docs(P20T1-5): 差旅边界事件矩阵与校验器收口

这个提交包含在:
2026-03-10 19:58:46 +08:00
父节点 6d13047dcb
当前提交 e7c30ce5a6
共修改 4 个文件,包含 66 行新增和 26 行删除
+17 -2
查看文件
@@ -1,7 +1,7 @@
# 领域事件清单(P19 / P19+IM-1 / P19+ERP-3 / P19+AI-1)
# 领域事件清单(P19 / P19+IM-1 / P19+ERP-3 / P19+AI-1 / P20+TRAVEL-1)
**快照日期**:2026-03-10
**目标**:冻结 `hyb-oa` 当前采购与资产域的标准领域事件名,并补充 `P19+IM-1` 已实际消费的 IM 通知类型清单,以及 `P19+ERP-1 / ERP-3 / AI-1` 已实际落地的消费映射,作为后续 ERP / IM / AI 适配的事实源。
**目标**:冻结 `hyb-oa` 当前采购、资产与差旅域的标准领域事件名,并补充 `P19+IM-1` 已实际消费的 IM 通知类型清单,以及 `P19+ERP-1 / ERP-3 / AI-1 / TRAVEL-1` 已实际落地的消费映射,作为后续 ERP / IM / AI / TRAVEL 适配的事实源。
## 1. 使用原则
- 本文档同时维护两类事实:
@@ -18,6 +18,10 @@
| `purchase_request.approved` | 采购申请审批通过后 | `purchase_request` | `purchaseRequestId`, `requestNo`, `approvedBy`, `legalEntityId`, `costCenterId`, `supplierId`, `budgetPoolId`, `totalAmount`, `status` | ERP、IM、AI | 对应预算 `confirm` 已完成 |
| `purchase_request.rejected` | 采购申请审批驳回后 | `purchase_request` | `purchaseRequestId`, `requestNo`, `actorId`, `reason`, `status` | IM、AI | 若存在预算预留,应已释放 |
| `purchase_request.withdrawn` | 申请人撤回采购申请后 | `purchase_request` | `purchaseRequestId`, `requestNo`, `actorId`, `status` | IM、AI、ERP 补偿 | 表示由 `reviewing` 回到 `draft` |
| `travel_request.submitted` | 差旅申请提交成功后 | `travel_request` | `travelRequestId`, `requestNo`, `applicantEmployeeId`, `departmentId`, `legalEntityId`, `costCenterId`, `budgetPoolId`, `estimatedAmount`, `tripType`, `status` | IM、Budget、TRAVEL-2/3 | 表示进入 `reviewing` 且预算尝试 `reserve` |
| `travel_request.approved` | 差旅申请审批通过后 | `travel_request` | `travelRequestId`, `requestNo`, `approvedBy`, `legalEntityId`, `costCenterId`, `budgetPoolId`, `estimatedAmount`, `tripType`, `status` | IM、Budget、TRAVEL-2/3 | 对应预算 `confirm` 已完成;TRAVEL-1 不做 ERP 出站 |
| `travel_request.rejected` | 差旅申请审批驳回后 | `travel_request` | `travelRequestId`, `requestNo`, `actorId`, `reason`, `status` | IM、Budget、AI | 若存在预算预留,应已释放 |
| `travel_request.withdrawn` | 申请人撤回差旅申请后 | `travel_request` | `travelRequestId`, `requestNo`, `actorId`, `status` | Budget、AI、TRAVEL-2/3 | 动作结果固定回到 `draft`,不是持久状态 |
| `purchase_order.archived` | PO/合同归档保存成功后 | `purchase_order_archive` | `purchaseOrderArchiveId`, `purchaseRequestId`, `requestNo`, `poNo`, `contractNo`, `archivedAt`, `totalAmount` | ERP、AI | ERP-2 以此驱动 accrual journal 与 archive summary |
| `asset.card.created` | 资产卡片创建成功后 | `asset_card` | `assetId`, `assetNo`, `name`, `categoryId`, `legalEntityId`, `costCenterId`, `purchaseRequestId`, `status` | ERP、IM、AI | 资产域不接 workflow |
| `asset.assigned` | 资产领用成功后 | `asset_card` | `assetId`, `assetNo`, `employeeId`, `assignedAt`, `location`, `status` | IM、AI | 对应新增 open assignment |
@@ -30,6 +34,7 @@
| entityType | 推荐事件前缀 | 当前事实源 |
| --- | --- | --- |
| `purchase_request` | `purchase_request.*` | `P17A` / `P17B` |
| `travel_request` | `travel_request.*` | `P20+TRAVEL-1` |
| `purchase_order_archive` | `purchase_order.*` | `P17B` / `P19+ERP-2` |
| `asset_card` | `asset.*` | `P18A` / `P18B` |
| `inventory_check` | `inventory_check.*` | `P18B` |
@@ -81,6 +86,8 @@
| `leave.rejected` | 请假驳回 | `leave_request` | `/leave-requests` | 结果通知 |
| `purchase_request.approved` | 采购审批通过 | `purchase_request` | `/purchase-requests` | 结果通知 |
| `purchase_request.rejected` | 采购驳回 | `purchase_request` | `/purchase-requests` | 结果通知 |
| `travel_request.approved` | 差旅审批通过 | `travel_request` | `/travel-requests?id=<id>` | 结果通知 |
| `travel_request.rejected` | 差旅审批驳回 | `travel_request` | `/travel-requests?id=<id>` | 结果通知 |
| `asset.assigned` | 资产领用成功 | `asset_card` | `/assets` | 通知新领用人 |
| `asset.returned` | 资产归还成功 | `asset_card` | `/assets` | 通知原持有人 |
| `asset.transferred` | 资产调拨成功 | `asset_card` | `/assets` | 通知归属变更涉及人员 |
@@ -89,6 +96,8 @@
## 9. 当前仍未接入 IM 的冻结事件
- `purchase_request.submitted`
- `purchase_request.withdrawn`
- `travel_request.submitted`
- `travel_request.withdrawn`
- `inventory_check.started`
这些事件名称仍保留在长期蓝图中,但不属于 `P19+IM-1` 的首批协同覆盖范围。
@@ -111,3 +120,9 @@
- 报销详情 AI 建议消费的事实锚点为 `reimbursement_form` 当前详情、预算提示与待办节点;采购详情 AI 建议消费 `purchase_request` 当前详情、归档摘要与资产候选信息;资产详情 AI 建议消费 `asset_card` 当前卡片摘要与财务维度信息。
- AI 一期的三条建议接口均采用白名单快照,不提升为长期公共事件,也不改变 `asset.card.created`、`purchase_request.*`、`purchase_order.archived` 等既有事件名的稳定性承诺。
- AI 输出仅形成 `summary / riskHints / nextActions` 结构化建议,并通过审计动作 `AI_SUGGESTION_REQUESTED` 记录请求摘要;不写库、不派发 Outbox、不回写业务状态。
## 12. P20+TRAVEL-1 已实现消费说明
- `P20+TRAVEL-1` 新增稳定事件名 `travel_request.submitted`、`travel_request.approved`、`travel_request.rejected`、`travel_request.withdrawn`,用于冻结差旅申请一期的业务事实边界。
- 差旅一期运行时会在 `travel_request.submitted` 时创建 workflow 实例、分派 `workflow.task_assigned` 待办,并按预算池解析结果尝试 `reserve`;`travel_request.approved` / `travel_request.rejected` 则分别驱动预算 `confirm` / `release`。
- 当前 IM 已实际消费差旅审批结果通知 `travel_request.approved` 与 `travel_request.rejected`;`travel_request.submitted` 与 `travel_request.withdrawn` 仍作为稳定领域事实保留,不额外新增结果类通知。
- `travel_order.imported` 在 `TRAVEL-1` 当前仍只作为内部集成事实和入站表更新使用,不提升为稳定公共事件,也不在本表作为长期承诺事件名登记。
+11 -3
查看文件
@@ -1,8 +1,8 @@
# hyb-oa 实现状态矩阵(P5-P19+IM-1+ERP-3+R10+MCP-1+AI-1)
# hyb-oa 实现状态矩阵(P5-P19+IM-1+ERP-3+R10+MCP-1+AI-1+TRAVEL-1)
**快照日期**:2026-03-10
**范围**:`F1-F42`(含 `F19b/F19c/F19d`)+ `R1-S2` + `P9A1-P9D1` + `P10E1-P10G1` + `G0-G6` + `H1` + `M1-M4` + `P13-0-P13-8` + `P14-0-P14-8` + `P15A-0-P15A-5` + `P15B-0-P15B-6` + `P16A-0-P16A-6` + `P16B-0-P16B-6` + `P16C-0-P16C-6` + `R9-0-R9-3` + `G2-0-G2-6` + `P17A-0-P17A-6` + `P17B-0-P17B-6` + `P18A-0-P18A-6` + `P18B-0-P18B-6` + `P19-0-P19-6` + `P19IM1-0-P19IM1-6` + `P19ERP1-0-P19ERP1-6` + `P19ERP2-0-P19ERP2-6` + `P19ERP3-0-P19ERP3-6` + `R10-0-R10-4` + `P19MCP1-0-P19MCP1-4` + `P19AI1-0-P19AI1-5`,共 236 项。
**事实源**:`issues/2026-02-09_13-39-02-p5-blueprint-v3.csv` + `issues/2026-02-09_23-30-00-p6-p8-remaining-work-master.csv` + `issues/2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv` + `issues/2026-02-10_10-35-30-p10-production-hardening.csv` + `issues/2026-02-11-p11-p12-governance-mobile.csv` + `issues/2026-02-12_01-09-41-p13-l5-governance.csv` + `issues/2026-02-13_00-11-56-p14-l5-operationalization.csv` + `issues/2026-03-06_14-30-00-p15a-l5-permission-decouple.csv` + `issues/2026-03-06_14-30-00-p15b-l5-leave-v1.csv` + `issues/2026-03-07_13-47-05-p16a-l5-master-data-core.csv` + `issues/2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv` + `issues/2026-03-07_17-14-39-p16c-l5-suppliers.csv` + `issues/2026-03-07_18-15-03-r9-g2-p19-roadmap-refresh.csv` + `issues/2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv` + `issues/2026-03-07_19-33-09-p17a-l5-procurement-core.csv` + `issues/2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv` + `issues/2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv` + `issues/2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv` + `issues/2026-03-07_23-22-00-p19-l4-integration-readiness.csv` + `issues/2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv` + `issues/2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv` + `issues/2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv` + `issues/2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv` + `issues/2026-03-09_10-15-00-r10-post-erp3-roadmap-refresh.csv` + `issues/2026-03-09_10-25-00-p19-mcp-1-l4-readonly-tools-baseline.csv` + `issues/2026-03-10_12-54-30-p19-ai-1-l5-suggestion-workbench-refresh.csv`(执行合同)
**范围**:`F1-F42`(含 `F19b/F19c/F19d`)+ `R1-S2` + `P9A1-P9D1` + `P10E1-P10G1` + `G0-G6` + `H1` + `M1-M4` + `P13-0-P13-8` + `P14-0-P14-8` + `P15A-0-P15A-5` + `P15B-0-P15B-6` + `P16A-0-P16A-6` + `P16B-0-P16B-6` + `P16C-0-P16C-6` + `R9-0-R9-3` + `G2-0-G2-6` + `P17A-0-P17A-6` + `P17B-0-P17B-6` + `P18A-0-P18A-6` + `P18B-0-P18B-6` + `P19-0-P19-6` + `P19IM1-0-P19IM1-6` + `P19ERP1-0-P19ERP1-6` + `P19ERP2-0-P19ERP2-6` + `P19ERP3-0-P19ERP3-6` + `R10-0-R10-4` + `P19MCP1-0-P19MCP1-4` + `P19AI1-0-P19AI1-5` + `P20TRAVEL1-0-P20TRAVEL1-5`,共 242 项。
**事实源**:`issues/2026-02-09_13-39-02-p5-blueprint-v3.csv` + `issues/2026-02-09_23-30-00-p6-p8-remaining-work-master.csv` + `issues/2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv` + `issues/2026-02-10_10-35-30-p10-production-hardening.csv` + `issues/2026-02-11-p11-p12-governance-mobile.csv` + `issues/2026-02-12_01-09-41-p13-l5-governance.csv` + `issues/2026-02-13_00-11-56-p14-l5-operationalization.csv` + `issues/2026-03-06_14-30-00-p15a-l5-permission-decouple.csv` + `issues/2026-03-06_14-30-00-p15b-l5-leave-v1.csv` + `issues/2026-03-07_13-47-05-p16a-l5-master-data-core.csv` + `issues/2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv` + `issues/2026-03-07_17-14-39-p16c-l5-suppliers.csv` + `issues/2026-03-07_18-15-03-r9-g2-p19-roadmap-refresh.csv` + `issues/2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv` + `issues/2026-03-07_19-33-09-p17a-l5-procurement-core.csv` + `issues/2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv` + `issues/2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv` + `issues/2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv` + `issues/2026-03-07_23-22-00-p19-l4-integration-readiness.csv` + `issues/2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv` + `issues/2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv` + `issues/2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv` + `issues/2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv` + `issues/2026-03-09_10-15-00-r10-post-erp3-roadmap-refresh.csv` + `issues/2026-03-09_10-25-00-p19-mcp-1-l4-readonly-tools-baseline.csv` + `issues/2026-03-10_12-54-30-p19-ai-1-l5-suggestion-workbench-refresh.csv` + `issues/2026-03-10_17-32-21-p20-travel-1-l5-request-intake-refresh.csv`(执行合同)
**说明**:
- 本矩阵用于全局读图(审计/交接/回归覆盖追踪),不替代 `issues/*.csv` 的执行合同职责。
@@ -273,3 +273,11 @@
| P19AI1-3 | 详情页AI建议卡片 | N/A | 2026-03-09_10-35-00-p19-ai-1-l5-suggestion-workbench.csv | 2026-03-10_12-54-30-p19-ai-1-l5-suggestion-workbench-refresh.csv | 2026-03-10 | DONE | client:typecheck/build | 在报销详情、采购详情、资产详情挂载 AI 建议卡片,权限不足或 AI 关闭时不显示,失败仅卡片内降级 |
| P19AI1-4 | AI文档事件与矩阵同步 | N/A | 2026-03-09_10-35-00-p19-ai-1-l5-suggestion-workbench.csv | 2026-03-10_12-54-30-p19-ai-1-l5-suggestion-workbench-refresh.csv | 2026-03-10 | DONE | validate-feature-matrix | 集成边界、领域事件、Feature Matrix 与事实源校验器同步收口到 `P5-P19+IM-1+ERP-3+R10+MCP-1+AI-1` |
| P19AI1-5 | P19AI1回归与验收收口 | N/A | 2026-03-09_10-35-00-p19-ai-1-l5-suggestion-workbench.csv | 2026-03-10_12-54-30-p19-ai-1-l5-suggestion-workbench-refresh.csv | 2026-03-10 | DONE | server:test + client:typecheck/build + validate-feature-matrix | AI provider、权限门禁、详情卡片、降级容错与既有主流程回归通过,`P19` 主线至此收口 |
| P20TRAVEL1-0 | P20TRAVEL1执行合同刷新建档 | N/A | 2026-03-09_10-45-00-p20-travel-1-l5-request-intake.csv | 2026-03-10_17-32-21-p20-travel-1-l5-request-intake-refresh.csv | 2026-03-10 | DONE | CSV 校验 | 以 superseding CSV 刷新 TRAVEL-1 执行合同,冻结独立 `travel.*` 权限、预算语义与非 ERP 边界 |
| P20TRAVEL1-1 | 差旅模型权限与seed基线 | N/A | 2026-03-09_10-45-00-p20-travel-1-l5-request-intake.csv | 2026-03-10_17-32-21-p20-travel-1-l5-request-intake-refresh.csv | 2026-03-10 | DONE | server:prisma-validate + server:test | 新增 `TravelRequest`、`TravelRequestSegment`、`travel_orders.travel_request_id`、`travel.*` 权限、差旅单号配置与默认单层审批 seed |
| P20TRAVEL1-2 | 差旅申请接口工作流与预算语义 | N/A | 2026-03-09_10-45-00-p20-travel-1-l5-request-intake.csv | 2026-03-10_17-32-21-p20-travel-1-l5-request-intake-refresh.csv | 2026-03-10 | DONE | server:test | 实现差旅申请 CRUD、提交 / 撤回、workflow travel 分支、预算 reserve/confirm/release 与 `travel_orders` 关联导入,不触发 ERP 出站 |
| P20TRAVEL1-3 | 差旅前端入口详情与待办联动 | N/A | 2026-03-09_10-45-00-p20-travel-1-l5-request-intake.csv | 2026-03-10_17-32-21-p20-travel-1-l5-request-intake-refresh.csv | 2026-03-10 | DONE | client:typecheck/build | 新增 `/travel-requests` 列表+详情页,支持创建 / 编辑 / 提交 / 撤回,并打通待办、移动审批、导航与通知深链 |
| P20TRAVEL1-4 | 差旅事件边界与矩阵同步 | N/A | 2026-03-09_10-45-00-p20-travel-1-l5-request-intake.csv | 2026-03-10_17-32-21-p20-travel-1-l5-request-intake-refresh.csv | 2026-03-10 | DONE | validate-feature-matrix | 集成边界、领域事件、Feature Matrix 与事实源校验器同步收口,明确 `TRAVEL-1` 不做 ERP / 供应商 API / 对公支付 |
| P20TRAVEL1-5 | P20TRAVEL1回归与验收收口 | N/A | 2026-03-09_10-45-00-p20-travel-1-l5-request-intake.csv | 2026-03-10_17-32-21-p20-travel-1-l5-request-intake-refresh.csv | 2026-03-10 | DONE | server:test + client:typecheck/build + validate-feature-matrix | 差旅 happy path、权限边界、预算释放、订单关联与既有 IM / ERP / AI / 采购 / 资产主流程回归全部通过 |
+37 -21
查看文件
@@ -1,8 +1,8 @@
# 集成边界冻结(P19 / P19+IM-1 / P19+ERP-3 / R10 / P19+MCP-1 / P19+AI-1)
# 集成边界冻结(P19 / P19+IM-1 / P19+ERP-3 / R10 / P19+MCP-1 / P19+AI-1 / P20+TRAVEL-1)
**快照日期**:2026-03-10
**当前基线**:`P19+IM-1`、`P19+ERP-1`、`P19+ERP-2`、`P19+ERP-3`、`P19+MCP-1` 与 `P19+AI-1` 已完成;当前运行时已落地企微群机器人 + 深链 + Outbox 异步派发的一期协同适配,以及 ERP 主数据 Pull、报销付款凭证切片、采购双阶段 journal / 归档摘要出站、资产台账摘要出站、Postgres MCP 只读工具基线与报销 / 采购 / 资产详情页 AI 只读建议挂件。
**目标**:在保持核心域稳定的前提下,冻结 ERP / IM / AI / MCP 的长期边界,并记录 IM 一期与 ERP 三期的已实现范围、禁入规则以及 R10 之后的固定主线顺序。
**当前基线**:`P19+IM-1`、`P19+ERP-1`、`P19+ERP-2`、`P19+ERP-3`、`P19+MCP-1`、`P19+AI-1` 与 `P20+TRAVEL-1` 已完成;当前运行时已落地企微群机器人 + 深链 + Outbox 异步派发的一期协同适配,以及 ERP 主数据 Pull、报销付款凭证切片、采购双阶段 journal / 归档摘要出站、资产台账摘要出站、Postgres MCP 只读工具基线、报销 / 采购 / 资产详情页 AI 只读建议挂件,以及差旅申请主单 / 行程段 / 审批预算锁定 / `travel_orders` 关联入站的一期差旅基线。
**目标**:在保持核心域稳定的前提下,冻结 ERP / IM / AI / MCP / TRAVEL 的长期边界,并记录 IM 一期、ERP 三期、AI 一期与差旅一期的已实现范围、禁入规则以及 R10 之后的固定主线顺序。
## 1. 总体原则
@@ -142,9 +142,24 @@
- 已在报销详情、采购详情、资产详情挂载 AI 建议卡片;当权限不足、总闸关闭、feature flag 未命中、上游超时或响应非法时,仅在卡片内降级展示,不影响主体页面渲染与业务动作。
- 已固定审计动作 `AI_SUGGESTION_REQUESTED`,仅记录 `targetType / targetId / provider / model / promptHash / tokenUsage / featureFlag`,不记录原始 prompt、脱敏前 payload 或上游全文。
## 5. 事件与通知交付规范
## 5. 差旅一期边界
### 5.1 事件最小结构
### 5.1 P20+TRAVEL-1 已实现范围
- 已新增 `TravelRequest`、`TravelRequestSegment` 与 `travel_orders.travel_request_id`,形成“差旅申请主单 + 行程段明细 + 外部订单事实关联”的一期差旅模型。
- 已固定独立 `travel.*` 权限命名空间,并将 `travel_request` 纳入工作流实体映射、待办页、移动审批与通知深链 `/travel-requests?id=<id>`。
- 已固定差旅一期持久状态仅 `draft / reviewing / approved / rejected`;`return` 与 `withdraw` 均回到 `draft`,释放预算并允许修改后重提。
- 已复用预算三段语义:提交 `reserve`、审批通过 `confirm`、驳回 / 退回 / 撤回 `release`;预算池由 `legal_entity_id + cost_center_id + start_date` 自动解析。
- 已固定一期工作流为直属经理单层审批,并把审批通过 / 驳回结果分别映射到 `travel_request.approved`、`travel_request.rejected` 通知类型。
### 5.2 差旅一期明确不做
- 不创建 `travel_request_commitment` journal,不写 `IntegrationOutbox`,不提前进入 `erp.travel.export`。
- 不接真实票务 / 酒店 / 商旅供应商 API,不做自动出票、改签、退票。
- 不做企业卡授权、交易导入、对公支付与清结算,这些能力继续固定在 `P20+TRAVEL-2` / `P20+TRAVEL-3`。
- `travel_order.imported` 当前仍只是内部集成事实与入站表更新,不提升为稳定公共事件名。
## 6. 事件与通知交付规范
### 6.1 事件最小结构
后续若继续扩展领域事件 / Outbox,建议统一包含:
- `eventName`
- `eventId`
@@ -155,72 +170,73 @@
- `payloadVersion`
- `payload`
### 5.2 幂等要求
### 6.2 幂等要求
- 同一 `eventId` 必须可安全重放。
- 消费端必须以 `eventId` 或 `entityId + status / version` 方式做幂等。
- 不允许消费端以“收到多次事件”为理由修改核心业务状态。
### 5.3 当前 IM 一期实现说明
### 6.3 当前 IM 一期实现说明
- 运行时仍以通知类型驱动 IM 入队,而不是直接暴露新的领域事件名。
- `notification.im` 的 `dedupeKey` 固定为:
- `${notificationType}:${targetType}:${targetId || targetPath}:${channelId}`
- IM 失败仅影响 Outbox 状态,不回滚业务事务。
## 6. MCP 基线
## 7. MCP 基线
### 6.1 P19+MCP-1 已实现范围
### 7.1 P19+MCP-1 已实现范围
- 已新增 `docs/mcp-tools.md`,作为项目级 MCP 工具目录与使用边界事实源。
- 已新增 `.mcp.json.example`,仅提供 `postgres` 只读示例配置,不提交任何真实密钥、PAT 或数据库连接串。
- 已新增 `scripts/validate-mcp-tools.py`,用于校验工具目录、示例配置与 `AGENTS.md` 引用关系。
- 已明确当前 shell 中 `codex mcp list --json` 不可作为唯一事实源,因此工具目录固定以官方 package 文档、执行合同与仓库校验脚本共同收口。
### 6.2 当前允许的 MCP 范围
### 7.2 当前允许的 MCP 范围
- `postgres MCP`:当前唯一允许启用的 MCP server,用于只读排障、迁移核对、账本核对。
- `postgres:query`:固定用于只读 SQL 查询;所有查询必须处于 `READ ONLY` 事务语义下。
- schema resources:允许读取表结构、字段类型与 schema 元数据,不得反向修改业务数据。
### 6.3 Deferred candidate
### 7.3 Deferred candidate
- `github MCP`:当前仅记录为 deferred candidate,不纳入 enabled servers。
- 原因:官方 GitHub MCP server 当前暴露读写混合工具集,不满足 `Read-only Tools Baseline`。
- 若未来需要启用,必须通过新的路线合同显式解锁,并单独治理最小权限 PAT、读写边界与回滚策略。
### 6.4 禁止事项
### 7.4 禁止事项
- 禁止提交真实 `.mcp.json`、真实数据库连接串、PAT、API Token 或其他密钥。
- 禁止在没有 `docs/mcp-tools.md` 的前提下默认启用 MCP。
- 禁止用 MCP 绕过仓库内已存在的本地验证命令。
- 禁止将 MCP 用作写生产数据或修改业务状态的通道。
## 7. 当前阶段明确不做
## 8. 当前阶段明确不做
- 不新增新的集成总线表结构
- 不接入 ERP 真实写回逻辑
- 不接入飞书 / 钉钉真实生产推送
- 不新增 AI 写库动作
- 不引入绕过工作流与权限体系的外部回调路径
## 8. R10 后续路线冻结
## 9. R10 后续路线冻结
### 8.1 固定主线顺序
- `R10` 之后的固定主线顺序为:`P19+MCP-1 -> P19+AI-1 -> P20+TRAVEL-1 -> P20+TRAVEL-2 -> P20+TRAVEL-3 -> P21+PWA-1 -> P21+PWA-2`。
### 9.1 固定主线顺序
- `P20+TRAVEL-1` 已完成后,当前固定后续主线顺序为:`P20+TRAVEL-2 -> P20+TRAVEL-3 -> P21+PWA-1 -> P21+PWA-2`。
- 历史主线顺序仍保持:`P19+MCP-1 -> P19+AI-1 -> P20+TRAVEL-1 -> P20+TRAVEL-2 -> P20+TRAVEL-3 -> P21+PWA-1 -> P21+PWA-2`。
- 后续阶段继续遵循“先治理,再工具,再建议,再业务,再移动”的总顺序,不并行开启两个重业务 phase。
- 每个 phase 固定遵循:`执行合同 CSV -> 方案批准 -> 开发 -> 测试 -> 文档矩阵收口 -> 合并 main`。
### 8.2 MCP / AI 前置关系
### 9.2 MCP / AI 前置关系
- `P19+MCP-1` 已完成,并已把 `docs/mcp-tools.md`、`.mcp.json.example` 与 MCP 校验脚本固化为仓库治理基线。
- 当前唯一允许启用的 MCP server 为 `postgres`;`github` 继续保持 deferred,不进入 enabled servers。
- `P19+AI-1` 已在 `P19+MCP-1` 之后完成落地,并继续遵守“AI 只做建议,不直接写库”的硬边界。
- 当前 AI 一期已覆盖采购、报销、资产详情的只读建议工作台;自由聊天、自动审批与 agent 自治仍明确不做。
### 8.3 差旅统付主线
- `P20+TRAVEL-1` 固定负责差旅申请、行程段与 `travel_orders` 入站整合,作为对公统付的前置主数据与流程基线。
### 9.3 差旅统付主线
- `P20+TRAVEL-1` 已完成差旅申请、行程段、审批预算与 `travel_orders` 入站整合,作为对公统付的前置流程基线。
- `P20+TRAVEL-2` 固定采用企业卡 / 虚拟卡授权与交易导入路线,优先复用 `docs/adr/adr-enterprise-card-control.md` 的既有结论。
- `P20+TRAVEL-3` 固定负责核销闭环与 ERP / AP 摘要桥接;个人垫资报销继续与对公统付并存,不互相替代。
### 8.4 PWA 兑现顺序
### 9.4 PWA 兑现顺序
- `P21+PWA-1` 固定先做移动资产扫码与盘点增强,优先兑现一线资产作业的生产价值。
- `P21+PWA-2` 固定后做离线动作队列与企微深链增强,继续复用现有 `APP_ORIGIN + targetPath` 深链规范。
- PWA 路线继续限定在浏览器 / PWA 栈内,不引入原生 App、小程序或双栈移动壳。
### 8.5 后置 backlog
### 9.5 后置 backlog
- `P19+IM-2 / IM-3 / IM-4`、`P22+VEH-1`、`P22+ASSET-FIN-1` 明确列为后置 backlog,本轮不进入主线。
- 这些方向只保留“触发条件 / 进入时机”的规划地位,不提前写入已完成矩阵或事实源校验器。
- 若后续优先级发生变化,必须通过新的路线合同显式改序,不直接口头跳 phase。
+1
查看文件
@@ -45,6 +45,7 @@ CSV_FACT_SOURCES = [
ROOT / "issues" / "2026-03-09_10-15-00-r10-post-erp3-roadmap-refresh.csv",
ROOT / "issues" / "2026-03-09_10-25-00-p19-mcp-1-l4-readonly-tools-baseline.csv",
ROOT / "issues" / "2026-03-10_12-54-30-p19-ai-1-l5-suggestion-workbench-refresh.csv",
ROOT / "issues" / "2026-03-10_17-32-21-p20-travel-1-l5-request-intake-refresh.csv",
]
ID_PATTERN = re.compile(r"^[A-Z][0-9][0-9A-Za-z-]*$")