# EM 观察网页可视化阶段 04 交接

状态：完成

阶段目标：完成集成计划 Task 1–2 的观察参数同步、网页/Painter 冻结开关，以及纯顺序方向段换向确认状态机；不实现活动段控制器、图表适配、网页托管或插件发布。

基线提交：`0bc8df9d5ecabd259dbd4d5db8594e590fbd0012`（阶段 03 交接）。`b0b79e5` 已核对为祖先。

实现提交：

- `c5ea4f6` `feat: configure observation visualization`
- `0a9c34d` `feat: track observed direction segments`

修改文件：

- `ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/TrajectoryObservationContracts.cs`
- `ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/MovementTest.TrajectoryObservationTest.cs`
- `ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/README.md`
- `ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest/TrajectoryObservationSegmentTracker.cs`
- `ClumsyPilot/tests/EMPlannerVerificationHost/TrajectoryObservationSettingsChecks.cs`
- `ClumsyPilot/tests/EMPlannerVerificationHost/TrajectoryObservationSegmentChecks.cs`
- `ClumsyPilot/tests/EMPlannerVerificationHost/TrajectoryObservationChecks.cs`

新增或确认的接口：

- `TrajectoryObservationSettings` 的默认求解器超时、OSQP 迭代和 ST 时域分别冻结为 `5.0 s`、`100000`、`2.0 s`；新增网页/Painter、端口、10 Hz、60 轮历史及换向确认参数，端口仅允许 `0` 或 `1024..65535`。
- MovementTest 的公共字段与上述设置一对一复制，然后通过 `CreateValidatedSnapshot()` 冻结；网页与 Painter 默认关闭，网页自动打开默认开启。
- `TrajectoryObservationSegmentTracker`、`TrajectoryObservationSegmentState`、`TrajectoryObservationSegmentUpdate` 和 `TrajectoryObservationSegmentPhase` 为纯状态机接口。它仅按 `N -> N+1` 推进，并要求匹配的已到绝对末点 GearSwitch 轨迹、双段连接点投影、连续真实停车保持和三个严格递增的同向速度样本。错误方向、零速、重复序列、投影超限、非 GearSwitch 与时间倒退均重置确认；末段进入 `Completed`。

验证命令与结果：

1. `git merge-base --is-ancestor b0b79e5 HEAD`：退出码 `0`。
2. `dotnet run --project ClumsyPilot/tests/EMPlannerVerificationHost/EMPlannerVerificationHost.csproj -- trajectory-observation`：退出码 `0`，输出 `PASS trajectory-observation`。Task 2 的 GREEN 连续运行两次均通过；最终退出验证再次通过。
3. `dotnet run --project ClumsyPilot/tests/TrajectoryPlanningVisualizationVerificationHost/TrajectoryPlanningVisualizationVerificationHost.csproj`：退出码 `0`，输出 `PASS trajectory-planning-visualization`。
4. `rg -n "SendXYThSpeed|SendMotion|DriveStop|PredefinedDriveStop|AccumulateSpeed" ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest`：退出码 `1`，无匹配；观察运行源码没有这些接口调用。`TrajectoryObservationChecks.cs` 中存在同名字符串，仅用于读取运行时源文件并执行禁止调用审计，不是运行时调用。
5. `git diff --check c5ea4f6^..0a9c34d -- <阶段 04 文件>`：退出码 `0`，无空白错误。`git diff-tree --no-commit-id --name-status -r c5ea4f6` 仅列出 Task 1 的五个文件；同命令对 `0a9c34d` 仅列出 Task 2 的三个文件。

未运行的验证及原因：无。

已知警告或遗留问题：主项目构建保留两个既有 obsolete 警告，位于 `MovementTests.TireFollowing.cs` 与 `TireFollowing.cs`，均不属于本阶段文件。启动时工作区有 130 项脏变更、暂存区为空；本阶段只精确暂存和提交了 Task 1–2 文件，交接前其余 129 项仍未展开、重置或提交。

与原计划的偏差：首次基线构建因本次命令遗留的 MSBuild 节点短暂锁定 `TrajectoryPlanningVisualization.dll` 而失败（CS2012）。确认 PID 的启动时间和命令行后仅终止该本次失败命令的孤立节点，随后原样重跑两个基线入口并通过；没有代码偏差。

下一阶段注意事项：阶段 05 仅实施集成计划 Task 3。必须使用本阶段 tracker 的不可变状态作为唯一活动方向段来源；同段保留当前协调器轨迹作为 seed，跨方向时更换协调器且新段第一次请求的 `PreviousTrajectory` 必须为 `null`。继续保持 `OBSERVE_ONLY`，不得引入执行器写调用。
