docs: add project management mdtodo spec

This commit is contained in:
Codex
2026-06-25 08:10:31 +00:00
parent e6ad3a90db
commit 47ab694b8c
4 changed files with 402 additions and 3 deletions
@@ -22,7 +22,7 @@
| 短名 | 客户端 |
| 层级 | L1 方向 |
| 状态 | 已生效 |
| 实现引用版本 | draft-2026-06-25-p0-web-caserun-e2e |
| 实现引用版本 | draft-2026-06-25-p0-web-caserun-e2e; draft-2026-06-25-p0-project-management-mdtodo |
| 需求规格模板 | [ISO/IEC/IEEE 29148 需求规格模板](../../templates/iso-iec-ieee-29148-requirements-spec-template.md) |
| 上级规格 | [PJ2026-01 HWLAB 总规格](PJ2026-01-HWLAB.md) |
| 规格治理索引 | [规格治理](spec-governance.md) |
@@ -42,6 +42,7 @@
- Cloud Web 工作台、登录后工作流、任务创建、会话入口、trace/result 展示和用户可见资源入口。
- Cloud Web 通过 `/auth/session` 消费 canonical identity,并以业务 API 返回的 capability/blocker 展示授权状态。
- Cloud Web 的 CaseRun 用户入口、run 状态卡、trace/aggregate/HWPOD 证据阅读入口和可操作 blocker 展示。
- Cloud Web 的项目管理根导航、MDTODO 页面、项目任务 DTO、Workbench launch context 和任务到 Workbench session 的公共 ID 链接。
- HWLAB CLI 的运行端点解析、API key 鉴权入口、同源 API 调用、短连接命令、结构化输出、错误语义和脚本可用性。
- 通过 HWLAB CLI 覆盖账号/额度、工作台、显式 Agent session、Agent 任务、trace/result、HWPOD/CaseRun 组合入口和必要管理入口的非视觉全流程复验。
- web-probe 作为 Cloud Web 同源非视觉验收路径运行 CaseRun;它不拥有新的业务事实或后门接口。
@@ -53,6 +54,7 @@
- Agent run、session、workspace 和 result 指针事实归 [Agent编排](PJ2026-0102-agent-orchestration.md)。
- HWPOD 资源、硬件事实和 probe 能力归 [硬件池](PJ2026-0101-hardware-pool.md)。
- CaseRun 评价、aggregate、replay 和训练反馈归 [HarnessRL](PJ2026-0103-harness-rl.md)。
- 项目管理的 source、任务投影、MDTODO adapter、Workbench link 和外部 PM adapter 归 [项目管理](PJ2026-010404-project-management.md)Workbench 只消费公共 launch context 元数据。
- FRP、Caddy、TLS、CI/CD、Secret 和发布健康归 [平台运维](PJ2026-0106-platform-ops.md)。
## 3. 术语表
@@ -63,6 +65,8 @@
| HWLAB CLI | HWLAB 命令行入口,用于脚本化访问 Web 同源 API、Agent、CaseRun、HWPOD、用户和管理能力。 |
| 同源 CLI | 与 Cloud Web 使用同一 Web origin、同一相对 API path 和同一用户身份语义的 HWLAB CLI 调用方式。 |
| Web CaseRun 入口 | Cloud Web 中提交、观察和阅读 CaseRun 的用户界面,与同源 CaseRun API 和 HarnessRL run/read model 绑定。 |
| 项目管理入口 | Cloud Web 登录后的 `/projects``/projects/mdtodo` 用户入口,用于查看项目 source、MDTODO 任务树和 Workbench link。 |
| Workbench launch context | 项目管理等外部页面传给公共 Workbench Launch API 的脱敏启动上下文,只包含 `projectId``taskRef`、sourceKind、title 摘要和 prompt template 等元数据。 |
| selected Web origin | 由 node/lane YAML 声明并由客户端工具解析的 Web origin;默认是 public origin,本次 D601/v03 验收可选择 internal IP origin。 |
| web-probe CaseRun | 通过真实浏览器和 selected Web origin 执行的 CaseRun 验收路径;只模拟用户入口和同源 API,不直接访问未声明的内部服务。 |
| API 契约 | HTTP API 和错误语义的稳定调用约定。 |
@@ -90,6 +94,7 @@
| PJ2026-010401 | Web工作台 | [PJ2026-010401 Web工作台](PJ2026-010401-web-workbench.md) | Cloud Web 用户工作流、会话输入、诊断反馈和响应式布局 | 用户管理、Agent编排、硬件池、HarnessRL、平台运维 | 用户和管理员 |
| PJ2026-010402 | HWLAB CLI | [PJ2026-010402 HWLAB CLI](PJ2026-010402-hwlab-cli.md) | 短连接命令、同源 API 调用、结构化输出、错误语义和非视觉全流程复验 | 全部业务 L1 | 用户脚本、自动化脚本、内测复现 |
| PJ2026-010403 | API契约 | [PJ2026-010403 API契约](PJ2026-010403-api-contract.md) | 同源 API path、schema、鉴权主体、错误码和兼容性 | 用户管理、Agent编排、硬件池、HarnessRL、平台运维 | Web、HWLAB CLI |
| PJ2026-010404 | 项目管理 | [PJ2026-010404 项目管理](PJ2026-010404-project-management.md) | 项目根导航、MDTODO 页面、独立项目管理微服务、任务投影、Workbench link 和项目管理 observe/analyze 验收 | 用户管理、Agent编排、平台运维、API契约 | Web、HWLAB CLI、web-probe |
## 6. 原子需求
@@ -139,6 +144,20 @@ Cloud Web、HWLAB CLI 和 web-probe 必须使用 YAML 选中的同一 Web origin
客户端只拥有入口、展示、命令形态和错误呈现。CaseRun stage、aggregate、评价和回放归 HarnessRLAgent run/command/trace 归 Agent编排;HWPOD 资源、租约、节点路由和 operation result 归硬件池。客户端发现能力缺失时应展示缺失能力和下一步诊断,不得用前端文案或脚本后处理合成通过状态。
### 6.5 CLIENT-L1-REQ-005 项目管理入口
| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| CLIENT-L1-REQ-005 | 项目管理 | [PJ2026-010404 项目管理](PJ2026-010404-project-management.md) | [PJ2026-010401 Web工作台](PJ2026-010401-web-workbench.md)、[PJ2026-010403 API契约](PJ2026-010403-api-contract.md)、[Agent编排](PJ2026-0102-agent-orchestration.md)、[用户管理](PJ2026-0105-user-management.md)、[平台运维](PJ2026-0106-platform-ops.md) |
客户端应提供登录后的项目管理入口,使用户能从 `/projects``/projects/mdtodo` 查看项目、source、MDTODO 文件摘要、任务树、任务状态、Workbench link 和结构化 blocker。
项目管理必须通过独立 `hwlab-project-management` 微服务和同源 Project Management API 暴露。客户端不得把项目管理实现并入 Workbench、Cloud Web 私有状态、Cloud API 内部模块、UniDesk `mdtodo` 或 UniDesk `project-manager` 服务。
MDTODO 页面启动 Workbench 时,只能调用公共 Workbench Launch API 并传递脱敏 `launchContext``projectId``taskRef`。Workbench 只消费这些元数据并按自身 session authority hydrate;项目管理页面不嵌入 Workbench、不 import Workbench store、不读取 Workbench 私有 reducerWorkbench 也不解析 Markdown 或 import MDTODO 页面。
项目管理原入口验收优先使用 web-probe observe/analyze,采样 `/projects``/projects/mdtodo` 和自然同源 `/v1/project-management/*` 请求;`script` 只能作为短 API matrix、截图或 observe command 缺口的补充证据。
## 7. 过程控制
本规格不单独索引过程 issue;跨 L1 的内测、灰度和阶段活动索引统一保留在 [PJ2026-01 HWLAB 总规格](PJ2026-01-HWLAB.md) 的 `7. 过程控制`。客户端方向的阶段活动材料应引用本规格和各 L2 规格,不在本规格正文中展开执行流水。
@@ -19,7 +19,7 @@
| 短名 | Web工作台 |
| 层级 | L2 课题 |
| 状态 | 已生效 |
| 实现引用版本 | draft-2026-06-20-p0-long-running-workbench; draft-2026-06-20-p0-error-diagnostics; draft-2026-06-20-p0-passive-web-probe-observer; draft-2026-06-20-p1-view-local-timing-ticker; draft-2026-06-24-p0-no-ui-timing-fabrication; draft-2026-06-25-p0-web-caserun-e2e; PJ2026-0104010803 唯一投影 draft-2026-06-20-p0-durable-facts-model; draft-2026-06-20-p1-zero-split-durable-realtime; draft-2026-06-20-p2-terminal-outbox-recovery; draft-2026-06-24-p0-aggregate-event-stream; draft-2026-06-25-p0-serve-session-aggregate-authority |
| 实现引用版本 | draft-2026-06-20-p0-long-running-workbench; draft-2026-06-20-p0-error-diagnostics; draft-2026-06-20-p0-passive-web-probe-observer; draft-2026-06-20-p1-view-local-timing-ticker; draft-2026-06-24-p0-no-ui-timing-fabrication; draft-2026-06-25-p0-web-caserun-e2e; draft-2026-06-25-p0-project-management-mdtodo; PJ2026-0104010803 唯一投影 draft-2026-06-20-p0-durable-facts-model; draft-2026-06-20-p1-zero-split-durable-realtime; draft-2026-06-20-p2-terminal-outbox-recovery; draft-2026-06-24-p0-aggregate-event-stream; draft-2026-06-25-p0-serve-session-aggregate-authority |
| 需求规格模板 | [ISO/IEC/IEEE 29148 需求规格模板](../../templates/iso-iec-ieee-29148-requirements-spec-template.md) |
| 上级规格 | [PJ2026-0104 客户端](PJ2026-0104-client.md) |
| 规格治理索引 | [规格治理](spec-governance.md) |
@@ -45,6 +45,7 @@ Web工作台负责 HWLAB 登录后的浏览器主入口,使用户能够在同
- 基本工作台 Agent 调用,包括最小任务输入、发送、短返回执行标识、状态查询入口和失败原因展示。
- 工作台诊断入口、运行状态摘要、probe/build/HWPOD/Agent 状态的低噪声展示方式。
- CaseRun 用户入口,包括 HWPOD 资源选择、case 列表、run 提交、run stage、Trace、HWPOD evidence、artifact manifest、aggregate 和 blocker 展示。
- Workbench 公共 launch context 消费,包括从项目管理等外部登录后页面创建或选择 session,并把脱敏 `projectId/taskRef` 元数据写入 session projection。
- 桌面多栏布局、侧栏折叠、移动端工作台布局和输入区可达性。
- Web 与 HWLAB CLI 共用的 Code Agent composer policy、trace renderer 和同源 API 行为。
- Web 入口对用户管理、Agent编排、硬件池、HarnessRL 和平台运维输出事实的展示契约。
@@ -58,6 +59,7 @@ Web工作台负责 HWLAB 登录后的浏览器主入口,使用户能够在同
- CaseRun 评价、回放和训练反馈语义归 [HarnessRL](PJ2026-0103-harness-rl.md)。
- 公开入口、CI/CD、GitOps、Secret、FRP、Caddy 和 runtime 健康归 [平台运维](PJ2026-0106-platform-ops.md)。
- CLI 参数、CLI 输出和 HTTP API 契约仍归 [PJ2026-0104 客户端](PJ2026-0104-client.md) 中对应 L2 课题。
- 项目管理根导航、MDTODO source、Markdown 解析、任务投影、ProjectWorkbenchLink 和外部 PM adapter 归 [PJ2026-010404 项目管理](PJ2026-010404-project-management.md)。
## 3. 术语表
@@ -72,6 +74,8 @@ Web工作台负责 HWLAB 登录后的浏览器主入口,使用户能够在同
| 同源业务入口 | Cloud Web 与 HWLAB CLI 通过同一 Web origin、相对 REST/JSON API path 和业务标识访问 HWLAB 能力的入口。 |
| Web CaseRun 视图 | Web 工作台或其相邻登录后页面中用于提交、观察和阅读 CaseRun 的用户界面。 |
| CaseRun run 卡 | 展示一次 CaseRun 的 runId、caseId、hwpodId、stage、Trace、HWPOD evidence、artifact manifest、aggregate 和 blocker 的紧凑工作态组件。 |
| WorkbenchLaunchContext | 项目管理等外部页面传给公共 Workbench Launch API 的脱敏启动上下文,Workbench 只把它作为 session metadata 保存和展示,不反解外部任务来源。 |
| ProjectTaskRef | 项目管理 API 返回的 opaque `taskRef`;Workbench 可保存和显示其摘要,但不得解析 Markdown、文件路径或 adapter 内部结构。 |
| selected Web origin | Web 工作台、CLI 和 web-probe 共同使用的 YAML-selected origin;默认 publicD601/v03 端到端验收可由 YAML 切换到 internal IP。 |
| 浏览器登录态 | Cloud Web 随同源请求携带的 `hwlab_session` Web session transport;前端只负责传递,不解释权限、project 归属或资源可见性。 |
| canonical identity | Web 工作台从 `/auth/session` 读取的最小身份结果,包含 actor、`authMethod``identityAuthority``sessionKind` 和 capability 摘要;它是 Web shell、导航和业务页面的唯一身份输入。 |
@@ -133,6 +137,7 @@ Web工作台负责 HWLAB 登录后的浏览器主入口,使用户能够在同
| PJ2026-01040110 | 浏览器回归 | 本规格 6.10 | Playwright 独立测试、真实采集 fixture、mock server、截图 artifact 和状态投影断言 | API契约、平台运维 | Workbench 功能回归、防止刷新和会话切换退化 |
| PJ2026-01040111 | 长程观测 | 本规格 6.11 | 纯客户端 web-probe observer、命令文件控制、无副作用采样、JSONL artifact 和后处理分析 | 平台运维、公开入口 | Workbench 长程稳定性、瞬态竞态复现 |
| PJ2026-01040112 | CaseRun入口 | 本规格 6.12 | Web CaseRun 视图、run 卡、证据阅读、blocker 展示和 web-probe 同路径验收 | HarnessRL、API契约、硬件池、Agent编排 | 用户端到端硬件验证 |
| PJ2026-01040113 | 项目启动 | 本规格 6.13 | 公共 Workbench launch context 消费、session metadata 投影和项目任务解耦边界 | 项目管理、API契约、Agent编排 | `/projects/mdtodo` 一键启动 Workbench |
### 5.1 目标数据流程图
@@ -494,6 +499,20 @@ Web 工作台只调用 YAML-selected origin 下的同源 CaseRun API 和既有 T
线上 web-probe 对 CaseRun 的验收必须从同一 selected Web origin 进入。默认使用正式 public origin;本次 D601/v03 可以由 YAML 切换到 internal IP origin。web-probe 可以点击页面控件或调用页面同源正式 mutation,但不得绕过 Web session、不得使用未被 YAML 选中的内部 service URL、不得直接写 D601 文件系统、不得用 SSH 或手工 CLI 操作补齐硬件证据。web-probe 报告至少应记录 originMode、YAML source path、final URL、截图 SHA、caseId、runId、hwpodId、nodeId、traceId、HWPOD operation result 引用、aggregate 或 artifact manifest hash,以及是否存在用户可见 blocker。
### 6.13 CLIENT-WB-REQ-013 项目启动
| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| CLIENT-WB-REQ-013 | 项目启动 | PJ2026-01040113 项目启动 | [PJ2026-010404 项目管理](PJ2026-010404-project-management.md)、[PJ2026-010403 API契约](PJ2026-010403-api-contract.md)、[Agent编排](PJ2026-0102-agent-orchestration.md) |
Web 工作台应提供公共 launch context 消费能力,使项目管理等登录后页面可以通过 `POST /v1/workbench/launches` 创建或选择 Workbench session,并把脱敏 `projectId``taskRef``sourceKind`、title 摘要和 prompt template 标识保存为 session metadata。
Workbench 对 launch context 的使用必须保持只读和脱敏。它可以在 session header、message detail 或诊断入口展示项目来源摘要,也可以把 metadata 传给 Agent turn admission;但不得反解 `taskRef`、读取 Markdown、调用 Project Management 私有 adapter、访问 PM DB、import MDTODO 页面组件或把项目管理状态写入 Workbench reducer。
项目管理页面跳转到 `/workbench/sessions/{sessionId}` 后,Workbench 必须按既有 session detail、message page、turn snapshot 和 trace event page authority hydrate。`projectId/taskRef` 只作为 metadata 和后续查询 link 的 ID,不得替代 sessionId、turnId、traceId 或 messageId 成为 Workbench authority。
Workbench 模块不得为了项目管理联动新增 iframe、嵌套 Workbench 容器、localStorage 协议、私有 service URL、跨模块 store import 或 Markdown parser 依赖。需要回到项目任务时,只能使用公共 project link URL 或公共 Project Management API 暴露的 link 摘要。
## 7. 过程控制
本规格不单独索引过程 issue;跨 L1 的内测、灰度和阶段活动索引统一保留在 [PJ2026-01 HWLAB 总规格](PJ2026-01-HWLAB.md) 的 `7. 过程控制`
@@ -19,7 +19,7 @@
| 短名 | API契约 |
| 层级 | L2 课题 |
| 状态 | 已生效 |
| 实现引用版本 | draft-2026-06-20-p0-workbench-pure-read-api; draft-2026-06-20-p0-error-diagnostics; draft-2026-06-20-p1-view-local-timing-ticker; draft-2026-06-22-p1-workbench-redis-derived-cache; draft-2026-06-25-p0-web-caserun-e2e; PJ2026-0104010803 唯一投影 draft-2026-06-20-p0-durable-facts-model; draft-2026-06-20-p1-zero-split-durable-realtime; draft-2026-06-20-p2-terminal-outbox-recovery; draft-2026-06-24-p0-aggregate-event-stream; draft-2026-06-25-p0-serve-session-aggregate-authority; PJ2026-01050105 Web鉴权 draft-2026-06-18-p0-auth |
| 实现引用版本 | draft-2026-06-20-p0-workbench-pure-read-api; draft-2026-06-20-p0-error-diagnostics; draft-2026-06-20-p1-view-local-timing-ticker; draft-2026-06-22-p1-workbench-redis-derived-cache; draft-2026-06-25-p0-web-caserun-e2e; draft-2026-06-25-p0-project-management-mdtodo; PJ2026-0104010803 唯一投影 draft-2026-06-20-p0-durable-facts-model; draft-2026-06-20-p1-zero-split-durable-realtime; draft-2026-06-20-p2-terminal-outbox-recovery; draft-2026-06-24-p0-aggregate-event-stream; draft-2026-06-25-p0-serve-session-aggregate-authority; PJ2026-01050105 Web鉴权 draft-2026-06-18-p0-auth |
| 需求规格模板 | [ISO/IEC/IEEE 29148 需求规格模板](../../templates/iso-iec-ieee-29148-requirements-spec-template.md) |
| 上级规格 | [PJ2026-0104 客户端](PJ2026-0104-client.md) |
| 关联规格 | [PJ2026-0104010803 Workbench唯一投影](PJ2026-0104010803-workbench-unique-projection.md)、[PJ2026-01060505 Workbench性能](PJ2026-01060505-workbench-performance.md) |
@@ -41,6 +41,7 @@ API契约负责定义 Cloud Web、HWLAB CLI 和自动化脚本共同使用的 RE
- Web session、API key、AuthPrincipal、actor 摘要和权限错误在客户端入口中的表达。
- Agent session、chat、steer、cancel、result、trace 和 inspect 的用户可见 API 形态。
- CaseRun case list、run admission、run status、events、aggregate、artifact manifest、cancel 和 HWPOD/AgentRun 引用的用户可见 API 形态。
- 项目管理 navigation/projects/MDTODO source/file/task/workbench-link REST 资源、ProjectTask DTO、Workbench launch intent DTO 和独立项目管理服务代理边界。
- Workbench workspace、Admin Access、provider profile、HWPOD node-ops、gateway 和性能摘要等入口的字段稳定性。
- JSON 成功/失败响应、HTTP 状态、错误分类、脱敏、默认摘要和完整展开边界。
- Workbench pure-read API 的缓存诊断字段,包括 `cacheStatus``cacheAgeMs`、projection revision/seq、dbQueryAvoided 和 Redis unavailable/stale 的低基数表达。
@@ -51,6 +52,7 @@ API契约负责定义 Cloud Web、HWLAB CLI 和自动化脚本共同使用的 RE
- AgentRun run、command、runner job、session continuation 和 provider runtime 归 [Agent编排](PJ2026-0102-agent-orchestration.md)。
- HWPOD 资源身份、硬件操作、node 路由和原始硬件事实归 [硬件池](PJ2026-0101-hardware-pool.md)。
- CaseRun、评价、aggregate、回放和训练反馈归 [HarnessRL](PJ2026-0103-harness-rl.md)。
- ProjectSource、MDTODO adapter、Markdown 任务投影、ProjectWorkbenchLink 和外部 PM adapter 归 [项目管理](PJ2026-010404-project-management.md)。
- 运行端点、FRP/Caddy、Secret、rollout 和 Prometheus 监控归 [平台运维](PJ2026-0106-platform-ops.md)。
- Redis workload、镜像、资源、NetworkPolicy、TTL 数值、metrics scrape 和运行面发布归 [平台运维](PJ2026-0106-platform-ops.md) 与 [Workbench性能](PJ2026-01060505-workbench-performance.md);API契约只定义客户端可见字段和诊断边界。
@@ -64,6 +66,11 @@ API契约负责定义 Cloud Web、HWLAB CLI 和自动化脚本共同使用的 RE
| CanonicalPrincipal | `/auth/session` 和受保护业务 route 共享的最小身份结果,包含 `authMethod``identityAuthority``sessionKind`、actor 摘要和后端 capability 摘要;它是业务 route 的唯一身份输入。 |
| 业务标识 | sessionId、turnId、traceId、runId、commandId、caseId 等用户可继续查询的稳定标识;projectId、workspaceId 和 conversationId 只能作为筛选、metadata 或兼容映射字段,不作为前端鉴权 authority。 |
| CaseRun resource | Cloud Web origin 下表达 CaseRun case、run、stage、event、aggregate 和 artifact manifest 的 RESTful 资源集合。 |
| Project Management resource | Cloud Web origin 下表达项目、source、MDTODO 文件、任务、Workbench link 和项目能力的 RESTful 资源集合。 |
| ProjectTask | 项目管理 API 返回的任务 DTO,包含 `taskRef``projectId``sourceId`、title、status、父子关系、linkCount 和脱敏 metadata。 |
| `taskRef` | 项目管理 opaque 任务引用;API 可以转发和保存,Workbench、Cloud Web 和 CLI 不得解析其内部结构。 |
| WorkbenchLaunchIntent | `POST /v1/workbench/launches` 的请求 DTO,用于把项目任务上下文传给 Workbench session admission。 |
| ProjectWorkbenchLink | 项目管理 API 返回的任务到 Workbench session/trace 的链接摘要,只表达 ID 指针和脱敏状态。 |
| Run admission | 接收 CaseRun 提交并返回 `202 Accepted`、runId、statusUrl 和下一步查询入口的短返回 mutation。 |
| selected origin mode | 客户端入口从 YAML 解析出的 origin 模式,至少区分 `public``internal`;API 只看到同源请求,不反推或硬编码入口地址。 |
| 错误语义 | HTTP status、错误码、blocker、failureKind、route 和下一步提示组成的可定位失败表达。 |
@@ -114,6 +121,7 @@ API契约负责定义 Cloud Web、HWLAB CLI 和自动化脚本共同使用的 RE
| PJ2026-01040305 | 错误输出 | 本规格 6.5 | JSON 成功/失败响应、错误码、route/status、脱敏和渐进披露 | 全部业务 L1 | 用户、脚本、排障 |
| PJ2026-01040306 | 缓存诊断 | 本规格 6.6 | Workbench pure-read cache diagnostic 字段、脱敏边界和禁止状态仲裁 | Workbench唯一投影、Workbench性能 | Web、CLI、Performance 页 |
| PJ2026-01040307 | CaseRun接口 | 本规格 6.7 | CaseRun case/run/status/events/aggregate/cancel REST 资源、短返回和错误语义 | HarnessRL、硬件池、Agent编排 | Web CaseRun、CLI、web-probe |
| PJ2026-01040308 | 项目管理接口 | 本规格 6.8 | 项目管理 REST 资源、MDTODO DTO、Workbench launch intent、link 查询和独立微服务代理边界 | 项目管理、Web工作台、用户管理 | `/projects``/projects/mdtodo`、CLI、web-probe |
目标后端模块应至少拆分为 route/handler、schema/contract、read model、persistence/projection、AgentRun adapter、trace event pager、SSE/event publisher 和 compat wrapper。route 文件只负责 HTTP 入口、鉴权桥接和错误映射;schema/contract 只负责类型和字段;read model 只组装查询模型;adapter 只转换外部执行事实;projection 只写 durable factscompat wrapper 只提供旧 path 到新资源的兼容映射,不拥有第二套业务事实。
@@ -376,6 +384,37 @@ CaseRun API 必须把事实来源分仓输出。AgentRun refs 至少应能指向
web-probe 使用 CaseRun API 时必须保持 YAML-selected origin 下的同源用户路径。它可以通过页面控件或同源正式 mutation 提交 run,并通过同一 status/events/aggregate 资源观察终态;当 YAML 选择 internal origin 时可以使用内部 IP,但仍不得调用未声明的内部 service URL、Kubernetes、Postgres、D601 SSH、本地 gateway 端口、旧 v0.2 runner 或测试 fixture 来补齐 CaseRun 成功证据。
### 6.8 CLIENT-API-REQ-008 项目管理用户接口
| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| CLIENT-API-REQ-008 | 项目管理接口 | PJ2026-01040308 项目管理接口 | [PJ2026-010404 项目管理](PJ2026-010404-project-management.md)、[PJ2026-010401 Web工作台](PJ2026-010401-web-workbench.md)、[用户管理](PJ2026-0105-user-management.md) |
API契约应定义 YAML-selected Cloud Web origin 下的项目管理 RESTful 资源,使 Cloud Web、HWLAB CLI 和 web-probe 能用同一用户身份、同一相对 path、同一错误 envelope 和同一脱敏边界访问项目、source、MDTODO 文件、任务、Workbench link 和 Workbench launch intent。
目标项目管理 API 资源设计如下。Cloud API 可以作为同源 route/auth bridge 转发到独立 `hwlab-project-management` 微服务,但不得拥有项目管理持久化、Markdown 解析、外部 PM sync、Workbench link 表或 adapter 状态。
| 资源 | Method / path | 请求字段 | 响应主体 | 状态码 | 权威边界 |
| --- | --- | --- | --- | --- | --- |
| Navigation | `GET /v1/project-management/navigation` | 可选 `projectId` | 导航可见性、capability、默认 project/source 摘要、blocker | 200/401/403 | 只表达项目入口能力,不返回 raw Markdown |
| Project list | `GET /v1/project-management/projects` | cursor、limit、可选筛选 | `projectId`、title、source 摘要、visibility、updatedAt | 200/401/403 | 当前 actor 可见项目列表 |
| MDTODO sources | `GET /v1/project-management/mdtodo/sources` | 可选 projectId | `sourceId`、displayName、root 摘要、read/write capability、parse/index status | 200/401/403 | 不暴露 host path、Secret 或完整 Git remote |
| MDTODO files | `GET /v1/project-management/mdtodo/files` | `sourceId`、cursor、limit | fileRef、displayName、taskCount、status、fingerprint hash、parseError 摘要 | 200/401/403/404 | 文件摘要,不返回完整 Markdown |
| MDTODO tasks | `GET /v1/project-management/mdtodo/tasks` | `sourceId`、fileRef、可选 status/filter | `ProjectTask[]`、taskRef、父子关系、linkCount、projection revision | 200/401/403/404/409 | 任务投影来自项目管理 read model |
| MDTODO task mutation | `PATCH /v1/project-management/mdtodo/tasks/{taskRef}` | title/status/metadata patch、expected revision | updated ProjectTask、document revision、audit id | 200/400/401/403/404/409/422 | 写入必须经 MDTODO adapter 文件锁和原子写入 |
| Workbench launch | `POST /v1/workbench/launches` | `WorkbenchLaunchIntent`,含 `sourceKind=project-management``projectId``taskRef`、prompt template | `202 Accepted` 或 200、sessionId、workbenchUrl、linkId、traceId 可空 | 200/202/400/401/403/404/409/422 | Workbench 公共 mutation,不属于 MDTODO 私有 helper |
| Workbench links | `GET /v1/project-management/workbench-links` | `taskRef`、可选 projectId/sourceId、cursor | linkId、sessionId、traceId、createdBy 摘要、createdAt、role、status | 200/401/403/404 | 只返回 ID 指针和脱敏摘要 |
`ProjectTask` DTO 至少应包含 `taskRef``projectId``sourceId``kind`、title、status、parentTaskRef、depth、linkCount、updatedAt 和 `valuesRedacted=true`。fileRef、lineNumber、source fingerprint、Markdown preview 和 parse diagnostic 只能作为脱敏 metadata 输出;默认响应不得包含 host path、raw Markdown、Secret、token、DB DSN、provider payload、完整 prompt 或可复用凭据。
`WorkbenchLaunchIntent` 至少应包含 `sourceKind="project-management"``projectId``taskRef`、title 摘要、promptTemplateId、optional initial prompt metadata 和 `valuesRedacted=true`。Workbench 可以保存这些字段为 session metadata,但不得反解 taskRef、读取 Markdown、调用 Project Management adapter 或把项目管理 DB 当作 Workbench authority。
项目管理 GET path 必须纯读。投影滞后、source 不可用、Markdown parse error、adapter unavailable、link 投影未收敛或 Workbench launch 尚未写回 link 时,GET 应返回 projecting、degraded、blocked 或结构化 failure;不得在 GET 中同步修复文件、触发 Workbench session 创建、调用 AgentRun dispatch、写 DB link、读取运行面 Secret 或访问未声明内部服务。
项目管理 API 的错误必须使用 `HwlabErrorEnvelope` 或等价结构,并携带 route、status、code/blocker、resource id 摘要、OTel trace id、request id、serviceId 和 `valuesRedacted=true``mdtodo-raw-markdown-leak``mdtodo-hostpath-leak``mdtodo-taskref-missing``workbench-link-projection-missing` 等应作为可分析 code/blocker,而不是只返回裸字符串。
web-probe observe/analyze 使用项目管理 API 时必须保持同源用户路径。它可以通过页面控件或同源正式 mutation 触发 Workbench launch,并通过自然请求、Resource Timing、DOM 摘要和 link API 观察结果;不得调用私有 service URL、Kubernetes、Postgres、D601 SSH、localStorage 后门或测试 fixture 来补齐通过证据。
## 7. 过程控制
本规格不单独索引一般过程 issue;跨 L1 的内测、灰度和阶段活动索引统一保留在 [PJ2026-01 HWLAB 总规格](PJ2026-01-HWLAB.md) 的 `7. 过程控制`。Workbench Redis 派生读缓存架构执行 issue 为 [#1870](https://github.com/pikasTech/HWLAB/issues/1870)P0 SPEC-first 子 issue 为 [#1871](https://github.com/pikasTech/HWLAB/issues/1871),后续实现必须引用 `draft-2026-06-22-p1-workbench-redis-derived-cache`
@@ -0,0 +1,322 @@
# PJ2026-010404 项目管理
## 修改历史
| 版本 | 对应 commit id | 更新日期 | 变更说明 |
| --- | --- | --- | --- |
当前正文仍在规格治理草稿中;未定稿前不新增版本号,不为单次编辑追加 `待提交` 版本。
## 正文
## PJ2026-010404 项目管理需求规格
## 1. 文档控制
| 字段 | 内容 |
| --- | --- |
| 编号 | PJ2026-010404 |
| 短名 | 项目管理 |
| 层级 | L2 课题 |
| 状态 | 已生效 |
| 实现引用版本 | draft-2026-06-25-p0-project-management-mdtodo |
| 需求规格模板 | [ISO/IEC/IEEE 29148 需求规格模板](../../templates/iso-iec-ieee-29148-requirements-spec-template.md) |
| 上级规格 | [PJ2026-0104 客户端](PJ2026-0104-client.md) |
| 关联规格 | [PJ2026-010401 Web工作台](PJ2026-010401-web-workbench.md)、[PJ2026-010403 API契约](PJ2026-010403-api-contract.md)、[PJ2026-0102 Agent编排](PJ2026-0102-agent-orchestration.md)、[PJ2026-0105 用户管理](PJ2026-0105-user-management.md)、[PJ2026-0106 平台运维](PJ2026-0106-platform-ops.md) |
| 规格治理索引 | [规格治理](spec-governance.md) |
| 架构治理 issue | [#2123](https://github.com/pikasTech/HWLAB/issues/2123)、P0 跟踪 [#2133](https://github.com/pikasTech/HWLAB/issues/2133) |
本文采用 ISO/IEC/IEEE 29148 需求规格模板的项目裁剪版:正文只保留项目管理的稳定使命、范围、术语、系统边界、内部分工和原子需求。
## 2. 目的和范围
### 2.1 目的
项目管理负责 HWLAB 登录后的项目入口、项目 source、MDTODO 任务树、任务与 Workbench session 的公共 ID 关联,以及后续外部项目管理系统 adapter 的统一入口。
本课题的目标状态是:Cloud Web 提供 `/projects` 根导航和 `/projects/mdtodo` 页面;MDTODO 任务能一键启动 Workbench;两者通过公共 API、`projectId``taskRef``sessionId``traceId``launchContext` 关联,不通过组件嵌套、store import、iframe、私有服务 URL 或 Markdown 结构解析互相依赖。
项目管理从 P0 起必须作为独立 `hwlab-project-management` 微服务交付。它不作为 `hwlab-cloud-api` 内部模块起步,也不并入既有 UniDesk `mdtodo`、UniDesk `project-manager`、HWLAB Workbench runtime、Cloud Web 或 user-billing 服务。
### 2.2 范围内
- Cloud Web `/projects` 根导航、项目列表、source 状态、能力摘要、blocker 和最近 Workbench link 展示。
- Cloud Web `/projects/mdtodo` 页面,展示 MDTODO source、Markdown 文件摘要、任务树、任务详情、状态、稳定 `taskRef`、链接摘要和 Workbench 启动入口。
- 独立 `hwlab-project-management` 微服务,包括 Project Management API、ProjectSource registry、MDTODO adapter 调度、DB read model、Workbench link 表、audit/outbox 和未来外部 PM adapter 扩展点。
- MDTODO adapter 对 Markdown TODO 文件的解析、文件锁、原子写入、重建投影和 parse error 表达。
- `projectId``sourceId``taskRef``linkId``sessionId``traceId` 的稳定关联模型。
- Workbench launch intent,即项目管理页面通过公共 Workbench Launch API 创建或选择 session,并记录项目任务与 Workbench session 的关联。
- 项目管理页面的 web-probe observe/analyze 采样、分析、DOM 脱敏、自然同源 API 分组、Workbench launch 控制动作和 YAML-first 阈值。
- D601/v03 YAML-first 独立微服务部署所需的 serviceId、namespace、Secret sourceRef、DB migration、OTel `service.name`、public route/proxy 和 health/readiness 声明。
### 2.3 范围外
- Workbench session、turn、run、command、trace/result 执行事实归 [Agent编排](PJ2026-0102-agent-orchestration.md) 和 Workbench 相关规格。
- 用户身份、role、capability、tenant/project visibility、API key 和额度归 [用户管理](PJ2026-0105-user-management.md)。
- Cloud API 的同源 path、错误 envelope、鉴权主体和 DTO 稳定性归 [API契约](PJ2026-010403-api-contract.md)。
- Cloud Web Workbench 的 session hydrate、timeline、trace renderer、composer 和状态投影归 [Web工作台](PJ2026-010401-web-workbench.md)。
- CI/CD、GitOps、FRP/Caddy、Secret 下发、public URL、OTel/Prometheus 和 rollout 归 [平台运维](PJ2026-0106-platform-ops.md)。
- P0 不直接部署 OpenProject、Plane、Vikunja、Redmine、Taiga、Huly、Leantime 或其他完整 PM 套件。
- P0 不把 Markdown TODO 权威数据迁移到数据库,不让 Workbench 解析 Markdown,也不让项目管理页面嵌入 Workbench。
## 3. 术语表
| 术语 | 定义 |
| --- | --- |
| 项目管理 | HWLAB 登录后的项目、source、任务和 Workbench link 入口。 |
| `hwlab-project-management` | 独立项目管理微服务,拥有项目管理 API、source registry、MDTODO adapter 编排、DB 投影、Workbench link、audit/outbox 和外部 PM adapter 扩展点。 |
| ProjectSource | 项目任务来源,初始支持 `mdtodo`,后续可扩展到 `plane``vikunja``openproject` 等 adapter。 |
| ProjectRecord | HWLAB 项目摘要,包含 `projectId`、标题、默认 source、可见性和更新时间。 |
| MDTODO source | 指向一个受控 Markdown TODO 根目录或仓库视图的 ProjectSource。 |
| Markdown source-of-truth | MDTODO 的权威任务内容仍保存在 `.md` 文件中;DB 只保存可重建投影、link、audit/outbox。 |
| `taskRef` | 项目管理 API 返回的 opaque 任务引用,例如 `mdtodo:<sourceId>:<fileHash>#<taskId>`;只有项目管理服务和 adapter 能反解。 |
| ProjectTask | 从 source 投影出的任务 DTO,包含 `taskRef``projectId``sourceId`、title、status、父子关系、depth、linkCount 和更新时间。 |
| WorkbenchLaunchContext | 项目管理页面发给公共 Workbench Launch API 的脱敏上下文,包含 `sourceKind=project-management``projectId``taskRef`、title 摘要和 prompt template 标识。 |
| ProjectWorkbenchLink | `projectId/taskRef/sessionId/traceId` 的稳定关联记录,用于从任务回到 Workbench session 或从 Workbench 元数据看到来源。 |
| PM DB 投影 | 项目管理服务维护的 `project_sources``mdtodo_documents``mdtodo_task_projection``project_workbench_links``project_audit_events` 等可重建表。 |
| Cloud API route/auth bridge | Cloud API 中只负责同源路由、AuthPrincipal、错误 envelope 和转发的桥接层;不拥有项目管理持久化或 Markdown 解析。 |
| 项目管理 web-probe | 针对 `/projects``/projects/mdtodo``/v1/project-management/*` 的 observe/analyze 采样与分析能力,只观察公共页面和同源 API,不提供私有后门。 |
## 4. 系统边界和接口
本规格把项目管理作为客户端方向下的独立项目入口课题看待;本章只描述输入、输出和责任边界。
| 边界项 | 内容 |
| --- | --- |
| 外部使用者 | 硬件研发用户、平台管理员、需要从任务上下文启动 Workbench 的用户和自动化验收。 |
| 外部输入 | 浏览器导航、source/file/task 选择、任务状态修改请求、Workbench launch 请求、AuthPrincipal、项目可见性、Markdown source 和外部 PM adapter 事件。 |
| 受控资源 | `/projects``/projects/mdtodo``/v1/project-management/*``POST /v1/workbench/launches` 的项目上下文、MDTODO adapter、PM DB 投影、Workbench link、audit/outbox 和 web-probe artifact。 |
| 外部输出 | 项目列表、source 摘要、文件摘要、任务树、任务详情、taskRef、Workbench link 摘要、capability/blocker、错误诊断、observe/analyze 报告和部署健康。 |
| 用户接口 | Cloud Web 项目页面、同源 Project Management API、公共 Workbench Launch API、HWLAB CLI 同源 request 和 web-probe observe/analyze。 |
| 系统边界 | 项目管理负责项目/任务入口、source 投影和 Workbench link;不执行 Agent、不拥有 Workbench session lifecycle、不替代用户权限、不把 `.md` 转为 DB 权威,也不承担平台发布运维。 |
## 5. 内部分工与规格索引
| 编号 | 模块或课题 | 规格文档 | 主责边界 | 上游依赖 | 下游支撑 |
| --- | --- | --- | --- | --- | --- |
| PJ2026-01040401 | 项目根导航 | 本规格 6.1 | `/projects` 一级入口、项目列表、source 状态、capability/blocker | 用户管理、Project Management API、平台入口 | 登录后项目入口、MDTODO 页面 |
| PJ2026-01040402 | MDTODO 页面 | 本规格 6.2 | `/projects/mdtodo` source/file/task/taskRef/link/launch 展示 | Project Management API、MDTODO adapter、API契约 | 用户任务阅读和 Workbench 启动 |
| PJ2026-01040403 | 独立微服务 | 本规格 6.3 | `hwlab-project-management` API、source registry、DB 投影、audit/outbox、adapter 编排 | 用户管理、平台运维、API契约 | Cloud Web、CLI、web-probe |
| PJ2026-01040404 | MDTODO adapter 与存储 | 本规格 6.4 | Markdown source-of-truth、解析、文件锁、原子写入、投影重建 | MDTODO `.md` source、mdtodo parser/CLI/service | ProjectTask DTO、DB 投影 |
| PJ2026-01040405 | Workbench Link | 本规格 6.5 | 公共 launch context、link 表、ID 关联和解耦边界 | Workbench Launch API、Agent编排 | 项目任务到 Workbench session |
| PJ2026-01040406 | 外部 PM adapter | 本规格 6.6 | Plane/Vikunja/OpenProject 等未来 adapter 接口和隔离边界 | 外部 PM 服务、用户管理 | 后续完整 PM 能力 |
| PJ2026-01040407 | 观测与验收 | 本规格 6.7 | web-probe observe/analyze、DOM 脱敏、YAML-first 阈值和 issue-ready evidence | 平台运维、公开入口、Cloud Web | D601/v03 原入口验收 |
| PJ2026-01040408 | YAML-first 运行配置 | 本规格 6.8 | 独立服务部署、Secret sourceRef、DB/OTel/health/public route 配置 | YAML运维、平台发布 | D601/v03 rollout |
### 5.1 目标架构图
```mermaid
flowchart LR
subgraph Browser[Cloud Web]
Root[/projects/]
Mdtodo[/projects/mdtodo/]
end
subgraph Edge[Cloud API same-origin]
Bridge[route/auth bridge + HwlabErrorEnvelope]
Launch[POST /v1/workbench/launches]
end
subgraph PM[hwlab-project-management]
Api[Project Management API]
Source[ProjectSource Registry]
Projection[(PM DB read model)]
Links[(ProjectWorkbenchLink)]
Audit[(audit/outbox)]
Adapter[MDTODO Adapter]
end
subgraph Store[Task sources]
Markdown[(.md source-of-truth)]
External[Future PM adapters]
end
subgraph WB[Workbench]
Session[(Session/read model)]
Trace[(Trace/result projection)]
end
Root --> Bridge
Mdtodo --> Bridge
Bridge --> Api
Api --> Source
Api --> Projection
Api --> Links
Api --> Audit
Api --> Adapter
Adapter --> Markdown
Api -.future adapter.-> External
Mdtodo --> Launch
Launch --> Session
Launch --> Links
Session --> Trace
```
### 5.2 数据流图
```mermaid
flowchart TD
MD[Markdown TODO file] --> Parse[MDTODO adapter parse]
Parse --> Rev[MdtodoDocumentRevision]
Parse --> Task[MdtodoTaskProjection]
Task --> Api[GET /v1/project-management/mdtodo/tasks]
Api --> UI[/projects/mdtodo task tree]
UI --> Intent[WorkbenchLaunchContext]
Intent --> Launch[POST /v1/workbench/launches]
Launch --> Sess[Workbench sessionId]
Sess --> Link[ProjectWorkbenchLink]
Link --> LinkApi[GET /v1/project-management/workbench-links]
LinkApi --> UI
```
MDTODO `.md` 文件是任务正文的 source-of-truth。PM DB 投影只用于导航、检索、权限投影、Workbench link 和审计,可从 source 重建。写入路径必须是 Web mutation 到项目管理服务,再到 adapter 文件锁和原子写入,最后重建投影;前端不得直接 PUT raw MarkdownDB 投影不得绕过 adapter 反写文件。
### 5.3 Workbench 启动时序
```mermaid
sequenceDiagram
participant U as 用户
participant P as /projects/mdtodo
participant PM as Project Management API
participant W as Workbench Launch API
participant R as Workbench Read Model
U->>P: 选择 source/file/task
P->>PM: GET /v1/project-management/mdtodo/tasks
PM-->>P: ProjectTask DTO with taskRef
U->>P: 点击在 Workbench 执行
P->>W: POST /v1/workbench/launches {projectId, taskRef, launchContext}
W->>R: create/select session with project metadata
W->>PM: record ProjectWorkbenchLink
W-->>P: sessionId, workbenchUrl, linkId
P->>PM: GET workbench-links by taskRef
P->>U: router.push(workbenchUrl)
U->>R: /workbench/sessions/{sessionId}
R-->>U: session/messages/trace projection
```
Workbench 接收 `launchContext` 元数据,但不反解 `taskRef`、不读取 Markdown、不 import MDTODO 页面或 adapter。项目管理页面只拿到 `sessionId``workbenchUrl`,随后让 Workbench 自己按 session authority hydrate。
### 5.4 web-probe observe/analyze 流程
```mermaid
flowchart LR
Start[observe start --target-path /projects/mdtodo] --> Page[Project Management page]
Page --> Dom[DOM/testId/ARIA passive samples]
Page --> Net[Natural same-origin network]
Cmd[observe command select/launch/screenshot/mark] --> Page
Dom --> Art[(JSONL artifacts)]
Net --> Art
Cmd --> Art
Art --> Analyze[observe analyze page-kind project-management-mdtodo]
Analyze --> Report[analysis/report.md + report.json]
```
项目管理验收优先使用 `observe start``observe command``observe analyze``web-probe script` 只作为短 API matrix、截图补证或 observe command 尚未覆盖时的过渡手段,不能作为原入口 closeout 的唯一证据。
## 6. 原子需求
### 6.1 CLIENT-PM-REQ-001 项目根导航
| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| CLIENT-PM-REQ-001 | 项目根导航 | PJ2026-01040401 项目根导航 | [Web工作台](PJ2026-010401-web-workbench.md)、[用户管理](PJ2026-0105-user-management.md)、[平台运维](PJ2026-0106-platform-ops.md) |
项目管理应提供 Cloud Web 登录后一级“项目”导航和 `/projects` 根页面,使用户可以看到可见项目、source 状态、最近任务、最近 Workbench session link、capability 和 blocker。
项目根导航不得嵌入 Workbench,也不得以 Workbench session、workspace snapshot 或 localStorage 作为项目可见性 authority。项目列表和 source 状态只能来自同源 Project Management API 和当前 AuthPrincipal;未登录、无权限、source 不可用和 adapter parse 失败必须显示结构化 blocker。
### 6.2 CLIENT-PM-REQ-002 MDTODO 页面
| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| CLIENT-PM-REQ-002 | MDTODO页面 | PJ2026-01040402 MDTODO 页面 | [API契约](PJ2026-010403-api-contract.md)、[用户管理](PJ2026-0105-user-management.md) |
项目管理应提供 `/projects/mdtodo` 页面,使用户可以选择 MDTODO source、Markdown 文件摘要和任务树,查看任务 title、status、父子关系、link 摘要、capability/blocker 和稳定 `taskRef`
页面必须通过同源 `/v1/project-management/*` API 获取 DTO,不得直接访问 UniDesk microservice proxy、hostPath、SSH、Kubernetes、数据库、未声明内部 service URL 或 Markdown 文件系统。页面默认不得展示 host path、Secret、token、完整 raw Markdown、provider payload、DB DSN 或大段 stdout/stderr。
MDTODO 页面可以提供任务状态写入入口,但写入必须进入项目管理服务,再由 MDTODO adapter 使用文件锁和原子写入修改 `.md`,随后重建投影。前端不得直接上传或覆盖 raw Markdown。
### 6.3 CLIENT-PM-REQ-003 独立项目管理微服务
| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| CLIENT-PM-REQ-003 | 独立微服务 | PJ2026-01040403 独立微服务 | [API契约](PJ2026-010403-api-contract.md)、[用户管理](PJ2026-0105-user-management.md)、[平台运维](PJ2026-0106-platform-ops.md) |
项目管理后端必须作为独立 `hwlab-project-management` 微服务交付。该服务拥有 Project Management API、ProjectSource registry、MDTODO adapter 编排、PM DB read model、ProjectWorkbenchLink、audit/outbox、health/readiness、OTel `service.name` 和未来外部 PM adapter 扩展点。
Cloud API 只保留同源 route/proxy/auth bridge:负责 AuthPrincipal、route policy、错误 envelope、trace context 和转发,不拥有项目/任务持久化、Markdown 解析、外部 PM sync、Workbench link 表或 adapter 状态。即使 P0 只有只读 MDTODO 和 launch Workbench,也不得把实现先落到 `hwlab-cloud-api` 内部模块后再迁移。
新增或重构的项目管理源码文件头部必须标注 `SPEC: PJ2026-010404 项目管理 draft-2026-06-25-p0-project-management-mdtodo`,并简述文件职责。
### 6.4 CLIENT-PM-REQ-004 MDTODO adapter 与存储策略
| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| CLIENT-PM-REQ-004 | MDTODO存储 | PJ2026-01040404 MDTODO adapter 与存储 | 项目管理独立微服务、平台运维 |
MDTODO 的权威存储应保持为 `.md` 文件。项目管理 DB 只保存可重建投影、Workbench link、audit/outbox 和 source sync 状态,不成为 Markdown 任务正文的唯一真实来源。
PM DB 至少应能表达 `project_sources``mdtodo_documents``mdtodo_task_projection``project_workbench_links``project_audit_events` 或等价结构。`mdtodo_documents` 记录文件 fingerprint、mtime、lastIndexedAt、parseError 和 revision`mdtodo_task_projection` 记录 `taskRef`、title、status、parentTaskRef、depth、linkCount、updatedAt 和 source fingerprintlink 表记录 `projectId/taskRef/sessionId/traceId`
只有当多人实时协同编辑成为主需求、任务查询和权限规则复杂到 Markdown 投影无法支撑、外部 PM adapter 已经成为主写入源,并且具备可靠 Markdown export/import、审计、冲突解决和离线恢复方案时,才重新评估 DB 作为权威存储。
### 6.5 CLIENT-PM-REQ-005 Workbench Link 与解耦
| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| CLIENT-PM-REQ-005 | Workbench联动 | PJ2026-01040405 Workbench Link | [Web工作台](PJ2026-010401-web-workbench.md)、[API契约](PJ2026-010403-api-contract.md)、[Agent编排](PJ2026-0102-agent-orchestration.md) |
项目管理页面应通过公共 Workbench Launch API 启动 Workbench。请求只能携带 `projectId``taskRef``launchContext`、prompt template 或等价脱敏元数据;响应返回 `sessionId``workbenchUrl`、可选 `traceId/linkId` 和错误诊断。
Workbench 与项目管理必须互相解耦。项目管理页面不得 import `useWorkbenchStore``CodeWorkbenchView`、Workbench reducer、Trace renderer 私有模块或 session 内部状态;Workbench 模块不得 import MDTODO 页面、MDTODO adapter、Markdown parser 或 Project Management DB。两者不得通过 iframe、嵌套容器、localStorage、私有 service URL、数据库 join 或解析对方 ID 内部结构关联。
Workbench 可以保存和展示脱敏 `launchContext` 元数据,但 session、turn、message、trace 和 final response 的 authority 仍来自 Workbench durable projection。项目管理页面返回后通过 `GET /v1/project-management/workbench-links?taskRef=...` 读取 link 摘要,不从 Workbench 私有 store 反查。
### 6.6 CLIENT-PM-REQ-006 外部 PM adapter 边界
| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| CLIENT-PM-REQ-006 | 外部PM适配 | PJ2026-01040406 外部 PM adapter | 项目管理独立微服务、用户管理 |
项目管理应预留外部 PM adapter 边界,但 P0 不直接引入完整外部套件。Plane 可作为未来 work item 平台优先候选,Vikunja 可作为任务/todo 后端优先候选,OpenProject/Redmine/Taiga/Huly/Leantime 仅作为后续 adapter 评估对象。
外部 PM adapter 必须通过 ProjectSource 和 ProjectTask DTO 进入项目管理服务,不得替换 HWLAB 项目管理 API,也不得让 Cloud Web 直接调用外部系统 UI/API 成为第二入口。外部服务的授权、同步、冲突、审计和脱敏策略必须先落入项目管理服务边界,再暴露给 Web 和 CLI。
### 6.7 CLIENT-PM-REQ-007 web-probe observe/analyze
| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| CLIENT-PM-REQ-007 | 观测验收 | PJ2026-01040407 观测与验收 | [Web工作台](PJ2026-010401-web-workbench.md)、[平台运维](PJ2026-0106-platform-ops.md) |
项目管理页面必须支持 web-probe observe/analyze 原入口验收。`web-probe observe start --target-path /projects/mdtodo` 应能在 selected Web origin 采样项目管理页面,并通过 `observe analyze` 输出 issue-ready evidenceobserver id、stateDir、report SHA、screenshot SHA、page-kind 摘要、DOM 摘要、自然同源 API timing 和 findings。
采样器应优先观察自然页面行为:`/auth/session``/v1/project-management/navigation``/v1/project-management/projects``/v1/project-management/mdtodo/sources``/v1/project-management/mdtodo/files``/v1/project-management/mdtodo/tasks``/v1/project-management/workbench-links``POST /v1/workbench/launches``script` 只允许作为短 API matrix、截图或 observe command 缺口补证;阶段 closeout 不得仅凭 script 通过。
项目管理页面应提供稳定 `data-testid` 或 ARIA 语义,覆盖项目导航、source 列表、file 列表、任务树、任务详情、selected task、Workbench launch 按钮、link 摘要、capability/blocker、empty/error/loading 状态。采样结果只保存 count、status、opaque id、hash/preview 和脱敏摘要,不保存 raw Markdown、host path、Secret、完整 prompt 或 provider payload。
`observe command` 后续应支持 `selectProjectSource``selectMdtodoFile``selectMdtodoTask``launchWorkbenchFromTask` 等受控动作。动作必须通过页面 UI 或正式公共 API 触发,进入 `control.jsonl`,并在 `observe analyze` 中关联动作前后的 DOM/API/link 投影变化;不得调用私有 service URL、localStorage、Kubernetes、数据库或测试后门。
项目管理 analyzer 应输出 `project-management-*``mdtodo-*``workbench-launch-*` 前缀 findings,避免在非 Workbench 页面误报 Workbench session/trace 专属 finding。
### 6.8 CLIENT-PM-REQ-008 YAML-first 运行配置
| 编号 | 短名 | 主责模块 | 关联模块 |
| --- | --- | --- | --- |
| CLIENT-PM-REQ-008 | YAML运行配置 | PJ2026-01040408 YAML-first 运行配置 | [YAML运维](PJ2026-010603-yaml-first-ops.md)、[平台运维](PJ2026-0106-platform-ops.md) |
`hwlab-project-management` 的运行面配置必须走 YAML-first。D601/v03 部署应在 node/lane YAML 中声明 serviceId、namespace、image/source truth、Service/Deployment、DB migration/read model、Secret sourceRef、targetKey、OTel `service.name`、health/readiness、NetworkPolicy、Cloud API route/proxy 和 public exposure 关联。
项目管理 web-probe target、readiness selector、自然请求 path group、DOM redaction allowlist、project command allowlist、loading/API 阈值和 slow path budget 也必须由受控 YAML 配置进入运行面,不得写在 probe 脚本、Cloud Web、项目管理服务或一次性 shell 中作为隐藏默认。
Secret、DB DSN、provider token、session token、API key、host path 和 raw Markdown 内容不得出现在默认 CLI 输出、probe 报告、日志或错误 envelope 中。输出只披露对象名、key 名、sourceRef、presence、fingerprint、hash、字节数和 `valuesRedacted=true` 摘要。
## 7. 过程控制
本规格的阶段活动由架构治理 issue [#2123](https://github.com/pikasTech/HWLAB/issues/2123) 拆分跟踪:
| 阶段 | 跟踪 issue | 完成口径 |
| --- | --- | --- |
| P0 SPEC 先行 | [#2133](https://github.com/pikasTech/HWLAB/issues/2133) | 本规格与客户端/Web/API 交叉引用合并到 UniDesk master。 |
| P1 独立项目管理微服务 | [#2134](https://github.com/pikasTech/HWLAB/issues/2134) | D601/v03 有独立 `hwlab-project-management` 服务、API、DB 投影和 health/readiness。 |
| P2 项目根导航与 MDTODO 页面 | [#2135](https://github.com/pikasTech/HWLAB/issues/2135) | `/projects``/projects/mdtodo` 可通过同源 API 展示项目、source、file、task 和 blocker。 |
| P3 Workbench Launch 与 Link 投影 | [#2136](https://github.com/pikasTech/HWLAB/issues/2136) | 任务一键启动 Workbench`projectId/taskRef/sessionId/traceId` link 可双向读取且模块解耦。 |
| P4 web-probe observe/analyze 项目管理支持 | [#2137](https://github.com/pikasTech/HWLAB/issues/2137) | observe/analyze 输出项目管理 page-kind evidencescript 仅为补证。 |
| P5 D601 YAML-first 部署与原入口验收 | [#2138](https://github.com/pikasTech/HWLAB/issues/2138) | D601/v03 selected origin 原入口通过 observe/analyze 完成 `/projects/mdtodo` 到 Workbench launch 验收。 |
P0 SPEC 完成前不得进入项目管理代码实现。每个阶段独立 PR 跟踪;PR 合并后必须把 PR、commit、observe/analyze 报告或原入口证据回写到对应阶段 issue 和 [#2123](https://github.com/pikasTech/HWLAB/issues/2123)。