From e7c30ce5a6292127c0faee59843c9fdf5df5b529 Mon Sep 17 00:00:00 2001 From: shunli Date: Tue, 10 Mar 2026 19:58:46 +0800 Subject: [PATCH] =?UTF-8?q?docs(P20T1-5):=20=E5=B7=AE=E6=97=85=E8=BE=B9?= =?UTF-8?q?=E7=95=8C=E4=BA=8B=E4=BB=B6=E7=9F=A9=E9=98=B5=E4=B8=8E=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E5=99=A8=E6=94=B6=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/domain-events.md | 19 ++++++++-- docs/feature-matrix.md | 14 ++++++-- docs/integration-boundaries.md | 58 +++++++++++++++++++----------- scripts/validate-feature-matrix.py | 1 + 4 files changed, 66 insertions(+), 26 deletions(-) diff --git a/docs/domain-events.md b/docs/domain-events.md index 75b3e746..4580c94c 100644 --- a/docs/domain-events.md +++ b/docs/domain-events.md @@ -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=` | 结果通知 | +| `travel_request.rejected` | 差旅审批驳回 | `travel_request` | `/travel-requests?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` 当前仍只作为内部集成事实和入站表更新使用,不提升为稳定公共事件,也不在本表作为长期承诺事件名登记。 diff --git a/docs/feature-matrix.md b/docs/feature-matrix.md index 386d0b1c..fa837afc 100644 --- a/docs/feature-matrix.md +++ b/docs/feature-matrix.md @@ -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 / 采购 / 资产主流程回归全部通过 | diff --git a/docs/integration-boundaries.md b/docs/integration-boundaries.md index d311a40e..624915a3 100644 --- a/docs/integration-boundaries.md +++ b/docs/integration-boundaries.md @@ -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=`。 +- 已固定差旅一期持久状态仅 `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。 diff --git a/scripts/validate-feature-matrix.py b/scripts/validate-feature-matrix.py index aa21ea54..f4330b19 100755 --- a/scripts/validate-feature-matrix.py +++ b/scripts/validate-feature-matrix.py @@ -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-]*$")