# PJ2026-01040409 MDTODO前端重写

## 修改历史

| 版本 | 对应 commit id | 更新日期 | 变更说明 |
| --- | --- | --- | --- |

当前正文仍在规格治理草稿中；未定稿前不新增版本号，不为单次编辑追加 `待提交` 版本。

## 正文

## PJ2026-01040409 MDTODO前端重写需求规格

## 1. 文档控制

| 字段 | 内容 |
| --- | --- |
| 编号 | PJ2026-01040409 |
| 短名 | MDTODO前端重写 |
| 层级 | L3 专项规格切片 |
| 状态 | 已生效 |
| 实现引用版本 | draft-2026-06-26-p0-mdtodo-web-rewrite |
| 需求规格模板 | [ISO/IEC/IEEE 29148 需求规格模板](../../templates/iso-iec-ieee-29148-requirements-spec-template.md) |
| 上级规格 | [PJ2026-010404 项目管理](PJ2026-010404-project-management.md) |
| 关联规格 | [PJ2026-0104 客户端](PJ2026-0104-client.md)、[PJ2026-010401 Web工作台](PJ2026-010401-web-workbench.md)、[PJ2026-010403 API契约](PJ2026-010403-api-contract.md)、[PJ2026-01060508 Web Probe Sentinel](PJ2026-01060508-web-probe-sentinel.md)、[PJ2026-0106 平台运维](PJ2026-0106-platform-ops.md) |
| 规格治理索引 | [规格治理](spec-governance.md) |

本文采用 ISO/IEC/IEEE 29148 需求规格模板的项目裁剪版：正文只保留 MDTODO Web 前端重写的稳定目标、边界、架构要求、交互要求和验收要求。

## 2. 目的和范围

### 2.1 目的

MDTODO Web 已经过多轮局部改造，但仍然存在布局不稳定、信息层级混乱、主工作区被元数据挤压、报告预览崩坏、任务树与 MDTODO Rxx 标准不一致、主动编辑能力弱、Workbench 启动不能形成真实工作上下文等问题。这些问题说明继续在旧页面上叠加 CSS 和局部组件修补不能收敛。

本规格要求对 `/projects/mdtodo` 的前端实现进行一次受控清除和重写：保留已稳定的公共 API、ID 关联和可复用运行证据，清除旧页面中面向临时修补的布局、状态和渲染实现，重新建立有界三栏工作区、Rxx 任务树、任务正文编辑、报告预览、Source/File 配置和 Workbench launch 交互。

重写目标不是制作新的静态展示页，而是把 MDTODO Web 做成可长期迭代的项目管理任务面。页面必须能在真实 HWPOD source 上读写 `docs/MDTODO/*.md` 直接文件，能通过公共 Project Management API 做任务 mutation，能通过公共 Workbench Launch API 创建带首轮任务上下文的 Workbench 工作流，并能通过 web-probe observe/analyze 完成可复验的视觉和交互验收。

### 2.2 范围内

- Cloud Web `/projects/mdtodo` 页面 shell、路由选择、状态栏、Source/File 下拉、Rxx 任务树、任务正文区域、报告预览区、弹窗和错误呈现。
- MDTODO 前端组件、composable、API adapter、DTO 映射、router restore、DOM/testId/ARIA 验收契约和局部样式。
- 旧 MDTODO 页面中不符合本规格的 `metric-card`、常驻详情元数据、常驻新建任务框、嵌套卡片、页面级长滚动、深色代码块、裸 JSON/Markdown 报告、临时 selector hack 和重复状态实现的清除。
- 从 Workbench 抽象出的通用有界三栏工作区布局组件在 MDTODO 页面中的使用。Workbench 现有页面可保持不动，抽象组件先服务 MDTODO。
- Source 配置弹窗、HWPOD-bound source 选择、`docs/MDTODO/` 直接文件发现、文件下拉显示、reindex 触发和 blocker 展示。
- Rxx 任务树展示、折叠、搜索、状态过滤、inline/double-click 编辑、任务新增、子任务、状态修改、删除、继续执行和冲突回滚。
- 任务内 Markdown link 的报告解析结果展示、右侧报告预览、全屏预览、长 JSON/RPC 日志渲染、代码块样式和报告关闭后的布局恢复。
- Workbench launch 按 `projectId`、`sourceId`、`fileRef`、`taskRef`、任务正文和报告上下文生成真实首轮工作内容。
- web-probe 对 MDTODO 页面多状态的 observe command、collect summary、analyze 规则、截图证据和 closeout 模板。

### 2.3 范围外

- `hwlab-project-management` 微服务的业务事实重构。若重写前端发现 API 缺口，应先补充项目管理规格和执行 issue，再做后端改动。
- Workbench session、trace、terminal、composer 和 read model 内部实现。MDTODO 只能通过公共 Workbench Launch API 关联 Workbench。
- HWPOD node、workspace adapter、DB schema、Secret、Auth、FRP/Caddy 和 GitOps 部署控制面。
- 对 MDTODO v0.2 的兼容实现。页面只支持 v0.3 及后续模型。
- 本地 `vue-tsc` 验证。前端类型和构建验证应走受控 CI/PipelineRun，开发本地最多做语法、lint 或针对性命令形态确认。

## 3. 术语表

| 术语 | 定义 |
| --- | --- |
| 清除和重写 | 不在旧页面继续叠加修补；盘点旧实现后替换页面 shell、布局、状态和交互组件，删除不符合规格的旧 UI 代码。 |
| 有界三栏工作区 | 页面外层高度受限，左侧任务树、中央任务正文、右侧报告预览分别内部滚动；页面本身不因长任务或报告无限变高。 |
| 左侧任务树 | Rxx outline 区域，默认不超过可用宽度的 30%，可折叠、可调整宽度，只承担导航和摘要。 |
| 主工作区 | 任务标题、状态、正文、inline edit、任务操作和 Workbench launch 的主要区域；无报告时应占据除左侧栏外的大部分宽度。 |
| 右侧报告栏 | 任务内报告链接的预览区；可折叠、可关闭、可全屏，打开时默认与主工作区各占约一半。 |
| 状态栏 | 页面顶部窄工具栏，承载 Source/File 下拉、任务搜索、状态过滤、info、settings、reindex 和 create action。 |
| info 弹窗 | 收纳 Source、TaskRef、File、Updated、统计、诊断和 link metadata 的信息面板；这些元数据不常驻挤占主工作区。 |
| Source 配置弹窗 | 配置 MDTODO source 的表单，可绑定 HWPOD 和 workspace 根。 |
| Direct MDTODO file | `docs/MDTODO/` 下直接 `.md` 文件；子目录内报告、日志和任务报告不得作为 MDTODO 文件。 |
| Rxx 任务树 | 以 `R1`、`R1.1`、`R1.1.1` 等任务 id 前缀组织层级，而不是按 Markdown heading 数量或 checkbox 缩进猜测。 |
| Inline edit | 双击标题或正文后原位进入编辑状态，提供保存、取消、冲突提示和回滚，不使用独立标题/正文输入框常驻占位。 |
| ReportPreview | 由 Project Management API 返回的报告预览 DTO，用于右侧栏和全屏展示。 |
| Workbench launch | MDTODO 页面调用公共 Workbench Launch API，创建带任务上下文和首轮 prompt 的 Workbench session。 |
| web-probe command | 可复用的 web-probe 交互命令，覆盖常见 MDTODO 操作；临时 script 只能作为过渡，不作为长期验收入口。 |

## 4. 系统边界和接口

| 边界项 | 内容 |
| --- | --- |
| 外部使用者 | 硬件研发用户、项目维护者、自动化验收和平台管理员。 |
| 外部输入 | 浏览器 URL、Source/File/task/report 深链、用户点击和键盘输入、Project Management API DTO、Workbench Launch API 响应、web-probe command。 |
| 受控资源 | `/projects/mdtodo` 页面、MDTODO 前端组件树、同源 `/v1/project-management/*` 读写请求、`POST /v1/workbench/launches`、web-probe artifact。 |
| 外部输出 | 有界布局截图、Rxx task outline、任务正文、编辑结果、报告预览、Workbench session link、blocker、diagnostic 和 observe/analyze 报告。 |
| 用户接口 | Cloud Web、公共 API、web-probe observe/analyze CLI。 |
| 系统边界 | MDTODO 前端只做展示、交互、路由状态和公共 API 调用；不解析私有 Workbench store、不直连 HWPOD/DB/Kubernetes/SSH、不保存业务 authority 到 localStorage。 |

## 5. 目标架构

### 5.1 前端组件分层

```mermaid
flowchart TD
  Route[Vue Router deep link] --> Page[MdtodoPageShell]
  Page --> Layout[BoundedWorkspaceLayout]
  Page --> Toolbar[MdtodoToolbar]
  Page --> Dialogs[Source/Create/Info dialogs]
  Layout --> Tree[MdtodoTaskTree]
  Layout --> Main[MdtodoTaskPanel]
  Layout --> Report[MdtodoReportPanel]
  Toolbar --> Selection[useMdtodoRouteSelection]
  Tree --> TaskData[useMdtodoTaskData]
  Main --> Mutation[useMdtodoTaskMutation]
  Report --> Reports[useMdtodoReportPreview]
  Main --> Launch[useMdtodoWorkbenchLaunch]
  Selection --> Api[MdtodoProjectApiClient]
  TaskData --> Api
  Mutation --> Api
  Reports --> Api
  Launch --> WorkbenchApi[Workbench Launch API]
```

`BoundedWorkspaceLayout` 只拥有布局、折叠、拖拽、滚动容器和可访问性状态。它不得包含 MDTODO 业务逻辑。MDTODO 页面通过 slot、props 和事件接入左侧、主区域和右侧内容。

### 5.2 状态和数据流

```mermaid
flowchart LR
  Url[URL sourceId/fileRef/taskId/linkId] --> Select[route selection composable]
  Select --> Load[load source/file/task/report]
  Load --> Store[local view state]
  Store --> Render[tree/main/report render]
  Render --> Edit[inline edit action]
  Edit --> Api[Project Management mutation with revision]
  Api --> Reconcile[refresh projection + rollback on conflict]
  Render --> Launch[Workbench launch action]
  Launch --> Wb[Workbench session with initial prompt]
  Render --> Probe[web-probe observe sample]
```

URL 是可恢复选择状态的 authority。组件内部可以缓存折叠宽度、当前编辑草稿和加载状态，但不能把 source/file/task/report 的业务选择只保存在 store 或 localStorage。

### 5.3 工作区布局

```mermaid
flowchart LR
  subgraph App[bounded page height]
    Header[Narrow page header]
    Toolbar[Status toolbar]
    subgraph Workspace[bounded workspace]
      Left[Task tree <=30 percent collapsible]
      Main[Task body/editor]
      Right[Report preview collapsible/fullscreen]
    end
  end
```

桌面视口下，`Header` 和 `Toolbar` 必须保持窄。`Workspace` 使用剩余高度，内部各栏滚动。报告未打开时，`Main` 占除左侧栏之外的全部宽度；报告打开时，`Main` 与 `Right` 默认约 50/50，可拖拽调整。

## 6. 原子需求

### 6.1 MDTODO-WEB-REWRITE-REQ-001 清除旧前端实现

| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| MDTODO-WEB-REWRITE-REQ-001 | 清除旧前端实现 | MDTODO Web | 项目管理、Web工作台 |

实现前必须盘点当前 MDTODO 前端文件、组件、样式、composable 和 API client，并形成删除或保留清单。

旧页面中只为局部问题叠加的布局和样式必须被清除或替换，包括但不限于常驻 `metric-card` 信息卡、常驻 `task-create-box`、常驻任务详情元数据块、嵌套卡片容器、页面级长滚动、报告区域裸 JSON 输出、深色代码块、固定 query selector 依赖、重复文件标题显示和不能恢复 URL 状态的本地 store。

允许保留的代码必须满足以下条件之一：公共 API client/DTO 已与 Project Management API 对齐；通用工具没有 MDTODO 业务耦合；web-probe 使用的 data-testid/ARIA 契约仍符合新页面。不能为了降低改动量保留旧页面主 shell 或旧布局骨架。

### 6.2 MDTODO-WEB-REWRITE-REQ-002 有界三栏布局

| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| MDTODO-WEB-REWRITE-REQ-002 | 有界三栏布局 | `BoundedWorkspaceLayout` | Web工作台、web-probe |

MDTODO 页面必须使用通用有界工作区布局。桌面视口下整体高度受限，页面 header、状态栏、任务树、主工作区和报告栏不得导致 document body 无限增长。

左侧任务树默认占可用宽度的 30% 或更小，可折叠、可拖拽调整，折叠后的展开按钮必须始终可见且不被 header、toolbar、report 或 overflow 遮挡。

右侧报告栏默认折叠。没有打开报告时，主工作区应占据除左侧任务树外的全部宽度。打开报告后，主工作区和报告栏默认各占约一半，用户可拖拽调整；关闭报告后主工作区恢复全宽。

任务树、主工作区和报告栏必须分别拥有内部滚动容器。长任务正文、长报告、长 JSON/RPC 日志只能在对应 pane 内滚动，不得把整个页面撑成长页面。

### 6.3 MDTODO-WEB-REWRITE-REQ-003 顶部状态栏和信息收敛

| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| MDTODO-WEB-REWRITE-REQ-003 | 状态栏和信息收敛 | `MdtodoToolbar` | 项目管理 |

页面 header 必须窄，只提供页面位置、主要状态和必要 action，不得占据任务阅读空间。

Source 和 File 必须作为顶部状态栏的下拉菜单。File 下拉的主显示文本必须是 `docs/MDTODO/` 下的直接文件名或清晰相对路径，不得显示内部标题、hash、奇怪的投影标题或报告标题。

Source、TaskRef、File、Updated、统计计数、link 摘要、诊断信息和 Workbench link metadata 必须收敛到 info/diagnostic 弹窗或菜单，不得常驻在主工作区挤占正文版面。

新建任务入口必须是按钮加弹窗，不得以常驻表单占据默认布局。Source 配置也必须通过设置按钮打开弹窗，弹窗关闭后不改变主工作区布局。

### 6.4 MDTODO-WEB-REWRITE-REQ-004 Source/File 选择和文件范围

| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| MDTODO-WEB-REWRITE-REQ-004 | Source/File 选择 | `MdtodoToolbar`、`useMdtodoSource` | Project Management API |

MDTODO source 应能在 Web 中配置，配置方式至少支持绑定到 HWPOD 和 workspace 根。HWPOD-bound source 默认只读取 `docs/MDTODO/` 目录。

MDTODO 文件发现必须只包含 `docs/MDTODO/` 下直接 `.md` 文件。子目录中的 `details/**`、`*_Task_Report.md`、`*_log_*.md`、图片、artifact 和报告文件只作为链接 target，不得作为 MDTODO 文件出现在 File 下拉或任务树根中。

文件选择必须驱动 URL、任务树、任务详情和报告预览刷新。source/file 不可用、文件过大、parse error、权限不足和 HWPOD 不在线必须显示结构化 blocker，不得通过空白页面或只读假成功掩盖。

### 6.5 MDTODO-WEB-REWRITE-REQ-005 Rxx 任务树

| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| MDTODO-WEB-REWRITE-REQ-005 | Rxx 任务树 | `MdtodoTaskTree` | MDTODO adapter |

任务树必须按 MDTODO v0.3 的 Rxx id 组织。`R1` 是根任务，`R1.1` 是 `R1` 子任务，`R1.1.1` 是 `R1.1` 子任务。层级不得由 Markdown heading 数量、缩进或前端字符串猜测单独决定。

任务树行应展示 Rxx id、标题摘要、状态、阻塞或报告提示。树只作为大纲存在，默认不展示完整正文和大块 metadata。

任务树必须支持折叠、展开、键盘导航、搜索、状态过滤和当前任务高亮。折叠状态不应破坏 URL 选择；用户通过深链进入 `R1.1` 时，父节点应自动展开到可见。

大文件场景下，任务树应按 selected file、搜索/状态过滤、父节点或窗口加载，不应依赖 source 级一次性全量响应才能进入可操作状态。

### 6.6 MDTODO-WEB-REWRITE-REQ-006 任务正文和主动编辑

| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| MDTODO-WEB-REWRITE-REQ-006 | 任务正文和主动编辑 | `MdtodoTaskPanel`、`useMdtodoTaskMutation` | Project Management API |

任务正文是主工作区的核心内容，必须在只读状态下直接可见。标题、正文、状态、报告链接和主要 action 不得被元数据卡片、空表单或报告栏遮挡。

标题和正文不得使用常驻独立输入框修改。用户双击标题或正文后，原位置进入可编辑状态；保存、取消、加载中、错误和冲突回滚状态必须明确可见。

任务 mutation 必须通过 Project Management API 执行，并携带 revision/fingerprint 或等价并发保护。前端允许做乐观更新，但 API 失败、版本冲突、parse error、写回失败或 HWPOD 离线时必须回滚或给出可恢复状态。

新增根任务、新增子任务、修改状态、删除、继续任务和 reindex 都应是公共 API 操作。前端不得直接编辑 Markdown 文件、不得直连 HWPOD workspace、不得把修改只保存在 localStorage。

### 6.7 MDTODO-WEB-REWRITE-REQ-007 报告预览和 Markdown 渲染

| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| MDTODO-WEB-REWRITE-REQ-007 | 报告预览 | `MdtodoReportPanel` | Project Management API、Web工作台 |

任务正文中的 Markdown link，如 `[R1.1](./20260110_LOG/R1.1_log_implementation.md)`，必须能被 Project Management API 解析为报告链接，并在右侧报告栏打开预览。

报告预览必须使用成熟 Markdown 渲染工具并启用安全清理。代码块、JSON、RPC 日志和长行应采用浅色、接近 Workbench 的代码块风格，支持横向滚动或合理换行，不得输出破碎的裸 JSON、未闭合代码块或深色大块区域。

报告栏必须支持打开、关闭、折叠、拖拽调整宽度和全屏预览。全屏预览关闭后，应恢复原报告栏和主工作区状态。

报告文件不得进入 MDTODO File 下拉或任务树。报告加载失败、文件过大、路径越界、权限不足和解析失败都应展示 report blocker，并保留任务正文可操作。

### 6.8 MDTODO-WEB-REWRITE-REQ-008 RESTful 深链

| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| MDTODO-WEB-REWRITE-REQ-008 | RESTful 深链 | Vue Router、`useMdtodoRouteSelection` | API契约 |

MDTODO 页面必须支持可复制、可刷新、可回放的深链，至少包含 source、file、task 和 report 四层选择：

```text
/projects/mdtodo/sources/:sourceId/files/:fileRef/tasks/:taskId/reports/:linkId?
```

刷新页面、浏览器前进后退、web-probe 直接打开深链和用户复制链接分享时，页面都必须从公共 API 恢复相同的 source/file/task/report 选择。

URL 不应暴露本地绝对路径、HWPOD 内部 host、DB 主键或 secret。`fileRef`、`taskId` 和 `linkId` 可以是 opaque id，但 UI 必须显示人类可读的文件名、Rxx id 和报告标题。

### 6.9 MDTODO-WEB-REWRITE-REQ-009 Workbench launch 真工作流

| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| MDTODO-WEB-REWRITE-REQ-009 | Workbench launch | `useMdtodoWorkbenchLaunch` | Web工作台、Agent编排 |

点击“在 Workbench 执行”必须调用公共 Workbench Launch API，并提交 `projectId`、`sourceId`、`fileRef`、`taskRef`、任务标题、任务正文摘要、相关报告链接和 prompt template 标识。

成功启动后，Workbench session 必须包含可工作的首轮用户消息或等价任务上下文，不能只是创建空 session。MDTODO 页面只能在 launch API 返回 sessionId、workbenchUrl 和 link 记录后跳转。

失败时，用户应留在 MDTODO 页面并看到结构化错误、重试入口和诊断信息。前端不得把空 session、无首轮消息或未关联 `taskRef` 的 session 标记为成功。

MDTODO 页面和 Workbench 只能通过公共 API 和 ID 关联。MDTODO 不 import Workbench store，不嵌入 Workbench 组件；Workbench 不解析 MDTODO Markdown，不 import MDTODO 组件。

### 6.10 MDTODO-WEB-REWRITE-REQ-010 web-probe 交互验收

| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| MDTODO-WEB-REWRITE-REQ-010 | web-probe 验收 | web-probe commands/analyze | 平台运维 |

MDTODO 前端重写必须补齐可复用 web-probe command，覆盖 source 选择、file 选择、task 选择、任务树折叠展开、pane resize、报告打开关闭、报告全屏、标题/正文 inline edit、状态修改、创建任务弹窗、Source 配置弹窗、reindex 和 Workbench launch。

验收应优先使用 `observe start`、`observe command`、`observe collect` 和 `observe analyze`。临时 `script` 只能作为短期补证，closeout 前高频动作必须沉淀为 command。

closeout 至少需要以下截图和分析证据：

| 视口 | 状态 | 必要证据 |
| --- | --- | --- |
| 960x600 | 默认深链进入任务 | header 窄、状态栏可用、任务正文可见、无页面级长滚动 |
| 960x600 | 左侧任务树折叠 | 展开按钮可见且未被覆盖，主工作区扩展 |
| 960x600 | 报告打开 | 主工作区和报告栏约 50/50，报告渲染正常 |
| 960x600 | 报告全屏 | 全屏可读、可关闭、关闭后状态恢复 |
| 1440x900 | 长 JSON/RPC 报告 | 浅色代码块、内部滚动、无裸 JSON 崩坏 |
| 390x844 | 窄屏阅读 | Source/File 可选、正文可读、报告入口可访问 |
| 960x600 | 创建任务弹窗 | 弹窗打开/关闭不破坏主布局 |
| 960x600 | Workbench launch | 目标 session 存在首轮任务上下文，不是空 session |

`observe analyze` 当前状态不得出现 `mdtodo-task-body-not-visible`、`mdtodo-report-fullscreen-missing`、左侧折叠按钮被遮挡、页面整体高度极端长、报告裸 JSON 崩坏或主工作区被详情 metadata 挤压等 top-level finding。若历史 artifact 仍有旧 finding，closeout 必须说明当前 artifact 和历史 artifact 的差异。

### 6.11 MDTODO-WEB-REWRITE-REQ-011 可访问性和稳定选择器

| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| MDTODO-WEB-REWRITE-REQ-011 | 可访问性和稳定选择器 | MDTODO Web | web-probe |

所有关键交互控件必须有稳定 `data-testid` 或 ARIA label，供 web-probe command 和人工排障使用。不得依赖形如 `document.querySelector("#app > main > section > ... > button:nth-child(3)")` 的脆弱选择器作为长期验收入口。

Source/File 下拉、info、settings、create task、tree collapse、report close、report fullscreen、inline edit save/cancel、Workbench launch 都必须能通过键盘到达，并有清晰 disabled/loading/error 状态。

### 6.12 MDTODO-WEB-REWRITE-REQ-012 视觉密度和版面原则

| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| MDTODO-WEB-REWRITE-REQ-012 | 视觉密度 | MDTODO Web | Web工作台 |

MDTODO 是项目管理工作台，不是营销页。页面应采用高密度、低装饰、可扫描的工具布局，避免大 hero、装饰卡片、嵌套卡片、单色大面积背景和占用主空间的说明文案。

正文和报告是主要内容。桌面默认状态下，主工作区可用面积应显著大于元数据和 chrome；没有报告时，正文区域应占除左侧任务树外的主要空间；有报告时，正文与报告应并列，而不是上下堆叠撑长页面。

MDTODO UI 应对齐 VSCode 插件的任务大纲和主动编辑心智，但不能把 Web 做成插件的逐像素复制。Web 版应保留深链、Source 配置、报告预览、Workbench launch 和 web-probe 验收这些浏览器特性。

## 7. 实施阶段

| 阶段 | 目标 | 完成条件 |
| --- | --- | --- |
| P0 SPEC 和现状盘点 | 以本规格为 source of truth，盘点旧 MDTODO 前端实现和删除清单 | issue 引用本规格，列出保留/删除文件，确认不动 backend-core 和 Workbench 内部 |
| P1 交互骨架和截图评审 | 用真实 API 或受控 fixture 做新布局骨架 | 960x600 默认、树折叠、报告打开、报告全屏截图通过人工评审 |
| P2 清除旧页面并接入新 shell | 替换旧页面 shell、toolbar、layout 和 route restore | 旧常驻 metric/detail/create box 不再出现在默认页面 |
| P3 任务树和主动编辑 | Rxx 树、正文展示、inline edit、mutation、conflict rollback 可用 | web-probe command 能完成选择、编辑、保存、取消和失败展示 |
| P4 报告预览和 Markdown 渲染 | 右侧报告栏、全屏、浅色代码块、长 JSON/RPC 滚动可用 | 长报告深链截图无裸 JSON 崩坏，报告文件不进入 File 下拉 |
| P5 Workbench launch | 任务能启动带首轮上下文的 Workbench session | web-probe 证明目标 session 不是空 session，ProjectWorkbenchLink 可查 |
| P6 D601/v03 滚动上线和 closeout | 使用受控 CI/CD 发布并用 web-probe 复验 | issue closeout 包含 PipelineRun、URL、截图、analyze report 和剩余风险 |

P1 截图评审是强制门槛。若用户或 reviewer 仍认为布局“不好”，不得进入 P2/P3 大量实现，应先调整规格或骨架。

## 8. 验收标准

| 编号 | 验收项 | 标准 |
| --- | --- | --- |
| AC-001 | 规格先行 | 执行 issue 明确引用本规格、上级规格、关联规格和实现引用版本。 |
| AC-002 | 清除旧实现 | PR diff 显示旧 MDTODO 前端页面 shell 和临时布局被替换，旧常驻 metric/detail/create box 不再存在。 |
| AC-003 | 布局有界 | 960x600 和 1440x900 下页面整体高度受限，任务树、主工作区、报告栏内部滚动。 |
| AC-004 | 左侧任务树 | 默认宽度不超过 30%，可折叠可展开，展开按钮不被遮挡。 |
| AC-005 | 主工作区 | 默认任务正文直接可见，元数据进入 info 弹窗，正文区域未被详情卡片挤压。 |
| AC-006 | File 下拉 | 直接显示 `docs/MDTODO/` 下文件名，不显示内部标题或报告文件。 |
| AC-007 | Direct file 范围 | `details/**`、报告和日志不会出现在 File 下拉或任务树根。 |
| AC-008 | Rxx 树 | `R1/R1.1/R1.1.1` 按 id 层级组织，深链任务自动展开父节点。 |
| AC-009 | Inline edit | 双击标题/正文可编辑，保存/取消/失败/冲突状态可见。 |
| AC-010 | 报告预览 | 任务报告在右侧栏和全屏模式可读，Markdown/代码块/长 JSON 渲染稳定。 |
| AC-011 | 深链 | source/file/task/report 深链刷新后恢复同一选择。 |
| AC-012 | Workbench launch | 点击执行后生成带首轮任务上下文的 Workbench session，不接受空 session 成功。 |
| AC-013 | 解耦边界 | MDTODO 前端只通过公共 Project Management API 和 Workbench Launch API 关联，不 import Workbench store 或直连 backend/HWPOD。 |
| AC-014 | web-probe | observe command 覆盖主要交互，analyze 当前 artifact 无布局崩坏 top-level finding。 |
| AC-015 | 发布验证 | D601/v03 通过受控 CI/CD rollout 和原入口 web-probe 验证；不在本地运行 `vue-tsc` 作为验收依据。 |

## 9. 风险和约束

- 若后端 API 仍缺少 task detail body、report preview、mutation revision 或 Workbench launch seed 字段，前端重写不得用本地拼接绕过，应先补规格和后端执行 issue。
- 若通用有界布局组件不足以支持 MDTODO，需要扩展通用组件，而不是在 MDTODO 页面复制一套私有三栏 CSS。
- 若历史 web-probe command 无法覆盖高频操作，应先补 command，再做 closeout；不得每次用临时脚本重放同一操作。
- 若 D601/v03 运行面和本地开发 fixture 展示不一致，以 D601/v03 原入口证据为准。
- 若用户在 P1 骨架评审中仍指出布局不满足需求，应暂停实现扩展，先修正布局规格和骨架。

## 10. 过程控制

本规格不直接记录执行日志。执行 issue 必须按阶段引用本规格，并在每个阶段关闭前回写：

- 当前实现引用版本。
- 关键 PR 和 rollout evidence。
- web-probe observe/analyze artifact 路径或报告。
- D601/v03 真实 URL 和截图摘要。
- 未完成项和后续 issue。

涉及 GitHub issue/PR 的正式写入必须使用 UniDesk 受控 GitHub CLI。涉及发布、PipelineRun、rollout 和 GitOps 的操作必须使用 UniDesk CI/CD 受控入口。涉及 web-probe 的验收必须优先使用 observe/analyze 和可复用 command。
