DCL7 精简文档并统一中文口径

这个提交包含在:
2026-05-12 23:06:16 +08:00
父节点 5da05eb5f7
当前提交 39a930399f
共修改 64 个文件,包含 411 行新增和 2129 行删除
+7 -7
查看文件
@@ -13,11 +13,11 @@ Read only what is relevant:
- Always read `AGENTS.md` and the newest relevant `issues/*.csv`.
- After R5, first check the main R5/R6 contract status before planning trial-run or follow-up work; R5 must remain the completed gate and R6 must have its own Issue CSV before expanding scope.
- For UI/page work, PC/mobile/WeCom experience, approval UX, or domestic OA benchmarking, read `docs/product-design-rules.md` and `references/visual-qa.md`. Mobile page work must treat `docs/product-design-rules.md` as the source of truth for the unified mobile shell, icon grid, card lists, deep Push pages, sticky actions, safe-area, and cross-viewport matrix. 移动页必须先对齐该设计事实源,再进入实现或验证。
- For UI/page work, PC/mobile/WeCom experience, approval UX, or domestic OA benchmarking, read `docs/产品设计规则.md` and `references/visual-qa.md`. Mobile page work must treat `docs/产品设计规则.md` as the source of truth for the unified mobile shell, icon grid, card lists, deep Push pages, sticky actions, safe-area, and cross-viewport matrix. 移动页必须先对齐该设计事实源,再进入实现或验证。
- For approval workflow, roles, self-approval, notification, deeplink, reminder, or escalation work, read `docs/需求-统一审批中心规约.md`.
- For reimbursement, invoice, OCR, duplicate invoice, or attachment work, read `docs/reimbursement-invoice-rules.md` and `references/reimbursement.md`.
- For local/WeCom/public trial-run, OCR runtime, Caddy, or DB drift work, read `docs/trialrun-runbook.md` and `references/trialrun.md`.
- For how this skill should evolve, read `docs/agent-development-practices.md`.
- For reimbursement, invoice, OCR, duplicate invoice, or attachment work, read `docs/报销发票附件规则.md` and `references/reimbursement.md`.
- For local/WeCom/public trial-run, OCR runtime, Caddy, or DB drift work, read `docs/试运行与自动化验证手册.md` and `references/trialrun.md`.
- For how this skill should evolve, read `docs/Agent开发交付实践.md`.
## Natural-Language Triage
@@ -40,8 +40,8 @@ Default behavior:
5. Prefer existing project patterns, official SDKs, and principles from documented domestic OA/approval/mobile references; do not copy competitor flows or text directly.
6. Verify with the narrowest relevant automated tests, then expand by risk.
7. Use Playwright screenshots or visual metrics for PC/mobile/WeCom UI changes. New or changed mobile pages must join the unified responsive system and the 320/360/375/390/393/414/430px 统一视觉矩阵 rather than adding page-specific layout fixes.
8. Dedicated `/mobile` pages must use the shared mobile slot/card/list/sticky-action system from `docs/product-design-rules.md`: fixed icon/avatar/status slots, `minmax(0, 1fr)` copy slots, `mobile-card`/mobile list cards, mobile tokens, and no desktop `card-std p-4` as a mobile main container.
9. Mobile homepage, approval, notification, and business cards must follow the display dedupe rules in `docs/product-design-rules.md`: one pending/progress summary per page, notifications as event stream with direct target links, bottom badges as counts only, and one visible business identifier/status per card or row.
8. Dedicated `/mobile` pages must use the shared mobile slot/card/list/sticky-action system from `docs/产品设计规则.md`: fixed icon/avatar/status slots, `minmax(0, 1fr)` copy slots, `mobile-card`/mobile list cards, mobile tokens, and no desktop `card-std p-4` as a mobile main container.
9. Mobile homepage, approval, notification, and business cards must follow the display dedupe rules in `docs/产品设计规则.md`: one pending/progress summary per page, notifications as event stream with direct target links, bottom badges as counts only, and one visible business identifier/status per card or row.
10. Update Issue CSV statuses only after the stated `Test_Method` passes.
11. Commit in Chinese batches with Issue IDs.
12. 面向用户可测试的改动,最终必须明确“是否已部署”。只有部署与公网检查通过后,才能告知用户可以去企业微信或公网试运行环境测试。
@@ -110,4 +110,4 @@ Final responses should include:
- After AP6, approval reminder, overdue reminder, and workflow productivity summary are current product facts, not open planning items. Reuse `POST /api/workflow/tasks/:taskId/remind`, `GET /api/workflow/tasks/summary`, `job:workflow-overdue-reminders`, existing workflow history, audit logs, notifications, and WeCom personal app delivery semantics. Do not add a parallel reminder channel, change approval status from reminders, or expand into complex BPM/SLA escalation without a new Issue.
- After DG7/MRF7, mobile approval is an "approval and progress" entry: employees may use it for submitted-item progress, while approvers use it for assigned tasks. Do not reintroduce disabled approval tabs for ordinary employees, duplicated home pending lists, or notification cards that only bounce users back to the notification center when a business target exists.
- After RI6, LP6, ME6 automation, QG6, and R7/OPS7/DOC7 draft materials, keep `ME6-3` open until representative real-device testing passes or the user explicitly accepts that risk. R7 draft rows may be `DONE`, but `R7E-*` true execution rows must stay `TODO` until the user confirms participants, roles, window, rollback contact, issue owner, and daily closeout. Do not treat QG6 or public mobile visual automation as a real-device substitute, and do not start real R7 from documentation alone.
- After DOCG7, document governance must start from `docs/文档索引.md` and `docs/文档事实源状态矩阵.md`. Use index archival: do not delete or move historical docs, do not rewrite old Issue CSV history, and resolve conflicts by latest Issue CSV plus current module specs before historical matrices or old runbooks.
- After DCL7, document governance must start from `docs/文档索引.md` and `docs/文档事实源状态矩阵.md`. Use Chinese-first current docs. Confirmed obsolete docs may be physically removed from the current tree and restored from git history when needed; do not create `docs/archive/` just to move clutter. Do not rewrite old Issue CSV snapshots when cleaning current docs.
@@ -1,6 +1,6 @@
# Reimbursement Reference
Primary fact source: `docs/reimbursement-invoice-rules.md`.
Primary fact source: `docs/报销发票附件规则.md`.
## Checks Before Editing
@@ -1,6 +1,6 @@
# Trial-Run Reference
Primary fact source: `docs/trialrun-runbook.md`.
Primary fact source: `docs/试运行与自动化验证手册.md`.
## Automatic First
@@ -1,6 +1,6 @@
# Visual QA Reference
Primary fact source: `docs/product-design-rules.md`.
Primary fact source: `docs/产品设计规则.md`.
## Brand Baseline
+7 -5
查看文件
@@ -15,7 +15,7 @@
- **优先复用成熟模块**:官方 SDK/成熟开源优先,避免重复造轮子;若自研须说明理由。
- **中文沟通**:默认使用中文回复;commit message 使用中文并引用 Issue ID。
- **项目 Skill 优先**:继续推进、试运行、视觉复核、报销/发票/OCR/附件、企业微信或部署类任务,优先使用 repo-scoped `.agents/skills/hyb-oa-delivery`。
- **设计事实源优先**:页面调整必须参考 `docs/product-design-rules.md`,并对齐公司主页 `www.hyinda.com` 的品牌风格。
- **设计事实源优先**:页面调整必须参考 `docs/产品设计规则.md`,并对齐公司主页 `www.hyinda.com` 的品牌风格。
## Tech & data
- Backend: `server/`(Node.js + Fastify + Prisma + PostgreSQL)。
@@ -70,11 +70,13 @@ E2E loop = plan → issues(csv) → 方案批准 → implement → test → revi
- 涉及 PC/手机/企业微信页面时,默认补充 Playwright 或视觉验证;若无法自动化,必须在 Issue `Test_Method` 写明人工步骤。
## Project knowledge sources
- Agent 交付实践:`docs/agent-development-practices.md`
- 产品与视觉规则:`docs/product-design-rules.md`
- 报销、发票、OCR、附件规则:`docs/reimbursement-invoice-rules.md`
- 试运行与自动化验证:`docs/trialrun-runbook.md`
- 文档入口与状态:`docs/文档索引.md`、`docs/文档事实源状态矩阵.md`
- Agent 交付实践:`docs/Agent开发交付实践.md`
- 产品与视觉规则:`docs/产品设计规则.md`
- 报销、发票、OCR、附件规则:`docs/报销发票附件规则.md`
- 试运行与自动化验证:`docs/试运行与自动化验证手册.md`
- 项目交付 Skill:`.agents/skills/hyb-oa-delivery/SKILL.md`
- DCL7 后文档中文优先;确认不用的历史文档从当前树删除,需要时通过 git 历史恢复,不维护 `docs/archive/`。
## Safety
- 不修复非当前 Issue 范围问题(可记录但不顺手改)。
@@ -43,12 +43,14 @@ Skill 不复制长文档。详细规则放在 `docs/`,Skill 通过 references
### 4. 文档保存事实源
项目事实源应随仓库版本管理:
项目事实源应随仓库版本管理,DCL7 之后采用中文优先和物理精简:
- 设计事实源:`docs/product-design-rules.md`
- 报销发票规则:`docs/reimbursement-invoice-rules.md`
- 试运行 Runbook:`docs/trialrun-runbook.md`
- Agent 交付实践:`docs/agent-development-practices.md`
- 文档入口:`docs/文档索引.md`
- 文档状态矩阵:`docs/文档事实源状态矩阵.md`
- 设计事实源:`docs/产品设计规则.md`
- 报销发票规则:`docs/报销发票附件规则.md`
- 试运行手册:`docs/试运行与自动化验证手册.md`
- Agent 交付实践:`docs/Agent开发交付实践.md`
AGENTS.md 只放硬约束和入口,不复制长规则。
@@ -84,7 +86,7 @@ AGENTS.md 只放硬约束和入口,不复制长规则。
移动页治理必须收敛到同一套事实源和组件体系:
- 改移动页面前先读 `docs/product-design-rules.md`,确认是否属于底部一级 Tab、首页图标宫格、卡片列表、深层 Push 页、顶部返回、吸底主操作或安全区问题。
- 改移动页面前先读 `docs/产品设计规则.md`,确认是否属于底部一级 Tab、首页图标宫格、卡片列表、深层 Push 页、顶部返回、吸底主操作或安全区问题。
- 新移动页默认纳入统一响应式 token 和跨视口视觉矩阵,覆盖 320、360、375、390、393、414、430px;不得只按某一台手机打补丁。
- 专用 `/mobile` 路由默认使用统一移动槽位、`mobile-card`、移动列表卡片和吸底操作;不得把桌面 `card-std p-4` 作为手机主容器,也不得为单个页面自造另一套间距、卡片或图标布局。
- 角色差异采用“同框架、按角色裁剪内容和动作”:员工、审批人、财务、管理员、负责人看到不同入口和动作,但不创建互不一致的角色专属移动 UI。
@@ -94,10 +96,12 @@ AGENTS.md 只放硬约束和入口,不复制长规则。
截至 R7P,RI6 报销票据体验、LP6 请假采购体验、ME6 自动化/部署收口、QG6 QA 治理以及 R7/OPS7/DOC7 草案材料均已完成;`ME6-3` 代表性企业微信真机抽查因设备不便继续待确认。后续默认进入等待门禁状态:不得关闭 `ME6-3`,不得把 QG6 或公网移动视觉矩阵当成真机替代,也不得从文档草案直接启动真实 R7。R7 真实执行必须保持 `R7E-*` 为 TODO,直到用户确认最终人员、角色、窗口、回滚联系人、问题登记负责人和每日收口节奏,并补足真机门禁或明确接受风险。
文档治理采用 DOCG7 后的索引归档策略:
文档治理采用 DCL7 后的中文优先和物理精简策略:
- 先读 `docs/文档索引.md` 和 `docs/文档事实源状态矩阵.md` 判断文档用途。
- 不删除、不移动历史证据,不回写旧 Issue CSV;用索引和顶部状态说明标注历史口径。
- 当前事实源、操作手册和用户可读文档默认使用中文文件名;技术生态或脚本强引用的英文名可以保留,但必须在索引中说明。
- 已确认不用的历史文档从当前树物理删除,不放 `docs/archive/`;需要时通过 git 历史恢复。
- 不回写旧 Issue CSV 快照;旧 Issue 中的历史路径保留审计语义。
- 历史矩阵、旧 runbook 或旧 trialrun 记录若与最新 Issue CSV、当前 PRD 或模块规约冲突,以最新 Issue CSV 和当前模块规约为准。
- R7/OPS7/DOC7 草案不代表真实 R7 已启动;MIF7 TODO 不代表移动整改已完成。
@@ -155,7 +159,7 @@ agent 在声明 blocker 前,必须先查项目内已有资产:
- 开发:按 Issue 实施后端、前端、脚本或文档变更,并执行对应验证。
- 审查:默认先报风险、行为回归、权限泄漏、状态机问题和漏测项。
- QA:用接口回归、Playwright、视觉截图、真机/公网 smoke 和人工步骤复核。
- 设计师:对齐 `docs/product-design-rules.md`、公司官网视觉和国内 OA 操作习惯。
- 设计师:对齐 `docs/产品设计规则.md`、公司官网视觉和国内 OA 操作习惯。
- 用户代理:模拟普通员工、审批人、财务、管理员在 PC、手机、企业微信里的真实路径。
不需要用户显式写“请扮演某角色”。agent 应根据语义自动选择角色;若任务跨多个角色,先给执行顺序和交接物。
-202
查看文件
@@ -1,202 +0,0 @@
# MVP 主线代码差距盘点
> Issue: `A1` in `issues/2026-05-09_20-57-19-mvp-mainline-dev-kickoff.csv`
> 日期: 2026-05-09
> 范围: 只读盘点,不改业务代码,不部署。
## 1. 盘点结论
首轮开发不应重写 OA。仓库内已经存在审批、报销、票据、企业微信、请假、采购、合同台账和项目轻管理的主要实现,下一步应按当前 PRD 做“主线收口”和“试运行门禁”,而不是新建一套系统。
当前可复用的主干如下:
| 主线 | 可复用实现 | 结论 |
| --- | --- | --- |
| 统一审批中心 | `workflow` 路由、`WorkflowDefinition/Instance/Task/History` 模型、PC/移动审批页、审批回归脚本 | 可作为 A2 底座,优先修入口、状态一致性、deeplink 和权限边界 |
| 报销/发票/OCR | `reimbursements`、`invoicePool`、附件、OCR、查重、付款、导出、PC/移动报销页 | 可作为 A3 底座,重点修主流程体验和状态文案 |
| 企业微信基础设施 | `wecomAuth`、身份绑定表、移动入口识别、通知 dispatcher、企业微信 webhook provider | 可作为 A4 底座,重点验证未绑定回退、停用阻断、通知脱敏和 deeplink |
| 请假/考勤 | `leave`、请假余额/附件/审批/撤回、团队日历;另有极简考勤与团队状态 | A5 先收口请假,不扩成完整考勤;补卡/外出/加班需另拆或只做最小入口 |
| 采购/费用 | `purchaseRequests`、明细、附件、审批、撤回、PO/合同号归档、采购回归 | A6 可做采购最小可用收口;费用申请可先复用报销/采购口径,不新造预算/ERP |
| 合同归档 | `contractsRegistry`、合同编号唯一、项目关联、归档位置、审计 | A6 可做台账最小可用;正式合同审批和合同附件库不是首轮默认范围 |
| 项目轻管理 | `projects`、成员、里程碑、任务、风险、交付、周报/报销/合同关联 | A6 可做项目页汇总收口,不做重型项目管理 |
| 权限/导航 | `systemWorkspace`、导航可见性、前端路由守卫、角色权限 | A7 重点收紧普通员工主路径和 P2 备用模块 |
| 回归门禁 | server 回归脚本、client E2E、QA smoke/live readiness 脚本 | A8 可复用现有门禁,缺真实配置时必须标 `SKIP` |
首轮默认不新增公共 API、不新增数据库表。若后续确认要实现补卡/外出/加班独立审批对象、合同正文附件库、正式合同审批、自动发票验真强依赖或预算占用,应另拆 Issue,并在 `Notes` 写明迁移和回滚路径。
## 2. 当前事实源
本次按以下当前事实源盘点:
| 文档 | 用途 |
| --- | --- |
| `docs/海音达OA-MVP需求规格说明书.md` | MVP 总纲、路线和验收 |
| `docs/需求-统一审批中心规约.md` | 审批动作、状态机、权限和留痕总依据 |
| `docs/需求-报销发票OCR规约.md` | 报销、发票、OCR、附件、付款和导出依据 |
| `docs/需求-企业微信基础设施规约.md` | 企业微信入口、绑定、通知、deeplink 和打卡边界 |
| `docs/需求-请假考勤修正规约.md` | 请假、补卡、外出、加班和考勤解释依据 |
| `docs/需求-采购费用审批规约.md` | 采购/费用申请最小可用依据 |
| `docs/需求-合同附件归档规约.md` | 合同台账、编号、归档位置和敏感边界依据 |
| `docs/需求-项目轻管理规约.md` | 项目轻管理和业务关联依据 |
路线确认:
- `hyb-oa` 是唯一业务主系统和唯一审批中心。
- 企业微信只做入口、身份、通知和打卡原始采集边界。
- 企业微信原生审批、飞书、钉钉、小程序、复杂 BPM、完整 ERP、AI 和重型项目管理不进入首轮开发。
## 3. 后端与数据模型盘点
### 3.1 统一审批中心
可复用:
- `server/src/routes/workflow.js` 已提供待办列表、待办详情、通过、驳回、退回、转审、批量通过、批量驳回。
- Prisma 已有 `WorkflowDefinition`、`WorkflowInstance`、`WorkflowTask`、`WorkflowHistory`、`ApprovalRule`、`ApprovalTransfer`。
- 待办详情已能关联报销、请假、采购、差旅对象。
- workflow 动作已在业务状态、历史记录、通知副作用之间做事务处理和后处理。
待修缺口:
- PC 待办列表目前偏“快速通过 + 详情”,退回、驳回、转审主要在详情页和移动页完成,A2 需确认 PC 操作是否清晰。
- 批量审批接口当前以报销权限和 `reimbursement` 为主,采购/请假批量是否首轮开放需在 A2 明确,不建议首轮扩大。
- 合同审批对象尚未接入 workflow,首轮 A6 只按合同台账最小可用处理。
- 移动审批存在离线队列能力,但 PRD 明确首批审批动作必须在线提交,A2 需确保离线草稿不会被误解为正式审批已完成。
### 3.2 报销、发票、OCR、附件
可复用:
- `server/src/routes/reimbursements.js` 已覆盖报销创建、列表、详情、明细、附件、提交、撤回、付款、项目关联。
- `server/src/routes/invoicePool.js` 和 `server/src/routes/invoicePool/*` 已覆盖票据上传、OCR、状态查询、可绑定票据、绑定/解绑、人工修正、归档、查重例外、发票文件访问。
- Prisma 已有 `ReimbursementForm`、`ReimbursementItem`、`ReimbursementAttachment`、`InvoicePool`、`InvoiceVerificationRecord`。
- 报销提交会校验绑定发票、审批定义、审批人和单号;付款后会归档已用发票。
待修缺口:
- `InvoiceVerificationRecord` 和验真接口已经存在,但当前 PRD 首批口径是 OCR + 查重 + 财务人工复核,A3 不能把自动验真变成必选路径。
- PC 和移动报销页功能较多,A3 重点应清理普通用户可见的内部术语、状态码和发票池概念。
- 报销主流程应优先验证“上传 -> OCR 终态 -> 绑定明细 -> 提交 -> 审批 -> 付款 -> 导出”,不在首轮扩展 ERP 导出能力。
- 费用申请若与报销/采购边界不清,A3/A6 应先采用现有报销或采购能力,不新建费用模块。
### 3.3 企业微信基础设施
可复用:
- `server/src/routes/wecomAuth.js` 已提供 `/api/auth/wecom/config`、login、callback、bind、unbind。
- `WecomIdentityBinding` 已保证 `employee_id` 和 `external_user_id` 唯一。
- callback 已覆盖已绑定直达、未绑定回退登录、绑定冲突、员工停用阻断和审计。
- `server/src/services/notificationDispatcher.js`、`server/src/services/notifications/*`、`server/src/services/integrations/im/wecom.js` 已支持企业微信 webhook、delivery 记录、失败分类和重试。
- `client/src/lib/runtimeContext.ts` 已能把企业微信/移动容器映射到 `/mobile`,并把 PC 详情页映射到移动等价路径。
待修缺口:
- 通知当前走 channel + webhook 能力,是否完全满足“脱敏标题、业务编号、状态、deeplink”需在 A4 逐类验收。
- 企业微信 live smoke 需要真实 CorpID、AgentID、回调地址、webhook 等配置;缺配置必须 `SKIP`。
- `runtimeContext` 中还有通用企业 IM UA 判断包含钉钉,仅用于移动偏好判断,不等于接入钉钉;A4/A7 可视情况把文案和测试聚焦为企业微信。
### 3.4 请假、考勤修正和团队状态
可复用:
- `server/src/routes/leave.js` 已覆盖假别、余额、工作日预览、请假创建/编辑/详情/提交/撤回。
- `server/src/services/leave.js` 已有工作日、附件规则、假期 ledger 预占和审批通过后扣减口径。
- `LeaveRequest`、`LeaveLedger`、`WorkflowInstance` 已支持请假接入统一审批。
- PC 请假页有团队日历,移动页支持请假提交,团队状态页支持在岗/居家/外出/出差/请假展示。
- 另有 `attendance` 路由、`AttendanceRecord` 和 `AttendancePolicy`,但应按当前路线视为备用/历史能力,不作为首轮正式打卡实现目标。
待修缺口:
- 补卡、外出、加班尚未形成独立 OA 审批对象;当前只有极简考勤补录和团队状态手工外出,不等于正式审批流。
- 企业微信打卡同步未实现,符合当前“首批不接打卡 API”的边界;A5 不应开发定位、人脸、Wi-Fi 或排班。
- A5 应先验证请假审批结果对团队状态或日历的影响。若补卡/外出/加班必须上线,应另拆独立 Issue,可能需要新增模型或复用申请对象,不能混在 A5 主线修补里。
### 3.5 P1 采购、合同、项目
可复用:
- `purchaseRequests` 已覆盖采购草稿、明细、附件、提交、撤回、审批、PO/合同号归档和采购回归脚本。
- `contractsRegistry` 已覆盖合同台账列表、到期提醒、新增、编辑、续签,合同编号唯一,支持项目关联、责任人、归档位置和审计。
- `projects` 已覆盖项目列表/详情、成员、里程碑、任务、风险、费用摘要、差旅摘要、周报、沟通记录、收口清单、交付记录和涉密文档引用。
- Prisma 已有 `PurchaseRequest`、`PurchaseRequestItem`、`PurchaseAttachment`、`PurchaseOrderArchive`、`ContractRegistry`、`Project`、`ProjectMember`、`ProjectMilestone`、`ProjectTask`、`ProjectRisk`、`ProjectDeliveryRecord` 等。
待修缺口:
- 采购当前包含预算预占、ERP track 等较重能力,A6 应只保留“申请 -> 审批 -> 附件/归档可追溯”的最小可用验收。
- 合同台账没有正式合同 workflow,也没有合同正文附件库;首轮只验收编号、状态、责任人、归档位置、项目关联和非涉密边界。
- 项目页功能较全,A6 应避免扩成项目管理平台,只确认关键事项汇总、风险、交付记录和业务关联。
## 4. 前端入口与页面盘点
可复用页面:
| 模块 | PC 页面 | 移动页面 |
| --- | --- | --- |
| 审批 | `WorkflowTasksPage.tsx`、`WorkflowTaskDetailPage.tsx` | `MobileApprovalsPage.tsx` |
| 报销 | `ReimbursementsPage.tsx`、`ReimbursementDetailPage.tsx`、`InvoicePoolPage.tsx` | `MobileReimbursementsPage.tsx`、`MobileReimbursementDetailPage.tsx`、`MobileCapturePage.tsx` |
| 企业微信绑定 | `ProfilePage.tsx` | `MobileProfilePage.tsx` |
| 请假 | `LeaveRequestPage.tsx` | `MobileLeavePage.tsx` |
| 采购 | `PurchaseRequestsPage.tsx` | 复用响应式 PC 页面 |
| 合同 | `ContractsRegistryPage.tsx` | 复用响应式 PC 页面 |
| 项目 | `ProjectsPage.tsx`、`ProjectDetailPage.tsx` | 移动端首批以 `/mobile` 摘要和 PC 响应式为主 |
入口现状:
- `client/src/router/index.tsx` 已注册 PC 和移动主路由。
- `AppShellLayout` 会根据企业微信/移动容器跳转到移动等价路径。
- `MobileBottomNav` 默认提供首页、审批、票据、我的;`MobilePortalPage` 额外提供报销、请假等卡片入口。
- `notificationLinks.ts` 已把 workflow、reimbursement、leave、purchase 等通知目标解析回 OA 页面。
待修缺口:
- PC 主导航目前有“主导航 / 管理入口 / 备用模块”分组,后台也有 `system/navigation`,但 fallback 与服务端默认可见性不完全一致;A7 需统一。
- 审批待办在服务端默认可见性中归入 admin/backup 强制段,A2/A7 需确保主管、财务、老板的审批入口清晰可达。
- 普通员工拥有一些旅行/采购/项目自助权限,A7 需确认是否会看到完整差旅、预算、AP、ERP、AI 等非首轮主路径。
- 移动端采购、合同、项目没有完整移动专页,首轮 A6 只做最小可用和可达性,不扩展移动完整编辑体验。
## 5. 测试与回归盘点
可复用门禁:
| 范围 | 已有脚本或用例 |
| --- | --- |
| 后端总回归 | `server/scripts/regression-all.sh` |
| 审批动作 | `server/scripts/regression-workflow-actions.sh`、`client/tests/e2e/workflow-quick-approve.spec.ts`、`client/tests/e2e/mobile-approvals-offline.spec.ts` |
| 报销/票据/OCR | `server/scripts/regression-dedup.sh`、`server/scripts/regression-ocr.sh`、`client/tests/e2e/r102-reimbursement-main-flow.spec.ts`、`client/tests/e2e/invoice-ocr-flow.spec.ts` |
| 企业微信入口 | `client/tests/e2e/wecom-entry.spec.ts`、`client/tests/e2e/wecom-first-bind.spec.ts`、`client/tests/e2e/r124-mobile-entry-matrix.spec.ts` |
| 请假/日历 | `client/tests/e2e/leave-flow.spec.ts`、`client/tests/e2e/leave-team-calendar.spec.ts` |
| 采购/项目 | `server/scripts/regression-procurement.sh`、`client/tests/e2e/procurement-flow.spec.ts`、`client/tests/e2e/project-workbench.spec.ts` |
| 权限/导航 | `client/tests/e2e/settings-governance.spec.ts`、`scripts/qa/check-mobile-route-contract.mjs` |
| 组合门禁 | `scripts/qa/run-business-flow-gates.sh`、`scripts/qa/run-web-gates.sh`、`scripts/qa/check-live-smoke-env.mjs` |
测试缺口:
- 合同台账目前没有明确的首轮 E2E,应在 A6 或 A8 补人工步骤或轻量 E2E。
- 企业微信真实入口、真实 webhook 和真实 OCR 依赖配置,A8 必须允许 `SKIP` 并记录原因。
- A7 权限导航需要按员工、主管、财务、管理员做角色矩阵,不应只跑 build/typecheck。
## 6. A2-A8 实施边界建议
| Issue | 建议边界 | 不做范围 | 是否需要新增 API/DB |
| --- | --- | --- | --- |
| A2 统一审批中心 | 修 PC/移动待办、详情状态、审批历史、deeplink 一致性;确认并发/已处理提示 | 不新增企业微信原生审批;不扩复杂 BPM;不强行批量支持所有业务 | 默认不需要 |
| A4 企业微信基础设施 | 验证 config、绑定、未绑定回退、停用阻断、通知脱敏、deeplink 回 OA | 不接飞书;不接企业微信原生审批;不做打卡同步 | 默认不需要 |
| A3 报销/发票/OCR | 收口上传、OCR 状态、查重、绑定、提交、付款、导出、用户文案 | 不把自动验真设为必需;不扩 ERP;不重构 OCR provider | 默认不需要 |
| A5 请假/考勤 | 先收口请假审批、团队状态/日历;补卡/外出/加班不足则记录或最小入口 | 不接企微打卡 API;不做定位/人脸/Wi-Fi/排班 | 独立补卡/外出/加班可能需要另拆 |
| A6 P1 最小可用 | 采购申请审批、合同台账、项目汇总最小可用 | 不做预算/ERP/AI/复杂招采/重型项目 | 合同审批/附件库若要做需另拆 |
| A7 权限导航 | 收紧角色可见性和备用模块;确保审批、报销、请假入口清晰 | 不靠前端隐藏替代服务端权限 | 默认不需要 |
| A8 回归门禁 | 汇总 server/client/E2E/smoke/live readiness;真实配置缺失标 SKIP | 不部署;不通知真机试运行 | 不需要 |
## 7. 后续开发顺序
建议继续执行既定顺序:
1. A2:统一审批中心入口与状态收口。
2. A4:企业微信入口、绑定、通知回 OA。
3. A3:报销/发票/OCR 主链路收口。
4. A5:请假、补卡、外出、加班与考勤口径。
5. A6:P1 采购、合同、项目最小可用。
6. A7:权限、导航与备用模块护栏。
7. A8:回归门禁与试运行证据收口。
A1 之后可以进入 A2,但 A2 是涉及 workflow 状态机、权限和入口的一类高风险改动,实施前需要给出具体技术方案并等待批准。
-384
查看文件
@@ -1,384 +0,0 @@
# hyb-oa 实现状态矩阵(历史主表 + R70-R90 试运行补充)
**文档状态**:实现状态与历史证据矩阵,不是 PRD,也不是当前开发排期。
**快照日期**:2026-05-05
**范围**:`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` + `P20TRAVEL2-0-P20TRAVEL2-5` + `P20TRAVEL3-0-P20TRAVEL3-5` + `P21PWA1-0-P21PWA1-5` + `P21PWA2-0-P21PWA2-5` + `P22PROD1-0-P22PROD1-5` + `R11-0-R11-5`,共 278 项。
**事实源**:`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/2026-03-10_21-05-59-p20-travel-2-l5-corporate-payments-refresh.csv` + `issues/2026-03-11_09-57-28-p20-travel-3-l5-reconciliation-erp-bridge-refresh.csv` + `issues/2026-03-11_17-50-39-p21-pwa-1-l5-asset-scan-refresh.csv` + `issues/2026-03-12_04-32-13-p21-pwa-2-l5-offline-deeplink-refresh.csv` + `issues/2026-03-12_16-58-44-p22-prod-1-l5-production-hardening.csv` + `issues/2026-03-13_10-30-00-r11-contract-reconciliation-and-spec-refresh.csv` + `issues/2026-04-26_r70-manual-trialrun.csv` + `issues/2026-04-29_08-39-22-r76-external-trialrun-closeout.csv` + `issues/2026-04-29_09-19-07-r77-ocr-pdf-first.csv` + `issues/2026-04-29_10-14-27-r78-reimbursement-payment-tail.csv` + `issues/2026-05-04_13-11-16-r79-governance-live-readiness.csv` + `docs/trialrun/coverage-matrix.csv`(执行合同与覆盖证据)
**当前用途**:判断功能是否做过、证据在哪、历史路线如何演进。
**不得误读**:新增需求和优先级以 [海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md)、[产品口径文档](./product-decisions.md) 和最新 `issues/*.csv` 为准。
**DOCG7 当前说明(2026-05-12)**:本表是历史主表和 QA 参考,不代表 2026-05-12 当前状态。R6、PC6、PA6、FL6、AP6、RI6、LP6、ME6/QG6、DG7/MRF7、MIA7/MIF7 之后的事实应以最新 Issue CSV、[`docs/文档索引.md`](./文档索引.md)、[`docs/文档事实源状态矩阵.md`](./文档事实源状态矩阵.md) 和 [`docs/trialrun/manual-trialrun-report.md`](./trialrun/manual-trialrun-report.md) 为准。
## R70-R90 试运行与外部环境补充(2026-04-28 至 2026-05-05)
- **本地核心链路**:员工/经理/管理员的本地 trialrun 主链路已在 R70/R71 通过;R73-R78 进一步补齐了真实 PDF OCR、深层业务辅助回归和财务支付尾链 focused regression。
- **当前公网部署基线**:`oa.hyinda.com` 已接到 `caddy -> 127.0.0.1:3000`,远端目录为 `/opt/hyb-oa-trialrun`,部署由本地 `rsync` 驱动,远端不是 git 工作树。
- **历史企微状态**:R80 当时已启用公网 `WECOM_ENABLED / WECOM_ENTRY_ENABLED / WECOM_OAUTH_ENABLED`,`wecom_entry_v1` 已由 `force_off` 调整为 `inherit`;R82-R88 已收口真实企微 UserId 兼容、首次绑定、会话提示与设备指纹,用户手机企业微信已验证可进入系统。
- **历史移动状态**:R89 当时已在本地完成登录极简化、移动默认 `/mobile`、底部导航、移动审批、票据上传与小屏菜单抽屉自动化;“公网仍需部署最新 R89/R90”是 2026-05-05 历史缺口,不代表当前公网状态。
- **历史剩余外部事项**:公网 live smoke、独立 smoke 账号核对、备份恢复演练、HTTPS cookie 行为与多用户并发证据在 R90/R91 当时仍待收口;历史 R79 中 “WECOM=false / wecom_entry_v1=force_off” 只作为过期诊断记录,不再代表当前状态。
- **阅读方式**:本文件的主表仍保留历史主线;与 trialrun、覆盖率、外部环境有关的现状判断,应结合 `docs/trialrun/coverage-matrix.csv` 与 `docs/trialrun/manual-trialrun-report.md` 一起看。
## R12 增量能力(2026-03-21)
- **事实源**:`issues/2026-03-21_10-30-00-p25-fee-control-ap-refresh.csv`、`issues/2026-03-21_10-40-00-p26-portal-sso-im-entry-refresh.csv`、`issues/2026-03-21_10-50-00-p28-portal-search-workbench-refresh.csv`、`issues/2026-03-21_11-00-00-p24-workflow-governance-refresh.csv`、`issues/2026-03-21_11-10-00-p29-replacement-readiness-refresh.csv`
- **P25-lite 费控闭环**:新增预算控制规则中心、三域统一 `precheck`、`EntityRiskFlag` 风险项、支付批次和最小 `AP Operations` 运营视图。
- **P26-lite 统一入口**:新增 `Portal Home`、`OIDC provider` 列表、登录页统一入口和 IM 签名 deep link。
- **P28-lite 搜索与工作台**:新增全局搜索、公告管理、最近访问与 Portal 工作台卡片聚合。
- **P24-lite 流程治理**:新增工作流定义后台治理、版本发布归档、报销流程只读投影,不改现有运行时引擎。
- **P29-lite 试点切换**:新增迁移 dry-run、切换范围控制台、试点切换 runbook 与映射清单,遵循“旧单只读归档、新单由新系统接管”。
- **默认开关**:`budget_precheck_v1`、`payment_batch_v1`、`portal_home_v1`、`global_search_v1`、`announcements_v1`、`workflow_definition_admin_v1`、`cutover_console_v1` 默认 `force_off`,需 env 与 DB 开关双重开启。
**说明**:
- 本矩阵用于全局读图(审计/交接/回归覆盖追踪),不替代 `issues/*.csv` 的执行合同职责。
- UI 专项合同(如 `ui-refresh-stage7/8`)属于界面治理线,独立维护,不并入本业务主表统计。
- `R11` 属于治理收口阶段:只承接历史 TODO 清账与规格书补齐,不代表新增运行时业务能力。
- `首次规划 CSV` 为该 ID 首次出现的执行合同;`首次完成 CSV` 为三状态首次全 `DONE` 的执行合同。
- `规格书章节` 仍保留历史引用语义;当前 PRD 主事实源已迁移到 `docs/海音达OA-MVP需求规格说明书.md`,`docs/requirements-specification.md` 仅为旧路径跳转。
| ID | 功能项 | 规格书章节 | 首次规划 CSV | 首次完成 CSV | 完成日期 | 当前状态 | 回归覆盖 | Notes |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| F1 | CSV快照收口(P5蓝图v2) | §16 迭代计划(执行合同收口) | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09 | DONE | manual | none |
| F2 | 费用类型只读API(expense-types) | §9.1-§9.2,§13.2/§13.3 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | none |
| F3 | 费用类型管理API(system.settings) | §9.1-§9.2,§13.2/§13.3 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | none |
| F4 | 报销单编辑与删除(补齐CRUD) | §4.2,§13.2 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | server/scripts/regression-workflow-actions.sh | none |
| F5 | 报销明细CRUD与总金额重算 | §4.2,§13.2 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | server/scripts/regression-workflow-actions.sh | none |
| F6 | 前端报销编辑器(明细+费用类型) | §4.2,§13.2 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | client:typecheck/build/test:e2e | none |
| F7 | 代提交(expense.proxy_submit) | §4.2.3-§4.2.4,§13.5 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | server/scripts/regression-workflow-actions.sh | none |
| F8 | 行政代上传(owner≠uploaded_by) | §4.2.3-§4.2.4,§10.7 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | server/scripts/regression-ocr.sh + regression-audit.sh | none |
| F9 | 票据解绑/重绑(bound->available) | §4.4,§10.4-§10.7 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | server/scripts/regression-workflow-actions.sh | none |
| F10 | 判重例外(override duplicate) | §4.4,§10.7,§12.4 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | server/scripts/regression-dedup.sh + regression-audit.sh | none |
| F11 | OCR失败重试API(次数/频控) | §4.4,§10.7 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | server/scripts/regression-ocr.sh + regression-audit.sh | none |
| F12 | 90天未绑定自动归档(unused_timeout) | §4.4,§10.4-§10.7 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | server/scripts/regression-ocr.sh | none |
| F13 | signed-url审计与下载行为记录 | §10.2,§10.7,§12.4 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | server/scripts/regression-audit.sh | none |
| F14 | 站内通知基础设施(DB+API) | §4.6 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | none |
| F15 | 邮件通知(SMTP/Nodemailer) | §4.6 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | none |
| F16 | 前端通知入口(Bell) | §4.6 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | client:test:e2e | none |
| F17 | 报表导出(CSV/Excel) | §16 Phase 2(报表导出) | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | none |
| F18 | 审批规则维护(system.settings) | §6,§13.3 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | server/scripts/regression-workflow-actions.sh | none |
| F19 | 作业系统升级(pg-boss 基础设施) | §16 Phase 2(队列/作业) | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | server/scripts/regression-all.sh | none |
| F19b | 作业迁移(OCR -> pg-boss) | §16 Phase 2(OCR队列化) | 2026-02-09_12-34-42-p5-blueprint-v2.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | server/scripts/regression-ocr.sh + regression-all.sh | none |
| F19c | 作业迁移(委派回收 -> pg-boss) | §16 Phase 2(委派回收队列化) | 2026-02-09_12-34-42-p5-blueprint-v2.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | server/scripts/regression-workflow-actions.sh | none |
| F19d | 作业迁移(超期归档 -> pg-boss) | §16 Phase 2(归档作业队列化) | 2026-02-09_12-34-42-p5-blueprint-v2.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | server/scripts/regression-ocr.sh + regression-all.sh | none |
| F20 | Worker进程拆分(可选) | §14(部署),§16 Phase 2 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | none |
| F21 | 对象存储(MinIO/S3兼容) | §10.3,§16 Phase 2 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | none |
| F22 | 可观测性增强(metrics/日志) | §14 非功能需求(可观测性) | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | none |
| F23 | SSO/OIDC(可选,P7+) | §11.1(登录扩展),§16 Phase 2 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | 规格扩展项(P6+/P7+) |
| F24 | 工作流扩展到其他实体(P7+) | §5,§16 Phase 2 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | 规格扩展项(P6+/P7+) |
| F25 | 敏感字段加密与脱敏(P6+) | §12.1-§12.3 | 2026-02-09_11-17-07-p5-blueprint.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | 规格扩展项(P6+/P7+) |
| F26 | 部门API(departments) | §3.2,§4.1,§13.2 | 2026-02-09_12-34-42-p5-blueprint-v2.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | none |
| F27 | 员工API对齐(新增别名 /api/employees) | §4.1,§13.2 | 2026-02-09_12-34-42-p5-blueprint-v2.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | none |
| F28 | 票据人工修正与手工归档(invoice-pool patch/archive) | §4.4,§10.4-§10.7 | 2026-02-09_12-34-42-p5-blueprint-v2.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | server/scripts/regression-audit.sh | none |
| F29 | 配置只读API(approval-rules/document-sequences) | §6,§8,§13.3 | 2026-02-09_12-34-42-p5-blueprint-v2.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | none |
| F30 | 通知触发集成(workflow/pay/auth) | §4.6,§12.4 | 2026-02-09_12-34-42-p5-blueprint-v2.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | none |
| F31 | Delegation Grants API对齐(新增别名/增强响应) | §4.2.4,§13.5 | 2026-02-09_12-34-42-p5-blueprint-v2.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | none |
| F32 | 前端组织与员工最小运营 | §3.2,§4.1(前端运营) | 2026-02-09_12-34-42-p5-blueprint-v2.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | client:typecheck/build | none |
| F33 | 前端行政代提交/代上传入口 | §4.2.3-§4.2.4 | 2026-02-09_12-34-42-p5-blueprint-v2.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | client:typecheck/build/test:e2e | none |
| F34 | 前端票据中心增强(编辑/归档/解绑/重试/例外) | §4.4,§10.7(前端增强) | 2026-02-09_12-34-42-p5-blueprint-v2.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | client:typecheck/build/test:e2e | none |
| F35 | 前端错误码文案补齐(VALID/AUTH/PERM) | §13.6 | 2026-02-09_12-34-42-p5-blueprint-v2.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | client:typecheck/build | none |
| F36 | 首次登录强制改密(后端) | §11.2-§11.5,§13.6 | 2026-02-09_12-34-42-p5-blueprint-v2.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | none |
| F37 | 登录失败锁定与解锁(AUTH_002) | §11.2-§11.5,§13.6 | 2026-02-09_12-34-42-p5-blueprint-v2.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | none |
| F38 | 首次登录改密与锁定提示(前端) | §11.2-§11.5,§13.6(前端) | 2026-02-09_12-34-42-p5-blueprint-v2.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | client:typecheck/build/test:e2e | none |
| F39 | 弱密码库拦截(Top 10k) | §11.2,§13.6 | 2026-02-09_12-34-42-p5-blueprint-v2.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | none |
| F40 | 组织/配置回归脚本(org+settings) | §16(回归工程化) | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | server/scripts/regression-org-settings.sh | 治理/回归工程项 |
| F41 | 认证安全回归脚本(auth security) | §11,§16(认证回归) | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | server/scripts/regression-auth-security.sh | 治理/回归工程项 |
| F42 | 架构文档修订(As-Is/To-Be) | N/A(架构文档治理) | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09_13-39-02-p5-blueprint-v3.csv | 2026-02-09 | DONE | manual | 治理/回归工程项 |
| R1 | 历史TODO清账映射(A/C -> E/F) | N/A(治理项) | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09 | DONE | manual | none |
| R2 | 规格与计划文档状态同步 | §16(执行合同与文档对齐) | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09 | DONE | manual | none |
| R3 | 状态一致性自动校验与CI接入 | §16(门禁与漂移阻断) | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09 | DONE | scripts/check-minimal.sh | none |
| V1 | 验真域模型与Provider抽象 | §4.4(发票治理扩展) | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09 | DONE | server/scripts/regression-verification.sh | none |
| V2 | 验真API与异步任务(pg-boss) | §4.4,§16(作业体系) | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09 | DONE | server/scripts/regression-verification.sh | none |
| V3 | 票据中心验真前端闭环 | §4.4(票据中心前端) | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09 | DONE | client:typecheck/build | none |
| V4 | 验真回归脚本与总回归接入 | §16(回归工程化) | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09 | DONE | server/scripts/regression-verification.sh + regression-all.sh | none |
| D1 | 看板聚合API | §16 Phase 2(可视化看板) | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09 | DONE | server/scripts/regression-dashboard.sh | none |
| D2 | 前端Dashboard强化 | §16 Phase 2(可视化看板) | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09 | DONE | client:typecheck/build | none |
| D3 | 看板导出联动 | §16 Phase 2(报表导出联动) | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09 | DONE | server/scripts/regression-dashboard.sh | none |
| B1 | 预算池与台账模型 | §16 Phase 2(预算管控) | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09 | DONE | server/scripts/regression-budget.sh | none |
| B2 | 预算API与提交流程拦截 | §16 Phase 2(预算管控) | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09 | DONE | server/scripts/regression-budget.sh | none |
| B3 | 预算前端运营页 | §16 Phase 2(预算运营) | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09 | DONE | client:typecheck/build | none |
| B4 | 预算回归脚本 | §16(回归工程化) | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09 | DONE | server/scripts/regression-budget.sh | none |
| I1 | 集成框架(Outbox+Adapter) | §16 Phase 2(外部集成) | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09 | DONE | server/scripts/regression-integrations.sh | none |
| I2 | ERP最小集成(paid同步) | §16 Phase 2(ERP 集成) | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09 | DONE | server/scripts/regression-integrations.sh | 默认关闭,按需灰度 |
| I3 | 差旅单导入与报销关联 | §16 Phase 2(差旅闭环) | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09 | DONE | server/scripts/regression-integrations.sh | 默认关闭,按需灰度 |
| I4 | 通知渠道扩展(企微/钉钉) | §4.6(多渠道通知) | 2026-03-13_21-04-30-p23-im2-wecom-productionization-refresh.csv | 2026-03-13_21-04-30-p23-im2-wecom-productionization-refresh.csv | 2026-03-13 | DONE | server/scripts/regression-im-notifier.sh | 已完成企微 webhook 生产化与密钥加固;飞书 / 钉钉 provider 继续 backlog |
| S1 | 企业卡/虚拟卡管控预研 | N/A(ADR 决策项) | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09 | DONE | manual | docs/adr/adr-enterprise-card-control.md |
| S2 | 移动端路线决策预研 | N/A(ADR 决策项) | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09_23-30-00-p6-p8-remaining-work-master.csv | 2026-02-09 | DONE | manual | docs/adr/adr-mobile-strategy.md |
| P9A1 | invoicePool拆分方案设计与边界冻结 | §16(维护性治理) | 2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv | 2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv | 2026-02-10 | DONE | manual | none |
| P9A2 | invoicePool验真路由独立化实施 | §16(维护性治理) | 2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv | 2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv | 2026-02-10 | DONE | server/scripts/regression-verification.sh | none |
| P9A3 | invoicePool共享select与响应映射收敛 | §16(维护性治理) | 2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv | 2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv | 2026-02-10 | DONE | server/scripts/regression-workflow-actions.sh + regression-verification.sh | none |
| P9B1 | Dashboard趋势改为SQL聚合 | §16(看板性能) | 2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv | 2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv | 2026-02-10 | DONE | server/scripts/regression-dashboard.sh | none |
| P9B2 | Dashboard聚合性能回归脚本补强 | §16(回归工程化) | 2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv | 2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv | 2026-02-10 | DONE | server/scripts/regression-dashboard.sh + regression-all.sh | none |
| P9C1 | feature-matrix纳入P6-P8能力 | §16(状态治理) | 2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv | 2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv | 2026-02-10 | DONE | manual | none |
| P9C2 | 矩阵一致性校验脚本扩展 | §16(门禁与漂移阻断) | 2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv | 2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv | 2026-02-10 | DONE | scripts/check-minimal.sh | none |
| P9D1 | P9整体验收与回归基线 | §16(回归基线) | 2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv | 2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv | 2026-02-10 | DONE | scripts/check-minimal.sh + server/scripts/regression-all.sh | none |
| P10E1 | ERP适配器配置模型收口 | §16(外部集成硬化) | 2026-02-10_10-35-30-p10-production-hardening.csv | 2026-02-10_10-35-30-p10-production-hardening.csv | 2026-02-10 | DONE | server/src/config.js 静态检查 | none |
| P10E2 | ERP真实HTTP适配器实现 | §16(ERP 同步硬化) | 2026-02-10_10-35-30-p10-production-hardening.csv | 2026-02-10_10-35-30-p10-production-hardening.csv | 2026-02-10 | DONE | server/scripts/regression-integrations.sh | 4xx dead_letter / 5xx+timeout retry |
| P10E3 | Outbox失败分类与重试语义强化 | §16(Outbox 可靠性) | 2026-02-10_10-35-30-p10-production-hardening.csv | 2026-02-10_10-35-30-p10-production-hardening.csv | 2026-02-10 | DONE | server/scripts/regression-integrations.sh | none |
| P10E4 | 集成回归脚本引入本地Mock ERP | §16(回归工程化) | 2026-02-10_10-35-30-p10-production-hardening.csv | 2026-02-10_10-35-30-p10-production-hardening.csv | 2026-02-10 | DONE | server/scripts/regression-integrations.sh | 脚本内嵌 Node mock server |
| P10M1 | invoicePool二阶段拆分(读路径) | §16(维护性治理) | 2026-02-10_10-35-30-p10-production-hardening.csv | 2026-02-10_10-35-30-p10-production-hardening.csv | 2026-02-10 | DONE | node --check invoicePool 主/子模块 | none |
| P10M2 | invoicePool二阶段拆分回归与基线更新 | §16(回归与文档) | 2026-02-10_10-35-30-p10-production-hardening.csv | 2026-02-10_10-35-30-p10-production-hardening.csv | 2026-02-10 | DONE | server/scripts/regression-verification.sh + regression-workflow-actions.sh | none |
| P10G1 | 矩阵与执行合同同步到P10 | §16(状态治理) | 2026-02-10_10-35-30-p10-production-hardening.csv | 2026-02-10_10-35-30-p10-production-hardening.csv | 2026-02-10 | DONE | scripts/check-minimal.sh | 覆盖 P5-P10 全量 |
| G0 | P11/P12执行合同建档 | §16(执行合同治理) | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11 | DONE | manual | none |
| G1 | Feature Flag模型与评估服务 | §16(灰度治理) | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11 | DONE | cd server && npm run prisma:validate | none |
| G2 | 开关管理API与审计 | §16(灰度治理) | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11 | DONE | node --check server/src/routes/featureFlags.js | none |
| G3 | ERP灰度接入(pay+手动sync) | §16(外部集成灰度) | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11 | DONE | server/scripts/regression-integrations.sh | 补齐department_id上下文 |
| G4 | 验真开关统一收口(路由+服务+作业) | §16(验真灰度) | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11 | DONE | server/scripts/regression-verification.sh | 判定统一收口 |
| G5 | 管理后台开关页 | §16(运营治理) | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11 | DONE | client:typecheck/build | none |
| G6 | 回归脚本与文档收口 | §16(回归工程化) | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11 | DONE | server/scripts/regression-feature-flags.sh | none |
| H1 | 安全与压测门槛 | §16(非功能治理) | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11 | DONE | server/scripts/security-baseline.sh + benchmark-dashboard.sh | none |
| M1 | PWA基础设施 | §16(移动端治理) | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11 | DONE | client:typecheck/build | none |
| M2 | 移动 PDF 发票与离线上传队列 | §16(移动端治理) | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11 | DONE | manual + client:typecheck/build | iOS前台恢复重放 |
| M3 | 移动审批快捷处理 | §16(移动端治理) | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11 | DONE | manual + client:typecheck/build | none |
| M4 | P12验收与收口 | §16(状态治理) | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11-p11-p12-governance-mobile.csv | 2026-02-11 | DONE | docs/mobile/pwa-regression-checklist.md | none |
| P13-0 | P13执行合同建档 | §16(执行合同治理) | 2026-02-12_01-09-41-p13-l5-governance.csv | 2026-02-12_01-09-41-p13-l5-governance.csv | 2026-02-12 | DONE | manual | none |
| P13-1 | 后端单元测试框架引入 | §16(测试工程化) | 2026-02-12_01-09-41-p13-l5-governance.csv | 2026-02-12_01-09-41-p13-l5-governance.csv | 2026-02-12 | DONE | cd server && npm test | Vitest底座落地 |
| P13-2 | 核心服务单元测试补齐 | §16(测试工程化) | 2026-02-12_01-09-41-p13-l5-governance.csv | 2026-02-12_01-09-41-p13-l5-governance.csv | 2026-02-12 | DONE | cd server && npm run test:coverage | 覆盖 featureFlags/verification/integrations dispatcher |
| P13-3 | OpenAPI自动文档接入 | §16(治理可观测性) | 2026-02-12_01-09-41-p13-l5-governance.csv | 2026-02-12_01-09-41-p13-l5-governance.csv | 2026-02-12 | DONE | /api/docs + /api/docs/json(非生产) | 双闸条件:非生产+开关开启 |
| P13-4 | SLI-SLO与错误预算落地 | §16(非功能治理) | 2026-02-12_01-09-41-p13-l5-governance.csv | 2026-02-12_01-09-41-p13-l5-governance.csv | 2026-02-12 | DONE | docs/ops/slo.md + deploy/prometheus/alerts-slo.yml | none |
| P13-5 | 回归脚本结构化报告输出 | §16(回归工程化) | 2026-02-12_01-09-41-p13-l5-governance.csv | 2026-02-12_01-09-41-p13-l5-governance.csv | 2026-02-12 | DONE | server/scripts/regression-all.sh --json-report | 报告 schema_version=1.0 |
| P13-6 | CI回归报告归档 | §16(CI治理) | 2026-02-12_01-09-41-p13-l5-governance.csv | 2026-02-12_01-09-41-p13-l5-governance.csv | 2026-02-12 | DONE | .github/workflows/ci-regression.yml artifact | run_id+sha 可追溯 |
| P13-7 | 变更失败率统计脚本 | §16(DORA 指标治理) | 2026-02-12_01-09-41-p13-l5-governance.csv | 2026-02-12_01-09-41-p13-l5-governance.csv | 2026-02-12 | DONE | python3 scripts/cfr_report.py --window 7d,30d | failed_commit=回归失败或24h热修 |
| P13-8 | P13验收与矩阵收口 | §16(状态治理) | 2026-02-12_01-09-41-p13-l5-governance.csv | 2026-02-12_01-09-41-p13-l5-governance.csv | 2026-02-12 | DONE | check-minimal + regression-all + validate-feature-matrix | none |
| P14-0 | P14执行合同建档 | §16(执行合同治理) | 2026-02-13_00-11-56-p14-l5-operationalization.csv | 2026-02-13_00-11-56-p14-l5-operationalization.csv | 2026-02-13 | DONE | manual | none |
| P14-1 | 回归报告Schema固化 | §16(报告Schema) | 2026-02-13_00-11-56-p14-l5-operationalization.csv | 2026-02-13_00-11-56-p14-l5-operationalization.csv | 2026-02-13 | DONE | scripts/validate_regression_report.py | none |
| P14-2 | CI回归摘要发布 | §16(CI摘要) | 2026-02-13_00-11-56-p14-l5-operationalization.csv | 2026-02-13_00-11-56-p14-l5-operationalization.csv | 2026-02-13 | DONE | manual | none |
| P14-3 | CFR自动周/月报 | §16(CFR报告) | 2026-02-13_00-11-56-p14-l5-operationalization.csv | 2026-02-13_00-11-56-p14-l5-operationalization.csv | 2026-02-13 | DONE | scripts/cfr_report.py | none |
| P14-4 | 高风险服务单测扩容 | §16(单测覆盖率) | 2026-02-13_00-11-56-p14-l5-operationalization.csv | 2026-02-13_00-11-56-p14-l5-operationalization.csv | 2026-02-13 | DONE | cd server && npm run test:coverage | 仅纯单测 |
| P14-5 | 覆盖率门禁渐进 | §16(覆盖率门禁) | 2026-02-13_00-11-56-p14-l5-operationalization.csv | 2026-02-13_00-11-56-p14-l5-operationalization.csv | 2026-02-13 | DONE | scripts/coverage_gate.js | none |
| P14-6 | OpenAPI覆盖扩展与漂移检查 | §16(OpenAPI覆盖扩展) | 2026-02-13_00-11-56-p14-l5-operationalization.csv | 2026-02-13_00-11-56-p14-l5-operationalization.csv | 2026-02-13 | DONE | scripts/openapi_diff_check.py | none |
| P14-7 | 分布式追踪最小落地 | §16(链路追踪) | 2026-02-13_00-11-56-p14-l5-operationalization.csv | 2026-02-13_00-11-56-p14-l5-operationalization.csv | 2026-02-13 | DONE | manual | none |
| P14-8 | P14验收与矩阵收口 | §16(验收与同步) | 2026-02-13_00-11-56-p14-l5-operationalization.csv | 2026-02-13_00-11-56-p14-l5-operationalization.csv | 2026-02-13 | DONE | scripts/check-minimal.sh | none |
| P15A-0 | P15A执行合同建档 | §17(权限解耦治理) | 2026-03-06_14-30-00-p15a-l5-permission-decouple.csv | 2026-03-06_14-30-00-p15a-l5-permission-decouple.csv | 2026-03-06 | DONE | CSV 校验 | none |
| P15A-1 | 常量字典与角色补齐 | §17(权限解耦治理) | 2026-03-06_14-30-00-p15a-l5-permission-decouple.csv | 2026-03-06_14-30-00-p15a-l5-permission-decouple.csv | 2026-03-07 | DONE | server:test | leave.* 权限与角色映射落地 |
| P15A-2 | 工作流动态鉴权剥离 | §17(权限解耦治理) | 2026-03-06_14-30-00-p15a-l5-permission-decouple.csv | 2026-03-06_14-30-00-p15a-l5-permission-decouple.csv | 2026-03-07 | DONE | server:test + regression-workflow-actions | workflow 审批按 entityType 动态鉴权 |
| P15A-3 | 前端路由与菜单显隐域解耦 | §17(权限解耦治理) | 2026-03-06_14-30-00-p15a-l5-permission-decouple.csv | 2026-03-06_14-30-00-p15a-l5-permission-decouple.csv | 2026-03-07 | DONE | client:typecheck/build | 复用审批入口支持 leave.approve |
| P15A-4 | OpenAPI Tag分离 | §17(权限解耦治理) | 2026-03-06_14-30-00-p15a-l5-permission-decouple.csv | 2026-03-06_14-30-00-p15a-l5-permission-decouple.csv | 2026-03-07 | DONE | /api/docs/json | leave 路由独立归组 |
| P15A-5 | P15A全量回归测试 | §17(权限解耦治理) | 2026-03-06_14-30-00-p15a-l5-permission-decouple.csv | 2026-03-06_14-30-00-p15a-l5-permission-decouple.csv | 2026-03-07 | DONE | regression-all | 报销主流程零回归 |
| P15B-0 | P15B执行合同建档 | §17(请假V1治理) | 2026-03-06_14-30-00-p15b-l5-leave-v1.csv | 2026-03-06_14-30-00-p15b-l5-leave-v1.csv | 2026-03-06 | DONE | CSV 校验 | none |
| P15B-1 | 国际化四层模型扩展 | §17(请假V1治理) | 2026-03-06_14-30-00-p15b-l5-leave-v1.csv | 2026-03-06_14-30-00-p15b-l5-leave-v1.csv | 2026-03-07 | DONE | prisma migrate dev + prisma generate | LeaveType / LeavePolicy / LeaveLedger / LeaveRequest 扩展完成 |
| P15B-2 | HR业务基础类型维表API | §17(请假V1治理) | 2026-03-06_14-30-00-p15b-l5-leave-v1.csv | 2026-03-06_14-30-00-p15b-l5-leave-v1.csv | 2026-03-07 | DONE | manual + server:test | leave-types CRUD 与策略绑定完成 |
| P15B-2A | Leave申请列表接口 | §17(请假V1治理) | 2026-03-06_14-30-00-p15b-l5-leave-v1.csv | 2026-03-06_14-30-00-p15b-l5-leave-v1.csv | 2026-03-07 | DONE | manual | 支持本人/全量视角列表查询 |
| P15B-3 | 天数预检与隔离碰撞强设闸 | §17(请假V1治理) | 2026-03-06_14-30-00-p15b-l5-leave-v1.csv | 2026-03-06_14-30-00-p15b-l5-leave-v1.csv | 2026-03-07 | DONE | manual leave flow | 半天粒度天数与冲突校验返回 422 |
| P15B-4 | 状态机与冻结账本流转闭环 | §17(请假V1治理) | 2026-03-06_14-30-00-p15b-l5-leave-v1.csv | 2026-03-06_14-30-00-p15b-l5-leave-v1.csv | 2026-03-07 | DONE | server:test + manual leave flow | reserve/release/consume 账本联动 workflow 完成 |
| P15B-4A | Leave撤回与冻结释放接口 | §17(请假V1治理) | 2026-03-06_14-30-00-p15b-l5-leave-v1.csv | 2026-03-06_14-30-00-p15b-l5-leave-v1.csv | 2026-03-07 | DONE | manual leave flow | 撤回恢复 draft 并释放冻结额度 |
| P15B-5 | Leave申请前端模块集成 | §17(请假V1治理) | 2026-03-06_14-30-00-p15b-l5-leave-v1.csv | 2026-03-06_14-30-00-p15b-l5-leave-v1.csv | 2026-03-07 | DONE | client:typecheck/build | 请假页面、菜单、路由与审批详情联动完成 |
| P15B-6 | P15B验收联调测试 | §17(请假V1治理) | 2026-03-06_14-30-00-p15b-l5-leave-v1.csv | 2026-03-06_14-30-00-p15b-l5-leave-v1.csv | 2026-03-07 | DONE | regression-all + manual leave flow | 创建/提交/审批/冲突/撤回全链路通过 |
| P16A-0 | P16A执行合同建档 | §18(主数据核心治理) | 2026-03-07_13-47-05-p16a-l5-master-data-core.csv | 2026-03-07_13-47-05-p16a-l5-master-data-core.csv | 2026-03-07 | DONE | CSV 校验 | P16A仅建主数据本体不批量改造既有业务 |
| P16A-1 | Prisma主数据模型与迁移 | §18(主数据核心治理) | 2026-03-07_13-47-05-p16a-l5-master-data-core.csv | 2026-03-07_13-47-05-p16a-l5-master-data-core.csv | 2026-03-07 | DONE | prisma:validate + prisma:migrate + prisma:generate | LegalEntity/CostCenter/DocumentCategory 与枚举迁移完成 |
| P16A-2 | 权限与种子补齐 | §18(主数据核心治理) | 2026-03-07_13-47-05-p16a-l5-master-data-core.csv | 2026-03-07_13-47-05-p16a-l5-master-data-core.csv | 2026-03-07 | DONE | server:test + seed:config + seed:dev-users | 新增 masterdata.view/manage 与主数据演示种子 |
| P16A-3 | 后端主数据CRUD API | §18(主数据核心治理) | 2026-03-07_13-47-05-p16a-l5-master-data-core.csv | 2026-03-07_13-47-05-p16a-l5-master-data-core.csv | 2026-03-07 | DONE | server:test + manual master-data flow | `/api/master-data/*` 三类主数据 CRUD/归档与唯一性校验可用 |
| P16A-4 | 前端主数据入口与管理页 | §18(主数据核心治理) | 2026-03-07_13-47-05-p16a-l5-master-data-core.csv | 2026-03-07_13-47-05-p16a-l5-master-data-core.csv | 2026-03-07 | DONE | client:typecheck/build | `MasterDataPage` 单页多 Tab 与菜单路由落地 |
| P16A-5 | 矩阵与文档同步 | §18(主数据核心治理) | 2026-03-07_13-47-05-p16a-l5-master-data-core.csv | 2026-03-07_13-47-05-p16a-l5-master-data-core.csv | 2026-03-07 | DONE | validate-feature-matrix | 状态矩阵范围、事实源与 P16A 条目同步完成 |
| P16A-6 | P16A回归与安全收口 | §18(主数据核心治理) | 2026-03-07_13-47-05-p16a-l5-master-data-core.csv | 2026-03-07_13-47-05-p16a-l5-master-data-core.csv | 2026-03-07 | DONE | regression-all + manual security | 主数据 CRUD/归档/越权负测与既有主流程回归通过 |
| P16B-0 | P16B执行合同建档 | §18(日历主数据治理) | 2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv | 2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv | 2026-03-07 | DONE | CSV 校验 | P16B仅补节假日历主数据与关闭态算法增强 |
| P16B-1 | Prisma日历模型与迁移 | §18(日历主数据治理) | 2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv | 2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv | 2026-03-07 | DONE | prisma:validate + prisma:migrate + prisma:generate | HolidayCalendar/HolidayCalendarDay 与法体默认日历关联落地 |
| P16B-2 | 日历开关与种子补齐 | §18(日历主数据治理) | 2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv | 2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv | 2026-03-07 | DONE | server:test + seed:config + seed:dev-users | `leave_holiday_calendar` 双闸开关与演示日历种子完成 |
| P16B-3 | 后端日历主数据API | §18(日历主数据治理) | 2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv | 2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv | 2026-03-07 | DONE | server:test + manual calendar flow | `/api/master-data/holiday-calendars*` 列表/维护/日期覆盖/归档可用 |
| P16B-4 | 前端主数据日历Tab | §18(日历主数据治理) | 2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv | 2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv | 2026-03-07 | DONE | client:typecheck/build | `MasterDataPage` 新增日历 Tab 与功能开关展示文案 |
| P16B-5 | 请假日历增强计算器 | §18(日历主数据治理) | 2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv | 2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv | 2026-03-07 | DONE | server:test + manual leave flow | 关闭开关保持自然日 开启后按法体默认日历计算 requestedDays |
| P16B-6 | P16B回归与矩阵收口 | §18(日历主数据治理) | 2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv | 2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv | 2026-03-07 | DONE | regression-all + manual flag toggle | finance 只读 finance_mgr 可维护 默认日历禁止归档 且请假 6 天→4 天验证通过 |
| P16C-0 | P16C执行合同建档 | §18(供应商主数据治理) | 2026-03-07_17-14-39-p16c-l5-suppliers.csv | 2026-03-07_17-14-39-p16c-l5-suppliers.csv | 2026-03-07 | DONE | CSV 校验 | P16C仅补供应商主数据与主数据页入口 |
| P16C-1 | Prisma供应商模型与迁移 | §18(供应商主数据治理) | 2026-03-07_17-14-39-p16c-l5-suppliers.csv | 2026-03-07_17-14-39-p16c-l5-suppliers.csv | 2026-03-07 | DONE | prisma:validate + prisma:migrate + prisma:generate | Supplier 模型、法体关联与迁移落地 |
| P16C-2 | 种子与权限边界补齐 | §18(供应商主数据治理) | 2026-03-07_17-14-39-p16c-l5-suppliers.csv | 2026-03-07_17-14-39-p16c-l5-suppliers.csv | 2026-03-07 | DONE | server:test + seed:config + seed:dev-users | 沿用 masterdata.view/manage 并补开发演示供应商 |
| P16C-3 | 后端供应商CRUD API | §18(供应商主数据治理) | 2026-03-07_17-14-39-p16c-l5-suppliers.csv | 2026-03-07_17-14-39-p16c-l5-suppliers.csv | 2026-03-07 | DONE | server:test + manual supplier flow | `/api/master-data/suppliers*` 列表/创建/更新/归档可用 |
| P16C-4 | 前端供应商Tab与API封装 | §18(供应商主数据治理) | 2026-03-07_17-14-39-p16c-l5-suppliers.csv | 2026-03-07_17-14-39-p16c-l5-suppliers.csv | 2026-03-07 | DONE | client:typecheck/build | `MasterDataPage` 新增供应商 Tab 与 API 封装完成 |
| P16C-5 | 矩阵与蓝图事实源同步 | §18(供应商主数据治理) | 2026-03-07_17-14-39-p16c-l5-suppliers.csv | 2026-03-07_17-14-39-p16c-l5-suppliers.csv | 2026-03-07 | DONE | validate-feature-matrix | P16C 条目、范围与事实源同步完成 |
| P16C-6 | P16C回归与安全收口 | §18(供应商主数据治理) | 2026-03-07_17-14-39-p16c-l5-suppliers.csv | 2026-03-07_17-14-39-p16c-l5-suppliers.csv | 2026-03-07 | DONE | regression-all + manual supplier flow | finance 只读 finance_mgr 可维护 employee 无查看权限 且重复/归档幂等验证通过 |
| R9-0 | R9执行合同建档 | N/A | 2026-03-07_18-15-03-r9-g2-p19-roadmap-refresh.csv | 2026-03-07_18-15-03-r9-g2-p19-roadmap-refresh.csv | 2026-03-07 | DONE | CSV 校验 | 新路线图合同建档并校验通过 |
| R9-1 | 冻结P16C之后的新阶段顺序 | N/A | 2026-03-07_18-15-03-r9-g2-p19-roadmap-refresh.csv | 2026-03-07_18-15-03-r9-g2-p19-roadmap-refresh.csv | 2026-03-07 | DONE | validate-feature-matrix | 固定顺序为 G2 → P17A → P17B → P18A → P18B → P19 |
| R9-2 | 冻结Skills与MCP启用边界 | N/A | 2026-03-07_18-15-03-r9-g2-p19-roadmap-refresh.csv | 2026-03-07_18-15-03-r9-g2-p19-roadmap-refresh.csv | 2026-03-07 | DONE | manual | 继续固定 `plan/testing`,MCP 默认关闭且首次启用前补 `docs/mcp-tools.md` |
| R9-3 | 声明旧P16到P18蓝图为历史快照 | N/A | 2026-03-07_18-15-03-r9-g2-p19-roadmap-refresh.csv | 2026-03-07_18-15-03-r9-g2-p19-roadmap-refresh.csv | 2026-03-07 | DONE | validate-feature-matrix | 旧蓝图保持不可变,后续阶段不回写历史 CSV |
| G2-0 | G2执行合同建档 | N/A | 2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv | 2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv | 2026-03-07 | DONE | CSV 校验 | G2 只处理预算/编号/工作流跨域桥接 |
| G2-1 | 扩展预算与工作流跨域兼容模型 | N/A | 2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv | 2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv | 2026-03-07 | DONE | prisma:validate + prisma:migrate + prisma:generate | BudgetPool / BudgetLedgerEntry / WorkflowInstance 补齐桥接字段并保持旧报销兼容 |
| G2-2 | 补齐预算接口与通用单据编号读取 | N/A | 2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv | 2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv | 2026-03-07 | DONE | server:test | 预算 API 支持法体/成本中心维度,新增通用 document sequence 读取与发号服务 |
| G2-3 | 扩展权限解析与工作流实体元数据 | N/A | 2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv | 2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv | 2026-03-07 | DONE | server:test + regression-workflow-actions | procurement 审批权限与 workflow 实体元数据扩展完成 |
| G2-4 | 升级预算前端为多作用域模式 | N/A | 2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv | 2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv | 2026-03-07 | DONE | client:typecheck/build | `BudgetsPage` 支持全局/部门/法体+成本中心三种预算模式 |
| G2-5 | 同步R9与G2事实源 | N/A | 2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv | 2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv | 2026-03-07 | DONE | validate-feature-matrix | Feature Matrix 范围、事实源与 R9/G2 条目同步完成 |
| G2-6 | G2回归与安全收口 | N/A | 2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv | 2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv | 2026-03-07 | DONE | regression-all + client:typecheck/build | 预算/编号/工作流跨域桥接回归通过,报销主流程零回归 |
| P17A-0 | P17A执行合同建档 | N/A | 2026-03-07_19-33-09-p17a-l5-procurement-core.csv | 2026-03-07_19-33-09-p17a-l5-procurement-core.csv | 2026-03-07 | DONE | CSV 校验 | 轻采购核心合同建档并冻结仅做申请主流程边界 |
| P17A-1 | 采购核心Prisma模型与迁移 | N/A | 2026-03-07_19-33-09-p17a-l5-procurement-core.csv | 2026-03-07_19-33-09-p17a-l5-procurement-core.csv | 2026-03-07 | DONE | prisma:validate + server:test | PurchaseRequest/PurchaseRequestItem/PurchaseAttachment 与 WorkflowInstance 采购关联落地 |
| P17A-2 | 采购权限与系统种子补齐 | N/A | 2026-03-07_19-33-09-p17a-l5-procurement-core.csv | 2026-03-07_19-33-09-p17a-l5-procurement-core.csv | 2026-03-07 | DONE | server:test + seed:config | procurement 权限映射、`PR_STANDARD` 单据分类与单步经理审批种子完成 |
| P17A-3 | 采购申请后端API与工作流接入 | N/A | 2026-03-07_19-33-09-p17a-l5-procurement-core.csv | 2026-03-07_19-33-09-p17a-l5-procurement-core.csv | 2026-03-07 | DONE | server:test + regression-workflow-actions | `/api/purchase-requests*` 草稿/提交/撤回/附件接口与 workflow 待办联动可用 |
| P17A-4 | 采购前端入口与申请页 | N/A | 2026-03-07_19-33-09-p17a-l5-procurement-core.csv | 2026-03-07_19-33-09-p17a-l5-procurement-core.csv | 2026-03-07 | DONE | client:typecheck/build | `PurchaseRequestsPage`、菜单、路由与移动审批详情采购展示完成 |
| P17A-5 | OpenAPI与合同文档同步 | N/A | 2026-03-07_19-33-09-p17a-l5-procurement-core.csv | 2026-03-07_19-33-09-p17a-l5-procurement-core.csv | 2026-03-07 | DONE | node --check + validate-feature-matrix | 采购路由标签、合同锚点与矩阵事实源同步完成 |
| P17A-6 | P17A回归与验收收口 | N/A | 2026-03-07_19-33-09-p17a-l5-procurement-core.csv | 2026-03-07_19-33-09-p17a-l5-procurement-core.csv | 2026-03-07 | DONE | regression-all + client:typecheck/build | 采购草稿/附件/提交/撤回/审批通过,且报销/请假/主数据零回归 |
| P17B-0 | P17B执行合同建档 | N/A | 2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv | 2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv | 2026-03-07 | DONE | CSV 校验 | 采购预算闭环与归档执行合同建档,冻结仅做预算预留确认释放与 PO/合同归档 |
| P17B-1 | 采购预算预留确认释放语义 | N/A | 2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv | 2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv | 2026-03-07 | DONE | server:test + regression-all | `purchase_request` 提交写 reserve、审批写 confirm、撤回/驳回/退回写 release,且兼容报销旧预算语义 |
| P17B-2 | PO合同归档模型与接口 | N/A | 2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv | 2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv | 2026-03-07 | DONE | server:test + regression-procurement | `PurchaseOrderArchive`、采购详情归档读取与幂等保存接口可用,仅管理角色可操作 |
| P17B-3 | 工作流联动预算释放 | N/A | 2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv | 2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv | 2026-03-07 | DONE | server:test + regression-workflow-actions | workflow 审批通过/驳回/退回与采购撤回链路已联动预算预留确认释放,并通过幂等释放助手收口 |
| P17B-4 | 前端归档入口与采购E2E | N/A | 2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv | 2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv | 2026-03-07 | DONE | client:typecheck/build + playwright | `PurchaseRequestsPage` 新增归档区块,采购主链路 E2E 覆盖员工提单、经理审批、财务归档 |
| P17B-5 | 安全文档与接口说明 | N/A | 2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv | 2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv | 2026-03-07 | DONE | node --check + validate-feature-matrix | 采购预算闭环、归档权限边界与矩阵事实源同步完成,主数据读取越权缺口已补齐 |
| P17B-6 | P17B回归与安全收口 | N/A | 2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv | 2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv | 2026-03-07 | DONE | regression-all + client:typecheck/build + playwright | 采购预算闭环、PO归档与全量回归通过,报销/请假/主数据/采购主流程零回归 |
| P18A-0 | P18A执行合同建档 | N/A | 2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv | 2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv | 2026-03-07 | DONE | CSV 校验 | 固资台账核心执行合同建档并冻结仅做资产分类与资产卡片 |
| P18A-1 | 资产Prisma模型与迁移 | N/A | 2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv | 2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv | 2026-03-07 | DONE | prisma:validate + prisma:migrate + prisma:generate | `AssetCategory`、`AssetCard` 与法体/成本中心/采购来源关系落地,且不破坏既有主流程 |
| P18A-2 | 资产权限与系统种子 | N/A | 2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv | 2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv | 2026-03-07 | DONE | server:test + seed:config | `asset.*` 权限映射与 `ASSET_CARD_DEFAULT` 系统单据分类补齐完成 |
| P18A-3 | 资产分类与卡片后端API | N/A | 2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv | 2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv | 2026-03-07 | DONE | server:test + regression-assets | `/api/asset-categories` 与 `/api/assets` 列表详情创建更新接口可用,采购来源引用校验正确 |
| P18A-4 | 资产台账前端入口与页面 | N/A | 2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv | 2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv | 2026-03-07 | DONE | client:typecheck/build | `AssetRegistryPage`、菜单、路由与资产分类/卡片编辑界面可用 |
| P18A-5 | OpenAPI与矩阵同步 | N/A | 2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv | 2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv | 2026-03-07 | DONE | node --check + validate-feature-matrix | 资产接口文档标签、合同锚点与矩阵事实源同步完成 |
| P18A-6 | P18A回归与验收收口 | N/A | 2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv | 2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv | 2026-03-07 | DONE | regression-all + client:typecheck/build | 资产分类、资产卡片与既有报销/请假/采购/主数据回归全部通过 |
| P18B-0 | P18B执行合同建档 | N/A | 2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv | 2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv | 2026-03-07 | DONE | CSV 校验 | 资产流转与盘点执行合同建档并冻结不引入资产审批流 |
| P18B-1 | 资产领用归还模型与接口 | N/A | 2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv | 2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv | 2026-03-07 | DONE | server:test + regression-assets | `AssetAssignment` 与 `/api/assets/:id/assign|return` 落地,支持领用归还再领用并保留不可变历史 |
| P18B-2 | 资产调拨模型与接口 | N/A | 2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv | 2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv | 2026-03-07 | DONE | server:test + regression-assets | `AssetTransfer` 与 `/api/assets/:id/transfer` 落地,调拨时同步归属人与位置并维护 assignment 开闭 |
| P18B-3 | 资产盘点模型与接口 | N/A | 2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv | 2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv | 2026-03-07 | DONE | server:test + regression-assets | `InventoryCheck`/`InventoryCheckItem` 与创建启动录入完成接口可用,盘点结果按资产 upsert |
| P18B-4 | 资产流转前端与盘点页 | N/A | 2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv | 2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv | 2026-03-07 | DONE | client:typecheck/build + playwright | `AssetRegistryPage` 增加领用归还调拨入口,新增 `InventoryChecksPage`、菜单与路由 |
| P18B-5 | 安全文档与审计动作同步 | N/A | 2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv | 2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv | 2026-03-07 | DONE | validate-feature-matrix + regression-assets | 审计动作码 `ASSET_*` 与 `INVENTORY_*` 链路补齐,矩阵事实源与资产回归脚本同步完成 |
| P18B-6 | P18B回归与安全收口 | N/A | 2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv | 2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv | 2026-03-07 | DONE | regression-all + client:typecheck/build + playwright | 资产领用归还调拨盘点闭环通过,且报销/请假/主数据/采购/资产台账零回归 |
| P19-0 | P19执行合同建档 | N/A | 2026-03-07_23-22-00-p19-l4-integration-readiness.csv | 2026-03-07_23-22-00-p19-l4-integration-readiness.csv | 2026-03-07 | DONE | CSV 校验 | 集成/AI/IM 准备阶段执行合同建档并冻结仅做蓝图与边界 |
| P19-1 | 领域事件清单冻结 | N/A | 2026-03-07_23-22-00-p19-l4-integration-readiness.csv | 2026-03-07_23-22-00-p19-l4-integration-readiness.csv | 2026-03-07 | DONE | validate-feature-matrix | `docs/domain-events.md` 冻结采购与资产域对外事件名、触发时机与最小载荷 |
| P19-2 | ERP与财务适配边界 | N/A | 2026-03-07_23-22-00-p19-l4-integration-readiness.csv | 2026-03-07_23-22-00-p19-l4-integration-readiness.csv | 2026-03-07 | DONE | validate-feature-matrix | `docs/integration-boundaries.md` 明确主数据同步、采购资产摘要输出与 ERP 禁入规则 |
| P19-3 | IM与AI边界冻结 | N/A | 2026-03-07_23-22-00-p19-l4-integration-readiness.csv | 2026-03-07_23-22-00-p19-l4-integration-readiness.csv | 2026-03-07 | DONE | validate-feature-matrix | 冻结飞书/企微通知与 AI 只读辅助边界,明确不得绕过权限与人工复核 |
| P19-4 | MCP与文档基线 | N/A | 2026-03-07_23-22-00-p19-l4-integration-readiness.csv | 2026-03-07_23-22-00-p19-l4-integration-readiness.csv | 2026-03-07 | DONE | manual | 明确 MCP 默认关闭,首次启用前需补 `docs/mcp-tools.md` 并生成工具目录 |
| P19-5 | 文档与矩阵同步 | N/A | 2026-03-07_23-22-00-p19-l4-integration-readiness.csv | 2026-03-07_23-22-00-p19-l4-integration-readiness.csv | 2026-03-07 | DONE | validate-feature-matrix | Feature Matrix 标题、范围、事实源与 P19 条目同步到 `P5-P19` |
| P19-6 | P19蓝图验收收口 | N/A | 2026-03-07_23-22-00-p19-l4-integration-readiness.csv | 2026-03-07_23-22-00-p19-l4-integration-readiness.csv | 2026-03-07 | DONE | validate-issues-csv + validate-feature-matrix | P19 仅交付文档蓝图且不包含运行时代码改动,校验通过后收口 |
| P19IM1-0 | P19IM1执行合同建档 | N/A | 2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv | 2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv | 2026-03-08 | DONE | CSV 校验 | 企微协同适配一期执行合同建档,冻结仅做群机器人 + 深链 + Outbox 派发 |
| P19IM1-1 | 通知渠道CRUD与路由配置 | N/A | 2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv | 2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv | 2026-03-08 | DONE | server:test + node --check | `NotificationChannel` 创建更新查询与角色 / 业务域 / 类型路由校验落地,不新增 Prisma 迁移 |
| P19IM1-2 | Outbox化IM派发与企微适配器 | N/A | 2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv | 2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv | 2026-03-08 | DONE | server:test + regression-im-notifier | `notification.im` 真实走 `IntegrationOutbox`,支持企微 `mock` / `wecom_webhook` 并与邮件拆分 |
| P19IM1-3 | 业务事件接入与通知类型规范化 | N/A | 2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv | 2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv | 2026-03-08 | DONE | server:test + regression-all | 报销 / 请假 / 采购 / 资产 / 盘点的首批待办与结果通知统一接入 IM 入队 |
| P19IM1-4 | 前端渠道管理页与导航入口 | N/A | 2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv | 2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv | 2026-03-08 | DONE | client:typecheck/build | 新增 `NotificationChannelsPage`、`/system/notification-channels` 路由与菜单入口,支持测试发送 |
| P19IM1-5 | OpenAPI文档与矩阵同步 | N/A | 2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv | 2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv | 2026-03-08 | DONE | validate-feature-matrix | 集成边界、领域事件与 Feature Matrix 更新到 `P5-P19+IM-1` 并纳入新合同事实源 |
| P19IM1-6 | P19IM1回归与验收收口 | N/A | 2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv | 2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv | 2026-03-08 | DONE | server:test + regression-all + client:typecheck/build | 企微 mock / webhook、渠道后台、业务入队与回归脚本全部通过,且站内通知 / 邮件零回归 |
| P19ERP1-0 | P19ERP1执行合同建档 | N/A | 2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv | 2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv | 2026-03-08 | DONE | CSV 校验 | ERP 主数据同步与报销付款凭证桥接执行合同建档,冻结先入后出与不污染核心域原则 |
| P19ERP1-1 | ERP适配契约与集成层模型 | N/A | 2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv | 2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv | 2026-03-08 | DONE | prisma:validate + server:test | 新增 `IntegrationBinding` / `IntegrationSyncState` 与 ERP provider 扩展契约,且不向核心事务表写 ERP 私有字段 |
| P19ERP1-2 | 主数据入站同步服务与接口 | N/A | 2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv | 2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv | 2026-03-08 | DONE | server:test + regression-integrations | `LegalEntity`、`CostCenter`、`Supplier` 支持 ERP 全量 Pull、状态查询与可选 cron,同步冲突与 skip 语义可追踪 |
| P19ERP1-3 | 报销付款凭证切片出站 | N/A | 2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv | 2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv | 2026-03-08 | DONE | server:test + regression-integrations + regression-all | `reimbursement.paid` 可预览标准 journal slice,并通过 `erp.journal.export` Outbox 导出;旧 `/api/integrations/erp/sync/:id` 继续兼容 |
| P19ERP1-4 | ERP管理页与报销详情导出入口 | N/A | 2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv | 2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv | 2026-03-08 | DONE | client:typecheck/build | 新增 `ErpIntegrationPage`、系统导航入口与报销详情 ERP 导出卡片,支持手动同步与导出反馈 |
| P19ERP1-5 | OpenAPI文档与矩阵同步 | N/A | 2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv | 2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv | 2026-03-08 | DONE | validate-feature-matrix | 集成边界、领域事件、Feature Matrix 与校验器同步到 `P5-P19+IM-1+ERP-1`,并纳入 ERP-1 合同事实源 |
| P19ERP1-6 | P19ERP1回归与安全收口 | N/A | 2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv | 2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv | 2026-03-08 | DONE | server:test + regression-integrations + regression-all + client:typecheck/build | 主数据 Pull、报销凭证切片、ERP 管理入口、开关阻断与 dead_letter 重入全部通过,且既有主流程零回归 |
| P19ERP2-0 | P19ERP2执行合同建档 | N/A | 2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv | 2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv | 2026-03-08 | DONE | CSV 校验 | 采购 ERP 双阶段出站执行合同建档,冻结 commitment / accrual / archive summary 三段模型 |
| P19ERP2-1 | 采购ERP出站契约与provider扩展 | N/A | 2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv | 2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv | 2026-03-08 | DONE | server:test | 扩展 `erp.journal.export` / `erp.procurement.export` 契约、payload、dedupe 与采购 binding 回写规则 |
| P19ERP2-2 | 采购审批与归档自动出站 | N/A | 2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv | 2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv | 2026-03-08 | DONE | server:test + regression-integrations | 采购审批自动入队 commitment,首次归档自动入队 accrual + summary,且 gate 关闭时仅 skip 不阻断业务 |
| P19ERP2-3 | 采购ERP轨道查询与重试接口 | N/A | 2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv | 2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv | 2026-03-08 | DONE | server:test + regression-integrations | 新增采购 ERP track / requeue 接口,支持历史补发、失败重试与 archive summary 覆盖同步 |
| P19ERP2-4 | 采购详情ERP轨道挂件 | N/A | 2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv | 2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv | 2026-03-08 | DONE | client:typecheck/build | `PurchaseRequestsPage` 归档区新增 ERP 三段轨道挂件,按权限区分查看与重试能力 |
| P19ERP2-5 | 文档事件与矩阵同步 | N/A | 2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv | 2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv | 2026-03-08 | DONE | validate-feature-matrix | 集成边界、领域事件、Feature Matrix 与校验器同步到 `P5-P19+IM-1+ERP-2`,并纳入 ERP-2 合同事实源 |
| P19ERP2-6 | P19ERP2回归与验收收口 | N/A | 2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv | 2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv | 2026-03-08 | DONE | server:test + regression-integrations + regression-all + client:typecheck/build | 采购双阶段 journal、archive summary 覆盖同步、详情挂件、权限边界与既有 ERP / IM 主流程回归全部通过 |
| P19ERP3-0 | P19ERP3执行合同建档 | N/A | 2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv | 2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv | 2026-03-09 | DONE | CSV 校验 | 资产 ERP 台账摘要执行合同建档,冻结仅做 asset ledger summary export 与仓库事实对齐 |
| P19ERP3-1 | 资产ERP出站契约与provider扩展 | N/A | 2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv | 2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv | 2026-03-09 | DONE | server:test | 新增 `erp.asset.export` 契约、`exportAssetToErp` provider 与 dispatcher / binding 回写规则,不新增核心表 ERP 字段 |
| P19ERP3-2 | 资产建卡与财务维度变更自动出站 | N/A | 2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv | 2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv | 2026-03-09 | DONE | server:test + regression-integrations | `POST /api/assets` 与财务维度 patch 自动写入资产 ERP 摘要 outbox,gate 关闭时仅 skip 不阻断业务 |
| P19ERP3-3 | 资产ERP轨道查询与重试接口 | N/A | 2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv | 2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv | 2026-03-09 | DONE | server:test + regression-integrations | 新增资产 ERP `track / requeue` 接口,支持脱敏查看、历史补发与失败重试 |
| P19ERP3-4 | 资产详情ERP轨道挂件 | N/A | 2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv | 2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv | 2026-03-09 | DONE | client:typecheck/build | `AssetRegistryPage` 详情侧新增资产 ERP 同步轨道挂件,按权限区分状态查看与补发操作 |
| P19ERP3-5 | 文档事件与矩阵同步 | N/A | 2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv | 2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv | 2026-03-09 | DONE | validate-feature-matrix | 集成边界、领域事件、Feature Matrix 与校验器同步到 `P5-P19+IM-1+ERP-3` 并纳入 ERP-3 合同事实源 |
| P19ERP3-6 | P19ERP3回归与验收收口 | N/A | 2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv | 2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv | 2026-03-09 | DONE | server:test + regression-integrations + regression-all + client:typecheck/build | 资产 ERP 摘要出站、详情挂件、脱敏权限、同一 outbox 覆盖同步与既有采购 / 报销 / IM 主流程回归全部通过 |
| R10-0 | R10执行合同建档 | N/A | 2026-03-09_10-15-00-r10-post-erp3-roadmap-refresh.csv | 2026-03-09_10-15-00-r10-post-erp3-roadmap-refresh.csv | 2026-03-09 | DONE | CSV 校验 | 后 ERP-3 时代总控路线合同建档,冻结未来主线顺序与执行纪律 |
| R10-1 | 冻结R10到P21主线顺序 | N/A | 2026-03-09_10-15-00-r10-post-erp3-roadmap-refresh.csv | 2026-03-09_10-15-00-r10-post-erp3-roadmap-refresh.csv | 2026-03-09 | DONE | CSV 校验 | 固定 `P19+MCP-1 -> P19+AI-1 -> P20+TRAVEL-1/2/3 -> P21+PWA-1/2`,并为后续阶段预生成执行合同 |
| R10-2 | 冻结后置backlog与进入条件 | N/A | 2026-03-09_10-15-00-r10-post-erp3-roadmap-refresh.csv | 2026-03-09_10-15-00-r10-post-erp3-roadmap-refresh.csv | 2026-03-09 | DONE | manual | `IM-2/3/4`、车辆、资产财务深化明确降为后置 backlog,仅保留进入条件不抢主线 |
| R10-3 | 同步路线文档与矩阵事实源 | N/A | 2026-03-09_10-15-00-r10-post-erp3-roadmap-refresh.csv | 2026-03-09_10-15-00-r10-post-erp3-roadmap-refresh.csv | 2026-03-09 | DONE | validate-feature-matrix | 集成边界与 Feature Matrix 纳入 R10 路线事实源,且不提前把未来 TODO phase 计入完成总数 |
| R10-4 | R10校验与收口 | N/A | 2026-03-09_10-15-00-r10-post-erp3-roadmap-refresh.csv | 2026-03-09_10-15-00-r10-post-erp3-roadmap-refresh.csv | 2026-03-09 | DONE | CSV 校验 + validate-feature-matrix | 新旧合同校验通过,主线 roadmap 可直接承接 P19+MCP-1 到 P21+PWA-2 |
| P19MCP1-0 | P19MCP1执行合同建档 | N/A | 2026-03-09_10-25-00-p19-mcp-1-l4-readonly-tools-baseline.csv | 2026-03-09_10-25-00-p19-mcp-1-l4-readonly-tools-baseline.csv | 2026-03-09 | DONE | CSV 校验 | MCP 只读工具基线执行合同建档,冻结示例配置优先与 GitHub deferred 边界 |
| P19MCP1-1 | MCP工具目录建档 | N/A | 2026-03-09_10-25-00-p19-mcp-1-l4-readonly-tools-baseline.csv | 2026-03-09_10-25-00-p19-mcp-1-l4-readonly-tools-baseline.csv | 2026-03-09 | DONE | validate-mcp-tools | 新增 `docs/mcp-tools.md`,enabled servers 固定仅 `postgres`,`github` 仅作为 deferred candidate 记录 |
| P19MCP1-2 | MCP使用边界与回滚策略 | N/A | 2026-03-09_10-25-00-p19-mcp-1-l4-readonly-tools-baseline.csv | 2026-03-09_10-25-00-p19-mcp-1-l4-readonly-tools-baseline.csv | 2026-03-09 | DONE | validate-mcp-tools + validate-feature-matrix | 固化只读排障边界、真实密钥禁入、GitHub 不启用与本机回滚策略,且与集成边界文档一致 |
| P19MCP1-3 | MCP文档校验与治理脚本 | N/A | 2026-03-09_10-25-00-p19-mcp-1-l4-readonly-tools-baseline.csv | 2026-03-09_10-25-00-p19-mcp-1-l4-readonly-tools-baseline.csv | 2026-03-09 | DONE | validate-mcp-tools | 新增 `.mcp.json.example` 与 `scripts/validate-mcp-tools.py`,形成目录文档、示例配置、校验脚本闭环 |
| P19MCP1-4 | P19MCP1文档矩阵与验收收口 | N/A | 2026-03-09_10-25-00-p19-mcp-1-l4-readonly-tools-baseline.csv | 2026-03-09_10-25-00-p19-mcp-1-l4-readonly-tools-baseline.csv | 2026-03-09 | DONE | validate-feature-matrix + git-diff-check | MCP 工具目录、边界文档、Feature Matrix 与事实源校验全部通过,可作为 `P19+AI-1` 前置基线 |
| P19AI1-0 | 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 | CSV 校验 | 以 superseding CSV 刷新 AI-1 执行合同,修正 feature flag 与 seed/config 锚点后冻结只读建议边界 |
| P19AI1-1 | AI provider与治理开关 | 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 | 新增 `ai.assist`、`ai_assist`、`AI_*` 配置与 mock/http provider 契约,默认关闭且不引入运行时 MCP 依赖 |
| P19AI1-2 | 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 | server:test | 实现报销 / 采购 / 资产三类只读 suggestion 接口、白名单脱敏快照、prompt hash 与审计摘要,不写库不改状态 |
| 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 / 采购 / 资产主流程回归全部通过 |
| P20TRAVEL2-0 | P20TRAVEL2执行合同刷新建档 | N/A | 2026-03-09_10-55-00-p20-travel-2-l5-corporate-payments.csv | 2026-03-10_21-05-59-p20-travel-2-l5-corporate-payments-refresh.csv | 2026-03-10 | DONE | CSV 校验 | 以 superseding CSV 刷新 TRAVEL-2 执行合同,冻结混合双轨、发票绑定与 ERP payment journal 前移边界 |
| P20TRAVEL2-1 | 统付模型支付权限与双账轨基线 | N/A | 2026-03-09_10-55-00-p20-travel-2-l5-corporate-payments.csv | 2026-03-10_21-05-59-p20-travel-2-l5-corporate-payments-refresh.csv | 2026-03-10 | DONE | server:prisma-validate + server:test | 新增 `CardAuthorization`、`CardTransaction`、`travel_order` 支付字段、`invoice_pool.travel_order_id` 与 `travel.payment.manage`,并冻结 authorize/settle/reverse 支付账轨 |
| P20TRAVEL2-2 | 授权交易导入与订单确认语义 | N/A | 2026-03-09_10-55-00-p20-travel-2-l5-corporate-payments.csv | 2026-03-10_21-05-59-p20-travel-2-l5-corporate-payments-refresh.csv | 2026-03-10 | DONE | server:test | 授权/交易导入具备幂等与清晰 skip reason,精确匹配的 settled charge 可把 `TravelOrder` 从 `imported` 推进到 `confirmed` |
| P20TRAVEL2-3 | 发票绑定标记已支付与ERP journal出站 | N/A | 2026-03-09_10-55-00-p20-travel-2-l5-corporate-payments.csv | 2026-03-10_21-05-59-p20-travel-2-l5-corporate-payments-refresh.csv | 2026-03-10 | DONE | server:test | 发票池支持 `travelOrderId` 排他绑定,`mark-paid` 支持幂等支付确认,并按 `travel_order.paid` 复用 `erp.journal.export` 出站 |
| P20TRAVEL2-4 | 差旅前端支付轨道与发票绑定交互 | N/A | 2026-03-09_10-55-00-p20-travel-2-l5-corporate-payments.csv | 2026-03-10_21-05-59-p20-travel-2-l5-corporate-payments-refresh.csv | 2026-03-10 | DONE | client:typecheck/build | 差旅详情新增对公支付轨道卡片,支持只读摘要、标记已支付、发票绑定与冻结建议交互,失败仅卡片内降级 |
| P20TRAVEL2-5 | P20TRAVEL2文档矩阵同步与回归收口 | N/A | 2026-03-09_10-55-00-p20-travel-2-l5-corporate-payments.csv | 2026-03-10_21-05-59-p20-travel-2-l5-corporate-payments-refresh.csv | 2026-03-10 | DONE | server:test + client:typecheck/build + validate-feature-matrix | ADR、边界文档、领域事件、Feature Matrix 与全量回归同步收口,主线里程碑推进到 248 |
| P20TRAVEL3-0 | P20TRAVEL3执行合同刷新建档 | N/A | 2026-03-09_11-05-00-p20-travel-3-l5-reconciliation-erp-bridge.csv | 2026-03-11_09-57-28-p20-travel-3-l5-reconciliation-erp-bridge-refresh.csv | 2026-03-11 | DONE | CSV 校验 | 以 superseding CSV 刷新 TRAVEL-3 执行合同,冻结批次快照、只读对账与 `erp.travel.export` 摘要桥边界 |
| P20TRAVEL3-1 | 对账批次模型与序列基线 | N/A | 2026-03-09_11-05-00-p20-travel-3-l5-reconciliation-erp-bridge.csv | 2026-03-11_09-57-28-p20-travel-3-l5-reconciliation-erp-bridge-refresh.csv | 2026-03-11 | DONE | server:prisma-validate + server:test | 新增 `TravelReconciliationBatch`、`TravelReconciliationItem`、`travel_reconciliation_batch` 单号与 seed,不改写既有订单/交易状态语义 |
| P20TRAVEL3-2 | 对账引擎批次接口与人工确认 | N/A | 2026-03-09_11-05-00-p20-travel-3-l5-reconciliation-erp-bridge.csv | 2026-03-11_09-57-28-p20-travel-3-l5-reconciliation-erp-bridge-refresh.csv | 2026-03-11 | DONE | server:test | 差旅对账支持批次快照、差异判定、confirm / reopen / finalize,且只读发现差异不自动修复订单或预算 |
| P20TRAVEL3-3 | ERP travel export与批次轨道 | N/A | 2026-03-09_11-05-00-p20-travel-3-l5-reconciliation-erp-bridge.csv | 2026-03-11_09-57-28-p20-travel-3-l5-reconciliation-erp-bridge-refresh.csv | 2026-03-11 | DONE | server:test | 新增 `erp.travel.export`、`travel_payable_summary` / `travel_settlement_batch` binding 与 batch-level track / requeue,不影响既有 `travel_order_payment` journal |
| P20TRAVEL3-4 | 差旅页对账Tab与前端联动 | N/A | 2026-03-09_11-05-00-p20-travel-3-l5-reconciliation-erp-bridge.csv | 2026-03-11_09-57-28-p20-travel-3-l5-reconciliation-erp-bridge-refresh.csv | 2026-03-11 | DONE | client:typecheck/build | `/travel-requests?tab=reconciliation&batchId=<id>` 已支持批次列表、KPI、异常确认、Finalize 与 ERP 轨道重试联动 |
| P20TRAVEL3-5 | P20TRAVEL3文档矩阵同步与回归收口 | N/A | 2026-03-09_11-05-00-p20-travel-3-l5-reconciliation-erp-bridge.csv | 2026-03-11_09-57-28-p20-travel-3-l5-reconciliation-erp-bridge-refresh.csv | 2026-03-11 | DONE | server:test + client:typecheck/build + validate-feature-matrix | 边界文档、领域事件、Feature Matrix、CSV 校验与全量回归同步收口,主线里程碑推进到 254 |
| P21PWA1-0 | P21PWA1执行合同刷新与P20基线冻结 | N/A | 2026-03-09_11-15-00-p21-pwa-1-l5-asset-scan.csv | 2026-03-11_17-50-39-p21-pwa-1-l5-asset-scan-refresh.csv | 2026-03-11 | DONE | CSV 校验 | 以 superseding CSV 刷新 PWA-1 执行合同,并正式冻结 P20 收口 gate、clean-main 起步与浏览器 PWA 资产扫码边界 |
| P21PWA1-1 | 移动资产扫码页与扫描适配器 | N/A | 2026-03-09_11-15-00-p21-pwa-1-l5-asset-scan.csv | 2026-03-11_17-50-39-p21-pwa-1-l5-asset-scan-refresh.csv | 2026-03-11 | DONE | client:typecheck/build | 新增 `/mobile/assets/scan`、扫码导航与 `BarcodeDetector -> ZXing` 回退扫描面板,保留手工输入兜底 |
| P21PWA1-2 | 资产扫码查找最小后端扩展 | N/A | 2026-03-09_11-15-00-p21-pwa-1-l5-asset-scan.csv | 2026-03-11_17-50-39-p21-pwa-1-l5-asset-scan-refresh.csv | 2026-03-11 | DONE | server:test | `GET /api/assets` 支持 `q` 条件,按 `assetNo/serialNo` 精确匹配与 `name contains` 兜底,不新增 lookup 路由 |
| P21PWA1-3 | 盘点录入模式与离线队列联动 | N/A | 2026-03-09_11-15-00-p21-pwa-1-l5-asset-scan.csv | 2026-03-11_17-50-39-p21-pwa-1-l5-asset-scan-refresh.csv | 2026-03-11 | DONE | server:test + client:typecheck/build | `inventoryCheckId` 模式支持 draft 启动、counting 录入、completed 只读,以及 IndexedDB 离线队列 last-write-wins 重放 |
| P21PWA1-4 | PWA一期文档边界与矩阵同步 | N/A | 2026-03-09_11-15-00-p21-pwa-1-l5-asset-scan.csv | 2026-03-11_17-50-39-p21-pwa-1-l5-asset-scan-refresh.csv | 2026-03-11 | DONE | validate-feature-matrix | 集成边界、PWA 回归清单、Feature Matrix 与事实源校验器同步到 `...+PWA-1`,并明确不做原生壳 / 深链 / 完整离线同步 |
| P21PWA1-5 | P21PWA1回归与验收收口 | N/A | 2026-03-09_11-15-00-p21-pwa-1-l5-asset-scan.csv | 2026-03-11_17-50-39-p21-pwa-1-l5-asset-scan-refresh.csv | 2026-03-11 | DONE | server:test + regression-all + client:typecheck/build + validate-feature-matrix | 移动扫码、盘点录入、离线重放与权限边界回归通过,矩阵推进到 260 并为 `P21+PWA-2` 留出干净合同起点 |
| P21PWA2-0 | P21PWA2执行合同刷新与主线最终冻结 | N/A | 2026-03-09_11-25-00-p21-pwa-2-l5-offline-deeplink.csv | 2026-03-12_04-32-13-p21-pwa-2-l5-offline-deeplink-refresh.csv | 2026-03-12 | DONE | CSV 校验 | 以 superseding CSV 刷新 PWA-2 执行合同,冻结 canonical workflow deep link、离线守卫、本地草稿与 R10 主线最终里程碑 |
| P21PWA2-1 | 移动审批深链入口与离线守卫快照 | N/A | 2026-03-09_11-25-00-p21-pwa-2-l5-offline-deeplink.csv | 2026-03-12_04-32-13-p21-pwa-2-l5-offline-deeplink-refresh.csv | 2026-03-12 | DONE | client:typecheck/build | `/workflow/tasks/:taskId` 保持 canonical,客户端在移动 / PWA / IM WebView 下自动分流到 `/mobile/approvals?taskId=<id>`,并引入仅含 `me + permissions` 的 24h 离线快照 |
| P21PWA2-2 | 移动审批approve/reject离线草稿队列 | N/A | 2026-03-09_11-25-00-p21-pwa-2-l5-offline-deeplink.csv | 2026-03-12_04-32-13-p21-pwa-2-l5-offline-deeplink-refresh.csv | 2026-03-12 | DONE | client:typecheck/build | `MobileApprovalsPage` 支持 `taskId` deep link、已缓存详情离线查看与 `approve/reject` 草稿 last-write-wins 重放,`already_processed` / 403 / 404 明确进入冲突态 |
| P21PWA2-3 | PWA缓存策略升级与IndexedDB helper收口 | N/A | 2026-03-09_11-25-00-p21-pwa-2-l5-offline-deeplink.csv | 2026-03-12_04-32-13-p21-pwa-2-l5-offline-deeplink-refresh.csv | 2026-03-12 | DONE | client:typecheck/build | `vite-plugin-pwa` runtime cache 升级为静态资源 `StaleWhileRevalidate` + 审批 GET `NetworkFirst`,并新增共享 IndexedDB helper 供上传 / 盘点 / 审批队列复用 |
| P21PWA2-4 | PWA二期文档矩阵与主线闭环同步 | N/A | 2026-03-09_11-25-00-p21-pwa-2-l5-offline-deeplink.csv | 2026-03-12_04-32-13-p21-pwa-2-l5-offline-deeplink-refresh.csv | 2026-03-12 | DONE | validate-feature-matrix | 集成边界、PWA 回归清单、Feature Matrix 与事实源校验器同步到 `...+PWA-2`,矩阵总数推进到 266 并明确 R10 主线闭环 |
| P21PWA2-5 | P21PWA2回归与R10主线最终验收 | N/A | 2026-03-09_11-25-00-p21-pwa-2-l5-offline-deeplink.csv | 2026-03-12_04-32-13-p21-pwa-2-l5-offline-deeplink-refresh.csv | 2026-03-12 | DONE | server:test + regression-all + client:typecheck/build + validate-feature-matrix | 移动 deep link、离线审批草稿、联网重放、权限拒绝、缓存回退与既有 PWA-1 / workflow 主流程回归全部通过,R10 主线正式闭环 |
| P22PROD1-0 | P22PROD1执行合同建档与生产化边界冻结 | N/A | 2026-03-12_16-58-44-p22-prod-1-l5-production-hardening.csv | 2026-03-12_16-58-44-p22-prod-1-l5-production-hardening.csv | 2026-03-12 | DONE | CSV 校验 | 冻结 `P22+PROD-1` 为路由级分包、高风险主链路 E2E 与证据化性能审计的单一生产化迭代,不混入新业务域或依赖大升级 |
| P22PROD1-1 | 路由懒加载与构建分包治理 | N/A | 2026-03-12_16-58-44-p22-prod-1-l5-production-hardening.csv | 2026-03-12_16-58-44-p22-prod-1-l5-production-hardening.csv | 2026-03-12 | DONE | client:typecheck/build | 顶层业务页切换为 `React.lazy + Suspense`,并在 Vite 中固定 `vendor-*` / `page-*` manual chunks,构建不再出现大包 warning |
| P22PROD1-2 | 差旅三部曲Playwright补齐 | N/A | 2026-03-12_16-58-44-p22-prod-1-l5-production-hardening.csv | 2026-03-12_16-58-44-p22-prod-1-l5-production-hardening.csv | 2026-03-12 | DONE | client:test:e2e(travel) | 新增差旅支付与对账 Playwright 规格,覆盖申请→审批→支付→绑票以及 reconciliation batch 创建、异常确认与 finalize 主链路 |
| P22PROD1-3 | 移动审批deep link与离线草稿E2E补齐 | N/A | 2026-03-12_16-58-44-p22-prod-1-l5-production-hardening.csv | 2026-03-12_16-58-44-p22-prod-1-l5-production-hardening.csv | 2026-03-12 | DONE | client:test:e2e(mobile approvals) | 以移动 viewport 自动化覆盖 canonical workflow deep link 分流、离线 `approve/reject` 草稿入队、联网重放与冲突态展示 |
| P22PROD1-4 | 高频查询性能审计与小步修复 | N/A | 2026-03-12_16-58-44-p22-prod-1-l5-production-hardening.csv | 2026-03-12_16-58-44-p22-prod-1-l5-production-hardening.csv | 2026-03-12 | DONE | server:test + benchmark scripts | 为 workflow tasks、`/api/assets?q` 与 travel reconciliation batches 新增 benchmark 脚本,并将资产搜索重写为 exact-first / fuzzy-second;未证实收益前不新增索引或 PG 扩展 |
| P22PROD1-5 | P22PROD1矩阵回归与验收收口 | N/A | 2026-03-12_16-58-44-p22-prod-1-l5-production-hardening.csv | 2026-03-12_16-58-44-p22-prod-1-l5-production-hardening.csv | 2026-03-12 | DONE | server:test + client:typecheck/build/test:e2e + validate-feature-matrix | Feature Matrix、事实源校验器、差旅与移动审批 E2E、后端单测与 benchmark 一并收口,主线推进到 `...+PROD-1` / 272 项 |
| R11-0 | R11执行合同建档与范围冻结 | §16 迭代计划(执行合同收口) | 2026-03-13_10-30-00-r11-contract-reconciliation-and-spec-refresh.csv | 2026-03-13_10-30-00-r11-contract-reconciliation-and-spec-refresh.csv | 2026-03-13 | DONE | CSV 校验 | 冻结 R11 只做历史 TODO 清账证据刷新与规格书补齐,不回写旧 CSV、不改运行时代码 |
| R11-1 | 历史 TODO 清账证据刷新 | N/A | 2026-03-13_10-30-00-r11-contract-reconciliation-and-spec-refresh.csv | 2026-03-13_10-30-00-r11-contract-reconciliation-and-spec-refresh.csv | 2026-03-13 | DONE | manual | `docs/todo-reconciliation.md` 已把 A1/A2/A3/A3-LOCK/A4/C2/C3/C4/C5 映射为 implemented,A5 映射为 superseded,历史 CSV 保持不可变 |
| R11-2 | 规格书目录扩展与章节锚点建立 | §4.7-§4.11,§13.2.7-§13.2.11 | 2026-03-13_10-30-00-r11-contract-reconciliation-and-spec-refresh.csv | 2026-03-13_10-30-00-r11-contract-reconciliation-and-spec-refresh.csv | 2026-03-13 | DONE | git diff --check | `docs/requirements-specification.md` 已补齐请假 / 采购 / 资产 / 差旅 / 集成章节与对应 API 契约锚点 |
| R11-3 | 请假采购资产规格补齐 | §4.7-§4.9,§13.2.7-§13.2.9 | 2026-03-13_10-30-00-r11-contract-reconciliation-and-spec-refresh.csv | 2026-03-13_10-30-00-r11-contract-reconciliation-and-spec-refresh.csv | 2026-03-13 | DONE | manual | 规格书已按当前代码与完成合同补齐请假 / 采购 / 资产的范围、权限、状态机、核心对象与显式不做项 |
| R11-4 | 差旅集成规格补齐与 cross-cutting 同步 | §4.10-§4.11,§13.2.10-§13.2.11,§15-§16 | 2026-03-13_10-30-00-r11-contract-reconciliation-and-spec-refresh.csv | 2026-03-13_10-30-00-r11-contract-reconciliation-and-spec-refresh.csv | 2026-03-13 | DONE | manual | 规格书已补齐 TRAVEL-1~3、IM-1、ERP-1~3 的已实现边界,并同步数据模型概览与迭代计划 |
| R11-5 | R11矩阵事实源与文档校验收口 | §16 迭代计划(执行合同收口) | 2026-03-13_10-30-00-r11-contract-reconciliation-and-spec-refresh.csv | 2026-03-13_10-30-00-r11-contract-reconciliation-and-spec-refresh.csv | 2026-03-13 | DONE | CSV 校验 + validate-feature-matrix + git diff --check | Feature Matrix、事实源校验器、R11 合同与文档变更已同步收口,历史 TODO 清账口径可追溯 |
## R13-R17 小团队内部管理增量(2026-03-21)
- **事实源**:`issues/2026-03-21_12-00-00-r13-small-team-profile.csv`、`issues/2026-03-21_12-10-00-r14-people-lifecycle.csv`、`issues/2026-03-21_12-20-00-r15-team-presence.csv`、`issues/2026-03-21_12-30-00-r16-weekly-report-todo.csv`、`issues/2026-03-21_12-40-00-r17-small-team-go-live.csv`
- **R13 小团队模式收敛**:新增 `WorkspaceSetting` 单例配置、`/api/system/workspace` 与 `/api/system/navigation`,默认主导航收敛为 `Portal / 团队 / 请假 / 报销 / 资产 / 周报 / 待办 / 公告`,采购/差旅/预算/AP 等模块降级为管理员备用入口。
- **R14 入转离与资产闭环**:扩展 `Employee` 就业状态字段,新增 `EmployeeLifecycleEvent`、`EmployeeChecklistTask`,支持入职、转正、调岗、离职、资产阻塞校验与账号停用闭环。
- **R15 团队状态**:新增 `EmployeePresence` 与团队在岗视图,支持员工手工更新今日状态,请假自动覆盖为 `leave`。
- **R16 周报与待办**:新增 `WeeklyReport` 与 `TodoItem`,支持周报懒创建、提交、团队汇总、待办创建/完成/取消,并接入 `Portal` 与搜索。
- **R17 真可用收口**:新增小团队管理员手册、员工快速上手文档、trialrun 运行手册与检查项补充,支持以 `small_team_internal` 为默认上线模式。
- **R17-4 试点观测支撑**:`Portal` 新增管理员试点观测摘要(近 7 天登录、周报提交、团队状态覆盖率),并补充 4 周观测模板。
- **默认上线建议**:开启 `portal_home_v1`、`announcements_v1`、`presence_board_v1`、`weekly_report_v1`、`employee_lifecycle_v1`、`todo_board_v1`、`global_search_v1`;保留 `payment_batch_v1`、`cutover_console_v1` 为管理员备用能力。
## R18-R22 统一内部业务平台增量(2026-03-21)
- **事实源**:`issues/2026-03-21_23-00-00-r18-r22-unified-internal-workbench.csv`
- **R18 企业微信前台接入**:新增企业微信配置、账号绑定、工作台入口与 deeplink 回跳;企业微信定位为 `入口 + 通知 + 可选免登`,不再承接第二套业务事实。
- **R19 项目管理基础进 OA**:新增 `Project / ProjectMember / ProjectMilestone / ProjectTask / ProjectRisk` 与前后端项目页,`Portal` 与全局搜索已接入项目域。
- **R20 项目联动主链**:报销、差旅、周报、待办已支持挂项目;项目详情页可统一查看成员、里程碑、任务、风险、费用、差旅、周报、合同与交付记录。
- **R21 涉密与公网边界**:新增 `ContractRegistry`、`ConfidentialDocumentRef`;OA 只保存元数据和引用路径,Refresh 来源校验与企业微信 IM 脱敏规则已收口到公网安全基线。
- **运行口径**:员工真正操作仍集中在 `hyb-oa`;企业微信只做入口与脱敏提醒;涉密正文与附件继续留在内网文件盘、NAS 或离线档案中。
## R23 试点收口与项目治理轻增强
| Feature Flag | 默认值 | 作用 | 主要页面 / 路由 |
| --- | --- | --- | --- |
| `project_communication_log_v1` | `force_off` | 在项目详情页记录客户沟通结果摘要、下一步动作与跟进日期;不做聊天归档 | `client/src/pages/ProjectDetailPage.tsx`, `/api/projects/:id/communication-logs` |
| `project_closure_checklist_v1` | `force_off` | 为项目完成/归档提供软约束式收口清单与 Portal 待收口统计 | `client/src/pages/ProjectDetailPage.tsx`, `/api/projects/:id/closure-checklist`, `/api/portal/home` |
### R23 固定边界
- `ProjectCommunicationLog` 与 `ProjectClosureChecklistItem` 不进入全文搜索。
- `confidential` / `restricted` 合同与资料引用不按摘要全文命中搜索,只按编号、项目编号或最小必要标签命中。
- 企业微信提醒仅发送脱敏标题与 deeplink,不发送沟通摘要、收口备注或涉密标题全文。
-179
查看文件
@@ -1,179 +0,0 @@
# hyb-oa 实施计划(历史 Phase 1 引导 + 当前执行口径)
**文档状态**:历史实施计划归档,不是当前执行计划。
**日期**:2026-05-04
**范围**:保留 2026-02 的引导性实施计划,同时补充当前试运行收口与外部环境闭环口径。
**当前用途**:追溯早期里程碑、复用资产和历史技术决策;当前需求与开发优先级以 [海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md)、[文档索引](./文档索引.md) 和最新 `issues/*.csv` 为准。
**不得误读**:下文的 `Phase 1 / P0 / Phase 2` 是历史阶段名,不代表 2026-05-09 之后的当前排期。
## 当前阶段(2026-05-04)
- 当前系统已不处于 `Phase 1 / P0` 开发阶段;本地核心 happy path、真实 PDF OCR 和报销付款尾链已具备回归证据。
- 当前优先级不是继续堆新功能,而是:
1. 治理事实源刷新
2. 外部环境闭环(HTTPS / 企微 / live smoke / 并发)
3. 发布门禁与部署 runbook 收口
- 当前执行事实源优先级:
- 当前 PRD:`docs/海音达OA-MVP需求规格说明书.md`
- 最新执行合同:`issues/*.csv`
- 业务覆盖:`docs/trialrun/coverage-matrix.csv`
- 试运行结论:`docs/trialrun/manual-trialrun-report.md`
- 全局状态矩阵:`docs/feature-matrix.md`
## 历史说明
下文保留的是 2026-02 的 Phase 1 引导计划,主要用于追溯设计出发点、资产复用和里程碑拆解;它**不是**当前最优先的执行合同。
## 0. 前置结论(不可再分叉)
- 技术栈:Fastify + Prisma + PostgreSQL(见 `docs/tech_stack_report.md`)
- 当前 PRD:以 `docs/海音达OA-MVP需求规格说明书.md` 为主事实源;`docs/requirements-specification.md` 仅保留为旧路径跳转。
## 1. 历史:复用资产清单(从 shenzhou-business-suite 迁移到 hyb-oa)
| 资产 | 来源 | 复用方式 | 需要改造 |
| :--- | :--- | :--- | :--- |
| 工作流 4 表结构 | `shenzhou-business-suite/supabase/schema/70_workflow/01_workflow_02_tables.sql` | 转 Prisma schema | Supabase/RPC → Fastify service 事务 |
| `approval_rules` | 同上 | 转 Prisma schema + seed 3 条 | 管理 UI 放 P1(P0 先 DB/接口维护) |
| `approval_transfers` | 同上 | 转 Prisma schema | 与 `workflow_tasks` 联动,reason≥10 约束 |
| `document_sequences` | 同上 | 转 Prisma schema + seed 默认报销单号 | 生成逻辑改为服务端原子更新 |
| 权限码体系 | `shenzhou-business-suite/src/types/permissions.ts` | 复用命名与粒度 | 增加 `expense.proxy_submit/proxy_manage` |
| 工作流类型 | `shenzhou-business-suite/src/types/workflow.ts` | 参考 JSON 结构 | P0 只用线性审批链(后续扩展保留) |
| 报销表结构参考 | `shenzhou-business-suite/supabase/schema/20_finance/06_reimbursement_01_tables.sql` | 参考 forms/items/attachments 字段 | 补 `file_sha256`、签名 URL、判重例外审计 |
| 默认费用类型 seed | `shenzhou-business-suite/supabase/seed.sql` | 迁移 35 启用 + 3 legacy 禁用 | hyb-oa 额外启用 `utilities/rent` 形成 37 启用 |
| 存储安全基线思路 | `shenzhou-business-suite/supabase/migrations/20260131175000_storage_security_baseline.sql` | 迁移约束到 API 层 | P0 本地存储 + 签名 URL;P2 MinIO/OSS |
| UI 组件 | `shenzhou-business-suite/src/components/ui/*` | 实现阶段复制到 `client/src/` | 替换路由/样式变量;移除 Supabase 依赖 |
| 测试基建 | `playwright` + `vitest` 配置 | 实现阶段迁移 | P0 覆盖鉴权/工作流/判重核心路径 |
## 2. 历史:Phase 1(P0)里程碑拆解(按可开工顺序)
### Milestone 1:Prisma schema 草稿 + 评审
**目标**:把关键表结构确定下来(后续开发不再反复改 schema)。
**范围(至少)**:
- 组织/人员:`departments`、`employees`、`employee_roles`
- 权限:权限码为代码常量;角色集合落 `employee_roles`
- 报销:`reimbursement_forms`、`reimbursement_items`、`invoice_pool`(票据/附件池 + 绑定关系)
- OCR:`ocr_results`(OCR 去重与结果持久化)
- 费用类型:`expense_types`(含 37 默认启用 seed)
- 单号:`document_sequences`
- 工作流:`workflow_definitions`、`workflow_instances`、`workflow_tasks`、`workflow_history`
- 审批规则/转审:`approval_rules`、`approval_transfers`
- 认证与审计:`auth_sessions`、`audit_logs`
- 代提交授权:`delegation_grants`
**验收**:
- schema 与当时的 `docs/requirements-specification.md` 一致;当前需求事实源已迁移到 `docs/海音达OA-MVP需求规格说明书.md`
- 关键约束可实现(单号唯一、转审原因≥10、费用类型 code 唯一、软禁用等)
**评审截止(Schema Freeze)**:
- 截止:Milestone 1 合并后的 **2 个工作日**
- 截止后变更规则:
- 仅允许 `ADD COLUMN / ADD TABLE / ADD INDEX` 这类向前兼容变更
- `DROP/RENAME/CHANGE TYPE/CHANGE NULLABLE` 等破坏性变更必须走“变更申请”,并同步更新规格书与迁移计划
### Milestone 2:认证与会话(JWT + refresh cookie)
**范围**:
- `POST /api/auth/login|refresh|logout|forgot-password|reset-password`
- `auth_sessions`:refresh hash + deviceFingerprint/ip/UA + session 限额(5)
- `tokenVersion` 踢下线
**验收**:
- refresh rotation 生效;退出/重置能撤销会话;access 不落 localStorage
### Milestone 3A:发票池上传(本地存储)+ SHA256 + 签名 URL
**范围**:
- `POST /api/invoice-pool/upload`(multipart;入参 `file` + 可选 `owner_employee_id` + 可选 `ocr_type`;返回 `invoice_pool_id`)
- `POST /api/invoice-pool/:id/signed-url`(TTL=10m)
- 上传约束:类型白名单 + ≤10MB
- 哈希:计算并落库 `file_sha256`(作为 OCR 去重 key)
**验收**:
- 未授权用户无法获取签名 URL;过期不可访问;同文件哈希可用于 OCR 去重复用
### Milestone 3B:腾讯云 OCR + `ocr_results` 去重 + retry 策略
**范围**:
- OCR:调用腾讯云 OCR,保存“标准化结果”(rawResponse 仅日志不落库)
- 去重:`ocr_results` 以 `file_sha256 + ocr_provider + ocr_type` 唯一,命中时复用(不重复计费)
- 状态机:`invoice_pool` 从 `pending_ocr` → `available/ocr_failed`
- 重试:`POST /api/invoice-pool/:id/retry-ocr`(attempt<=3;间隔>=60s;错误码 `VALID_006/VALID_007`)
- 审计:`OCR_REQUESTED/OCR_SUCCEEDED/OCR_FAILED/OCR_RETRIED`
- 自动归档:`available/ocr_failed` 未绑定条目 90 天后自动归档为 `archived_reason=unused_timeout`
**验收**:
- 同一文件二次上传不重复计费;OCR 失败可重试且次数/频控生效;90 天游离自动归档生效且不参与全局判重;状态与审计一致
### Milestone 4:费用类型系统(动态 `expense_types`)
**范围**:
- `GET /api/expense-types?enabled=true`
- seed:默认启用 37 项 + legacy 3 项禁用
- 软禁用语义:禁用后不出现在下拉,但历史可展示
**验收**:
- 下拉加载启用类型;禁用类型不显示但历史单据不丢
### Milestone 5:单号生成(`document_sequences`)
**范围**:
- 报销单号:`BX-YYYYMMDD-0001`(daily reset)
- 生成逻辑:数据库原子递增(同事务写入 `reimbursement_forms.form_number`)
**验收**:
- 并发下无重复编号;失败回滚不产生脏占用
### Milestone 6:报销单 CRUD + 提交发起工作流
**范围**:
- 报销单:创建/更新/删除草稿/查看
- 发票池绑定/解绑:`POST /api/invoice-pool/:id/bind|unbind`(并发行锁;冲突 409/`VALID_005`;绑定时触发全局判重 409/`VALID_003`)
- 删除草稿:自动解绑其绑定的发票池条目并回到 `available`
- 提交:校验 items、票据/发票要求(发票池绑定)、判重;生成单号;启动工作流实例并创建首个任务
- 代提交:校验 `delegation_grants`(scope & 生效时间)
- 代提交授权(Delegation Grants)CRUD API(用于自助/代维护):
- `GET /api/delegation-grants`(默认返回与本人相关;`system.users` 可查询任意)
- `POST /api/delegation-grants`(本人创建:principal=自己;`system.users` 可代创建)
- `POST /api/delegation-grants/:id/revoke`(本人撤销;`system.users` 可代撤销)
**验收**:
- draft → submitted/reviewing;workflow_instance/task/history 创建完整
- delegation_grants 可被创建/查询/撤销;所有变更写入 `audit_logs`
### Milestone 7:审批动作(approve/reject/return/withdraw/transfer)
**范围**:
- `approval_rules` 匹配审批链(3 条默认规则)
- `POST /api/workflow/tasks/:taskId/approve|reject|return`
- `POST /api/workflow/tasks/:taskId/transfer`(reason≥10;链路≤3)
- 审计:动作写入 `workflow_history`;关键例外写 `audit_logs`
**验收**:
- 审批推进正确;转审三处证据齐全;状态与任务一致(status=reviewing 但节点来自 task)
### Milestone 8:付款标记 + 发票判重例外 + 发票池归档
**范围**:
- `POST /api/reimbursements/:id/pay`(需 `expense.finance.pay`)
- 付款完成联动:将该报销单绑定的发票池条目归档(`status=archived, archived_reason=used_complete`)
- 发票双策略判重 + 例外(仅 `finance_mgr`,需原单号+原因,原单 `approved/paid` 禁止)
**验收**:
- approved → paid;发票池条目自动归档为 `used_complete`;例外受限且审计完整
### Milestone 9:最小 CI 门槛(护栏)
**范围**:
- typecheck + lint(不改写源码)
- 最小集成测试:登录/发票池上传+OCR+绑定/提交/审批/转审/判重/付款标记/归档
- 安全回归:敏感字段脱敏测试(银行卡/身份证等字段在所有对外响应均为脱敏格式;审计日志禁止明文)
**验收**:
- CI 通过:typecheck + lint + 最小集成测试 + 脱敏测试全绿
## 3. Phase 2(扩展)
> 状态口径说明(2026-02-09):
> - 已落地:OCR 增强、报表导出、对象存储(MinIO/OSS)、工作流扩展到其他实体(最小骨架)。
> - 历史待推进:企微/钉钉通知(渠道扩展)。当前路线已调整为“企业微信基础设施 + OA 唯一审批中心”,飞书/钉钉不进入首批 MVP。
> - 详细状态与证据以 `docs/feature-matrix.md` 与 `issues/2026-02-09_13-39-02-p5-blueprint-v3.csv` 为准。
- [x] OCR 能力增强(队列化与重试策略)
- [ ] 历史项:企微/钉钉通知(当前不作为待开发入口;企微基础设施以新 PRD 与最新 Issue CSV 为准)
- [x] 报表导出
- [x] 对象存储(MinIO/OSS)
- [x] 工作流扩展到其他实体(请假/采购)
## 4. 风险与阻塞项(P0)
- 财务对“费用类型/科目默认值”仍可能需要微调:通过 `expense_types` 配置解决,避免改代码
- 转审/例外权限属于高风险动作:必须上线前完成审计与权限回归测试
-60
查看文件
@@ -1,60 +0,0 @@
# invoicePool 路由拆分方案(P9A1)
**文档状态**:一次性重构方案归档,不是当前待办。
**当前用途**:追溯 `invoicePool` 路由拆分的边界、兼容策略和回滚思路。
**不得误读**:本文不代表当前新需求;报销、发票、OCR、附件规则以 [报销、发票与附件规则](./reimbursement-invoice-rules.md) 和当前 PRD 为准。
## 1. 背景
- 现状:`server/src/routes/invoicePool.js` 超过 2700 行,上传、列表、详情、验真、归档、解绑、OCR 重试等职责集中在单文件。
- 风险:
- 验真链路迭代时容易与票据主流程互相影响。
- `select` 片段与响应映射逻辑重复,字段漂移不易发现。
- 新人接手定位成本高,回归面过大。
## 2. 目标与非目标
- 目标:
- 不改变现有 API 路径、权限码、响应结构。
- 将验真端点独立到子模块,主文件保留入口职责。
- 抽取 shared `select`/`mapper`,降低重复与字段遗漏风险。
- 非目标:
- 不新增业务功能。
- 不调整数据库模型与外部接口契约。
## 3. 拆分边界冻结
### 3.1 保留在 `invoicePool.js` 的能力
- 票据列表、上传、详情、编辑、归档、解绑、OCR 重试、判重例外、签名 URL 与文件读取。
- 入口职责:对外仍由 `server/src/routes/invoicePool.js` 注册全部 `/api/invoice-pool/*` 路径。
### 3.2 独立模块
- `server/src/routes/invoicePool/verification.js`
- `POST /invoice-pool/:id/verify`
- `GET /invoice-pool/:id/verification`
- `POST /invoice-pool/:id/verification/retry`
### 3.3 shared 模块
- `server/src/routes/invoicePool/shared/selects.js`
- 统一 `verification_records` 子查询。
- 提供列表/详情 `select` builder。
- `server/src/routes/invoicePool/shared/mappers.js`
- `mapVerificationRecord`
- `mapInvoiceSummary`
- `normalizeInvoiceResponse`
- `server/src/routes/invoicePool/shared/schemas.js`
- 验真列表查询参数解析。
- `server/src/routes/invoicePool/shared/helpers.js`
- 验真任务触发(`pg-boss`/inline 兼容)。
## 4. 迁移顺序
1. 新增 shared 模块与 `verification.js`,逻辑先保持等价迁移。
2. `invoicePool.js` 改为组合注册(调用 `verification.js`),删除内联验真端点。
3. 将列表与详情相关查询切换到 shared `select` builder。
4. 执行静态检查与验真回归脚本,确认无接口行为变化。
## 5. 兼容性与回滚
- 兼容性:
- 路由路径、权限码、返回字段保持不变。
- 错误码(`VALID_001`/`PERM_001`/`SYS_404`)保持原语义。
- 回滚策略:
- 保留 `invoicePool.js` 入口文件与原有注册顺序。
- 如发现回归,可将 `verification.js` 调用回切为原文件内联实现(无 schema 变更,无数据回滚)。
-70
查看文件
@@ -1,70 +0,0 @@
# hyb-oa 试点迁移映射清单(R12-lite)
## 1. 迁移边界
- 本轮只支持 **人工导出 / dry-run 核对 / 人工导入主数据**。
- 历史业务单据采取 **旧 OA 只读归档** 策略,不导入到 hyb-oa 继续流转。
- 新系统只接 **切换后新建单据**。
- 未完结旧单需在切换前由业务人工清空或冻结。
## 2. 主数据映射
| 旧 OA 对象 | hyb-oa 对象 | 关键字段 | 备注 |
| --- | --- | --- | --- |
| 员工 | `Employee` | `employee_no`、`name`、`email`、`department_id` | dry-run 文件头至少包含 `employee_no,name,department_name` |
| 部门 | `Department` | `name`、`parent_id`、`manager_id` | dry-run 文件头至少包含 `name` |
| 预算 | `Budget` / `BudgetPool` | `code`、`name`、`department_id`、`legal_entity_id`、`cost_center_id` | dry-run 文件头至少包含 `code,name` |
| 法体 / 成本中心 / 供应商 / 费用类型 | 既有主数据表 | 编码、名称、启停用状态 | 建议优先沿用现有编码体系 |
## 3. 业务域映射
| 旧 OA 域 | hyb-oa 域 | 切换策略 |
| --- | --- | --- |
| 报销 | `reimbursements` | 切换后新单进入 hyb-oa;旧单仅旧 OA 只读查询 |
| 请假 | `leave-requests` | 切换后新单进入 hyb-oa;旧单不迁移流程状态 |
| 采购申请 | `purchase-requests` | 切换后新单进入 hyb-oa;PO/合同历史仅保留编号映射 |
| 差旅申请 / 支付 | `travel-requests` / `payment-batches` | 切换后新单进入 hyb-oa;历史订单不重放支付状态 |
| 资产台账 | `assets` | 可按主数据导入当前资产卡片,历史流转日志保留在旧 OA |
| 门户入口 | `portal` | 先切 Portal,再逐域切业务入口 |
## 4. 状态映射原则
- `draft / reviewing / approved / rejected / cancelled / paid` 等状态只做 **对照说明**,不做历史单据业务态导入。
- 旧 OA 审批中的单据,不在切换后继续迁移到 hyb-oa 跑剩余流程。
- 所有状态核对用于审计与人工校验,不用于自动回放。
## 5. 编号与附件原则
- 编号:旧 OA 历史编号保留在旧系统;hyb-oa 新单继续使用自身编号规则。
- 附件:历史附件仅做映射清单,不搬运到 hyb-oa 继续流转。
- 如需保留锚点,可在迁移台账中记录“旧编号 / 旧附件路径 / 新系统实体 ID(如有)”对照表。
## 6. dry-run 文件要求
| runType | 必需列 |
| --- | --- |
| `employees` | `employee_no,name,department_name` |
| `departments` | `name` |
| `budgets` | `code,name` |
| `masterdata_validation` | `type,code` |
## 7. 切换与回退
1. 导出旧 OA 主数据 CSV。
2. 在 hyb-oa 执行 dry-run,确认 `dry_run_ok`。
3. 公告旧 OA 新单停用时间。
4. 打开目标 `CutoverScope`。
5. 试点期观测 Portal、待办、预算预校验、支付批次与消息链路。
6. 如需回退,关闭 `CutoverScope` 并恢复旧入口。
## 8. 审计留痕
- 保存 dry-run 记录 ID、上传文件名、差异摘要。
- 保存 `CutoverScope` 启停时间、操作人和备注。
- 保存试点期首批新单编号、审批截图与付款批次号。
## 9. R18-R22 项目与合同最小导入映射
| 现有表格 | hyb-oa 对象 | 建议最小列 |
| --- | --- | --- |
| 项目台账 | `Project` | `project_no,name,client_name,owner_employee_no,status,target_end_at,is_confidential` |
| 项目成员表 | `ProjectMember` | `project_no,employee_no,role` |
| 里程碑表 | `ProjectMilestone` | `project_no,title,status,due_date,sort_order` |
| 风险表 | `ProjectRisk` | `project_no,title,detail,level,status,owner_employee_no` |
| 合同登记表 | `ContractRegistry` | `contract_no,project_no,counterparty_name,summary,confidentiality_level,archive_location,offline_archive_no,status` |
### 9.1 导入原则
- 优先导入“仍在使用的活动项目”,不追求一次性搬空历史。
- 项目资料正文不导入,`hyb-oa` 只保留资料目录、链接和归档位置。
- 对于涉密合同,CSV 里也只放元数据,不放正文摘要和附件路径明细。
-102
查看文件
@@ -1,102 +0,0 @@
# PWA 回归清单(P12 + P21PWA1 + P21PWA2)
## 前置条件
- `client` 已完成构建:`cd client && npm run build`
- 浏览器支持 PWA(Chrome / Safari 最新版,含移动端)
- 服务端 API 可用
- 离线相关场景优先在真实设备、企微 / 钉钉容器或移动浏览器中手工验证
## 场景 A:安装与离线壳
1. 打开系统首页,确认可出现安装入口(浏览器原生 UI)。
2. 安装到桌面后重新打开,确认可进入系统壳页面。
3. 断网后刷新,确认仍可打开壳页面(离线壳生效)。
期望:离线壳可访问,不应白屏崩溃。
## 场景 B:移动 PDF 发票离线上传
1. 访问 `移动 PDF 发票上传` 页面。
2. 断网,选择 PDF 文件,点击“立即上传”。
3. 确认提示“已加入待上传队列”。
4. 恢复网络,点击“同步队列”或等待自动重放。
5. 进入票据中心确认文件已上传。
期望:离线缓存成功,联网可重放成功。
## 场景 C:移动资产扫码
1. 使用具备资产读取权限的账号访问 `资产扫码` 页面。
2. 在支持 `BarcodeDetector` 的浏览器中点击“开始扫码”,扫描资产条码或二维码。
3. 若浏览器不支持 `BarcodeDetector`,确认页面自动回退到 ZXing 并可继续扫码。
4. 若相机不可用,改为手工输入资产编号 / 序列号 / 名称。
5. 确认唯一命中时展示轻量资产详情卡;多命中时展示候选列表。
期望:扫码与手工输入都能完成资产查找,且不要求新增原生壳。
## 场景 D:移动盘点录入与离线重放
1. 使用具备 `asset.inventory` 权限的账号,从 `资产盘点` 页面进入 `移动扫码盘点`。
2. 选择或打开一个 `draft` 盘点任务,点击“开始并扫码”,确认任务进入 `counting`。
3. 扫码定位资产后提交盘点结果,确认桌面盘点页同步看到新增 item。
4. 在任务为 `counting` 且已解析资产的前提下断网,再次提交盘点结果,确认提示“已加入离线队列”。
5. 恢复网络后等待自动重放或手动点击“同步队列”,确认队列项被移除且盘点结果已写回服务端。
6. 用无 `asset.inventory` 权限账号访问同一路径,确认只能查看资产结果,不能录入盘点。
期望:离线只缓存已解析盘点结果,联网可重放成功,权限边界不回退。
## 场景 E:移动审批在线动作
1. 使用审批角色访问 `移动审批` 页面。
2. 选择待办任务,依次测试在线 `通过` / `驳回` / `退回` / `转审`。
3. 返回待办列表与详情页确认状态同步刷新。
期望:在线动作闭环不回归,错误提示可读。
## 场景 F:workflow canonical deep link 落点
1. 生成待办通知,其 canonical URL 为 `/workflow/tasks/<taskId>`。
2. 在企微 / 钉钉容器或移动浏览器打开链接。
3. 确认 PWA 壳成功打开并自动跳转到 `/mobile/approvals?taskId=<taskId>`。
4. 确认待办详情正确展开;若该任务不在第一页列表中,也能单独查看详情。
期望:服务端 canonical deep link 不变,移动端自动落到移动审批页,桌面链接不回归。
## 场景 G:deep link 登录回跳
1. 未登录状态下直接打开 `/workflow/tasks/<taskId>`。
2. 守卫跳转到 `/login?redirect=...`。
3. 登录成功后返回原始 deep link。
4. 再次命中移动兜底跳转并进入 `/mobile/approvals?taskId=<taskId>`。
期望:登录回跳完整保留 deep link,上线后仍进入移动审批详情。
## 场景 H:离线审批草稿与联网重放
1. 在线进入移动审批页并成功加载某个待办详情。
2. 断网后选择 `通过` 或填写 comment 后 `驳回`。
3. 页面提示“已加入待同步审批草稿”。
4. 恢复联网后等待自动重放或手动点击“同步草稿队列”。
5. 确认成功项从队列移除,列表 / 详情刷新到最新状态。
期望:离线仅排队 `approve / reject`,联网可自动或手动重放成功。
## 场景 I:离线冷启动与未缓存待办
1. 设备先在线登录成功并写入本地会话快照。
2. 完全关闭页面后断网,直接打开 `/workflow/tasks/<taskId>` 或 `/mobile/approvals?taskId=<taskId>`。
3. 若该待办曾在线加载过,确认可进入移动审批壳并看到缓存详情。
4. 若该待办从未缓存过,确认页面只显示 taskId 与“离线未缓存该待办,请联网后重试”提示。
期望:离线冷启动仅依赖本地会话快照进入壳页面,不伪造未缓存详情。
## 场景 J:草稿冲突与失败重试
1. 离线起草一条 `驳回` 草稿。
2. 在恢复联网前,由其他审批人在线处理同一待办。
3. 自动重放返回 `409 already_processed`、`403` 或 `404`。
4. 确认草稿进入“存在冲突”状态,而不是静默视为成功。
5. 对 `5xx` 或临时网络异常场景,确认草稿进入“同步失败”状态并可手动重试。
期望:冲突与失败语义区分明确,用户可查看任务、重试失败项或丢弃草稿。
## 场景 K:权限与边界
1. 非审批角色访问 `移动审批` 或 deep link,确认被拒绝到 `403`。
2. 无在线会话且无本地快照时,离线冷启动不得绕过守卫。
3. 离线状态下确认 `退回` / `转审` 按钮统一置灰,并提示“需联网执行”。
期望:PWA-2 只放开移动审批壳的离线守卫,不扩散到其他受保护页面。
## 备注
- iOS 场景仅保证前台恢复后的重放,不承诺后台持续同步。
- `PWA-2` 不校验真实钉钉 / 企微 JS-SDK,只校验同源 H5 deep link 打开体验。
@@ -28,7 +28,7 @@
- 最大响应(max)< 1500ms
## SLI/SLO 与错误预算(P13)
- 详细定义见:`docs/ops/slo.md`
- 详细定义见:`docs/ops/SLO错误预算.md`
- 首版目标:
- 可用性(30天)>= 99.9%
- 核心 Dashboard API P99 < 500ms
-9
查看文件
@@ -1,9 +0,0 @@
# 需求规格说明书旧路径说明
**文档状态**:兼容跳转入口,不再作为主编辑入口。
当前 PRD 主事实源已改为中文文件名,方便人工审查:
- [海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md)
保留本文件是为了兼容历史文档、历史 Issue CSV 和外部链接。后续新增需求、评审和开发拆分,应优先引用中文主文档。
-69
查看文件
@@ -1,69 +0,0 @@
# hyb-oa 技术栈与复用报告(定案)
**文档状态**:历史技术选型定案,保留为架构追溯参考。
**日期**:2026-02-05
**适用范围**:OA 报销系统(Phase 1)
**当前用途**:确认 Fastify + Prisma + PostgreSQL 等基础技术选型来源。
**不得误读**:`Phase 1 / P0 / P2` 为早期阶段口径,不代表当前 MVP 需求范围;当前需求以 [海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md) 为准。
## 1. 定案结论(统一口径)
| 层级 | 选型 |
| :--- | :--- |
| 前端(OA) | React + Vite + Tailwind |
| 后端(OA API) | Fastify |
| ORM | Prisma |
| 数据库 | PostgreSQL |
| 认证 | JWT(access + refresh rotation),refresh 以 httpOnly Cookie 传输 |
| 权限 | RBAC(权限码) |
| 审计 | `workflow_history`(流程)+ `audit_logs`(安全与关键变更) |
| 部署 | Docker + Caddy/Nginx(反向代理) |
## 2. 关键取舍(为什么这么选)
### 2.1 常驻 Node 服务场景:优先“稳定性/少踩坑”
本项目目标是云服务器常驻 Node 服务 + 长期演进,因此选型优先级为:
1) 工具链成熟度与可维护性
2) 团队上手成本与踩坑风险
3) 可观测性/审计/权限等生产配套
4) 性能(在常驻服务场景下,冷启动优势不显著)
### 2.2 Prisma vs Drizzle(定案:Prisma)
- Prisma:迁移范式统一、资料多、团队协作成本低;适合“新人不踩坑”
- Drizzle:更轻、更 SQL 直观,但更依赖团队 SQL/事务/索引纪律;在本项目“稳定性优先”的定义下不作为默认
### 2.3 Fastify vs Hono(定案:Fastify)
- Fastify 适合常驻服务:生态成熟、插件与生产实践丰富(鉴权、日志、schema 校验等)
- Hono 更偏极简/Edge/Serverless 方向;并非本项目的默认最优解
### 2.4 为什么不使用 Supabase(本项目定案)
本项目部署形态为“自建常驻 API + 自建权限/审计/工作流/文件存储”,Supabase 在此形态下会带来:
- 额外的运维与概念复杂度(RLS、RPC、Storage、Auth 等)
- 架构边界不清(哪些逻辑在 DB,哪些在服务层)
因此 hyb-oa 选择“Fastify + Prisma + PostgreSQL”作为单一事实源。
## 3. 复用资产清单(来自 `shenzhou-business-suite`)
> 原则:复用“成熟结构/约束/枚举/经验”,把改造集中在“Supabase 调用 → REST API 调用”。
| 资产 | 来源路径(参考) | 复用价值 | 备注/改造点 |
| :--- | :--- | :---: | :--- |
| 工作流引擎 4 表 + `approval_rules`/`approval_transfers`/`document_sequences` | `shenzhou-business-suite/supabase/schema/70_workflow/01_workflow_02_tables.sql` | ⭐⭐⭐⭐⭐ | 转 Prisma schema;工作流事务由 Fastify 服务层实现 |
| 工作流配置/类型(assignee_rule 等) | `shenzhou-business-suite/src/types/workflow.ts` | ⭐⭐⭐⭐ | 作为工作流 JSON 配置与契约参考 |
| 权限码体系 | `shenzhou-business-suite/src/types/permissions.ts` | ⭐⭐⭐⭐ | 复用命名与粒度;补 `expense.proxy_*` |
| 报销表结构参考(forms/items/attachments) | `shenzhou-business-suite/supabase/schema/20_finance/06_reimbursement_01_tables.sql` | ⭐⭐⭐⭐ | 字段设计参考;hyb-oa 简化并补 `file_sha256` 等 |
| 默认费用类型 seed(35 启用 + 3 legacy 禁用) | `shenzhou-business-suite/supabase/seed.sql` | ⭐⭐⭐⭐⭐ | hyb-oa 额外启用 `utilities/rent` 形成 37 启用 |
| 存储安全基线(类型/大小/访问控制) | `shenzhou-business-suite/supabase/migrations/20260131175000_storage_security_baseline.sql` | ⭐⭐⭐⭐ | 思路迁移到“本地存储 + 签名 URL” |
| UI 组件(shadcn/ui 风格) | `shenzhou-business-suite/src/components/ui/*` | ⭐⭐⭐⭐ | 实现阶段复制到 `hyb-oa/client/src/`(需统一路径与样式变量) |
| 报销前端页面结构 | `shenzhou-business-suite/src/pages/finance/reimbursement/*` | ⭐⭐⭐ | 需移除 Supabase 调用,替换为 OA API |
| 测试框架 | `shenzhou-business-suite/playwright.config.ts` + `vitest.config.ts` | ⭐⭐⭐ | 实现阶段迁移;补齐鉴权/工作流核心路径 |
## 4. 关键设计原则(写入规格书的那几条)
- 状态 vs 节点分离:报销单 `status` 固定 7 状态;审批节点由 `workflow_tasks` 驱动
- 配置驱动:`approval_rules`/`expense_types`/`document_sequences` 均可配置;P0 预置默认值即可生效
- 审计分层:
- `workflow_history`:流程动作与审批链路(权威)
- `audit_logs`:登录/敏感字段/配置变更/判重例外等安全关键事件
- 文件存储:P0 本地存储 + 签名 URL;P2 切换 MinIO/OSS(接口不变)
## 5. 与本仓库当前现状对齐(信息校验)
- `server/package.json` 已包含:`fastify`、`@fastify/jwt`、`prisma/@prisma/client`、`zod`
- `docker-compose.yml` 已提供 PostgreSQL 15(本地/开发用)
-43
查看文件
@@ -1,43 +0,0 @@
# 历史 TODO 清账映射(A/C -> B/D/F)
**文档状态**:历史 TODO 清账证据,不是当前待办列表。
**日期**:2026-03-13
**范围**:
- `issues/2026-02-07-p2-kickoff.csv`
- `issues/2026-02-08_14-20-25-p2-ci-and-tests.csv`
**目标**:对历史 `TODO` 项逐条给出去向:`implemented | superseded | still-open`,并以“后续执行合同 + 当前代码路径”形成可审计证据链。
**当前用途**:解释早期 TODO 为什么不再直接推进;新需求必须进入新的 `issues/*.csv`。
**不得误读**:本文中的 `still-open=0` 只针对列出的早期 TODO,不代表全项目没有待办。
## 1. 2026-02-07-p2-kickoff.csv
| Legacy ID | 标题 | 清账状态 | 对应实现 / 去向证据 |
| --- | --- | --- | --- |
| A1 | 付款凭证扩展与pay幂等冲突判定 | implemented | `issues/2026-02-08_11-02-30-p2-stabilization.csv:B1`(DONE)承接付款幂等收口;当前代码在 `server/src/routes/reimbursements.js` 的 `/api/reimbursements/:id/pay` 已支持 `paymentVoucherNo/paymentDate/paymentChannel` 幂等重试,并在冲突时返回 `already_paid_conflict`。 |
| A2 | 委派有效期与自动回收 | implemented | `issues/2026-02-08_11-02-30-p2-stabilization.csv:B2/B3`(DONE)收口委派有效期与并发回收;当前代码在 `server/src/routes/delegations.js` 支持 `validFrom/validTo`,`server/src/jobs/delegationRevokeJob.js` 负责过期授权自动回收与审计。 |
| A5 | Sprint1回归护栏前置 | superseded | 该目标已被后续统一回归体系取代:`issues/2026-02-08_17-05-00-p3-full-delivery.csv:D12`(DONE)与 `issues/2026-02-08_17-05-00-p3-full-delivery.csv:D4`(DONE)已将回归入口与 CI 补强收口;当前脚本 `server/scripts/regression-workflow-actions.sh` 与 `server/scripts/regression-all.sh` 持续承接原“护栏前置”职责。 |
| A3 | OCR真对接与异步处理 | implemented | `issues/2026-02-09_13-39-02-p5-blueprint-v3.csv:F11` 与 `issues/2026-02-09_13-39-02-p5-blueprint-v3.csv:F19b`(DONE)已将 OCR provider、异步处理与回归闭环收口;当前代码在 `server/src/services/ocr/tencent.js` 提供腾讯云 VAT OCR 对接,在 `server/src/scripts/run-ocr-once.js` 与 `server/src/jobs/ocrJob.js` 提供异步扫描执行能力。 |
| A3-LOCK | OCR多实例并发幂等锁 | implemented | `issues/2026-02-08_17-05-00-p3-full-delivery.csv:D3`(DONE)已把 OCR mock 回归与并发锁验收纳入主线;当前代码在 `server/src/jobs/ocrJob.js` 使用 `FOR UPDATE SKIP LOCKED` + `ocr_locked_at/ocr_lock_owner` 进行唯一认领,表结构见 `server/prisma/schema.prisma`。 |
| A4 | 审计工作台只读能力 | implemented | `issues/2026-02-08_17-05-00-p3-full-delivery.csv:D2`(DONE)承接审计接口与回归;当前代码在 `server/src/routes/audit.js` 已提供 `/api/audit-logs`,前端 `client/src/pages/AuditLogsPage.tsx` 已实现分页、筛选、导出与权限控制。 |
## 2. 2026-02-08_14-20-25-p2-ci-and-tests.csv
| Legacy ID | 标题 | 清账状态 | 对应实现 / 去向证据 |
| --- | --- | --- | --- |
| C2 | 审计接口自动化测试 | implemented | `issues/2026-02-08_17-05-00-p3-full-delivery.csv:D2`(DONE)直接承接;当前回归脚本 `server/scripts/regression-audit.sh` 已覆盖权限、分页、筛选与参数非法场景。 |
| C3 | OCR 自动化测试(Mock优先) | implemented | `issues/2026-02-08_17-05-00-p3-full-delivery.csv:D3`(DONE)直接承接;当前回归脚本 `server/scripts/regression-ocr.sh` 已覆盖 mock provider、状态流转、失败重试与并发唯一认领。 |
| C4 | P3-a 待办列表页落地 | implemented | `issues/2026-02-08_17-05-00-p3-full-delivery.csv:D6`(DONE)直接承接;当前页面 `client/src/pages/WorkflowTasksPage.tsx` 已实现真实待办列表、分页、状态筛选与详情入口。 |
| C5 | P3-a 审批详情与动作联调 | implemented | `issues/2026-02-08_17-05-00-p3-full-delivery.csv:D6`(DONE)直接承接;当前页面 `client/src/pages/WorkflowTaskDetailPage.tsx` 已联通 `approve/reject/return/transfer` 动作、候选审批人、错误提示与数据刷新。 |
## 3. 汇总结论
- `implemented`:9
- `superseded`:1
- `still-open`:0
## 4. 治理口径
- 历史 `issues/*.csv` 继续保持快照不可变,不回写旧状态。
- 清账结论由本文件和后续治理合同承接,作为“旧 TODO 已被后续迭代覆盖”的审计证据。
- 若后续代码与旧合同文案冲突,以当前运行时代码和已完成执行合同为准。
-11
查看文件
@@ -1,11 +0,0 @@
"ID","Flow","Trigger","CurrentFeedback","AutoRefresh","TerminalStates","FailureReason","RetryEntry","IndustryBenchmark","Risk","SuggestedIssue","Notes"
"AUX-01","报销详情发票识别","员工上传 PDF/图片发票","上传成功后显示单一识别状态,识别完成后自动添加;事件流失败时轮询兜底","fetch-stream/SSE + 3s 轮询兜底","已添加、识别失败、重复、已用于报销","通过 availabilityMessage 展示业务原因","失败发票可重新识别或人工修正","合思/分贝通/每刻均强调票据识别、验真、查重和电子档案","真实腾讯 OCR 耗时和公网链路仍需 live smoke 证据","保留 H10 live OCR gate","本轮已作为主链路优化"
"AUX-02","票据中心发票验真","财务或有权限用户触发验真","详情页显示验真记录,pending 时轮询记录列表","React Query 轮询 pending 验真记录","通过、失败、异常","展示 provider 返回的 resultMessage 或 errorMessage","失败记录可重试验真","国内费控系统通常把识别、验真、查重作为连续可追踪流程","普通员工不应看到过多 provider 细节;财务侧可保留","新增验真 UX 断言 Issue","不在本轮改业务代码"
"AUX-03","支付批次执行","财务创建、复核并执行付款批次","批次页显示状态和操作结果 toast","依赖页面 refetch 和 focused regression","待复核、已复核、执行中、已执行、失败","失败路径由批次路由和回归脚本覆盖","失败后按批次状态重新处理","分贝通/合思强调企业支付、对账、归档闭环","执行中长耗时缺少实时进度和失败明细聚合","新增支付批次执行进度 Issue","需防 maker-checker 权限回归"
"AUX-04","ERP 凭证/主数据同步","付款、报销或主数据变更后进入 outbox","管理页和预览可查看 pending outbox","当前以后台 job 和页面刷新为主","pending、sent、failed、dead-letter","outbox 错误摘要可查","管理端可 retry outbox","同类系统强调 OA/HRM/ERP 连接和三流合一","普通业务页对同步中/同步失败提示较弱","新增 ERP 同步状态外显 Issue","外部 ERP live 回执仍是专项"
"AUX-05","用户/主数据导入","管理员上传导入文件","导入接口返回成功/失败摘要","通常一次 HTTP 完成;批量大时缺少任务化反馈","完成、部分失败、失败","行级错误摘要","修正文件后重新导入","国内 OA 常见批量导入需行级错误与可下载失败清单","大批量导入可能阻塞且反馈不连续","新增导入任务化与错误清单 Issue","需先盘点现有导入入口"
"AUX-06","审批处理与移动离线队列","审批人在 PC/移动端通过、驳回、转交","操作后 toast 和列表刷新;移动离线队列有回放机制","页面 refetch;离线队列恢复后重放","已处理、待处理、失败、冲突","权限/状态冲突显示错误","失败后重新提交操作","国内 OA 强调移动审批效率和全程留痕","多人并发和代理审批 live 证据不足","新增审批并发与代理 live smoke Issue","不在本轮改 workflow 状态机"
"AUX-07","附件材料上传","报销草稿或驳回状态上传附件","显示上传结果和附件列表","上传完成后 refetch 详情","已上传、失败、已删除","上传失败显示错误","重新选择文件上传","行业实践区分发票凭证和附件材料","移动弱网下缺分片/重试进度;PDF 与图片入口需清楚","新增附件弱网与视觉断言 Issue","需保持附件不参与发票识别和查重"
"AUX-08","通知与 IM 投递","审批、报销状态变化或系统消息触发","站内通知列表显示未读;外部 IM 依赖配置","前端查询通知;外部投递后台处理","未读、已读、投递失败","后台日志或 outbox 错误","管理端/脚本重试","国内 OA 强调消息可达和待办闭环","真实企业微信消息投递证据不足","新增 IM 投递 live smoke Issue","真实企业微信登录由人工验收"
"AUX-09","预算/费用标准预检","提交报销或采购前触发预检","页面展示预算、标准和风险提示","多为提交前即时计算","通过、提示、阻断","以业务文案展示不合规原因","修改明细后重新预检","费控最佳实践强调事前管控","普通用户对阻断原因和修改建议仍可增强","新增提交前预检解释 Issue","不顺手改当前费用规则"
"AUX-10","公网 live smoke 与发布门禁","部署后执行公网 ready、资源扫描、OCR 样本和网页 smoke","脚本输出 pass 或明确 SKIP 缺项","命令式检查,不依赖页面自动刷新","通过、失败、跳过","缺账号/缺样本/公网异常","补齐环境变量后重跑","上线前必须保留真实链路证据","缺账号或样本时容易误以为已覆盖真实链路","保留 H10 发布门禁","本轮脚本已加入 pending OCR 扫描"
1 ID Flow Trigger CurrentFeedback AutoRefresh TerminalStates FailureReason RetryEntry IndustryBenchmark Risk SuggestedIssue Notes
2 AUX-01 报销详情发票识别 员工上传 PDF/图片发票 上传成功后显示单一识别状态,识别完成后自动添加;事件流失败时轮询兜底 fetch-stream/SSE + 3s 轮询兜底 已添加、识别失败、重复、已用于报销 通过 availabilityMessage 展示业务原因 失败发票可重新识别或人工修正 合思/分贝通/每刻均强调票据识别、验真、查重和电子档案 真实腾讯 OCR 耗时和公网链路仍需 live smoke 证据 保留 H10 live OCR gate 本轮已作为主链路优化
3 AUX-02 票据中心发票验真 财务或有权限用户触发验真 详情页显示验真记录,pending 时轮询记录列表 React Query 轮询 pending 验真记录 通过、失败、异常 展示 provider 返回的 resultMessage 或 errorMessage 失败记录可重试验真 国内费控系统通常把识别、验真、查重作为连续可追踪流程 普通员工不应看到过多 provider 细节;财务侧可保留 新增验真 UX 断言 Issue 不在本轮改业务代码
4 AUX-03 支付批次执行 财务创建、复核并执行付款批次 批次页显示状态和操作结果 toast 依赖页面 refetch 和 focused regression 待复核、已复核、执行中、已执行、失败 失败路径由批次路由和回归脚本覆盖 失败后按批次状态重新处理 分贝通/合思强调企业支付、对账、归档闭环 执行中长耗时缺少实时进度和失败明细聚合 新增支付批次执行进度 Issue 需防 maker-checker 权限回归
5 AUX-04 ERP 凭证/主数据同步 付款、报销或主数据变更后进入 outbox 管理页和预览可查看 pending outbox 当前以后台 job 和页面刷新为主 pending、sent、failed、dead-letter outbox 错误摘要可查 管理端可 retry outbox 同类系统强调 OA/HRM/ERP 连接和三流合一 普通业务页对同步中/同步失败提示较弱 新增 ERP 同步状态外显 Issue 外部 ERP live 回执仍是专项
6 AUX-05 用户/主数据导入 管理员上传导入文件 导入接口返回成功/失败摘要 通常一次 HTTP 完成;批量大时缺少任务化反馈 完成、部分失败、失败 行级错误摘要 修正文件后重新导入 国内 OA 常见批量导入需行级错误与可下载失败清单 大批量导入可能阻塞且反馈不连续 新增导入任务化与错误清单 Issue 需先盘点现有导入入口
7 AUX-06 审批处理与移动离线队列 审批人在 PC/移动端通过、驳回、转交 操作后 toast 和列表刷新;移动离线队列有回放机制 页面 refetch;离线队列恢复后重放 已处理、待处理、失败、冲突 权限/状态冲突显示错误 失败后重新提交操作 国内 OA 强调移动审批效率和全程留痕 多人并发和代理审批 live 证据不足 新增审批并发与代理 live smoke Issue 不在本轮改 workflow 状态机
8 AUX-07 附件材料上传 报销草稿或驳回状态上传附件 显示上传结果和附件列表 上传完成后 refetch 详情 已上传、失败、已删除 上传失败显示错误 重新选择文件上传 行业实践区分发票凭证和附件材料 移动弱网下缺分片/重试进度;PDF 与图片入口需清楚 新增附件弱网与视觉断言 Issue 需保持附件不参与发票识别和查重
9 AUX-08 通知与 IM 投递 审批、报销状态变化或系统消息触发 站内通知列表显示未读;外部 IM 依赖配置 前端查询通知;外部投递后台处理 未读、已读、投递失败 后台日志或 outbox 错误 管理端/脚本重试 国内 OA 强调消息可达和待办闭环 真实企业微信消息投递证据不足 新增 IM 投递 live smoke Issue 真实企业微信登录由人工验收
10 AUX-09 预算/费用标准预检 提交报销或采购前触发预检 页面展示预算、标准和风险提示 多为提交前即时计算 通过、提示、阻断 以业务文案展示不合规原因 修改明细后重新预检 费控最佳实践强调事前管控 普通用户对阻断原因和修改建议仍可增强 新增提交前预检解释 Issue 不顺手改当前费用规则
11 AUX-10 公网 live smoke 与发布门禁 部署后执行公网 ready、资源扫描、OCR 样本和网页 smoke 脚本输出 pass 或明确 SKIP 缺项 命令式检查,不依赖页面自动刷新 通过、失败、跳过 缺账号/缺样本/公网异常 补齐环境变量后重跑 上线前必须保留真实链路证据 缺账号或样本时容易误以为已覆盖真实链路 保留 H10 发布门禁 本轮脚本已加入 pending OCR 扫描
-17
查看文件
@@ -1,17 +0,0 @@
"Domain","Tier","Routes","Primary_Roles","Env_Gates","Feature_Flags","Coverage_Status","Evidence","Validated_Flows","Gaps","Next_Action"
"__DOC_STATUS__","meta","N/A","N/A","N/A","N/A","historical_reference","docs/文档索引.md|docs/文档事实源状态矩阵.md|docs/trialrun/manual-trialrun-report.md","本 CSV 是历史证据 / QA 参考,不代表 2026-05-12 当前状态。R6/PC6/PA6/FL6/AP6/RI6/LP6/ME6/QG6/DG7/MIA7 后的当前状态以最新 Issue CSV 和文档索引为准。","历史条目中的公网仍需、待执行、缺口等表述需按当时日期理解。","不要单独使用本 CSV 决定当前门禁或新需求;先读最新 Issue CSV。"
"认证与 Portal 导航","must_cover","/login|/portal|主/管/备导航","employee|manager|admin","APP_ORIGIN|COOKIE_SECURE|PORTAL_HOME_ENABLED|WECOM_ENTRY_ENABLED","portal_home_v1|wecom_entry_v1","done","artifacts/r69/acceptance-report.md|docs/trialrun/manual-trialrun-report.md|client/tests/e2e/login-portal-ux.spec.ts|client/tests/e2e/wecom-entry.spec.ts|client/tests/e2e/manual/r70-trialrun-assist.spec.ts","登录、Portal 首屏、员工/经理/管理员导航分组、普通浏览器与企微 WebView CTA 提示均有自动化或人工证据。","真实企微 OAuth 绑定与回跳未做端到端;HTTPS 部署态 cookie 行为未在本轮验证。","保持主链路 done;真实企微与 HTTPS 转 A5 外部专项。"
"请假与审批","must_cover","/leave-requests|/workflow/tasks","employee|manager|admin","none","leave_holiday_calendar","done","artifacts/r69/acceptance-report.md|docs/trialrun/manual-trialrun-report.md|client/tests/e2e/leave-flow.spec.ts|client/tests/e2e/workflow-quick-approve.spec.ts|client/tests/e2e/leave-team-calendar.spec.ts","请假草稿、提交、撤回、经理快捷审批、团队日历权限边界与经理部门视角已自动化并在 R70 人工复测通过。","多审批人链路、代理审批、真实并发多人协同未在 trialrun 轮次验证。","维持 done;多人协同与代理审批并入 A5 或后续专项。"
"报销、票据中心与 OCR","must_cover","/reimbursements|/reimbursements/:id|/invoice-pool","employee|manager|finance|admin","OCR_PROVIDER|TENCENT_SECRET_ID|TENCENT_SECRET_KEY|PAYMENT_BATCH_ENABLED|ERP_SYNC_ENABLED","invoice_verification|payment_batch_v1|erp_sync","done","docs/trialrun/manual-trialrun-report.md|artifacts/r70/live-ocr-batch-report.md|issues/2026-04-29_08-39-22-r76-external-trialrun-closeout.csv|issues/2026-04-29_09-19-07-r77-ocr-pdf-first.csv|issues/2026-04-29_10-14-27-r78-reimbursement-payment-tail.csv|client/tests/e2e/reimbursement-workflow-progress.spec.ts|client/tests/e2e/invoice-ocr-flow.spec.ts|client/tests/e2e/reimbursement-payment-batch-flow.spec.ts|client/tests/e2e/manual/live-invoice-ocr.spec.ts|client/tests/e2e/manual/live-invoice-ocr-batch.spec.ts|server/scripts/regression-payment-batches.sh","报销提交后审批进度、票据中心缺字段修正、上传后自动 OCR 进入可绑定、绑定后提交已自动化;R70 人工链路也通过。R77 已在干净本地 trialrun DB 上用真实 PDF 发票跑通 `上传 -> OCR -> available`。R78 已补 employee->manager->finance->finance_mgr->payment batch->execute->reimbursement paid->invoice archived->ERP preview pending outbox focused regression。","真实 ERP 投递回执、高风险两轮复核、大额或混合付款批次仍未进入本轮本地试运行;腾讯 OCR 凭证仍依赖旧项目运行时注入。","维持 done;真实 ERP 与高风险付款转外部/专项回归,PDF 转图片 fallback 仅在新增票样兼容性问题出现时再评估。"
"周报与待办","must_cover","/weekly-reports|/todos","employee|manager","WEEKLY_REPORT_ENABLED|TODO_BOARD_ENABLED","weekly_report_v1|todo_board_v1","done","artifacts/r70/auto-trialrun-deep-report.md|docs/trialrun/manual-trialrun-report.md|client/tests/e2e/weekly-todo-flow.spec.ts|client/tests/e2e/manual/r70-trialrun-deep-assist.spec.ts","周报保存、生成待办、提交周报、完成待办闭环已自动化且在真实 trialrun 数据上复核通过。","经理侧未提交周报聚合与催办策略未单独验证。","维持 done;如进入管理场景增强,再补经理视角聚合。"
"公告、搜索与通知","must_cover","/announcements|/notifications|全局搜索","employee|manager|admin","ANNOUNCEMENTS_ENABLED|GLOBAL_SEARCH_ENABLED","announcements_v1|global_search_v1","done","artifacts/r70/auto-trialrun-deep-report.md|docs/trialrun/manual-trialrun-report.md|client/tests/e2e/announcements-presence.spec.ts|client/tests/e2e/global-search.spec.ts|client/tests/e2e/manual/r70-trialrun-deep-assist.spec.ts|client/tests/e2e/r75-automation-gap-fill.spec.ts","公告发布、员工可见、Portal 汇总、真实搜索命中公告并跳转,以及通知中心未读筛选、单条已读、全部已读与待办跳转均有自动化或人工证据。","无当前试运行阻断缺口;真实外发渠道投递与通知渠道配置验证另见系统治理和外部环境项。","站内通知维持 done;外发渠道留在 A5/治理专项。"
"团队状态与考勤","must_cover","/team|/attendance","employee|manager|admin","PRESENCE_BOARD_ENABLED|ATTENDANCE_ENABLED","presence_board_v1|attendance_v1","done","docs/trialrun/manual-trialrun-report.md|client/tests/e2e/announcements-presence.spec.ts|issues/2026-04-09_r59-attendance-clockin.csv|client/tests/e2e/r75-automation-gap-fill.spec.ts","团队状态更新、Portal 汇总、经理查看团队状态,以及员工今日上班/下班打卡、月视图记录、管理员团队考勤补卡最小链路均已验证。","排班、节假日豁免、跨日班次等复杂考勤规则未做专项回归,但不构成本轮 trialrun 阻断。","维持 done;复杂考勤规则按需要独立专项。"
"人员、组织、生命周期与绩效","must_cover","/people|/organization|/people/:employeeId|/performance","admin|manager|employee","EMPLOYEE_LIFECYCLE_ENABLED","employee_lifecycle_v1","partial_done","docs/trialrun/manual-trialrun-report.md|issues/2026-03-21_12-10-00-r14-people-lifecycle.csv|issues/2026-03-29_r46-performance-review.csv|issues/2026-03-28_17-12-07-r40-profile-edit-and-people-export.csv|client/tests/e2e/r75-automation-gap-fill.spec.ts","管理员已人工打开人员管理与组织架构;当前 trialrun 已新增‘创建临时员工 -> 发起入职 -> 转正’轻量 happy path,生命周期、档案、导出、绩效权限边界仍保留历史 QA 与回归证据。","离职/资产交接完整链路、员工自助档案修改和直属上级绩效评分未在本轮重验。","lifecycle 基线已补齐;离职交接与绩效真实操作留后续 focused regression。"
"项目、合同台账与涉密边界","must_cover","/projects|/projects/:projectId|/contracts-registry","manager|admin|project roles","PROJECT_DOMAIN_ENABLED|PROJECT_LINKING_ENABLED|PROJECT_COMMUNICATION_LOG_ENABLED|PROJECT_CLOSURE_CHECKLIST_ENABLED|CONFIDENTIAL_DOC_REFS_ENABLED","project_domain_v1|project_linking_v1|project_communication_log_v1|project_closure_checklist_v1|confidential_doc_refs_v1","partial","docs/trialrun/manual-trialrun-report.md|client/tests/e2e/project-workbench.spec.ts|client/tests/e2e/confidential-boundary.spec.ts|client/tests/e2e/manual/r70-trialrun-assist.spec.ts","项目工作台沟通回填、收口面板、Portal 摘要、涉密搜索边界已自动化;经理人工确认项目入口可理解。","合同台账页面本轮只验证入口,没有当前 trialrun 下的浏览/编辑证据;真实项目创建与成员协同未重跑。","A4 可补项目详情与合同台账只读 smoke;重交互保持后置。"
"采购","enabled_admin","/purchase-requests","employee|manager|finance","none","none","partial_done","artifacts/r69/acceptance-report.md|client/tests/e2e/procurement-flow.spec.ts|issues/2026-03-24_17-00-26-r33-3-transaction-timeout-tail-cleanup.csv","员工提单、经理审批、财务归档链路已自动化通过,且事务超时问题已收口。","未进入 R70 人工试运行,当前 trialrun DB 下没有业务体验反馈。","若采购进入试运行范围,先补一次人工 happy path;否则保留自动化证据即可。"
"资产与盘点","enabled_admin","/assets|/inventory-checks|/mobile/assets/scan","employee|asset admin","none","none","partial_done","artifacts/r69/acceptance-report.md|client/tests/e2e/assets-flow.spec.ts|issues/2026-03-24_17-00-26-r33-3-transaction-timeout-tail-cleanup.csv","资产建卡、领用归还、调拨、盘点主链路已自动化通过。","未进入 R70 人工试运行;移动扫描真实设备与摄像头场景未验证。","保持自动化证据;真实移动扫描转 A5 或独立移动专项。"
"差旅与移动审批","enabled_admin","/travel-requests|/mobile/approvals|/mobile/capture","employee|manager|finance","WECOM_ENTRY_ENABLED","wecom_entry_v1","partial_done","artifacts/r69/acceptance-report.md|client/tests/e2e/travel-payment-flow.spec.ts|client/tests/e2e/travel-reconciliation-flow.spec.ts|client/tests/e2e/mobile-approvals-offline.spec.ts|docs/trialrun/manual-trialrun-report.md","差旅申请、审批、支付、绑票、对账批次,以及移动审批 deep link 离线重放都有自动化证据;R70 人工仅确认移动入口可理解。","真实 IM deep link、真实移动设备 PDF 上传、多人并发审批未验证。","保留自动化为主;真实设备和 IM 深链并入 A5。"
"预算、支付批次与 AP 运营","optional","/budgets|/payment-batches|/ap-operations","finance|admin","BUDGET_PRECHECK_ENABLED|PAYMENT_BATCH_ENABLED|ERP_SYNC_ENABLED","budget_precheck_v1|payment_batch_v1|erp_sync","partial_done","issues/2026-03-29_08-07-14-p25-lite-budget-ap.csv|issues/2026-04-06_r52-ap-operations.csv|issues/2026-04-29_10-14-27-r78-reimbursement-payment-tail.csv|client/tests/e2e/reimbursement-payment-batch-flow.spec.ts|server/scripts/regression-payment-batches.sh","支付批次 maker-checker、AP 待付款快捷复核、finance 执行报销付款批次,以及 reimbursement paid 后 ERP preview pending outbox 已在本地 focused regression 跑通;历史 budget/AP 视图与 review 证据仍保留。","预算预检页面级联动、高风险两轮复核、大额批次与非报销实体付款未在本轮 focused local 回归中重跑。","若财务域继续扩大试运行,再补 budget precheck 与高风险二次复核专项;当前 payment batch/AP happy path 已具备本地回归证据。"
"ERP 集成与切换控制台","external","/system/integrations/erp|/system/cutover","integration admin|system.settings","ERP_SYNC_ENABLED|CUTOVER_CONSOLE_ENABLED","erp_sync|cutover_console_v1","partial_external","issues/2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv|issues/2026-03-21_11-10-00-p29-replacement-readiness-refresh.csv|client/tests/e2e/live-smoke.spec.ts","ERP 管理页、mock/http 回归和只读 live smoke 有历史证据。","当前本地 trialrun 没有真实 ERP 出入站或 cutover 操作验证。","仅在外部环境专项下执行,不进入默认 trialrun gate。"
"系统治理、功能开关与审计","enabled_admin","/system/workspace|/system/settings|/system/feature-flags|/system/workflow-definitions|/audit-logs|/system/notification-channels","admin","WORKFLOW_DEFINITION_ADMIN_ENABLED","workflow_definition_admin_v1","partial_done","docs/trialrun/manual-trialrun-report.md|client/tests/e2e/settings-governance.spec.ts|client/tests/e2e/live-smoke.spec.ts|server/src/scripts/smoke-trialrun-runtime.js|client/tests/e2e/r75-automation-gap-fill.spec.ts|issues/2026-05-05_20-01-18-r90-r91-trialrun-closeout.csv","工作区设置、系统设置、功能开关、审计日志打开与导航边界有自动化和人工证据;R74 本地门禁已检查 workspace/flag/navigation 基线,R75 已补功能开关备注保存并恢复写路径。R80 已把 `wecom_entry_v1` 从 `force_off` 调整为 `inherit`,R90 已把旧公网诊断从当前事实中剥离。","流程定义、通知渠道、工作区其他写操作和审计留痕写入效果仍未在当前 trialrun 做完整专项;公网 `announcements_v1` / `global_search_v1` 仍需在 live smoke 中重新核对。","保留 partial_done;R90/R91 先收口公网 feature flag 与 live smoke,再补通知渠道与流程定义写路径。"
"企微、HTTPS、部署态与并发","external","/login(企微入口)|部署运行时|多账号并发","all roles","APP_ORIGIN|COOKIE_SECURE|WECOM_*|PUBLIC_SECURITY_HARDENING_ENABLED","wecom_entry_v1|public_security_hardening_v1","partial_done","deploy/trialrun/runbook.md|client/tests/e2e/wecom-entry.spec.ts|client/tests/e2e/live-smoke.spec.ts|client/tests/e2e/r89-mobile-login-navigation.spec.ts|server/src/scripts/smoke-trialrun-runtime.js|issues/2026-05-04_16-47-46-r80-live-wecom-enablement.csv|issues/2026-05-04_20-53-39-r82-wecom-userid-compatibility.csv|issues/2026-05-04_23-36-10-r83-r86-user-onboarding-simplify.csv|issues/2026-05-05_14-01-13-r87-wecom-session-hint.csv|issues/2026-05-05_14-12-50-r88-wecom-device-fingerprint.csv|issues/2026-05-05_17-35-00-r89-mobile-login-ux.csv|issues/2026-05-05_20-01-18-r90-r91-trialrun-closeout.csv","本地/只读 smoke、env contract、导航/入口提示与 local runtime gate 已就绪;`https://oa.hyinda.com/ready` 已通过只读探活。R80 已启用公网企微 env 与 `wecom_entry_v1=inherit`;R82-R88 已修复真实 UserId 兼容、首次绑定、会话提示与设备指纹;R89 已完成本地移动登录与导航自动化。","历史缺口:当时公网仍需部署最新 R89/R90 并用真实手机企业微信复核 `/mobile` 落点;该表述不代表当前公网状态。HTTPS cookie secure、独立 smoke 账号 live smoke 和多用户并发协同也需按最新 Issue CSV 判断。","企微不再按外部阻塞处理;R90/R91 当时继续推进公网最新版本部署、`returnTo=/mobile`、live smoke、备份恢复和并发专项。"
1 Domain Tier Routes Primary_Roles Env_Gates Feature_Flags Coverage_Status Evidence Validated_Flows Gaps Next_Action
2 __DOC_STATUS__ meta N/A N/A N/A N/A historical_reference docs/文档索引.md|docs/文档事实源状态矩阵.md|docs/trialrun/manual-trialrun-report.md 本 CSV 是历史证据 / QA 参考,不代表 2026-05-12 当前状态。R6/PC6/PA6/FL6/AP6/RI6/LP6/ME6/QG6/DG7/MIA7 后的当前状态以最新 Issue CSV 和文档索引为准。 历史条目中的公网仍需、待执行、缺口等表述需按当时日期理解。 不要单独使用本 CSV 决定当前门禁或新需求;先读最新 Issue CSV。
3 认证与 Portal 导航 must_cover /login|/portal|主/管/备导航 employee|manager|admin APP_ORIGIN|COOKIE_SECURE|PORTAL_HOME_ENABLED|WECOM_ENTRY_ENABLED portal_home_v1|wecom_entry_v1 done artifacts/r69/acceptance-report.md|docs/trialrun/manual-trialrun-report.md|client/tests/e2e/login-portal-ux.spec.ts|client/tests/e2e/wecom-entry.spec.ts|client/tests/e2e/manual/r70-trialrun-assist.spec.ts 登录、Portal 首屏、员工/经理/管理员导航分组、普通浏览器与企微 WebView CTA 提示均有自动化或人工证据。 真实企微 OAuth 绑定与回跳未做端到端;HTTPS 部署态 cookie 行为未在本轮验证。 保持主链路 done;真实企微与 HTTPS 转 A5 外部专项。
4 请假与审批 must_cover /leave-requests|/workflow/tasks employee|manager|admin none leave_holiday_calendar done artifacts/r69/acceptance-report.md|docs/trialrun/manual-trialrun-report.md|client/tests/e2e/leave-flow.spec.ts|client/tests/e2e/workflow-quick-approve.spec.ts|client/tests/e2e/leave-team-calendar.spec.ts 请假草稿、提交、撤回、经理快捷审批、团队日历权限边界与经理部门视角已自动化并在 R70 人工复测通过。 多审批人链路、代理审批、真实并发多人协同未在 trialrun 轮次验证。 维持 done;多人协同与代理审批并入 A5 或后续专项。
5 报销、票据中心与 OCR must_cover /reimbursements|/reimbursements/:id|/invoice-pool employee|manager|finance|admin OCR_PROVIDER|TENCENT_SECRET_ID|TENCENT_SECRET_KEY|PAYMENT_BATCH_ENABLED|ERP_SYNC_ENABLED invoice_verification|payment_batch_v1|erp_sync done docs/trialrun/manual-trialrun-report.md|artifacts/r70/live-ocr-batch-report.md|issues/2026-04-29_08-39-22-r76-external-trialrun-closeout.csv|issues/2026-04-29_09-19-07-r77-ocr-pdf-first.csv|issues/2026-04-29_10-14-27-r78-reimbursement-payment-tail.csv|client/tests/e2e/reimbursement-workflow-progress.spec.ts|client/tests/e2e/invoice-ocr-flow.spec.ts|client/tests/e2e/reimbursement-payment-batch-flow.spec.ts|client/tests/e2e/manual/live-invoice-ocr.spec.ts|client/tests/e2e/manual/live-invoice-ocr-batch.spec.ts|server/scripts/regression-payment-batches.sh 报销提交后审批进度、票据中心缺字段修正、上传后自动 OCR 进入可绑定、绑定后提交已自动化;R70 人工链路也通过。R77 已在干净本地 trialrun DB 上用真实 PDF 发票跑通 `上传 -> OCR -> available`。R78 已补 employee->manager->finance->finance_mgr->payment batch->execute->reimbursement paid->invoice archived->ERP preview pending outbox focused regression。 真实 ERP 投递回执、高风险两轮复核、大额或混合付款批次仍未进入本轮本地试运行;腾讯 OCR 凭证仍依赖旧项目运行时注入。 维持 done;真实 ERP 与高风险付款转外部/专项回归,PDF 转图片 fallback 仅在新增票样兼容性问题出现时再评估。
6 周报与待办 must_cover /weekly-reports|/todos employee|manager WEEKLY_REPORT_ENABLED|TODO_BOARD_ENABLED weekly_report_v1|todo_board_v1 done artifacts/r70/auto-trialrun-deep-report.md|docs/trialrun/manual-trialrun-report.md|client/tests/e2e/weekly-todo-flow.spec.ts|client/tests/e2e/manual/r70-trialrun-deep-assist.spec.ts 周报保存、生成待办、提交周报、完成待办闭环已自动化且在真实 trialrun 数据上复核通过。 经理侧未提交周报聚合与催办策略未单独验证。 维持 done;如进入管理场景增强,再补经理视角聚合。
7 公告、搜索与通知 must_cover /announcements|/notifications|全局搜索 employee|manager|admin ANNOUNCEMENTS_ENABLED|GLOBAL_SEARCH_ENABLED announcements_v1|global_search_v1 done artifacts/r70/auto-trialrun-deep-report.md|docs/trialrun/manual-trialrun-report.md|client/tests/e2e/announcements-presence.spec.ts|client/tests/e2e/global-search.spec.ts|client/tests/e2e/manual/r70-trialrun-deep-assist.spec.ts|client/tests/e2e/r75-automation-gap-fill.spec.ts 公告发布、员工可见、Portal 汇总、真实搜索命中公告并跳转,以及通知中心未读筛选、单条已读、全部已读与待办跳转均有自动化或人工证据。 无当前试运行阻断缺口;真实外发渠道投递与通知渠道配置验证另见系统治理和外部环境项。 站内通知维持 done;外发渠道留在 A5/治理专项。
8 团队状态与考勤 must_cover /team|/attendance employee|manager|admin PRESENCE_BOARD_ENABLED|ATTENDANCE_ENABLED presence_board_v1|attendance_v1 done docs/trialrun/manual-trialrun-report.md|client/tests/e2e/announcements-presence.spec.ts|issues/2026-04-09_r59-attendance-clockin.csv|client/tests/e2e/r75-automation-gap-fill.spec.ts 团队状态更新、Portal 汇总、经理查看团队状态,以及员工今日上班/下班打卡、月视图记录、管理员团队考勤补卡最小链路均已验证。 排班、节假日豁免、跨日班次等复杂考勤规则未做专项回归,但不构成本轮 trialrun 阻断。 维持 done;复杂考勤规则按需要独立专项。
9 人员、组织、生命周期与绩效 must_cover /people|/organization|/people/:employeeId|/performance admin|manager|employee EMPLOYEE_LIFECYCLE_ENABLED employee_lifecycle_v1 partial_done docs/trialrun/manual-trialrun-report.md|issues/2026-03-21_12-10-00-r14-people-lifecycle.csv|issues/2026-03-29_r46-performance-review.csv|issues/2026-03-28_17-12-07-r40-profile-edit-and-people-export.csv|client/tests/e2e/r75-automation-gap-fill.spec.ts 管理员已人工打开人员管理与组织架构;当前 trialrun 已新增‘创建临时员工 -> 发起入职 -> 转正’轻量 happy path,生命周期、档案、导出、绩效权限边界仍保留历史 QA 与回归证据。 离职/资产交接完整链路、员工自助档案修改和直属上级绩效评分未在本轮重验。 lifecycle 基线已补齐;离职交接与绩效真实操作留后续 focused regression。
10 项目、合同台账与涉密边界 must_cover /projects|/projects/:projectId|/contracts-registry manager|admin|project roles PROJECT_DOMAIN_ENABLED|PROJECT_LINKING_ENABLED|PROJECT_COMMUNICATION_LOG_ENABLED|PROJECT_CLOSURE_CHECKLIST_ENABLED|CONFIDENTIAL_DOC_REFS_ENABLED project_domain_v1|project_linking_v1|project_communication_log_v1|project_closure_checklist_v1|confidential_doc_refs_v1 partial docs/trialrun/manual-trialrun-report.md|client/tests/e2e/project-workbench.spec.ts|client/tests/e2e/confidential-boundary.spec.ts|client/tests/e2e/manual/r70-trialrun-assist.spec.ts 项目工作台沟通回填、收口面板、Portal 摘要、涉密搜索边界已自动化;经理人工确认项目入口可理解。 合同台账页面本轮只验证入口,没有当前 trialrun 下的浏览/编辑证据;真实项目创建与成员协同未重跑。 A4 可补项目详情与合同台账只读 smoke;重交互保持后置。
11 采购 enabled_admin /purchase-requests employee|manager|finance none none partial_done artifacts/r69/acceptance-report.md|client/tests/e2e/procurement-flow.spec.ts|issues/2026-03-24_17-00-26-r33-3-transaction-timeout-tail-cleanup.csv 员工提单、经理审批、财务归档链路已自动化通过,且事务超时问题已收口。 未进入 R70 人工试运行,当前 trialrun DB 下没有业务体验反馈。 若采购进入试运行范围,先补一次人工 happy path;否则保留自动化证据即可。
12 资产与盘点 enabled_admin /assets|/inventory-checks|/mobile/assets/scan employee|asset admin none none partial_done artifacts/r69/acceptance-report.md|client/tests/e2e/assets-flow.spec.ts|issues/2026-03-24_17-00-26-r33-3-transaction-timeout-tail-cleanup.csv 资产建卡、领用归还、调拨、盘点主链路已自动化通过。 未进入 R70 人工试运行;移动扫描真实设备与摄像头场景未验证。 保持自动化证据;真实移动扫描转 A5 或独立移动专项。
13 差旅与移动审批 enabled_admin /travel-requests|/mobile/approvals|/mobile/capture employee|manager|finance WECOM_ENTRY_ENABLED wecom_entry_v1 partial_done artifacts/r69/acceptance-report.md|client/tests/e2e/travel-payment-flow.spec.ts|client/tests/e2e/travel-reconciliation-flow.spec.ts|client/tests/e2e/mobile-approvals-offline.spec.ts|docs/trialrun/manual-trialrun-report.md 差旅申请、审批、支付、绑票、对账批次,以及移动审批 deep link 离线重放都有自动化证据;R70 人工仅确认移动入口可理解。 真实 IM deep link、真实移动设备 PDF 上传、多人并发审批未验证。 保留自动化为主;真实设备和 IM 深链并入 A5。
14 预算、支付批次与 AP 运营 optional /budgets|/payment-batches|/ap-operations finance|admin BUDGET_PRECHECK_ENABLED|PAYMENT_BATCH_ENABLED|ERP_SYNC_ENABLED budget_precheck_v1|payment_batch_v1|erp_sync partial_done issues/2026-03-29_08-07-14-p25-lite-budget-ap.csv|issues/2026-04-06_r52-ap-operations.csv|issues/2026-04-29_10-14-27-r78-reimbursement-payment-tail.csv|client/tests/e2e/reimbursement-payment-batch-flow.spec.ts|server/scripts/regression-payment-batches.sh 支付批次 maker-checker、AP 待付款快捷复核、finance 执行报销付款批次,以及 reimbursement paid 后 ERP preview pending outbox 已在本地 focused regression 跑通;历史 budget/AP 视图与 review 证据仍保留。 预算预检页面级联动、高风险两轮复核、大额批次与非报销实体付款未在本轮 focused local 回归中重跑。 若财务域继续扩大试运行,再补 budget precheck 与高风险二次复核专项;当前 payment batch/AP happy path 已具备本地回归证据。
15 ERP 集成与切换控制台 external /system/integrations/erp|/system/cutover integration admin|system.settings ERP_SYNC_ENABLED|CUTOVER_CONSOLE_ENABLED erp_sync|cutover_console_v1 partial_external issues/2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv|issues/2026-03-21_11-10-00-p29-replacement-readiness-refresh.csv|client/tests/e2e/live-smoke.spec.ts ERP 管理页、mock/http 回归和只读 live smoke 有历史证据。 当前本地 trialrun 没有真实 ERP 出入站或 cutover 操作验证。 仅在外部环境专项下执行,不进入默认 trialrun gate。
16 系统治理、功能开关与审计 enabled_admin /system/workspace|/system/settings|/system/feature-flags|/system/workflow-definitions|/audit-logs|/system/notification-channels admin WORKFLOW_DEFINITION_ADMIN_ENABLED workflow_definition_admin_v1 partial_done docs/trialrun/manual-trialrun-report.md|client/tests/e2e/settings-governance.spec.ts|client/tests/e2e/live-smoke.spec.ts|server/src/scripts/smoke-trialrun-runtime.js|client/tests/e2e/r75-automation-gap-fill.spec.ts|issues/2026-05-05_20-01-18-r90-r91-trialrun-closeout.csv 工作区设置、系统设置、功能开关、审计日志打开与导航边界有自动化和人工证据;R74 本地门禁已检查 workspace/flag/navigation 基线,R75 已补功能开关备注保存并恢复写路径。R80 已把 `wecom_entry_v1` 从 `force_off` 调整为 `inherit`,R90 已把旧公网诊断从当前事实中剥离。 流程定义、通知渠道、工作区其他写操作和审计留痕写入效果仍未在当前 trialrun 做完整专项;公网 `announcements_v1` / `global_search_v1` 仍需在 live smoke 中重新核对。 保留 partial_done;R90/R91 先收口公网 feature flag 与 live smoke,再补通知渠道与流程定义写路径。
17 企微、HTTPS、部署态与并发 external /login(企微入口)|部署运行时|多账号并发 all roles APP_ORIGIN|COOKIE_SECURE|WECOM_*|PUBLIC_SECURITY_HARDENING_ENABLED wecom_entry_v1|public_security_hardening_v1 partial_done deploy/trialrun/runbook.md|client/tests/e2e/wecom-entry.spec.ts|client/tests/e2e/live-smoke.spec.ts|client/tests/e2e/r89-mobile-login-navigation.spec.ts|server/src/scripts/smoke-trialrun-runtime.js|issues/2026-05-04_16-47-46-r80-live-wecom-enablement.csv|issues/2026-05-04_20-53-39-r82-wecom-userid-compatibility.csv|issues/2026-05-04_23-36-10-r83-r86-user-onboarding-simplify.csv|issues/2026-05-05_14-01-13-r87-wecom-session-hint.csv|issues/2026-05-05_14-12-50-r88-wecom-device-fingerprint.csv|issues/2026-05-05_17-35-00-r89-mobile-login-ux.csv|issues/2026-05-05_20-01-18-r90-r91-trialrun-closeout.csv 本地/只读 smoke、env contract、导航/入口提示与 local runtime gate 已就绪;`https://oa.hyinda.com/ready` 已通过只读探活。R80 已启用公网企微 env 与 `wecom_entry_v1=inherit`;R82-R88 已修复真实 UserId 兼容、首次绑定、会话提示与设备指纹;R89 已完成本地移动登录与导航自动化。 历史缺口:当时公网仍需部署最新 R89/R90 并用真实手机企业微信复核 `/mobile` 落点;该表述不代表当前公网状态。HTTPS cookie secure、独立 smoke 账号 live smoke 和多用户并发协同也需按最新 Issue CSV 判断。 企微不再按外部阻塞处理;R90/R91 当时继续推进公网最新版本部署、`returnTo=/mobile`、live smoke、备份恢复和并发专项。
@@ -1,147 +0,0 @@
# R4 部署预检记录(2026-05-10)
**文档状态**:R4 预检、D3 同步与 D4 只读复检证据。
**执行范围**:`issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv` 的 R4,以及 `issues/2026-05-10_13-20-38-deployment-version-sync-governance.csv` 的 D1-D5。
**当前结论**:`DONE`。D3 已用既有部署脚本同步 release candidate,D4 只读复检通过;R5 因缺真实公网账号和 OCR 样票仍保持 `TODO/SKIP`。
## 1. 初始 R4 边界
- 初始 R4 只读预检未部署。
- 初始 R4 未修改远端 `.env`。
- 初始 R4 未执行 migration、seed、备份创建、服务重启或生产数据写入。
- 本轮未读取、打印、提交真实密码、JWT secret、企业微信 secret、腾讯 OCR secret 或数据库连接串明文。
- 企业微信真机、公网真实账号登录和真实 OCR 样票验证仍属于 R5;本轮只停留在 readiness 检查。
## 2. 版本口径
| 项目 | 结果 |
| --- | --- |
| 部署准备最新提交 | `2bab4e5 R3 完成权限直连审计` |
| 业务运行时代码基线 | `537e608 A8 完成首轮主线总回归门禁` |
| `537e608..2bab4e5` 差异 | 仅包含测试、文档和 Issue CSV;不包含业务运行时代码变更 |
| 远端目录 | `/opt/hyb-oa-trialrun` 存在 |
| 远端版本来源 | 远端不是 git 工作树,无法用 `git rev-parse` 直接确认版本 |
初始关键运行时文件哈希抽查结果:
| 文件 | 结论 |
| --- | --- |
| `server/src/services/workspaceSettings.js` | `BLOCKED`:远端与 `537e608/2bab4e5` 不一致 |
| `client/src/components/navigation/NavLinks.tsx` | `BLOCKED`:远端与 `537e608/2bab4e5` 不一致 |
| `server/src/routes/workflow.js` | `BLOCKED`:远端与 `537e608/2bab4e5` 不一致 |
| `server/src/routes/reimbursements.js` | 一致 |
| `server/src/routes/invoicePool.js` | 一致 |
| `server/src/routes/wecomAuth.js` | 一致 |
| `server/src/routes/leave.js` | 一致 |
| `server/src/routes/purchaseRequests.js` | 一致 |
| `server/src/routes/contractsRegistry.js` | 一致 |
| `server/src/routes/projects.js` | 一致 |
初始判定:远端当时可运行,但不能宣称已经是本轮 release candidate。由于不一致文件覆盖审批中心和权限导航护栏,按 R4 规则停止在预检阶段,并拆分部署版本同步治理 Issue。
## 3. 本地只读检查
| 检查项 | 结果 |
| --- | --- |
| `git status --short` | R4 开始前干净 |
| `git log --oneline -5` | 最新提交为 `2bab4e5`,其后为 `60adbcf`、`537e608`、`a18d477`、`d6ee25f` |
| `node deploy/trialrun/validate-env-contract.js` | PASS;检查服务 `server/worker/init`,`config.js` env 键数 121,`.env.example` env 键数 135 |
| `node scripts/qa/check-live-smoke-env.mjs` | public `/ready` 为 200;企业微信 config 为 ready;`liveSmokeReady=false`;`liveOcrReady=false` |
| live smoke 缺项 | 缺 `LIVE_SMOKE_ADMIN_IDENTIFIER/PASSWORD`、`LIVE_SMOKE_EMPLOYEE_IDENTIFIER/PASSWORD`、OCR live 登录或样票环境变量 |
| `node scripts/qa/check-public-bundle-copy.mjs https://oa.hyinda.com` | scanned=54,focused=4,findings=0 |
| Issue CSV 校验 | 通过 |
| 公网 `/ready` | 200,`data.ok=true` |
| 公网企业微信 config | 200;响应字段不包含 `secret`;`enabled/entryEnabled/oauthEnabled=true` |
## 4. 远端只读检查
| 检查项 | 结果 |
| --- | --- |
| SSH 用户 | `[email protected]` 可连接 |
| 服务器 | `VM-0-13-debian` |
| 部署目录 | `/opt/hyb-oa-trialrun` 存在 |
| git 工作树 | `no`;当前部署方式仍按 rsync 文件树判断 |
| compose 文件 | `deploy/trialrun/docker-compose.yml` 存在 |
| env 文件 | `deploy/trialrun/.env` 存在 |
| compose 工具 | `docker-compose 1.29.2` |
| 容器状态 | `hyb-oa-trialrun-server` Up;`hyb-oa-trialrun-db` Up 且 healthy |
| 远端本机 `/ready` | `http://127.0.0.1:3000/ready` 返回 200 |
| Prisma migrate status | 46 migrations found;`Database schema is up to date!` |
| 备份目录 | `deploy/trialrun/backups` 存在 |
| 最近备份 | 2026-05-06 有 DB dump 和 storage tar;2026-05-05 有 DB dump、storage tar 和 feature flags CSV |
| 文件存储目录 | `deploy/trialrun/data/storage` 存在 |
| 最近 server 日志摘要 | 抽样只看到 `/ready` 和企业微信 config 探活请求;未见迁移 drift 或服务启动失败摘要 |
远端环境变量只做存在性、布尔值和非空长度检查,未打印 secret 明文:
| 范围 | 结果 |
| --- | --- |
| 基础域名与安全 | `APP_ORIGIN=https://oa.hyinda.com`,`COOKIE_SECURE=true`,`PUBLIC_SECURITY_HARDENING_ENABLED=true` |
| 运行与存储 | `OCR_PROVIDER=tencent`,`STORAGE_DRIVER=local`,`JOB_DRIVER=pgboss`,`SERVE_CLIENT_DIST=true` |
| 企业微信 | `WECOM_ENABLED/WECOM_ENTRY_ENABLED/WECOM_OAUTH_ENABLED=true`;`WECOM_CORP_ID/WECOM_AGENT_ID/WECOM_AGENT_SECRET` 非空 |
| OCR | `TENCENT_SECRET_ID/TENCENT_SECRET_KEY/TENCENT_OCR_REGION` 非空 |
| 核心 secret | `JWT_SECRET/POSTGRES_PASSWORD/DATABASE_URL/FIELD_ENCRYPTION_KEY` 非空 |
## 5. Caddy 只读检查
| 检查项 | 结果 |
| --- | --- |
| SSH 用户 | `[email protected]` 可连接 |
| Caddy systemd | `active` 且 `enabled` |
| Caddy 配置校验 | `Valid configuration` |
| OA 站点块 | `/etc/caddy/Caddyfile` 包含 `oa.hyinda.com` |
| 反代目标 | `/etc/caddy/Caddyfile` 包含 `reverse_proxy 127.0.0.1:3000` |
| 443 监听 | `caddy` 正在监听 `*:443` |
## 6. 初始 R4 判定
初始 R4 未通过,保持 `DOING/TODO/TODO`,原因是远端运行时代码与本轮 release candidate 不一致,且远端不是 git 工作树,无法用提交号直接证明当前运行版本。
不一致不应在 R4 内通过远端手工修补解决。建议下一步先审批并执行部署版本同步治理:
- 确认同步目标仍为 `2bab4e5`,运行时代码基线仍为 `537e608`。
- 部署前复核备份和回滚路径。
- 使用既有 `deploy/trialrun/deploy.sh` 或批准后的等效流程同步远端文件树、构建并执行部署脚本内置 smoke。
- 部署后重新执行 R4 只读预检;通过后才进入 R5 live smoke。
## 7. 初始 SKIP 与禁止项
- `SKIP`:真实公网账号登录,原因是缺 `LIVE_SMOKE_*`。
- `SKIP`:真实 OCR 样票,原因是缺 OCR live 文件或目录环境变量。
- `SKIP`:企业微信手机真机,原因是 R5 才执行。
- 初始 R4 内禁止继续部署、重启、迁移、修改 `.env` 或写生产数据。
## 8. D1-D2 后续复核(2026-05-10)
执行合同:`issues/2026-05-10_13-20-38-deployment-version-sync-governance.csv`。
| 项目 | 结果 |
| --- | --- |
| D1 版本差异复核 | `DONE`:`537e608..2bab4e5` 仍仅包含测试、文档和 Issue CSV,不包含业务运行时代码变更 |
| D1 远端哈希复核 | 与 R4 一致:`workspaceSettings.js`、`NavLinks.tsx`、`workflow.js` 未对齐,其余抽查运行时文件一致 |
| D1 结论 | 同步目标仍固定为 `2bab4e5`;业务运行时代码基线仍为 `537e608`;不采用远端手工补丁 |
| D2 备份目录 | 远端 `deploy/trialrun/backups` 存在 |
| D2 最近备份 | 2026-05-10 13:43 已创建 `hyb-oa-db-20260510_134340.dump`(2691566 bytes)和 `hyb-oa-storage-20260510_134341.tar.gz`(2610057 bytes) |
| D2 回滚路径 | runbook 已包含 DB/storage 备份、恢复、仅代码回滚和 DB 回滚步骤 |
| D2 结论 | `DONE`:部署前新近备份已创建;当时 D3 仍需用户单独批准,后续执行结果见第 9 节 |
D3 受控同步 release candidate 后续已执行,结果见第 9 节。R5 live smoke 仍保持 `TODO/SKIP`。
## 9. D3-D5 发布同步与复检(2026-05-10)
执行合同:`issues/2026-05-10_13-20-38-deployment-version-sync-governance.csv`。
| 项目 | 结果 |
| --- | --- |
| D3 部署同步 | `DONE`:执行 `bash deploy/trialrun/deploy.sh` 成功 |
| 环境同步 | `SYNC_ENV=0`,未覆盖远端 `.env` |
| 部署脚本门禁 | env contract、rsync、容器重建、init、Prisma migrate status、`/ready`、external deps smoke、runtime smoke、公网 bundle 文案扫描均完成 |
| 远端关键文件哈希 | `workspaceSettings.js`、`NavLinks.tsx`、`workflow.js` 及其他抽查运行时文件已与本地一致 |
| 远端服务 | `hyb-oa-trialrun-server` 与 `hyb-oa-trialrun-db` 运行中,DB healthy,本机 `/ready` 返回 200 |
| Prisma migration | 46 migrations found;`Database schema is up to date!` |
| Caddy | `active/enabled`,配置有效,`oa.hyinda.com` 反代到 `127.0.0.1:3000`,443 监听正常 |
| 企业微信 config | 公网接口 200,`enabled/entryEnabled/oauthEnabled=true`,响应不包含 secret |
| 公网资源扫描 | `node scripts/qa/check-public-bundle-copy.mjs https://oa.hyinda.com`:scanned=54,focused=4,findings=0 |
| R5 readiness | `liveSmokeReady=false`、`liveOcrReady=false`;缺 `LIVE_SMOKE_*` 与 OCR live 文件或目录 |
R4 已可回填 `DONE/DONE/DONE`。R5 真实公网账号、企业微信真机和真实 OCR 样票验证仍未执行,不能宣称通过。
@@ -1,52 +0,0 @@
# 国内 OA 与费控系统最佳实践对照
**文档状态**:外部最佳实践调研快照和历史归档参考,不是当前需求事实源。
快照日期:2026-05-08;公开来源二次复核:2026-05-09
**不得误读**:本文只用于解释当时对国内 OA、费控和企业微信入口的调研判断;当前实现范围以 [海音达OA-MVP需求规格说明书](../海音达OA-MVP需求规格说明书.md)、模块规约和最新 `issues/*.csv` 为准。
## 调研来源
- 合思(原易快报)官网:强调从申请、消费、报销、对账、记账、归档、报表的全流程数字化,覆盖商旅、用车、餐饮、办公采购等场景,并把发票识别验真、合规透明、可追踪作为核心能力。来源:<https://www.hosecloud.com/index.html>
- 分贝通官网:首页与费用管理产品页强调全流程费控、全场景支付、事前管控、OCR 识别、自动验真、查重、电子档案、三流合一和 OA/HRM/CRM/ERP 连接。来源:<https://www.fenbeitong.com/>、<https://www.fenbeitong.com/product.php>
- 每刻科技官网:强调多行业费用管理、AI/OCR 票据识别、智能审核、知识库/制度问答、海外票据识别和合规效率。来源:<https://www.maycur.com/>
- 企业微信第三方应用文档:工作台应用应从企业微信直接进入 H5 页面,第三方网页授权通过 OAuth code 获取成员身份,回调与 state 需要明确校验。来源:<https://wdk-docs.github.io/wework-docs/>、<https://wdk-docs.github.io/wework-docs/server/>
## 可迁移最佳实践
1. **移动端优先入口**
- 企业微信工作台进入后应直接落到移动工作台,不应出现 PC 壳、桌面表格或侧边栏。
- 深链要保留目标页面,例如审批待办、票据上传、报销详情。
2. **报销从“填单”转向“票据驱动”**
- 员工上传发票后,应尽快看到“上传成功、识别中、可添加、识别失败、重复/已使用”的状态变化。
- 识别失败或重复时,应给出业务语言原因和下一步动作,不应只显示系统码。
3. **事前规则与事后审计并行**
- 费用标准、预算、审批规则应在提交前预检。
- 财务复核、例外放行、付款、归档应全程留痕。
4. **三流合一与电子档案**
- 报销单、发票、附件、审批记录、付款批次、ERP 凭证应能互相追溯。
- 普通员工侧只看业务文案;财务/管理员侧才出现更细的状态、差错和审计信息。
5. **自动化验收要覆盖“体验事实”**
- 仅验证接口成功不够,还要验证页面文案、状态变化、移动布局、文件选择行为、错误提示和视觉溢出。
- 真实 OCR、真实企业微信 OAuth、真机文件选择属于上线前必须有证据的 live smoke。
## hyb-oa 当前判断
| 领域 | 当前合理点 | 主要差距 | 优化优先级 |
| --- | --- | --- | --- |
| 企业微信入口 | 已有 `/mobile`、OAuth config、移动底部导航和公网入口配置 | 真机企业微信 OAuth + 真实账号回跳证据不足;仍需防 PC 页面误入 | P0 |
| 报销与票据 | 已支持报销、PDF 发票上传、OCR、绑定、解绑、查重、付款批次 | OCR 真实耗时、状态变化和失败提示需要 live 证据;票据入口需确认 PDF-only 在企业微信文件选择器中可用 | P0 |
| 费用规则 | 已有费用类型、审批规则、预算预检、支付批次 | 普通用户流程还需更强的提交前解释和异常引导 | P1 |
| 审批 | PC/移动审批和离线队列已有自动化 | 多人并发、代理审批、真实企业微信 deep link 还缺 live 证据 | P1 |
| 电子档案 | 发票、附件、审批、付款、ERP preview 已有链路 | 财务视角归档检索、合同/发票/付款跨域追溯仍偏分散 | P1 |
| 全局治理 | 已有 feature matrix、coverage matrix、Issue CSV、回归脚本 | 缺项目级覆盖扫描、全页面视觉巡检和统一 release gate | P0 |
## 下一步落地策略
1. 先把现有流程和测试覆盖机器化,避免继续靠人工记忆判断是否“一一核查”。
2. 将已知问题固化成静态扫描与 Playwright 断言,包括原始码值、内部术语、移动 PC 化、PDF capture 错误、横向溢出。
3. 把真实 OCR、真实企业微信、真机测试作为 live readiness,不具备条件时输出 skipped 和缺项清单。
4. 发布前统一执行 project-wide release gate;只有部署和公网检查通过后,才通知可以测试。
-412
查看文件
@@ -1,412 +0,0 @@
# R70 人工业务试运行报告
**文档状态**:历史人工试运行快照,不代表当前公网部署状态。
日期:2026-04-28
**当前用途**:追溯 R70-R81 期间本地、公网、企微、OCR 等验证证据,并保留 R6 之后批次的追加收口记录。
**不得误读**:文中的 `force_off`、公网 `.env`、企微启用状态和开放问题均为当时记录;当前状态应以最新 Issue CSV、部署报告、live smoke 结果、[`docs/文档索引.md`](../文档索引.md) 和 [`docs/文档事实源状态矩阵.md`](../文档事实源状态矩阵.md) 为准。
## DOCG7 文档事实源治理(2026-05-12)
DOCG7 用于治理文档口径,不改业务代码、不部署公网、不关闭 `ME6-3`。本轮明确:R6 已通过;PC6、PA6、FL6、AP6、RI6、LP6、ME6 自动化、QG6、DG7/MRF7 和 MIA7 已完成相应收口;MIF7 是下一批移动整改合同但仍为 TODO;R7/OPS7/DOC7 是准备材料,不代表真实 R7 已启动或已上线。后续读取历史矩阵、旧 runbook 或旧 trialrun 记录时,应优先按 `docs/文档索引.md` 和 `docs/文档事实源状态矩阵.md` 判断是否仍能指导当前开发。
## R6 小范围试运行记录(历史模板 + 已执行记录)
本节源自 `issues/2026-05-11_10-23-41-r6-small-trialrun-prep.csv` 的执行模板,后续已追加 R6、PS6 和 R6 后批次的真实收口记录。阅读时以表内最新“当前门禁/当前代码基线”和后续收口段落为准,不要把早期模板措辞当作当前未启动状态。
### R6 基线
| 项目 | 记录 |
| --- | --- |
| 公网地址 | `https://oa.hyinda.com` |
| 当前门禁 | R5 已 `DONE/DONE/DONE`;R6 首轮小范围试运行已完成;R6-ISSUE-003 采购提交阻断已热修、部署并复跑通过;PC6/PA6/FL6/AP6/RI6/LP6 后续优化已完成;ME6 自动化、部署和公网视觉复检已完成,`ME6-3` 代表性企业微信真机抽查因设备不便暂缓;QG6 非业务 QA 治理已完成但不替代真机 |
| 当前代码基线 | DG7/MRF7 移动信息架构与展示去重治理已部署到 `https://oa.hyinda.com`,并完成 `/ready`、public bundle、live smoke readiness、公网移动视觉矩阵复检;`ME6-3` 代表性企业微信真机抽查仍待用户确认 |
| 试运行窗口 | `2026-05-12 14:00-17:00 Asia/Shanghai`;若现场无法执行,顺延到 `2026-05-13 14:00-17:00 Asia/Shanghai` |
| 回滚联系人 | `wangshunli` |
| 问题登记负责人 | `wangshunli` |
| 当前候选配置 | 员工 `SMOKE002`;经理/审批人 `SMOKE101`;管理员/拍板人 `wangshunli`;财务 `wangzhiling` |
| 允许范围 | 报销、请假、采购、审批、企业微信入口/通知、财务付款/导出 |
| 禁止扩展 | 预算、ERP、AI、完整差旅、复杂 BPM、审批设计器、新组织规则 |
### R6 非真机自动验证(BV6,真机暂停期间)
本节对应 `issues/2026-05-11_13-58-30-r6-non-device-business-verification.csv`。设备暂不在身边时,只记录 PC、公网、自动化和模拟视口证据;不启动 R6,不关闭 `RS6-7/UI6-6/R6-ISSUE-001`。
| 项目 | 结果 | 证据位置 / 备注 |
| --- | --- | --- |
| 基线 | 通过 | 本地基线 `cee04d5`;R6 未启动;`RS6-7` 与 `UI6-6` 继续保持 `DONE/DONE/TODO`;`R6-ISSUE-001` 继续 `open/PAUSED` |
| 公网健康与 live smoke | 通过 | `check-live-smoke-env --strict` 通过;`run-live-smoke-readiness.sh` 通过;报告 `artifacts/qa-flow/live-smoke-readiness-20260511-135958`;公网 bundle `findings=0`;live OCR 返回重复票据的可解释终态 |
| 企业微信个人应用消息 | 通过 | 只读查询确认 `R5-WECOM-APP-PERSONAL` 为 `enabled=true`、`mode=wecom_app_message`;旧 `R50-MOCK-007334` 为 `enabled=false`;mock 不作为 R6 通知验收依据 |
| 业务自动化 | 通过 | `approval/leave/procurement` 本地隔离业务流通过,报告 `artifacts/qa-flow/business-flow-20260511-140942`;公网 live smoke 通过;`reimbursement` 组已在 `R6-ISSUE-002` 对齐测试口径后通过,报告 `artifacts/qa-flow/business-flow-20260511-161344` |
| 财务链路 | 通过 / 真实候选账号已创建 | `server/scripts/regression-payment-batches.sh` 通过,`paymentBatches` 单测 3 passed;只读查询确认 `SMOKE301/SMOKE302` 为 active 测试财务账号;WZ6 已创建 `wangzhiling`,状态 `active`,角色 `employee,finance` |
| PC 与移动模拟视觉 | 通过 | R105 公网视觉 4 passed;移动响应式矩阵 9 passed;截图汇总到 `output/playwright/r6-non-device-business-verification/` |
| 真机门禁 | 暂停 | iPhone 12 / iOS 14.1 / 企业微信 与 Redmi K60 企业微信真实触控、入口和布局体验仍需人工确认;自动视觉不替代真机验收 |
### R6 人员与角色
| 用户 | 角色 | 入口 | 设备 | 负责流程 | 结果 | 备注 |
| --- | --- | --- | --- | --- | --- | --- |
| `SMOKE002` | 员工 / 提交人 | PC / 企业微信 / 手机浏览器 | iPhone 12 / iOS 14.1 / Redmi K60 | 报销、请假、采购提交 | 通过 | 已自动辅助提交报销、请假和采购;报销、请假通过;PS6 热修后采购复跑通过。用户口径为 `smkoe02/smoke02`,按既有账号统一记录为 `SMOKE002` |
| `SMOKE101` | 经理 / 审批人 | PC / 企业微信 / 手机浏览器 | iPhone 12 / iOS 14.1 / Redmi K60 | 审批待办、退回或驳回 | 通过 | 已处理报销、请假和采购待办并通过;审批人可以是经理;不使用 admin 解释审批权 |
| `wangshunli` | 管理员 / 回滚联系人 / 试运行拍板人 / 问题登记负责人 | PC | 管理员 PC | 管理后台、配置核对、试运行决策、问题分级和回滚拍板 | 已辅助执行 | 已用于试运行前账号、基础资料和问题登记辅助;不作为本轮普通业务审批人;财务由 `wangzhiling` 承担 |
| `wangzhiling` | 财务 | PC / 手机浏览器 | Redmi K60 | 财务复核、付款标记、导出 | 通过 | 首次登录已完成改密,账号只读核验为 `active`、角色 `employee,finance`、未锁定;已完成报销财务复核和付款标记。采购首轮只验证提交、审批和历史查看,未扩财务后处理。姓名和手机号后续可由管理员按真实信息更新,不写入仓库 |
### R6 流程执行矩阵
| 流程 | 操作路径 | 期望结果 | 执行人 | 结果 | 证据位置 |
| --- | --- | --- | --- | --- | --- |
| 报销 | 员工提交报销 -> 上传 PDF 发票或附件 -> 提交审批 -> 审批人处理 -> 财务复核或付款标记 | 状态、审批历史、通知和财务动作一致 | `SMOKE002` / `SMOKE101` / `wangzhiling` | 通过 | 2026-05-12 自动辅助执行:`BX-20260512-0011`,id `fd89f7db-9b33-4364-b329-53f406ab38ee`,金额 `188.88`,终态 `paid`;经理任务 `41ef7694-6a0d-4229-ab4e-c85392fe3708`,财务任务 `dbc20c92-51ac-494f-9fe1-b9271bc91ac2`;不提交敏感截图 |
| 请假 | 员工提交请假 -> 审批人处理 -> 员工查看状态 | 待办、历史和团队状态一致 | `SMOKE002` / `SMOKE101` | 通过 | 2026-05-12 自动辅助执行:id `639acec8-bbfc-462c-bc3b-eaaa70e72153`,开始日期 `2026-07-28`,终态 `approved`;经理任务 `d9230348-2059-4dca-97f7-107621b0d40b` |
| 采购 | 员工提交采购 -> 审批人处理 -> 查看审批历史 | 采购状态和审批中心一致 | `SMOKE002` / `SMOKE101` | 通过 | 初次执行采购 id `ab69db11-87e3-48b0-8a8a-43324d1c70e5` 曾因 `budgetPrecheckGate is not defined` 阻断;PS6 热修部署后复跑通过:`CG-20260512-0001`,id `538c3c92-edce-4c28-bcdd-9bb8065c1d0e`,经理任务 `6d3cf41c-2a44-4bc3-9245-db6383fabdf0`,终态 `approved`,缺预算池按 legacy warn 返回 `missing_budget_pool`,无 500 |
| 企业微信通知 | 待办产生 -> 审批人收到个人应用消息 -> 点击回 OA | 消息可达且 deeplink 回移动审批或详情 | `SMOKE101` / `oa_smoke_02` | 通过 | 报销经理待办、报销通过、报销付款、请假通过等绑定用户通知记录为 `wecom_app_sent`;PS6 采购经理待办任务 `6d3cf41c-2a44-4bc3-9245-db6383fabdf0` delivery=`wecom_app_sent`、errcode=`0`;分配给财务角色时因 `wangzhiling` 尚未绑定企业微信,记录 `wecom_app_no_bound_recipients`,财务本轮以 PC 为主,不作为阻断 |
| 财务付款/导出 | 财务处理已通过单据 -> 标记付款或导出 | 权限、状态和审计记录正确 | `wangzhiling` | 通过 | `wangzhiling` 已完成登录改密和报销付款标记;采购未进入财务节点;不导出敏感数据到仓库 |
### R6 问题登记
| ID | 级别 | 角色 | 入口/设备 | 流程 | 复现步骤 | 当前处理 | 负责人 | 状态 | 关联 Issue |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| R6-ISSUE-001 | 阻断 | 审批人 / 员工 | iPhone 12 / iOS 14.1 / 企业微信 WebView | 移动底部导航、审批入口、首页快捷卡 | 旧记录误写为 iPhone 11;用户更正为 iPhone 12 / iOS 14.1。真机截图显示首页快捷卡和底部 Tab 的字体图标漂移、重影、挤压,底部“审批”体验不稳定;自动化 Chromium UA 截图与真实 iOS 企业微信 WebView 存在差异 | 已关闭:WCM6/MME6 已部署公网并完成自动复检,移动核心图标改 SVG,补企业微信 WebView viewport/字号/safe-area,底部角标独立定位,`/mobile/me` 图文槽位和卡片顶边完成自适应收口;用户确认“看过了,可以没问题”。后续若出现移动回归,另建新 Issue 处理。 | Codex | closed | `issues/2026-05-11_20-38-33-r6-wecom-mobile-rendering-hardening.csv`; `issues/2026-05-11_22-42-11-r6-mobile-me-adaptive-visual-polish.csv`; `issues/2026-05-11_23-26-00-r6-mobile-unified-design-rollout.csv` |
| R6-ISSUE-002 | 一般 | 自动化 / 员工与财务测试账号 | 本地隔离 E2E / PC | 报销审批进度、报销支付批次 | `BUSINESS_FLOW_GROUPS=reimbursement bash scripts/qa/run-business-flow-gates.sh local` 中 2 条用例曾失败,失败点为 Playwright 查找旧导航入口 `票据中心`;当前正式员工路径应从报销详情添加 PDF 发票 | 已关闭:测试已改为报销详情页“添加发票”路径,不恢复普通员工“票据中心”入口;支付批次用例同步按业务编号定位待办,并按金额选择财务或财务主管二级审批;报销业务流 gate 10 passed、1 skipped | Codex | closed | `issues/2026-05-11_15-50-00-r6-reimbursement-e2e-nav-alignment.csv` |
| R6-ISSUE-003 | 阻断 | 员工 / 审批人 | 公网 PC / 自动化 API | 采购提交 | R6-4 中员工创建采购草稿后提交,`POST /api/purchase-requests/:id/submit` 返回 500;服务端日志定位到 `server/src/routes/purchaseRequests.js:1617`:`ReferenceError: budgetPrecheckGate is not defined`;该问题导致采购无法进入审批,采购主链路无法完成 R6 | 已关闭:PS6 已修复采购提交事务中 `budgetPrecheckGate` 未定义问题,本地采购业务流通过,公网已部署 `a8b7351`;复跑 `CG-20260512-0001` 成功提交并由 `SMOKE101` 审批通过,企业微信个人应用消息 delivery=`wecom_app_sent`、errcode=`0` | Codex | closed | `issues/2026-05-12_01-12-20-r6-purchase-submit-budget-precheck-hotfix.csv` |
MME6 补充(2026-05-11):针对用户补充的 iPhone 12 / iOS 14.1 图文贴近与 iPhone 14 / iOS 16.2 卡片顶边观感,已把 `/mobile/me` 改为固定头像/图标槽 + `minmax(0, 1fr)` 文字槽,移动卡片顶边装饰线仅在 `/mobile` 作用域禁用,并将该规则写入产品设计规约。本地 `client typecheck`、`client build`、WCM6 视觉专项 8 passed、R5/R6/R124 移动相关回归 10 passed;部署后 `/ready` 正常、public bundle `findings=0`、live smoke readiness PASS、真实 OCR 样票返回重复发票可解释终态且测试通过,公网 WCM6 视觉专项 8 passed,报告 `artifacts/qa-flow/live-smoke-readiness-20260511-230918`。用户已确认当前设计可接受,`R6-ISSUE-001` 关闭;MUD6 继续把该设计推广到所有专用 `/mobile` 页面。
MUD6 收口(2026-05-11):已将 MME6 槽位自适应方案推广到专用 `/mobile` 路由:移动首页、审批、报销列表、报销详情、我的、个人设置、通知、票据上传、请假和资产扫码。通用移动样式固定图标/头像槽、`minmax(0, 1fr)` 文本槽、`clamp()` 间距、`mobile-card`、移动列表卡片、空状态和深层页吸底操作;业务角色差异继续按权限裁剪入口和动作,不拆多套 UI。本地 `client typecheck`、`client build`、MUD6 全移动页视觉专项 7 passed、WCM6/RS6/R124 回归 16 passed;已部署到 `https://oa.hyinda.com`,`/ready` 正常、public bundle `findings=0`、live smoke readiness PASS、真实 OCR 样票为重复发票可解释终态且通过,公网 MUD6 视觉专项 7 passed,报告 `artifacts/qa-flow/live-smoke-readiness-20260511-235918`。R6-3 可恢复执行试运行前检查,建议仍抽查 iPhone 12 / iOS 14、iPhone 14 / iOS 16.2、Redmi K60 的企业微信首页、审批、报销详情、我的和通知。
R6-3 试运行前自动检查(2026-05-12):公网 `/ready` 正常;public bundle 扫描 `scanned=54 focused=4 findings=0`;`check-live-smoke-env --strict` 通过,`liveSmokeReady=true`、`liveOcrReady=true`;`LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-live-smoke-readiness.sh` 通过,公网 live smoke `3 passed`,真实 OCR 样票返回“该发票已用于报销,不能重复添加”的可解释终态,报告 `artifacts/qa-flow/live-smoke-readiness-20260512-001722`。只读查询确认通知渠道 `R5-WECOM-APP-PERSONAL` 为 `enabled=true`、`mode=wecom_app_message`,旧 `R50-MOCK-007334` 为 `enabled=false`;远端容器 `hyb-oa-trialrun-db` healthy、`hyb-oa-trialrun-server` running,Prisma migration status 为 up to date;最近可追溯备份为 `hyb-oa-db-20260510_134340.dump` 与 `hyb-oa-storage-20260510_134341.tar.gz`。WZ6 已通过现有管理员 API 创建真实财务候选账号 `wangzhiling`,只读核验为 `active` 且角色 `employee,finance`,创建动作有 `SYSTEM_USER_CREATED` 审计;一次性密码仅写入仓库外 `~/.hyb-oa/wangzhiling-onetime.env`。因此 R6-3 已完成,R6-4 可在试运行窗口内按清单执行;主 R6 仍保持 `TODO`,直到真实流程执行、问题登记和每日收口完成。
级别定义:
- 阻断:权限泄漏、付款状态错乱、企业微信入口不可用、审批主流程无法继续、真实 OCR 大面积失败。
- 严重:主流程可绕行但影响试运行可信度,需当天判断修复、降级或暂停。
- 一般:不阻断流程,进入后续修复 Issue。
- 体验建议:文案、布局、效率和易用性建议,进入后续体验优化批次。
### R6 每日收口
| 日期 | 执行范围 | 新增问题 | 阻断数 | 严重数 | 结论 | 决策人 |
| --- | --- | --- | --- | --- | --- | --- |
| 2026-05-12 | R6-4 自动辅助小范围流程:报销、请假、采购、财务付款、企业微信通知审计 | `R6-ISSUE-003` 采购提交后端 500 | 1 | 0 | 暂停采购流程,先修复后继续;报销、请假、财务付款证据保留 | `wangshunli` |
| 2026-05-12 | PS6 热修部署后恢复 R6-4:采购提交、审批、历史查看、企业微信通知审计 | 无新增问题;`R6-ISSUE-003` 已关闭 | 0 | 0 | R6 首轮小范围试运行通过;进入后续 PC/移动/审批效率/财务台账优化 Issue | `wangshunli` |
### R6 结论(2026-05-12)
R6 首轮小范围试运行通过。已验证报销、请假、采购、审批、企业微信个人应用消息、移动入口既有门禁和财务付款主链路;采购提交阻断已通过 PS6 热修关闭。R6 通过不等于全面正式上线,下一批按独立 Issue 推进 PC 信息架构、移动二轮体验、审批催办/超时、审批效率摘要和财务台账增强。
AP6 收口(2026-05-12):审批效率 v1 已完成并部署。代码提交 `72e38db` 增加审批催办、超时提醒 job 和待办效率摘要,状态回填提交 `2d87c36` 记录部署验收;公网 `/ready` 正常,public bundle `findings=0`,live smoke readiness 通过,报告 `artifacts/qa-flow/live-smoke-readiness-20260512-104535`。AP6 v1 固定为:申请人/提交人可通过 `POST /api/workflow/tasks/:taskId/remind` 催办本人 pending 审批,24 小时同一任务最多 1 次;`GET /api/workflow/tasks/summary` 返回待办和超时聚合;`job:workflow-overdue-reminders` 只提醒 pending 待办,不改变审批状态。AP6 后已按计划进入 RI6。
RI6 收口(2026-05-12):报销票据体验完善已完成并部署。PC/移动报销详情统一复用发票状态文案和下一步提示,普通员工继续从报销详情添加 PDF 发票,不恢复“票据中心/发票池”主入口;移动可添加发票显示明确“可添加”状态,识别失败、重复、已归档或已报销进入可解释终态。本地 `client typecheck/build`、`check-ui-design-rules --strict`、R111/R125 专项 4 passed、R109 移动专项 1 passed、`BUSINESS_FLOW_GROUPS=reimbursement` 10 passed / 1 skipped;已部署到 `https://oa.hyinda.com`,公网 `/ready` 正常,public bundle `findings=0`,live smoke readiness 通过,报告 `artifacts/qa-flow/live-smoke-readiness-20260512-120138`。RI6 后已按计划进入 LP6 并完成收口;R7 尚未启动,需在 LP6/ME6 至少完成一轮后另建合同。
LP6 收口(2026-05-12):请假采购体验完善已完成并部署。请假 PC/移动记录增加状态下一步提示、当前审批节点、最近审批动作和退回/驳回意见;请假附件上传改为中文自定义控件。采购列表和详情优先展示业务编号或标题,不再把 UUID 作为主展示;缺预算池 warning 改为“未匹配预算池,已按当前试运行规则继续进入审批/请管理员补充预算配置”的用户可理解提示;采购详情补审批记录分区和附件用途/下载留痕说明。后端未新增 API、未改 Prisma schema,仅在既有请假/采购响应中补充 `pendingWorkflow` 与 `approvalHistory`。
LP6 本地验证:`leave-flow.spec.ts`、`leave-team-calendar.spec.ts`、`procurement-flow.spec.ts`、`workflow-quick-approve.spec.ts` 共 8 passed;`permission-direct-access.spec.ts -g "PA6 请假和采购自审"` 1 passed,确认请假/采购自审和 admin-only 业务审批仍由服务端拒绝;`BUSINESS_FLOW_GROUPS=leave,procurement bash scripts/qa/run-business-flow-gates.sh local` 在临时库通过,报告 `artifacts/qa-flow/business-flow-20260512-124643`;`server prisma:validate`、`node --check src/routes/leave.js`、`node --check src/routes/purchaseRequests.js`、`client typecheck/build`、`check-ui-design-rules --strict`、`git diff --check` 均通过。视觉证据输出到 `output/playwright/lp6-leave-procurement-polish/`,覆盖 PC 1440x960 请假/采购/审批与移动 390x844 请假/审批,均无横向溢出、无可见原生文件控件、无 `Choose File` 文案、无 console error。已部署到 `https://oa.hyinda.com`,公网 `/ready` 正常,public bundle `findings=0`,live smoke readiness 通过,报告 `artifacts/qa-flow/live-smoke-readiness-20260512-125740`;本地未提供完整 live smoke 凭据和真实 OCR 样票,脚本按规则跳过网页 live smoke 与真实 OCR,不影响 LP6 请假采购体验验收。下一批默认进入 ME6 移动二轮体验;R7 仍需在 LP6/ME6 至少完成一轮后另建合同。
ME6 自动化与部署收口(2026-05-12):移动二轮体验小修已完成。修复点限定在专用 `/mobile` 路由体验稳定性:移动首页对 AP6 审批效率摘要响应增加缺省容错,请假记录对旧数据缺少 `approvalHistory` 时不再渲染崩溃;历史移动视觉专项补齐 `/api/workflow/tasks/summary` mock,并将统一移动矩阵截图目录支持切换到 `output/playwright/r6-mobile-experience-second-pass/`。本地 `client typecheck`、`client build`、`check-ui-design-rules --strict` 通过;ME6 移动矩阵 7 passed,覆盖 320/360/375/390/393/414/430px、企业微信 iOS UA、企业微信 Android UA 和普通移动 UA;R5 真机反馈移动专项 2 passed,RS6 移动响应式专项 7 passed,WCM6 企业微信多手机专项 8 passed,R124 移动入口矩阵 1 passed。已部署到 `https://oa.hyinda.com`,公网 `/ready` 正常,public bundle `findings=0`,live smoke readiness PASS,报告 `artifacts/qa-flow/live-smoke-readiness-20260512-135035`;缺少完整 live smoke 凭据和真实 OCR 样票时,脚本按规则跳过网页 live smoke 与真实 OCR。公网 ME6 移动视觉矩阵 7 passed,截图输出到 `output/playwright/r6-mobile-experience-second-pass-live/`。ME6-3 真机抽查仍待用户确认:iPhone 12 iOS14 企业微信、iPhone 14 iOS16.2 企业微信、Redmi K60 企业微信的首页、审批、报销详情、我的、通知和请假;敏感截图不提交仓库。ND9 之后允许先做 QG6 非业务治理和 R7 草案材料,但不能把这些工作当成真机替代,也不能直接启动真实 R7。
ND9 非真机延续(2026-05-12):用户反馈当前不方便做代表性企业微信真机抽查,因此 `ME6-3` 继续保持 `TODO`,不得伪造完成或用自动化替代。后续可先执行 QG6 QA 治理、R7 草案、运维交接和培训材料等不依赖真机的工作;这些工作不得改变业务规则、审批链、PDF-only、企业微信通知通道或财务规则。R7 真实扩大试运行仍需用户确认最终人员、窗口,并补足 ME6 真机门禁或明确接受该风险。
QG6 QA 治理收口(2026-05-12):非真机阶段 QA 治理升级已完成并部署。`check-ui-design-rules.mjs` 已增强 UUID 主展示、内部术语、英文上传、移动桌面表格和 PC 壳扫描,新增 `--self-test` 和白名单说明;PC 审批详情不再展示任务 UUID 或 workflow instance UUID。新增 `scripts/qa/run-visual-matrix.sh` 固定视觉矩阵,项目级视觉报告支持 issue-id、baseURL、commit 和状态字段;`run-business-flow-gates.sh` 与 `run-live-smoke-readiness.sh` 输出统一 `summary.json`。本地 `client typecheck/build`、`server prisma:validate`、`check-ui-design-rules --self-test/--strict` 通过;QG6 本地视觉矩阵 8 passed,报告 `artifacts/qa-flow/qg6-qa-governance-upgrade-visual-matrix-20260512-172418`,业务流 `reimbursement,leave,procurement` 全部通过,报告 `artifacts/qa-flow/business-flow-20260512-172944`。已部署到 `https://oa.hyinda.com`,公网 `/ready` 正常,public bundle `findings=0`,live smoke readiness PASS,报告 `artifacts/qa-flow/live-smoke-readiness-20260512-174055`;公网移动视觉矩阵 7 passed,报告 `artifacts/qa-flow/qg6-qa-governance-upgrade-visual-matrix-20260512-174055`。`ME6-3` 代表性企业微信真机抽查仍为 TODO,QG6 不替代真机验收;下一步只允许 R7 草案、OPS7/DOC7 材料等非真机准备,真实 R7 仍需用户确认人员、窗口和风险接受。
R7/OPS7/DOC7 非真机准备(2026-05-12):已创建 `issues/2026-05-12_17-49-03-r7-expanded-trialrun-prep-ops-doc-materials.csv`。R7 草案见 `docs/trialrun/r7-expanded-trialrun-prep.md`,只固定范围、角色占位、门禁、问题分级、每日收口和退出标准;`R7E-1..R7E-3` 继续保持 `TODO`,真实 R7 未启动。OPS7 运维交接 Runbook 见 `docs/trialrun/ops7-runbook.md`,只记录部署、回滚、备份恢复、账号交接、live readiness 和企业微信通知检查清单,不执行生产配置变更或数据库恢复。DOC7 用户手册与 FAQ 见 `docs/trialrun/r7-user-guide-and-faq.md`,只描述当前已实现的报销、请假、采购、审批、企业微信入口和财务台账能力,不承诺预算、ERP、AI、完整差旅、复杂 BPM 或审批设计器。`ME6-3` 真机门禁仍未关闭;R7 真实启动仍需用户确认最终人员、窗口,并补足真机门禁或明确接受风险。
DG7/MRF7 移动信息架构与展示去重治理收口(2026-05-12):已根据 iPhone 12、iPhone 14 和 Redmi K60 企业微信真机反馈建立首页/审批/通知/业务卡片去重规约,并完成移动端实现与部署。员工底部“审批”入口改为“进度”视角,展示我发起的报销、请假、采购进度且不显示审批动作;审批人仍使用“审批”视角。首页只保留一处待处理摘要,首页通知不再重复完整待办;底部审批角标移到图标右上外侧,不覆盖图标或文字。审批详情改为 `/mobile/approvals/:taskId` Push 页并隐藏底部 Tab;通知中心卡片整体可点,先标记已读再直达报销、请假、采购或审批移动详情;采购和请假通知不再回首页或新建表单。PC/移动卡片展示引入共享业务主标识工具,同一卡片不重复业务编号或状态;`check-ui-design-rules.mjs` 已增加重复业务编号扫描规则。验证结果:`client typecheck/build`、`check-ui-design-rules --self-test/--strict`、DG7 专项 3 passed、WCM6 11 passed、R124/R6 响应式/MUD6 15 passed。已执行 `bash deploy/trialrun/deploy.sh`,公网 `/ready` 正常,public bundle `findings=0`,live smoke readiness PASS,报告 `artifacts/qa-flow/live-smoke-readiness-20260512-205559`;公网移动视觉矩阵 7 passed,报告 `artifacts/qa-flow/dg7-mobile-information-dedupe-governance-visual-matrix-20260512-205634`。因当前无法做完整三机复测,`ME6-3` 继续保持 TODO,不用本轮自动化替代真机门禁。
MIA7 移动信息架构、视觉与流程审查(2026-05-12):用户完成一轮 iPhone12/iPhone14/Redmi 企业微信真机抽查后,确认上一轮硬问题基本关闭,但发现首页、常用入口、待处理摘要、进度、通知、详情返回和角色首页仍存在信息架构层面的重复与不一致。已基于 `9da0ca9`、现有移动截图、页面源码和公开同类产品原则创建 `issues/2026-05-12_21-48-39-mobile-ia-visual-flow-review.csv`,并输出审查报告 `docs/trialrun/mobile-ia-visual-flow-review.md`。本轮只做标准和问题登记:已把 MIA7 移动工作台、进度、通知、详情壳和返回语义写入 `docs/product-design-rules.md`,并新建后续整改合同 `issues/2026-05-12_21-48-40-mobile-ia-flow-remediation.csv`。MIA7 结论不代表问题已修复;MIF7 仍为 TODO,`ME6-3` 真机门禁仍保持待确认。
## 结论
R70 初次试运行暂停项已在 2026-04-28 的 R71 定向修复后关闭。基于本地环境复测,经理团队日历与员工报销缺票提示/发票上传绑定提交链路均已通过,可恢复下一轮本地人工试运行。
## 执行环境
- 环境 URL:`http://192.168.123.7:3000`
- 分支/提交:`2bce9c9 + local R71 working tree`
- 浏览器:`Firefox (Playwright CLI)`
- 执行人:`Codex Playwright 辅助复核`
- 执行时间:`2026-04-28 17:22 - 19:11 CST`
- 数据库:`hyb_oa_manual_trialrun_20260428172231`
## 角色结果
员工路径:
- 执行人:`Codex Playwright 辅助复核`
- 结论:Portal、请假、周报、待办、搜索、公告、移动入口主路径可达;R71 后报销缺票提示清晰,上传/绑定发票后可提交进入审批中。
- 阻断问题:无。
- 备注:员工请假提交成功,经理已审批通过;周报转待办并完成闭环通过;报销复测使用单据 `4931211b-34b4-43b8-9e9f-917569d47c33` 和发票 `北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf`,提交后单号为 `BX-20260428-0001`。
经理路径:
- 执行人:`Codex Playwright 辅助复核`
- 结论:Portal 管理视角、待我处理快捷审批、团队状态、项目入口与请假团队日历均可用。
- 阻断问题:无。
- 备注:经理已对员工请假单完成一次“通过”审批,审批后待办列表刷新正常;R71 复测中团队日历成功显示 `2026-04-27 ~ 2026-05-03` 窗口及员工 `2026-04-29` 年假记录。
管理员路径:
- 执行人:`Codex Playwright 辅助复核`
- 结论:主要管理入口可见且页面可达,未发现阻断问题。
- 阻断问题:无。
- 备注:人员管理、组织架构、系统设置、功能开关、审计日志均可打开并加载;审计日志可看到最近登录留痕。
## 问题汇总
- 当前开放问题:P0/P1/P2/P3 均为 0。
- 已闭环问题:`R70-001`、`R70-002` 已通过 R71 定向修复与人工复测关闭。
详细问题见 `artifacts/r70/issue-log.csv`。
## R71 处理结果
- P1 修复:server manager 角色已补齐 `leave.view_all`,reviewer 复核确认未扩成 `leave.manage`,经理团队日历路径复测通过。
- P2 修复:前端已在提交前提示“需先绑定至少 1 张发票”,并为 `bound_invoice_required` 增加可理解中文文案。
- 联动修复:人工复核中补修 `/api/invoice-pool/upload` 的 multipart 文件流挂起问题,上传 -> 绑定 -> 提交报销链路已通过。
- 技术遗留:client build 仍有 chunk 循环与大 chunk 警告,建议独立进入 R72 技术优化项,不阻断本地人工试运行。
## 风险
- 人工试运行依赖参与者真实操作,自动化通过不等于业务体验通过。
- 当前结论基于本地临时库、HTTP 本地地址和 Firefox 浏览器复核,不代表企业微信接入、HTTPS 和多用户并发场景都已验证。
- 若发现 workflow、权限、状态机、审批规则、迁移相关问题,必须单独 review 后再修复。
## R73 本地辅助复核补充
- 真实腾讯 OCR:已通过 `client/tests/e2e/manual/live-invoice-ocr.spec.ts` 本地辅助复核,测试票据为 `/home/shunli/Projects/hyb-oa/artifacts/北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf`。
- 运行方式:server 进程在本地 `3001` 端口以运行时注入方式加载旧项目本地腾讯配置;密钥未写入本仓库 `server/.env`。
- 自动巡检:`client/tests/e2e/manual/r70-trialrun-assist.spec.ts` 在补齐本地运行时开关后,员工 / 经理 / 管理员 10 个辅助步骤全部通过。
- 环境结论:本地试运行如果出现 Portal、周报、公告、团队、人员管理等入口缺失,先检查 server 运行时 `*_ENABLED` 开关是否齐全;本次已确认数据库开关与工作区配置本身无异常。
## R74 自动化压榨补充
- 本地门禁:`server/src/scripts/smoke-trialrun-runtime.js` 已支持 `TRIALRUN_RUNTIME_MODE=local`,并在本地 HTTP 口径下校验 env、feature flag、workspace setting 与导航基线,通过。
- 深层真实业务辅助回归:`client/tests/e2e/manual/r70-trialrun-deep-assist.spec.ts` 已通过,覆盖:
- 周报保存 -> 生成待办 -> 提交 -> 完成待办
- 公告发布 -> 员工可见 -> 团队状态更新 -> Portal 汇总可见
- 真实全局搜索命中公告并跳转
- 批量真实腾讯 OCR 辅助回归:`client/tests/e2e/manual/live-invoice-ocr-batch.spec.ts` 已落地并在干净本地 trialrun DB `hyb_oa_manual_trialrun_20260429093000` 上完成真实 PDF 发票成功识别,结果已回填到 `artifacts/r70/live-ocr-batch-report.md`。
- 当前 OCR 环境结论:旧项目 `/home/shunli/shenzhou-business-suite/.env` 中一组腾讯凭证已在当前应用链路验证可用;R77 已补齐 PDF 模式下的 `IsPdf=true` / `PdfPageNumber=1` 调用与返回字段归一化,OCR 识别主链路已闭环,不再存在先前的鉴权/解码失败阻塞。
## R77 OCR 收口补充
- 复测时间:`2026-04-29 09:51 - 09:54 CST`
- 自动化环境:`http://127.0.0.1:3001`
- 自动化数据库:`hyb_oa_manual_trialrun_20260429093000`
- 腾讯配置来源:旧项目 `/home/shunli/shenzhou-business-suite/.env`,仅运行时注入,未写回本仓库。
- 复测命令:
- `cd client && PLAYWRIGHT_MANUAL=1 PLAYWRIGHT_OCR_LIVE=1 PLAYWRIGHT_OCR_LIVE_FILE=/home/shunli/Projects/hyb-oa/artifacts/北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf E2E_BASE_URL=http://127.0.0.1:3001 npx playwright test tests/e2e/manual/live-invoice-ocr.spec.ts --workers=1 --reporter=list`
- `cd client && PLAYWRIGHT_MANUAL=1 PLAYWRIGHT_OCR_LIVE=1 PLAYWRIGHT_OCR_LIVE_BATCH=1 PLAYWRIGHT_OCR_LIVE_FILE=/home/shunli/Projects/hyb-oa/artifacts/北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf E2E_BASE_URL=http://127.0.0.1:3001 npx playwright test tests/e2e/manual/live-invoice-ocr-batch.spec.ts --workers=1 --reporter=list`
- 结果:
- 单张 live OCR:`1 passed (26.2s)`。
- batch live OCR:`1 passed (14.1s)`,runner 正常退出。
- 最新 batch 票据结果:`fb29cdd8-0c10-4254-8feb-d3c3c1be86c3`,销售方 `北京悦海堂餐饮管理有限公司`,总金额 `1683.00`,状态 `available`。
- 试运行结论:
- 员工侧报销 / 票据中心 / OCR 主链路 `上传 -> OCR -> available -> 绑定 -> 提交报销` 已具备本地试运行条件。
- 本轮仍未覆盖真实企微 OAuth、HTTPS cookie secure、多角色并发协同、真实 ERP 外发回执,以及高风险二次复核;这些项继续保留在外部或后续 focused regression。
## R78 财务支付尾链 focused regression
- 回归时间:`2026-04-29 10:37 - 10:52 CST`
- 自动化环境:`http://127.0.0.1:3002`
- 自动化数据库:`hyb_oa_manual_trialrun_20260429093000`
- 本地 focused 开关:
- 运行时 env:`PAYMENT_BATCH_ENABLED=true`、`ERP_SYNC_ENABLED=true`
- DB feature flag:通过 `TRIALRUN_EXTRA_FORCE_ON_FLAGS='payment_batch_v1 erp_sync'` 重复执行 `seed:trialrun` 显式打开,仅用于本地 focused 财务回归,不改变默认 trialrun 上线建议。
- 回归命令:
- `cd server && ./scripts/regression-payment-batches.sh`
- `cd client && E2E_BASE_URL=http://127.0.0.1:3002 npx playwright test tests/e2e/reimbursement-payment-batch-flow.spec.ts --workers=1 --reporter=list`
- 结果:
- server focused regression:`3 passed`
- Playwright focused E2E:`1 passed (58.0s)`
- 已验证链路:
- employee:创建空白报销 -> 上传 mock 票据 -> 绑定 -> 提交
- manager / finance:完成两级审批
- finance:创建 reimbursement payment batch,并在复核后执行
- finance_mgr:在 AP 工作台完成快捷复核
- execute 后:`payment batch = executed`、`reimbursement = paid`、`invoice = archived`
- ERP preview:可见最新 `pending` outbox
- reviewer 结论:
- `paymentBatches` 复核路由仍拦截 maker 自审;低风险批次维持 `finance_mgr` 复核、`finance` 执行的边界。
- 失败路径单测确认不会错误归档已绑定发票,也不会误入 ERP / 通知 follow-up。
- `PaymentBatchesPage` 与 `ApOperationsPage` 没有新增越权入口,按钮仍按 `payment.batch.manage` 与 `risk.review.manage` 分离。
## R79 公网部署只读巡检
- 巡检时间:`2026-05-04 13:04 - 13:16 CST`
- 公网地址:`https://oa.hyinda.com`
- 服务器:`118.89.77.218`
- SSH 结论:`deploy` / `root` 可免密登录;`shunli` 当前不可免密登录。
- 反向代理:`caddy` active,`/etc/caddy/Caddyfile` 已包含 `oa.hyinda.com -> reverse_proxy 127.0.0.1:3000`。
- 部署目录:`/opt/hyb-oa-trialrun`
- 部署形态:远端目录不是 git 工作树;当前推荐从本地执行 `deploy/trialrun/deploy.sh`,通过 `rsync` 同步。
- 容器编排:服务器当前使用 `docker-compose 1.29.2`,不是 `docker compose`。
- 公网探活:
- `https://oa.hyinda.com/ready`:`HTTP/2 200`
- `https://oa.hyinda.com`:`HTTP/2 200`
- 当前公网 `.env`:
- `APP_ORIGIN=https://oa.hyinda.com`
- `COOKIE_SECURE=true`
- `PUBLIC_SECURITY_HARDENING_ENABLED=true`
- `WECOM_ENABLED=false`
- `WECOM_ENTRY_ENABLED=false`
- `WECOM_OAUTH_ENABLED=false`
- `OCR_PROVIDER=mock`
- 当前公网数据库只读核查:
- `workspace_settings.profile = small_team_internal`
- `portal_home_v1 = force_on`
- `announcements_v1 = force_off`
- `global_search_v1 = force_off`
- `wecom_entry_v1 = force_off`
- 远端 smoke 结果:
- `smoke-external-deps.js`:通过,但其通过前提是“企微入口未启用 + OCR 使用 mock provider”。
- `smoke-trialrun-runtime.js`:失败,当前阻塞点为 `announcements_v1 => enabled=false reason=flag_force_off envEnabled=true`。
- 结论:
- 公网 HTTPS 与容器服务本身已通。
- 当前还不能把公网部署态视为“外部试运行闭环完成”。
- 下一步最小阻塞清单是:独立 smoke 账号、企微后台配置、以及公网 feature flag 基线修正后重跑 live smoke。
## R80 企微公网启用与只读验收
- 执行时间:`2026-05-04 16:47 - 17:03 CST`
- 服务器动作:
- 已把企微校验文件挂到 `https://oa.hyinda.com/WW_verify_StBYfdlboMaIoRRE.txt`
- 已在远端 `/opt/hyb-oa-trialrun/deploy/trialrun/.env` 启用:
- `WECOM_ENABLED=true`
- `WECOM_ENTRY_ENABLED=true`
- `WECOM_OAUTH_ENABLED=true`
- `WECOM_CORP_ID` / `WECOM_AGENT_ID` / `WECOM_AGENT_SECRET`
- `WECOM_REDIRECT_URI=https://oa.hyinda.com/api/auth/wecom/callback`
- `WECOM_ALLOWED_RETURN_HOSTS=oa.hyinda.com`
- 已把数据库 `wecom_entry_v1` 从 `force_off` 调整为 `inherit`
- 已使用 `docker-compose -f deploy/trialrun/docker-compose.yml --env-file deploy/trialrun/.env up -d --no-deps --force-recreate server` 重建公网 server 容器
- curl 验证结果:
- `GET /api/auth/wecom/config`:`status=ready`、`entryEnabled=true`、`oauthEnabled=true`
- `GET /api/auth/wecom/login?returnTo=%2Fportal`:`HTTP 302`
- `Location` 已包含:
- `appid=ww6b98ab55e5e8d341`
- `agentid=1000002`
- `redirect_uri=https://oa.hyinda.com/api/auth/wecom/callback`
- Playwright 只读验证:
- 登录页已展示“使用企业微信进入工作台”
- 浏览器实际请求 `/api/auth/wecom/config` 返回 `200`
- 点击按钮后,页面跳转到 `open.weixin.qq.com/...#wechat_redirect`
- 桌面浏览器页面提示“请在企业微信客户端打开链接”,符合企微 OAuth 预期
- 截图产物:`output/playwright/2026-05-04-wecom-login-page.png`
- 当前剩余人工动作:
- 必须由你本人使用真实企业微信客户端完成首次进入
- 若首次回到 `/login?wecom=unbound`,需先用 OA 账号密码登录并在“个人设置”完成绑定
- 绑定成功后,再次从企业微信工作台进入 OA,才算真实企微登录闭环完成
- 当前结论:
- 服务器侧企微入口、OAuth 跳转、域名校验文件、HTTPS 回调地址均已就绪
- 自动化已压到浏览器跳转层;剩余未完成项只剩“真实企微客户端首次绑定闭环”
## R81 企微回调身份诊断部署
- 时间:`2026-05-04 17:50 - 17:56 CST`
- 背景:
- 真实手机企业微信进入 OA 时,服务端收到 `/api/auth/wecom/callback` 回调
- 当前失败表现为:`AUTH_003 / missing_user_id`
- 你已确认当前企微账号是企业内部成员
- 本轮动作:
- 为 `missing_user_id` 分支补充最小安全诊断日志
- 补 1 条单测覆盖“仅有 OpenId、没有 UserId”场景
- 本地校验通过后,已重建公网 `server` 容器
- 本地验证结果:
- `cd server && node --check src/routes/wecomAuth.js`:通过
- `cd server && npm test -- tests/unit/routes/wecomAuth.test.js`:`7 passed`
- `cd server && npm run prisma:validate`:通过
- 远端验证结果:
- `https://oa.hyinda.com/ready`:正常
- `https://oa.hyinda.com/api/auth/wecom/config`:`status=ready`
- `https://oa.hyinda.com/api/auth/wecom/login?returnTo=%2Fportal`:`302` 到企业微信 OAuth
- 当前状态:
- 服务器已具备取证能力
- 待你用手机企业微信再复现 1 次,我再根据日志判断下一步应是“错误提示优化”还是“绑定模型调整”
## R83-R86 用户开通与首次绑定收口
- 时间:`2026-05-04 23:36 - 23:58 CST`
- 本轮本地实现:
- 单个新建用户改为系统自动生成员工号,不再要求管理员手工输入工号。
- 单个新建用户改为后端生成一次性口令,并在成功态只展示一次。
- 新用户首次登录后继续沿用强制改密闭环。
- 企业微信未绑定回退登录时,服务端已保留短时待绑定上下文,并在账号密码登录成功后自动补绑定。
- 本轮新增自动化结果:
- `cd server && npm test -- tests/unit/routes/auth.login.test.js tests/unit/routes/wecomAuth.test.js tests/unit/routes/users.write.test.js`
- `11 passed`
- `cd client && E2E_BASE_URL=http://127.0.0.1:3100 npx playwright test tests/e2e/user-onboarding.spec.ts tests/e2e/wecom-first-bind.spec.ts --workers=1 --reporter=list`
- `3 passed`
- 自动化已验证链路:
- 管理员创建用户 -> 系统返回员工号与一次性口令
- 新用户首次登录 -> 强制修改密码 -> 进入 Portal
- 企业微信未绑定 -> 回退密码登录 -> 继续进入目标页
- 仍需真实人工复核:
- 将本轮代码部署到目标环境后,用真实手机企业微信完成 1 次首次进入,确认真实 OAuth 回调、cookie 与企业身份环境下也能自动完成首次绑定闭环。
## R89 登录与移动端 UX 收口
- 时间:`2026-05-05`
- 本地自动化环境:`http://127.0.0.1:5173`
- 本轮实现结果:
- `/mobile` 路由在手机端隐藏桌面 Topbar,使用底部四入口:`首页 / 审批 / 票据 / 我的`。
- 普通小屏非 `/mobile` 页面保留顶部菜单抽屉作为兜底,并修复抽屉定位导致的点不开问题。
- 移动首页调整为“今天”优先,首屏展示审批待办、未读通知和高频动作。
- “我的”页承接低频入口、个人设置、完整员工档案、管理入口和退出登录。
- 移动审批和票据上传的主按钮改为更适合手机的触控目标。
- 自动化结果:
- `cd client && E2E_BASE_URL=http://127.0.0.1:5173 npx playwright test tests/e2e/r89-mobile-login-navigation.spec.ts --workers=1 --reporter=list`
- `3 passed`
- `cd client && npm run typecheck`
- 通过
- `cd client && npm run build`
- 通过;仍保留既有 Vite circular chunk 警告。
- 当前结论:
- 本地自动化已覆盖登录极简、企微移动入口、移动底部导航、移动审批、票据上传、“我的/更多”和小屏菜单抽屉。
- 真实公网手机企微仍需人工打开一次,确认企业微信真实容器内的 OAuth、cookie 与默认 `/mobile` 落点。
## R90/R91 事实源与公网入口收口启动
- 时间:`2026-05-05 20:01 CST`
- 本轮执行合同:
- `issues/2026-05-05_20-01-18-r90-r91-trialrun-closeout.csv`
- 已确认的公网只读状态:
- `GET https://oa.hyinda.com/ready`:通过
- `GET https://oa.hyinda.com/api/auth/wecom/config`:`status=ready`、`entryEnabled=true`、`oauthEnabled=true`
- `GET https://oa.hyinda.com/api/auth/wecom/login?returnTo=%2Fmobile`:`HTTP 302` 到企业微信 OAuth,state 中 `returnTo=/mobile`
- 远端 `root` 与 `deploy` 均可 SSH 到 `/opt/hyb-oa-trialrun`;`hyb-oa-trialrun-server` 与 `hyb-oa-trialrun-db` 正常运行
- 本轮调整方向:
- 文档与检查清单统一改为企业微信手机入口默认 `/mobile`
- 服务端企微默认 `defaultReturnTo` 也改为 `/mobile`,避免后台配置或直链未带 `returnTo` 时回到桌面 Portal
- 桌面浏览器和账号密码登录仍由前端运行时显式进入 `/portal`
- 当前仍需收口:
- 部署 R89/R90 最新代码到公网后,再用真实手机企业微信打开一次应用,确认已绑定账号直接进入 `/mobile`
- 用既有测试账号或 smoke 账号跑公网 live smoke,不使用真实业务账号
## R91 公网部署、live smoke 与备份恢复
- 时间:`2026-05-05 20:13 - 20:24 CST`
- 本轮部署:
- 已执行 `bash deploy/trialrun/deploy.sh`
- 远端已重建 `hyb-oa-trialrun-server`
- 前端 build 通过;仍保留既有 Vite circular chunk 警告
- `smoke-external-deps.js`:通过,当前 OCR 仍为 `mock provider`
- 企微移动入口复核:
- `GET https://oa.hyinda.com/api/auth/wecom/config`:`loginUrl=/api/auth/wecom/login?returnTo=%2Fmobile`、`defaultReturnTo=/mobile`
- `GET https://oa.hyinda.com/api/auth/wecom/login`:`HTTP 302` 到企业微信 OAuth,state 中 `returnTo=/mobile`
- Playwright 使用 iPhone + 企业微信 UA 打开公网 `/login`:主 CTA 可见,点击后请求 `/api/auth/wecom/login?returnTo=%2Fmobile` 并跳转 `open.weixin.qq.com`
- 截图:`output/playwright/r91-public-mobile-wecom-login.png`
- Runtime smoke:
- 首次手动补跑发现 `global_search_v1` 仍为 `force_off`
- 已备份远端 feature flag 状态:`/opt/hyb-oa-trialrun/deploy/trialrun/backups/feature-flags-r91-before-20260505-2018.csv`
- 已将 trialrun 必需的 11 个 `force_off` flag 改为 `inherit`
- 再次执行 `docker-compose ... exec -T server node src/scripts/smoke-trialrun-runtime.js`:通过
- Live smoke:
- 已确认远端存在 `SMOKE001` / `SMOKE002` 独立账号
- 已在本次会话内重置 smoke 账号随机密码用于自动化;密码未写入 git、不打印
- `LIVE_EXPECT_WECOM_STATUS=ready bash scripts/qa/run-web-gates.sh smoke-live`:`3 passed`
- 备份与恢复演练:
- DB 备份:`/opt/hyb-oa-trialrun/deploy/trialrun/backups/hyb-oa-db-20260505_202239.dump`
- Storage 备份:`/opt/hyb-oa-trialrun/deploy/trialrun/backups/hyb-oa-storage-20260505_202241.tar.gz`
- DB 恢复演练:已恢复到临时库 `hyb_oa_restore_check`,确认 `public` schema 下 96 张表,随后删除临时库
- Storage 恢复演练:已恢复到 `/tmp/hyb-oa-storage-restore-check-20260505_202241`,确认可解包,随后清理临时目录
- 演练后 `GET https://oa.hyinda.com/ready`:通过
- 当前仍需人工完成:
- 用真实手机企业微信从工作台打开 OA 应用一次,确认已绑定账号直接进入 `/mobile`
@@ -1,12 +0,0 @@
Domain,Tier,Primary_Roles,PC_Routes,Mobile_WeCom_Routes,Server_Routes,Main_Flow,Exception_Flow,Permission_Flow,Current_Coverage,Known_Gaps,Best_Practice_Delta,Next_Action
"__DOC_STATUS__","meta","N/A","N/A","N/A","N/A","本 CSV 是历史证据 / QA 参考,不代表 2026-05-12 当前状态。R6/PC6/PA6/FL6/AP6/RI6/LP6/ME6/QG6/DG7/MIA7 后的当前流程以最新 Issue CSV、文档索引和手工试运行报告为准。","历史缺口按当时日期理解,不自动生成当前需求。","当前权限和状态以服务端实现与最新 PA6/后续 Issue 为准。","historical_reference","可能包含已过期的公网仍需、待执行或真机缺口描述。","用于追溯流程覆盖,不替代当前 PRD 或门禁。","先读最新 Issue CSV 再决定下一步。"
"认证与企业微信入口","P0","employee|manager|admin","/login|/portal|/settings/profile","/mobile|/mobile/me|/mobile/profile","server/src/routes/auth.js|server/src/routes/wecomAuth.js|server/src/routes/me.js","账号登录或企微 OAuth 进入工作台,按设备落到 PC Portal 或移动工作台。","未绑定、会话过期、OAuth 回跳失败、密码错误、首次登录改密。","普通员工仅看个人入口;管理员看系统入口;企业微信回跳只允许安全 returnTo。","login-portal-ux.spec.ts|wecom-entry.spec.ts|wecom-first-bind.spec.ts|r89-mobile-login-navigation.spec.ts|live-smoke.spec.ts","真实企业微信 OAuth 和真机回跳仍需 live smoke;HTTPS cookie 行为缺最终证据。","国内企业微信应用最佳实践要求工作台直达 H5 移动体验,不能露出 PC 壳。","B3/B5:视觉巡检防 PC 壳;live readiness 检查真实账号。"
"报销与票据 OCR","P0","employee|manager|finance|finance_mgr|admin","/reimbursements|/reimbursements/:id|/invoice-pool|/payment-batches|/ap-operations","/mobile/reimbursements|/mobile/reimbursements/:id|/mobile/capture","server/src/routes/reimbursements.js|server/src/routes/invoicePool.js|server/src/routes/paymentBatches.js|server/src/routes/apOperations.js","员工建草稿、加明细、上传发票、OCR 识别、添加到报销、提交审批、财务付款归档。","OCR 超时/失败、重复发票、已绑定/已报销、删除后重传、缺金额无法自动明细、付款失败。","员工只看自己的报销和业务文案;经理审批;财务复核付款;管理员配置。","reimbursement-workflow-progress.spec.ts|invoice-ocr-flow.spec.ts|reimbursement-payment-batch-flow.spec.ts|r111-invoice-reimbursement-guard.spec.ts|r125-invoice-reupload-after-delete.spec.ts|regression-dedup.sh","真实腾讯 OCR 耗时和公网文件上传链路需要样本;移动 PDF 选择需真机证据。","合思/分贝通/每刻均强调票据识别、验真、查重、电子档案和状态可追溯。","B3/B5/B7:视觉和文案门禁、真实 OCR readiness、发布门禁。"
"审批中心","P0","manager|finance|finance_mgr|admin","/workflow/tasks|/workflow/tasks/:taskId","/mobile/approvals","server/src/routes/workflow.js|server/src/routes/workflowDefinitions.js","审批人查看待办,审批/驳回/退回/转交,申请人查看进度。","任务已处理、权限不足、并发审批、离线审批重放冲突。","只有当前审批人可处理;管理员可治理流程定义;普通员工只看相关单据进度。","workflow-quick-approve.spec.ts|mobile-approvals-offline.spec.ts|r111-invoice-reimbursement-guard.spec.ts","代理审批、多人并发、真实企业微信 deep link 证据不足。","同类系统强调审批全程留痕、风险提示和移动处理效率。","B4/B5:业务流门禁聚合;live smoke 覆盖移动 deep link。"
"请假与考勤","P1","employee|manager|admin","/leave-requests|/attendance|/team","/mobile/leave","server/src/routes/leave.js|server/src/routes/leave-types.js|server/src/routes/attendance.js|server/src/routes/presence.js","员工提交请假、经理审批、团队日历/考勤状态更新。","余额不足、附件缺失、节假日/跨日、撤回、补卡。","员工看本人;经理看团队;管理员配置假期和考勤规则。","leave-flow.spec.ts|leave-team-calendar.spec.ts|announcements-presence.spec.ts|r75-automation-gap-fill.spec.ts","复杂排班、跨日班次和真实移动附件未专项重验。","国内 OA 常规要求移动提交、审批联动团队视图。","B4:纳入业务流门禁;B3:移动视觉巡检。"
"周报、待办、公告与通知","P1","employee|manager|admin","/weekly-reports|/todos|/announcements|/notifications","/mobile/notifications","server/src/routes/weeklyReports.js|server/src/routes/todos.js|server/src/routes/announcements.js|server/src/routes/notifications.js","员工写周报、生成待办、公告触达、通知已读。","未提交提醒、通知跳转失效、公告权限错误。","管理员发布公告;员工只看可见公告;经理看团队周报汇总。","weekly-todo-flow.spec.ts|announcements-presence.spec.ts|global-search.spec.ts|r75-automation-gap-fill.spec.ts","外发渠道、催办策略和真实消息投递缺专项证据。","同类系统强调制度与知识库同步、通知可追踪。","B4:纳入业务流门禁;后续可补渠道 live smoke。"
"人员、组织、HR 与绩效","P1","employee|manager|hr|admin","/people|/people/:employeeId|/people/stats|/organization|/payroll|/performance","/mobile/me|/mobile/profile","server/src/routes/employees.js|server/src/routes/departments.js|server/src/routes/payroll.js|server/src/routes/performance.js","管理员维护人员组织,员工完善档案,经理/HR 查看统计与绩效。","入职/转正/离职、隐私字段缺失、导出、权限越界。","员工看本人;经理看团队;HR/管理员看管理页面。","user-onboarding.spec.ts|r75-automation-gap-fill.spec.ts","离职资产交接、绩效真实评分、敏感字段脱敏证据不足。","国内 OA/HR 常规要求组织数据作为审批和权限事实源。","B2/B4:覆盖扫描标出缺口,业务门禁先跑现有用例。"
"项目、合同与涉密边界","P1","manager|project_role|admin","/projects|/projects/:projectId|/contracts-registry","/mobile","server/src/routes/projects.js|server/src/routes/contractsRegistry.js|server/src/routes/confidentialDocRefs.js","项目创建、成员协作、沟通记录、合同台账、涉密引用边界。","项目权限不足、涉密文档不可见、合同缺关联。","项目成员和管理员分级可见;涉密内容最小暴露。","project-workbench.spec.ts|confidential-boundary.spec.ts","真实项目创建协同和合同台账编辑证据不足。","费控最佳实践强调申请/合同/发票/付款互相追溯。","B4:纳入项目与合同只读/写入门禁。"
"采购、预算、差旅与对公付款","P1","employee|manager|finance|admin","/purchase-requests|/budgets|/travel-requests|/payment-batches|/ap-operations","/mobile/approvals|/mobile/capture","server/src/routes/purchaseRequests.js|server/src/routes/budgets.js|server/src/routes/travelRequests.js|server/src/routes/travelOrders.js|server/src/routes/travelReconciliation.js|server/src/routes/paymentBatches.js","采购/差旅申请、预算预检、审批、支付、对账和归档。","预算不足、审批拒绝、对账差异、付款异常、票据不匹配。","员工创建;经理审批;财务付款和对账;管理员配置规则。","procurement-flow.spec.ts|travel-payment-flow.spec.ts|travel-reconciliation-flow.spec.ts|reimbursement-payment-batch-flow.spec.ts","高风险两轮复核、大额批次、真实 ERP/银行回执缺证据。","分贝通/合思强调事前管控、企业支付、三流合一和报表分析。","B4/B7:聚合现有业务流,live 外部回执保持 skipped。"
"资产与移动盘点","P1","employee|asset_admin|admin","/assets|/inventory-checks","/mobile/assets/scan","server/src/routes/assets.js|server/src/routes/assetMovements.js|server/src/routes/inventoryChecks.js","资产建卡、领用归还、调拨、盘点,移动端扫码盘点。","扫码失败、离线队列、盘点冲突、权限不足。","员工看本人资产;资产管理员管理台账和盘点。","assets-flow.spec.ts","真实摄像头扫码和真机离线恢复缺证据。","移动端应优先真实设备验证摄像头和文件权限。","B3/B5:视觉与真机清单覆盖。"
"系统治理、审计与发布","P0","admin|system_operator","/system/workspace|/system/settings|/system/feature-flags|/system/workflow-definitions|/audit-logs|/system/cutover|/system/integrations/erp","/mobile/me","server/src/routes/systemWorkspace.js|server/src/routes/featureFlags.js|server/src/routes/audit.js|server/src/routes/cutover.js|server/src/routes/integrations.js","管理员配置工作区、功能开关、流程定义、审计、切换和集成。","配置漂移、开关 force_off、迁移漂移、外部依赖不可用、发布失败。","仅系统权限可见;普通用户页面不得出现内部码值或调试文案。","settings-governance.spec.ts|live-smoke.spec.ts|smoke-trialrun-runtime.js|check-ui-design-rules.mjs","缺项目级 coverage scan、全页面视觉巡检和统一 release gate。","成熟系统需要可审计、可回滚、可持续回归的发布链路。","B2/B3/B6/B7:补齐覆盖扫描、视觉巡检、漂移诊断和发布门禁。"
1 Domain Tier Primary_Roles PC_Routes Mobile_WeCom_Routes Server_Routes Main_Flow Exception_Flow Permission_Flow Current_Coverage Known_Gaps Best_Practice_Delta Next_Action
2 __DOC_STATUS__ meta N/A N/A N/A N/A 本 CSV 是历史证据 / QA 参考,不代表 2026-05-12 当前状态。R6/PC6/PA6/FL6/AP6/RI6/LP6/ME6/QG6/DG7/MIA7 后的当前流程以最新 Issue CSV、文档索引和手工试运行报告为准。 历史缺口按当时日期理解,不自动生成当前需求。 当前权限和状态以服务端实现与最新 PA6/后续 Issue 为准。 historical_reference 可能包含已过期的公网仍需、待执行或真机缺口描述。 用于追溯流程覆盖,不替代当前 PRD 或门禁。 先读最新 Issue CSV 再决定下一步。
3 认证与企业微信入口 P0 employee|manager|admin /login|/portal|/settings/profile /mobile|/mobile/me|/mobile/profile server/src/routes/auth.js|server/src/routes/wecomAuth.js|server/src/routes/me.js 账号登录或企微 OAuth 进入工作台,按设备落到 PC Portal 或移动工作台。 未绑定、会话过期、OAuth 回跳失败、密码错误、首次登录改密。 普通员工仅看个人入口;管理员看系统入口;企业微信回跳只允许安全 returnTo。 login-portal-ux.spec.ts|wecom-entry.spec.ts|wecom-first-bind.spec.ts|r89-mobile-login-navigation.spec.ts|live-smoke.spec.ts 真实企业微信 OAuth 和真机回跳仍需 live smoke;HTTPS cookie 行为缺最终证据。 国内企业微信应用最佳实践要求工作台直达 H5 移动体验,不能露出 PC 壳。 B3/B5:视觉巡检防 PC 壳;live readiness 检查真实账号。
4 报销与票据 OCR P0 employee|manager|finance|finance_mgr|admin /reimbursements|/reimbursements/:id|/invoice-pool|/payment-batches|/ap-operations /mobile/reimbursements|/mobile/reimbursements/:id|/mobile/capture server/src/routes/reimbursements.js|server/src/routes/invoicePool.js|server/src/routes/paymentBatches.js|server/src/routes/apOperations.js 员工建草稿、加明细、上传发票、OCR 识别、添加到报销、提交审批、财务付款归档。 OCR 超时/失败、重复发票、已绑定/已报销、删除后重传、缺金额无法自动明细、付款失败。 员工只看自己的报销和业务文案;经理审批;财务复核付款;管理员配置。 reimbursement-workflow-progress.spec.ts|invoice-ocr-flow.spec.ts|reimbursement-payment-batch-flow.spec.ts|r111-invoice-reimbursement-guard.spec.ts|r125-invoice-reupload-after-delete.spec.ts|regression-dedup.sh 真实腾讯 OCR 耗时和公网文件上传链路需要样本;移动 PDF 选择需真机证据。 合思/分贝通/每刻均强调票据识别、验真、查重、电子档案和状态可追溯。 B3/B5/B7:视觉和文案门禁、真实 OCR readiness、发布门禁。
5 审批中心 P0 manager|finance|finance_mgr|admin /workflow/tasks|/workflow/tasks/:taskId /mobile/approvals server/src/routes/workflow.js|server/src/routes/workflowDefinitions.js 审批人查看待办,审批/驳回/退回/转交,申请人查看进度。 任务已处理、权限不足、并发审批、离线审批重放冲突。 只有当前审批人可处理;管理员可治理流程定义;普通员工只看相关单据进度。 workflow-quick-approve.spec.ts|mobile-approvals-offline.spec.ts|r111-invoice-reimbursement-guard.spec.ts 代理审批、多人并发、真实企业微信 deep link 证据不足。 同类系统强调审批全程留痕、风险提示和移动处理效率。 B4/B5:业务流门禁聚合;live smoke 覆盖移动 deep link。
6 请假与考勤 P1 employee|manager|admin /leave-requests|/attendance|/team /mobile/leave server/src/routes/leave.js|server/src/routes/leave-types.js|server/src/routes/attendance.js|server/src/routes/presence.js 员工提交请假、经理审批、团队日历/考勤状态更新。 余额不足、附件缺失、节假日/跨日、撤回、补卡。 员工看本人;经理看团队;管理员配置假期和考勤规则。 leave-flow.spec.ts|leave-team-calendar.spec.ts|announcements-presence.spec.ts|r75-automation-gap-fill.spec.ts 复杂排班、跨日班次和真实移动附件未专项重验。 国内 OA 常规要求移动提交、审批联动团队视图。 B4:纳入业务流门禁;B3:移动视觉巡检。
7 周报、待办、公告与通知 P1 employee|manager|admin /weekly-reports|/todos|/announcements|/notifications /mobile/notifications server/src/routes/weeklyReports.js|server/src/routes/todos.js|server/src/routes/announcements.js|server/src/routes/notifications.js 员工写周报、生成待办、公告触达、通知已读。 未提交提醒、通知跳转失效、公告权限错误。 管理员发布公告;员工只看可见公告;经理看团队周报汇总。 weekly-todo-flow.spec.ts|announcements-presence.spec.ts|global-search.spec.ts|r75-automation-gap-fill.spec.ts 外发渠道、催办策略和真实消息投递缺专项证据。 同类系统强调制度与知识库同步、通知可追踪。 B4:纳入业务流门禁;后续可补渠道 live smoke。
8 人员、组织、HR 与绩效 P1 employee|manager|hr|admin /people|/people/:employeeId|/people/stats|/organization|/payroll|/performance /mobile/me|/mobile/profile server/src/routes/employees.js|server/src/routes/departments.js|server/src/routes/payroll.js|server/src/routes/performance.js 管理员维护人员组织,员工完善档案,经理/HR 查看统计与绩效。 入职/转正/离职、隐私字段缺失、导出、权限越界。 员工看本人;经理看团队;HR/管理员看管理页面。 user-onboarding.spec.ts|r75-automation-gap-fill.spec.ts 离职资产交接、绩效真实评分、敏感字段脱敏证据不足。 国内 OA/HR 常规要求组织数据作为审批和权限事实源。 B2/B4:覆盖扫描标出缺口,业务门禁先跑现有用例。
9 项目、合同与涉密边界 P1 manager|project_role|admin /projects|/projects/:projectId|/contracts-registry /mobile server/src/routes/projects.js|server/src/routes/contractsRegistry.js|server/src/routes/confidentialDocRefs.js 项目创建、成员协作、沟通记录、合同台账、涉密引用边界。 项目权限不足、涉密文档不可见、合同缺关联。 项目成员和管理员分级可见;涉密内容最小暴露。 project-workbench.spec.ts|confidential-boundary.spec.ts 真实项目创建协同和合同台账编辑证据不足。 费控最佳实践强调申请/合同/发票/付款互相追溯。 B4:纳入项目与合同只读/写入门禁。
10 采购、预算、差旅与对公付款 P1 employee|manager|finance|admin /purchase-requests|/budgets|/travel-requests|/payment-batches|/ap-operations /mobile/approvals|/mobile/capture server/src/routes/purchaseRequests.js|server/src/routes/budgets.js|server/src/routes/travelRequests.js|server/src/routes/travelOrders.js|server/src/routes/travelReconciliation.js|server/src/routes/paymentBatches.js 采购/差旅申请、预算预检、审批、支付、对账和归档。 预算不足、审批拒绝、对账差异、付款异常、票据不匹配。 员工创建;经理审批;财务付款和对账;管理员配置规则。 procurement-flow.spec.ts|travel-payment-flow.spec.ts|travel-reconciliation-flow.spec.ts|reimbursement-payment-batch-flow.spec.ts 高风险两轮复核、大额批次、真实 ERP/银行回执缺证据。 分贝通/合思强调事前管控、企业支付、三流合一和报表分析。 B4/B7:聚合现有业务流,live 外部回执保持 skipped。
11 资产与移动盘点 P1 employee|asset_admin|admin /assets|/inventory-checks /mobile/assets/scan server/src/routes/assets.js|server/src/routes/assetMovements.js|server/src/routes/inventoryChecks.js 资产建卡、领用归还、调拨、盘点,移动端扫码盘点。 扫码失败、离线队列、盘点冲突、权限不足。 员工看本人资产;资产管理员管理台账和盘点。 assets-flow.spec.ts 真实摄像头扫码和真机离线恢复缺证据。 移动端应优先真实设备验证摄像头和文件权限。 B3/B5:视觉与真机清单覆盖。
12 系统治理、审计与发布 P0 admin|system_operator /system/workspace|/system/settings|/system/feature-flags|/system/workflow-definitions|/audit-logs|/system/cutover|/system/integrations/erp /mobile/me server/src/routes/systemWorkspace.js|server/src/routes/featureFlags.js|server/src/routes/audit.js|server/src/routes/cutover.js|server/src/routes/integrations.js 管理员配置工作区、功能开关、流程定义、审计、切换和集成。 配置漂移、开关 force_off、迁移漂移、外部依赖不可用、发布失败。 仅系统权限可见;普通用户页面不得出现内部码值或调试文案。 settings-governance.spec.ts|live-smoke.spec.ts|smoke-trialrun-runtime.js|check-ui-design-rules.mjs 缺项目级 coverage scan、全页面视觉巡检和统一 release gate。 成熟系统需要可审计、可回滚、可持续回归的发布链路。 B2/B3/B6/B7:补齐覆盖扫描、视觉巡检、漂移诊断和发布门禁。
+49
查看文件
@@ -0,0 +1,49 @@
# 人工试运行报告
**文档状态**:当前试运行证据摘要。
**适用时间**:DCL7 之后。
DCL7 已删除本文件中 R70-R91 的长流水历史,避免旧环境、旧开关和旧公网状态误导当前工作。历史全文可通过 git 恢复:`git show 5da05eb:docs/trialrun/人工试运行报告.md`。
## 当前结论
- R6 首轮小范围试运行已通过;范围是报销、请假、采购、审批、企业微信入口/通知、财务付款/导出。
- PC6、PA6、FL6、AP6、RI6、LP6、ME6 自动化、QG6、DG7/MRF7、MIA7 已完成相应收口。
- `ME6-3` 代表性企业微信真机门禁仍待确认,不能用自动化、公网视觉矩阵或 QG6 替代。
- MIF7 是下一批移动信息架构整改合同,当前仍为 TODO。
- R7/OPS7/DOC7 是准备材料;真实 R7 未启动,需用户确认人员、窗口、回滚联系人、问题登记负责人和真机风险状态。
## 关键证据索引
| 批次 | 当前状态 | 证据入口 |
| --- | --- | --- |
| R6 | 已通过 | `issues/2026-05-11_10-23-41-r6-small-trialrun-prep.csv` |
| PS6 | 采购提交阻断已修复 | `issues/2026-05-12_01-12-20-r6-purchase-submit-budget-precheck-hotfix.csv` |
| PC6 | PC 工作台与审批信息架构已完成 | `issues/2026-05-12_01-40-00-r6-pc-workbench-ia-polish.csv` |
| PA6 | 权限与审计回归已完成 | `issues/2026-05-12_01-46-00-r6-permission-audit-regression.csv` |
| FL6 | 财务台账/导出增强已完成 | `issues/2026-05-12_01-43-00-r6-finance-ledger-export-v1.csv` |
| AP6 | 审批催办、超时提醒和效率摘要已完成 | `issues/2026-05-12_01-42-00-r6-approval-productivity-v1.csv` |
| RI6 | 报销票据体验已完成 | `issues/2026-05-12_01-44-00-r6-reimbursement-invoice-polish-v1.csv` |
| LP6 | 请假采购体验已完成 | `issues/2026-05-12_01-45-00-r6-leave-procurement-polish-v1.csv` |
| ME6 | 自动化和公网视觉已完成,真机门禁未关闭 | `issues/2026-05-12_01-41-00-r6-mobile-experience-second-pass.csv` |
| QG6 | QA 治理已完成 | `issues/2026-05-12_01-47-00-r6-qa-governance-upgrade.csv` |
| MIA7 | 移动信息架构审查已完成 | `issues/2026-05-12_21-48-39-mobile-ia-visual-flow-review.csv` |
| MIF7 | 后续整改合同,仍为 TODO | `issues/2026-05-12_21-48-40-mobile-ia-flow-remediation.csv` |
## 当前门禁
| 门禁 | 状态 | 说明 |
| --- | --- | --- |
| 公网地址 | 可用 | `https://oa.hyinda.com` |
| `/ready` | 最近相关批次均通过 | 具体时间看对应 Issue CSV 和部署报告 |
| 企业微信个人应用消息 | 正式通知通道 | 企业微信只做入口、身份、消息和 deeplink |
| `ME6-3` 真机抽查 | 未关闭 | iPhone 12/iOS14、iPhone 14/iOS16.2、Redmi K60 企业微信仍需代表性复测或用户明确接受风险 |
| R7 真实执行 | 未启动 | 草案不等于启动 |
## 历史恢复
需要追溯 R70-R91 的详细流水时,使用:
```bash
git show 5da05eb:docs/trialrun/人工试运行报告.md
```
@@ -2,7 +2,7 @@
**文档状态**:当前操作手册,用于部署后公网、企业微信入口和真实 OCR 条件复核。
发布候选证据、权限直连审计、部署预检和小范围试运行顺序,以 [`release-readiness-checklist.md`](release-readiness-checklist.md) 为准;本文只列 live smoke 和真实 OCR 的执行条件。
发布候选证据、权限直连审计、部署预检和小范围试运行顺序,以 [`发布试运行准备清单.md`](发布试运行准备清单.md) 为准;本文只列 live smoke 和真实 OCR 的执行条件。
## 必需环境变量
@@ -22,7 +22,7 @@
| 范围 | 证据 | 结论 |
| --- | --- | --- |
| A1 代码差距盘点 | `644852f A1 完成MVP主线代码差距盘点` | 已确认复用现有能力,不从零重写 |
| A1 代码盘点 | `644852f A1 完成MVP主线代码盘点` | 已确认复用现有能力,不从零重写 |
| A2 统一审批中心 | `d871a40`、`f8c99c8`、`28be209` | PC/移动审批、状态展示和本地回归已闭环 |
| A3 报销/发票/OCR | `e79d252 A3 收口报销发票 OCR 主链路` | mock OCR、查重、主流程和视觉验证已通过 |
| A4 企业微信入口/通知 | `86451b3 A4 收口企业微信入口与通知回 OA` | 自动化入口和通知 deeplink 已收口,真机留到 live smoke |
@@ -78,7 +78,7 @@ node scripts/qa/check-live-smoke-env.mjs
如发现服务端权限缺口,必须停止部署并拆独立修复 Issue;不得用前端隐藏临时绕过。
R3 审计执行记录见 [`permission-direct-access-audit.md`](permission-direct-access-audit.md)。2026-05-10 本地自动化直连审计已通过,未发现权限泄漏;R4/D3/D4 记录见 [`deployment-preflight-2026-05-10.md`](deployment-preflight-2026-05-10.md),当前远端运行时代码已对齐 release candidate。
R3 审计执行记录见 [`权限直连审计记录.md`](权限直连审计记录.md)。2026-05-10 本地自动化直连审计已通过,未发现权限泄漏;R4/D3/D4 旧部署预检长记录已在 DCL7 中从当前树移除,如需审计可从 `5da05eb` 的 git 历史恢复查看。
## 5. 部署预检
@@ -19,7 +19,7 @@
## 当前标准
后续 MIF7 整改按 `docs/product-design-rules.md` 的 MIA7 标准执行:
后续 MIF7 整改按 `docs/产品设计规则.md` 的 MIA7 标准执行:
- 底部导航只承载一级模块,首页常用只放快捷动作,不重复底部 Tab。
- 首页待处理最多一张轻摘要,不同时堆总数、三宫格、列表、状态标签和入口按钮。
+5
查看文件
@@ -0,0 +1,5 @@
"Domain","Tier","Routes","Primary_Roles","Env_Gates","Feature_Flags","Coverage_Status","Evidence","Validated_Flows","Gaps","Next_Action"
"__DOC_STATUS__","meta","N/A","N/A","N/A","N/A","current_summary","docs/文档索引.md|docs/文档事实源状态矩阵.md|docs/trialrun/人工试运行报告.md","DCL7 后保留的轻量覆盖摘要。历史长表可通过 5da05eb 的 git 历史恢复。","历史缺口不代表当前待办。","当前门禁以最新 Issue CSV 为准。"
"报销请假采购审批","current","/reimbursements|/leave-requests|/purchase-requests|/workflow/tasks","employee|manager|finance","N/A","N/A","done","issues/R6|RI6|LP6|AP6","报销、请假、采购、审批主链路已在 R6 后批次收口。","ME6-3 真机仍待确认。","进入 MIF7 前先做移动整改。"
"移动与企业微信","current","/mobile|/mobile/approvals|/mobile/reimbursements|/mobile/notifications","employee|manager|finance","WECOM_*","wecom_entry_v1","partial_done","issues/ME6|DG7|MIA7","自动化和公网视觉通过,真机代表设备未关闭。","iPhone12/iPhone14/Redmi K60 企业微信仍需复测或风险接受。","MIF7 继续整改移动 IA。"
"财务与导出","current","/ap-operations|/payment-batches","finance","N/A","payment_batch_v1","done","issues/FL6|PA6","财务台账、导出、权限和审计已完成一轮。","R7 真实财务用户扩大试运行未启动。","R7 前按草案确认人员和窗口。"
1 Domain Tier Routes Primary_Roles Env_Gates Feature_Flags Coverage_Status Evidence Validated_Flows Gaps Next_Action
2 __DOC_STATUS__ meta N/A N/A N/A N/A current_summary docs/文档索引.md|docs/文档事实源状态矩阵.md|docs/trialrun/人工试运行报告.md DCL7 后保留的轻量覆盖摘要。历史长表可通过 5da05eb 的 git 历史恢复。 历史缺口不代表当前待办。 当前门禁以最新 Issue CSV 为准。
3 报销请假采购审批 current /reimbursements|/leave-requests|/purchase-requests|/workflow/tasks employee|manager|finance N/A N/A done issues/R6|RI6|LP6|AP6 报销、请假、采购、审批主链路已在 R6 后批次收口。 ME6-3 真机仍待确认。 进入 MIF7 前先做移动整改。
4 移动与企业微信 current /mobile|/mobile/approvals|/mobile/reimbursements|/mobile/notifications employee|manager|finance WECOM_* wecom_entry_v1 partial_done issues/ME6|DG7|MIA7 自动化和公网视觉通过,真机代表设备未关闭。 iPhone12/iPhone14/Redmi K60 企业微信仍需复测或风险接受。 MIF7 继续整改移动 IA。
5 财务与导出 current /ap-operations|/payment-batches finance N/A payment_batch_v1 done issues/FL6|PA6 财务台账、导出、权限和审计已完成一轮。 R7 真实财务用户扩大试运行未启动。 R7 前按草案确认人员和窗口。
@@ -0,0 +1,6 @@
Domain,Tier,Primary_Roles,PC_Routes,Mobile_WeCom_Routes,Server_Routes,Main_Flow,Exception_Flow,Permission_Flow,Current_Coverage,Known_Gaps,Best_Practice_Delta,Next_Action
"认证与企业微信入口","P0","employee|manager|finance|admin","/login|/portal|/settings/profile","/mobile|/mobile/me","server/src/routes/auth.js|server/src/routes/wecomAuth.js|server/src/routes/me.js","账号登录或企业微信进入 OA,按设备进入 PC 或移动工作台。","未绑定、会话过期、OAuth 回跳失败。","员工看个人入口,管理员看系统入口。","wecom-entry|live-smoke|ME6 automation","ME6-3 真机门禁未关闭。","企业微信只做入口、身份、消息和 deeplink。","MIF7 后再做代表性真机复测。"
"报销与票据","P0","employee|manager|finance","/reimbursements|/reimbursements/:id|/ap-operations","/mobile/reimbursements|/mobile/reimbursements/:id","server/src/routes/reimbursements.js|server/src/routes/invoicePool.js|server/src/routes/apOperations.js","员工建报销、加发票/附件、提交审批、财务复核或付款状态展示。","识别失败、重复票据、已归档、缺附件。","员工看本人,审批人处理分配任务,财务看财务范围。","RI6|FL6|PA6","R7 真实扩大试运行未启动。","移动轻任务,PC 高密度复核。","MIF7 统一详情壳和返回语义。"
"请假与采购","P0","employee|manager","/leave-requests|/purchase-requests|/workflow/tasks","/mobile/leave|/mobile/approvals","server/src/routes/leave.js|server/src/routes/purchaseRequests.js|server/src/routes/workflow.js","员工提交,请假/采购进入审批,审批人处理,员工看进度。","退回/驳回、缺预算池 warning、附件缺失。","自审和 admin-only 业务审批由服务端拒绝。","LP6|PS6|PA6","采购复杂预算、供应商准入、ERP 不在当前范围。","状态和审批历史一致。","MIF7 优化移动进度分组。"
"通知与审批效率","P0","employee|manager","/notifications|/workflow/tasks","/mobile/notifications|/mobile/approvals","server/src/routes/notifications.js|server/src/routes/workflow.js","通知事件直达详情;申请人可催办本人 pending 任务。","通知目标不存在、无权限、重复催办。","催办不改变审批状态,通知失败不回滚业务。","AP6|DG7|MIA7","通知和进度视觉仍需 MIF7 进一步区分。","通知是事件收件箱,不是待办副本。","MIF7 做通知事件化。"
"系统治理和财务","P1","finance|admin","/system/*|/audit-logs|/ap-operations","/mobile/me","server/src/routes/audit.js|server/src/routes/featureFlags.js|server/src/routes/apOperations.js","管理员看配置和审计,财务看台账和导出。","权限不足、导出失败、审计缺口。","管理员不默认获得财务业务能力,财务不获得系统管理能力。","PA6|FL6|QG6","R7 真实执行未启动。","最小权限和可追溯。","R7 前确认人员、窗口和回滚联系人。"
1 Domain Tier Primary_Roles PC_Routes Mobile_WeCom_Routes Server_Routes Main_Flow Exception_Flow Permission_Flow Current_Coverage Known_Gaps Best_Practice_Delta Next_Action
2 认证与企业微信入口 P0 employee|manager|finance|admin /login|/portal|/settings/profile /mobile|/mobile/me server/src/routes/auth.js|server/src/routes/wecomAuth.js|server/src/routes/me.js 账号登录或企业微信进入 OA,按设备进入 PC 或移动工作台。 未绑定、会话过期、OAuth 回跳失败。 员工看个人入口,管理员看系统入口。 wecom-entry|live-smoke|ME6 automation ME6-3 真机门禁未关闭。 企业微信只做入口、身份、消息和 deeplink。 MIF7 后再做代表性真机复测。
3 报销与票据 P0 employee|manager|finance /reimbursements|/reimbursements/:id|/ap-operations /mobile/reimbursements|/mobile/reimbursements/:id server/src/routes/reimbursements.js|server/src/routes/invoicePool.js|server/src/routes/apOperations.js 员工建报销、加发票/附件、提交审批、财务复核或付款状态展示。 识别失败、重复票据、已归档、缺附件。 员工看本人,审批人处理分配任务,财务看财务范围。 RI6|FL6|PA6 R7 真实扩大试运行未启动。 移动轻任务,PC 高密度复核。 MIF7 统一详情壳和返回语义。
4 请假与采购 P0 employee|manager /leave-requests|/purchase-requests|/workflow/tasks /mobile/leave|/mobile/approvals server/src/routes/leave.js|server/src/routes/purchaseRequests.js|server/src/routes/workflow.js 员工提交,请假/采购进入审批,审批人处理,员工看进度。 退回/驳回、缺预算池 warning、附件缺失。 自审和 admin-only 业务审批由服务端拒绝。 LP6|PS6|PA6 采购复杂预算、供应商准入、ERP 不在当前范围。 状态和审批历史一致。 MIF7 优化移动进度分组。
5 通知与审批效率 P0 employee|manager /notifications|/workflow/tasks /mobile/notifications|/mobile/approvals server/src/routes/notifications.js|server/src/routes/workflow.js 通知事件直达详情;申请人可催办本人 pending 任务。 通知目标不存在、无权限、重复催办。 催办不改变审批状态,通知失败不回滚业务。 AP6|DG7|MIA7 通知和进度视觉仍需 MIF7 进一步区分。 通知是事件收件箱,不是待办副本。 MIF7 做通知事件化。
6 系统治理和财务 P1 finance|admin /system/*|/audit-logs|/ap-operations /mobile/me server/src/routes/audit.js|server/src/routes/featureFlags.js|server/src/routes/apOperations.js 管理员看配置和审计,财务看台账和导出。 权限不足、导出失败、审计缺口。 管理员不默认获得财务业务能力,财务不获得系统管理能力。 PA6|FL6|QG6 R7 真实执行未启动。 最小权限和可追溯。 R7 前确认人员、窗口和回滚联系人。
+33
查看文件
@@ -0,0 +1,33 @@
# 历史功能状态矩阵
**文档状态**:轻量历史索引,不是当前 PRD,不是当前开发排期。
**适用时间**:DCL7 之后。
本文件只回答“早期功能状态矩阵是否还存在入口,以及去哪里追溯历史明细”。DCL7 已删除原来的大表内容,避免旧阶段状态和当前事实源混在一起。
## 当前使用规则
- 当前需求、范围和验收以 [文档索引](./文档索引.md)、[海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md)、当前模块规约和最新 `issues/*.csv` 为准。
- 历史完成证据优先看相关 Issue CSV 和 git 历史;不要从本文件生成新需求。
- 早期大表可通过 git 历史恢复:`git show 5da05eb:docs/feature-matrix.md`。
## 当前事实摘要
| 范围 | 当前口径 | 事实源 |
| --- | --- | --- |
| R6 小范围试运行 | 已完成并部署;不等于全面正式上线 | `issues/2026-05-11_10-23-41-r6-small-trialrun-prep.csv`、[人工试运行报告](./trialrun/人工试运行报告.md) |
| PC6/PA6/FL6/AP6/RI6/LP6 | 已按各自合同完成 | 最新相关 `issues/*.csv` |
| ME6 | 自动化和公网视觉矩阵已完成;`ME6-3` 真机门禁未关闭 | [真机公网测试清单](./trialrun/真机公网测试清单.md) |
| QG6 | QA 治理已完成 | `issues/2026-05-12_01-47-00-r6-qa-governance-upgrade.csv` |
| DG7/MRF7/MIA7 | 移动信息去重、真机反馈修复和审查已完成 | [移动信息架构视觉流程审查](./trialrun/移动信息架构视觉流程审查.md) |
| MIF7 | 下一批移动整改,仍为 TODO | `issues/2026-05-12_21-48-40-mobile-ia-flow-remediation.csv` |
| R7 | 只有草案和准备材料;真实 R7 未启动 | [R7扩大试运行草案](./trialrun/R7扩大试运行草案.md) |
## 已移除历史大表
原 `docs/feature-matrix.md` 包含 P5-R90 等历史批次的大量完成行。DCL7 后压缩并重命名为当前轻量索引;如需审计某个旧 ID,请按以下顺序查:
1. `git log --follow -- docs/历史功能状态矩阵.md`
2. `git show 5da05eb:docs/feature-matrix.md`
3. 对应 `issues/*.csv`
4. 对应 commit 记录
+1 -1
查看文件
@@ -124,5 +124,5 @@ A7 收口员工导航和备用模块护栏
- `docs/海音达OA-MVP需求规格说明书.md` 定义开发项目流程和 MVP 业务目标。
- `issues/*.csv` 是每轮执行合同。
- `docs/测试规约与回归门禁.md` 定义测试、视觉验证和回归门禁。
- `docs/trialrun-runbook.md` 定义本地、公网、企业微信和真实 OCR 的操作步骤。
- `docs/试运行与自动化验证手册.md` 定义本地、公网、企业微信和真实 OCR 的操作步骤。
- `AGENTS.md` 定义不可违反的执行硬约束。
@@ -103,7 +103,7 @@ PC 端:
- 适合明细编辑、批量查看、财务复核和台账导出。
- 报销详情分区展示:摘要、明细、发票、附件、审批流、预算与审核提示。
- PC 报销列表和详情遵循 [产品设计规则基线](./product-design-rules.md):业务编号、状态、申请人、金额和更新时间优先,不把 UUID 或内部状态码作为主展示。
- PC 报销列表和详情遵循 [产品设计规则基线](./产品设计规则.md):业务编号、状态、申请人、金额和更新时间优先,不把 UUID 或内部状态码作为主展示。
手机/企业微信端:
+84 -69
查看文件
@@ -1,77 +1,92 @@
# hyb-oa 文档事实源状态矩阵
# 文档事实源状态矩阵
**文档状态**:当前文档治理事实源。
**适用时间**:2026-05-12 DOCG7 之后。
**治理策略**:采用索引归档,不删除、不移动历史文档,不回写旧 Issue CSV。历史文档通过本文档和 `docs/文档索引.md` 标注用途。
**适用时间**:DCL7 之后。
**治理口径**:中文优先,物理精简。历史资料不建 `docs/archive/`,已确认不用的文档从当前树移除,通过 git 历史恢复。
## 当前判断规则
## 冲突优先级
- 最新 Issue CSV 是执行合同事实源;当前 PRD、模块规约和设计规则是需求/验收事实源。
- 当前操作手册用于执行试运行、部署、真机验收和用户培训;若与最新 Issue CSV 或模块规约冲突,以最新 Issue CSV 和当前模块规约为准。
- 历史矩阵、旧 trialrun 报告和旧 CSV 用于追溯证据,不代表 2026-05-12 当前状态。
- R7/OPS7/DOC7 是准备材料,不代表真实扩大试运行已经启动。
- `ME6-3` 代表性企业微信真机门禁仍未关闭;MIF7 是下一批移动信息架构整改合同,当前仍为 TODO。
最新 Issue CSV > 当前 PRD/模块规约 > 产品和设计规则 > 当前操作手册 > 技术参考 > 历史证据 > git 历史。
## 状态矩阵
## 当前事实源
| 文档 | 分类 | 当前用途 | 当前口径 |
| --- | --- | --- | --- |
| `docs/文档索引.md` | 当前事实源 | 文档入口、冲突优先级、归档策略 | 当前有效;先读它判断哪些文档可指导开发 |
| `docs/文档事实源状态矩阵.md` | 当前事实源 | DOCG7 后文档状态分类 | 当前有效;不替代具体模块规约 |
| `docs/海音达OA-MVP需求规格说明书.md` | 当前事实源 | PRD 主事实源 | 当前有效;范围变更先更新 PRD 或模块规约 |
| `docs/product-design-rules.md` | 当前事实源 | PC、移动、企业微信 WebView 设计规则 | 当前有效;MIA7 移动标准为最新移动设计事实源 |
| `docs/product-decisions.md` | 当前事实源 | 已拍板产品边界 | 当前有效;与最新 Issue CSV 冲突时以后者为准 |
| `docs/需求-统一审批中心规约.md` | 当前事实源 | 审批、催办、超时提醒、审批效率 | 当前有效;AP6 v1 已是当前事实 |
| `docs/reimbursement-invoice-rules.md` | 当前事实源 | 报销、发票、附件、OCR 规则 | 当前有效;RI6 后员工入口仍是报销详情添加发票 |
| `docs/需求-报销发票OCR规约.md` | 当前事实源 | 报销发票 OCR 模块规约 | 当前有效;细节与 `reimbursement-invoice-rules.md` 配套 |
| `docs/需求-企业微信基础设施规约.md` | 当前事实源 | 企业微信入口、身份、消息、deeplink | 当前有效;企业微信不替代 OA 正式审批 |
| `docs/需求-请假考勤修正规约.md` | 当前事实源 | 请假、补卡、考勤修正 | 当前有效;LP6 已完成轻体验收口 |
| `docs/需求-采购费用审批规约.md` | 当前事实源 | 采购、费用、附件、审批规则 | 当前有效;复杂预算、供应商准入和 ERP 不在当前批次扩展 |
| `docs/需求-合同附件归档规约.md` | 当前事实源 | 合同台账和附件归档边界 | 当前有效;涉密正文不上传 |
| `docs/需求-项目轻管理规约.md` | 当前事实源 | 项目轻管理边界 | 当前有效;不扩成重型项目管理 |
| `docs/测试规约与回归门禁.md` | 当前事实源 | 自动化、视觉、真机、状态回填规则 | 当前有效;真机暂停只能标 PAUSED |
| `docs/开发交付与变更管理规约.md` | 当前事实源 | Issue CSV、review、提交和交付流程 | 当前有效 |
| `AGENTS.md` | 当前事实源 | Agent 执行硬约束 | 当前有效;执行开发前必须遵守 |
| `.agents/skills/hyb-oa-delivery/SKILL.md` | 当前事实源 | 项目交付 Skill | 当前有效;需要随事实源同步 |
| `docs/agent-development-practices.md` | 当前事实源 | Agent 协作与交付实践 | 当前有效;详细事实源在 docs 和 Issue CSV |
| `docs/admin-handbook.md` | 当前操作手册 | 管理员上线、权限、试运行配置 | 当前有效;R7 未真实启动,ME6-3 未关闭 |
| `docs/employee-quickstart.md` | 当前操作手册 | 员工使用说明 | 当前有效;移动体验下一批 MIF7 继续整改 |
| `docs/trialrun-runbook.md` | 当前操作手册 | 本地、公网、企业微信、真实 OCR 验证步骤 | 当前有效;不替代真机清单 |
| `docs/trialrun/real-device-public-checklist.md` | 当前操作手册 | 真实手机/企业微信人工验收 | 当前有效;`ME6-3` 仍待代表设备确认 |
| `docs/trialrun/release-readiness-checklist.md` | 当前操作手册 | 发布试运行准备与门禁 | 当前有效但含早期证据;顶部当前状态优先 |
| `docs/trialrun/live-smoke-readiness.md` | 当前操作手册 | 公网 live smoke 和真实 OCR readiness | 当前有效 |
| `docs/trialrun/r7-expanded-trialrun-prep.md` | 草案/准备材料 | R7 扩大试运行草案 | 不代表真实 R7 已启动;`R7E-*` 仍需用户确认后执行 |
| `docs/trialrun/ops7-runbook.md` | 草案/准备材料 | 运维交接 Runbook 草案 | 不代表生产配置变更或恢复演练已执行 |
| `docs/trialrun/r7-user-guide-and-faq.md` | 草案/准备材料 | R7 用户手册和 FAQ 草案 | 只描述已实现能力,不承诺扩展能力 |
| `docs/trialrun/mobile-ia-visual-flow-review.md` | 实现状态与证据 | MIA7 移动信息架构审查结论 | 当前审查证据;整改仍以 MIF7 合同为准 |
| `docs/trialrun/manual-trialrun-report.md` | 实现状态与证据 | R70-R6 及后续批次收口记录 | 历史基底 + 最新追加记录;不要只读标题判断当前状态 |
| `docs/feature-matrix.md` | 历史证据 | 2026-05-05 前后历史实现状态矩阵 | 历史主表;不代表 2026-05-12 当前状态 |
| `docs/trialrun/coverage-matrix.csv` | 历史证据 | 试运行覆盖证据和 QA 参考 | 历史证据;不单独作为当前门禁 |
| `docs/trialrun/project-wide-flow-matrix.csv` | 历史证据 / QA 参考 | 项目级流程和覆盖映射 | 历史 QA 参考;当前流程以最新 Issue CSV 为准 |
| `docs/trialrun/permission-direct-access-audit.md` | 实现状态与证据 | 权限直连审计记录 | 当前可追溯证据;后续权限变更需重新审计 |
| `docs/trialrun/deployment-preflight-2026-05-10.md` | 实现状态与证据 | 2026-05-10 部署预检证据 | 历史证据;不代表最新部署状态 |
| `docs/trialrun/async-ux-audit.csv` | 历史证据 / QA 参考 | 异步体验审计记录 | 历史 QA 参考 |
| `docs/requirements-specification.md` | 历史归档参考 | 旧规格入口或跳转 | 不作为当前 PRD 主入口 |
| `docs/implementation_plan.md` | 历史归档参考 | 早期实施计划 | 不作为当前排期 |
| `docs/tech_stack_report.md` | 技术参考 / 历史归档参考 | 技术栈和复用报告 | 技术栈有参考价值,范围口径需看当前 PRD |
| `docs/architecture.md` | 技术参考 | 架构概览 | 当前参考;部署状态需结合最新部署报告 |
| `docs/integration-boundaries.md` | 技术参考 | ERP、IM、AI、MCP、PWA 集成边界 | 当前参考;不因历史能力扩大 R6/R7 范围 |
| `docs/domain-events.md` | 技术参考 | 领域事件清单 | 当前参考 |
| `docs/mcp-tools.md` | 技术参考 | MCP 工具边界 | 当前参考;未启用工具不得假设可用 |
| `docs/ops/*.md` | 技术参考 | SLO、 tracing、测试策略、CI 和 DORA | 当前参考;不替代 Issue CSV |
| `docs/adr/*.md` | 技术参考 / 历史归档参考 | 重要路线决策记录 | 保留 ADR 历史结论 |
| `docs/mobile/pwa-regression-checklist.md` | 历史证据 / QA 参考 | PWA 移动回归清单 | 历史 QA 参考;当前移动验收看 ME6/MIA7/MIF7 |
| `docs/MVP主线代码差距盘点.md` | 历史证据 | MVP 主线差距盘点 | 历史证据;不作为新需求入口 |
| `docs/todo-reconciliation.md` | 历史证据 | 旧 TODO 清账映射 | 历史追溯,不直接生成新需求 |
| `docs/invoice-pool-refactor-plan.md` | 历史归档参考 | invoicePool 拆分方案 | 一次性方案归档 |
| `docs/migration-mapping.md` | 历史归档参考 | 旧系统迁移映射 | 仅迁移专项使用 |
| `docs/trialrun/domestic-oa-best-practices.md` | 历史归档参考 | 国内 OA 调研快照 | 仅作原则参考,不替代产品事实源 |
| 路径 | 分类 | 当前用途 |
| --- | --- | --- |
| `docs/文档索引.md` | 当前事实源 | 唯一文档入口 |
| `docs/文档事实源状态矩阵.md` | 当前事实源 | 文档分类和恢复规则 |
| `docs/海音达OA-MVP需求规格说明书.md` | 当前事实源 | PRD 主事实源 |
| `docs/产品设计规则.md` | 当前事实源 | PC、移动、企业微信设计规则 |
| `docs/产品口径.md` | 当前事实源 | 产品边界和业务规则 |
| `docs/需求-统一审批中心规约.md` | 当前事实源 | 审批、催办、超时、效率摘要 |
| `docs/报销发票附件规则.md` | 当前事实源 | 报销、发票、附件细则 |
| `docs/需求-报销发票OCR规约.md` | 当前事实源 | OCR 和报销模块规约 |
| `docs/需求-企业微信基础设施规约.md` | 当前事实源 | 企业微信入口、身份、消息、deeplink |
| `docs/需求-请假考勤修正规约.md` | 当前事实源 | 请假和考勤修正 |
| `docs/需求-采购费用审批规约.md` | 当前事实源 | 采购和费用审批 |
| `docs/需求-合同附件归档规约.md` | 当前事实源 | 合同台账和附件归档 |
| `docs/需求-项目轻管理规约.md` | 当前事实源 | 项目轻管理 |
| `docs/测试规约与回归门禁.md` | 当前事实源 | 测试和回归门禁 |
| `docs/开发交付与变更管理规约.md` | 当前事实源 | Issue CSV、review、提交和交付 |
| `docs/Agent开发交付实践.md` | 当前事实源 | Agent 协作开发实践 |
| `AGENTS.md` | 当前事实源 | 项目硬约束 |
| `.agents/skills/hyb-oa-delivery/SKILL.md` | 当前事实源 | 项目交付 Skill |
## 最近事实链摘要
## 当前操作手册
- R6、PC6、PA6、FL6、AP6、RI6、LP6 已完成并部署。
- ME6 自动化、部署和公网移动视觉矩阵已完成;`ME6-3` 代表性真机抽查仍待确认。
- QG6 已完成 QA 治理升级。
- DG7/MRF7 已完成移动信息去重和真机反馈第一轮修复。
- MIA7 已完成移动信息架构、视觉和流程审查;MIF7 是下一批移动整改合同,尚未实施。
- R7 只有草案和准备材料;真实扩大试运行尚未启动。
| 路径 | 当前用途 |
| --- | --- |
| `docs/管理员手册.md` | 管理员上线、权限、试运行配置 |
| `docs/员工快速上手.md` | 员工使用说明 |
| `docs/试运行与自动化验证手册.md` | 本地、公网、企业微信和真实 OCR 验证 |
| `docs/trialrun/发布试运行准备清单.md` | 发布和试运行门禁 |
| `docs/trialrun/公网LiveSmoke准备清单.md` | 公网 live smoke 和真实 OCR readiness |
| `docs/trialrun/真机公网测试清单.md` | 真实手机和企业微信人工验收 |
## 草案和证据
| 路径 | 分类 | 当前口径 |
| --- | --- | --- |
| `docs/trialrun/R7扩大试运行草案.md` | 草案 | R7 未真实启动 |
| `docs/trialrun/OPS7运维交接Runbook.md` | 草案 | 不代表已执行生产配置或恢复演练 |
| `docs/trialrun/R7用户手册与FAQ.md` | 草案 | 不承诺未实现能力 |
| `docs/历史功能状态矩阵.md` | 历史证据 | 轻量索引,旧大表从 git 历史恢复 |
| `docs/trialrun/人工试运行报告.md` | 历史证据 | R6 后状态摘要和关键证据索引 |
| `docs/trialrun/试运行覆盖矩阵.csv` | 历史证据 | 轻量覆盖摘要 |
| `docs/trialrun/项目级流程覆盖矩阵.csv` | QA 参考 | `check-flow-coverage` 使用 |
| `docs/trialrun/权限直连审计记录.md` | 当前证据 | 权限直连审计 |
| `docs/trialrun/移动信息架构视觉流程审查.md` | 当前证据 | MIA7 审查结论;MIF7 仍为 TODO |
## 技术参考
| 路径 | 说明 |
| --- | --- |
| `docs/架构概览.md` | 架构和运行时边界 |
| `docs/集成边界.md` | 集成边界,不扩大 MVP 范围 |
| `docs/领域事件清单.md` | 领域事件 |
| `docs/mcp-tools.md` | 脚本和 AGENTS 强引用,保留英文文件名 |
| `docs/ops/*.md` | 非功能、SLO、测试、CI、DORA、追踪 |
| `docs/adr/*.md` | ADR 历史决策 |
## 已从当前树移除
这些文件已物理删除,不再维护当前副本;需要时通过 git 历史恢复。
| 旧路径 | 原用途 |
| --- | --- |
| `docs/implementation_plan.md` | 早期实施计划 |
| `docs/tech_stack_report.md` | 早期技术栈报告 |
| `docs/invoice-pool-refactor-plan.md` | invoicePool 一次性方案 |
| `docs/migration-mapping.md` | 旧迁移映射 |
| `docs/MVP主线代码差距盘点.md` | 旧 MVP 代码差距盘点 |
| `docs/todo-reconciliation.md` | 旧 TODO 清账 |
| `docs/mobile/pwa-regression-checklist.md` | 旧 PWA 回归清单 |
| `docs/trialrun/domestic-oa-best-practices.md` | 旧国内 OA 调研快照 |
| `docs/trialrun/async-ux-audit.csv` | 旧异步体验审计 |
| `docs/trialrun/deployment-preflight-2026-05-10.md` | 旧部署预检记录 |
| `docs/requirements-specification.md` | 旧 PRD 跳转入口 |
## 当前门禁
- `ME6-3` 代表性企业微信真机门禁仍未关闭。
- MIF7 是下一批移动信息架构整改合同,当前仍为 TODO。
- R7 真实扩大试运行尚未启动。
+91 -92
查看文件
@@ -1,117 +1,116 @@
# hyb-oa 文档索引
**文档状态**:当前人工审查入口。
**适用时间**:2026-05-12 DOCG7 之后。
**文档状态**:当前唯一文档入口。
**适用时间**:DCL7 之后。
**治理口径**:中文优先,物理精简。已确认不用的历史文档不放 `docs/archive/`,直接从当前工作树移除;需要时从 git 历史恢复。
本索引用来区分“当前事实源”和“历史证据”。查需求、排期、开发范围时,先读当前事实源;排查历史实现、回归证据或旧决策时,再读历史快照和证据文档。
## 读取规则
## 归档判定规则
- 判断当前需求、开发、验收:读最新 Issue CSV、当前 PRD、模块规约和本索引。
- 判断历史证据:读轻量历史索引,必要时用 `git show <commit>:<old-path>` 恢复旧文档。
- 判断冲突:最新 Issue CSV > 当前 PRD/模块规约 > 设计和产品规则 > 当前操作手册 > 技术参考 > 历史证据。
- 英文文件名只在技术生态或脚本强引用时保留,例如 `docs/mcp-tools.md`。
本仓库采用“索引归档”策略治理历史文档:历史证据和过期口径保留原路径,不移动到 `docs/archive`,不批量删除,也不回写旧 Issue CSV。归档通过本文档分区和文档顶部状态说明完成。
## 最近事实源链
| 分类 | 判定标准 | 使用规则 |
| --- | --- | --- |
| 当前事实源 | PRD、模块规约、产品口径、设计规则、AGENTS 项目规则 | 可以直接指导需求确认、Issue CSV 拆分、开发和验收 |
| 当前操作手册 | 管理员、员工、试运行、部署和真机复核手册 | 用于当前试运行、上线和人工验收;与 PRD 冲突时以 PRD 和最新 Issue CSV 为准 |
| 历史证据 | 实现状态矩阵、trialrun 报告和 CSV、旧 TODO、旧实施计划 | 只用于追溯功能是否做过、当时怎么验过;不作为当前需求来源 |
| 技术参考 | 架构、集成边界、领域事件、MCP、ops、ADR | 用于理解运行时边界和技术约束;不能单独扩大当前 MVP 范围 |
| 历史归档参考 | 一次性方案、早期选型、迁移映射和外部调研快照 | 只作审计和追溯;若要重新启用,必须先更新 PRD 或模块规约并新建 Issue CSV |
判断冲突时,优先级固定为:最新 Issue CSV > 当前 PRD 和模块规约 > 产品口径文档 > 当前操作手册 > 技术参考 > 历史证据和归档参考。
如果历史矩阵、旧计划、旧 runbook 或旧 trialrun 记录里出现“当前”“下一批”“公网仍需”“待执行”等旧阶段措辞,但该文档没有在 2026-05-12 之后刷新,应按历史证据读取,不得覆盖最新 Issue CSV 和当前模块规约。
## 最近事实源更新链
当前事实链为:R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> MIF7(TODO)。
R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> MIF7(TODO)。
- R6、PC6、PA6、FL6、AP6、RI6、LP6 已完成并部署。
- ME6 自动化、部署和公网视觉矩阵已完成;`ME6-3` 代表性企业微信真机门禁仍待确认。
- ME6 自动化和公网视觉矩阵已完成;`ME6-3` 代表性企业微信真机门禁仍待确认。
- QG6 已完成 QA 治理升级。
- DG7/MRF7 已完成移动信息去重和真机反馈第一轮修复。
- MIA7 已完成移动信息架构、视觉和流程审查;MIF7 是下一批移动整改合同,尚未实施。
- R7/OPS7/DOC7 是准备材料,不代表已上线、已启动真实 R7 或已经扩大试运行。
- R7/OPS7/DOC7 是准备材料,不代表已上线或已启动真实 R7。
## 当前事实源
| 文档 | 用途 | 注意 |
| --- | --- | --- |
| [海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md) | 当前 PRD 主事实源,回答做什么、先做什么、不做什么、如何验收,并固定标准软件开发流程 | 后续需求变更先改这里或对应规则文档,再拆 Issue CSV |
| [需求 - 统一审批中心规约](./需求-统一审批中心规约.md) | 统一审批中心模块级开发规约,包含审批规则矩阵、状态流转和权限数据范围 | 审批相关开发拆 Issue CSV 前必须参考 |
| [需求 - 报销发票 OCR 规约](./需求-报销发票OCR规约.md) | 报销、发票、OCR、附件、付款和导出模块级开发规约,包含费用类型矩阵、人工复核和验收数据集 | 报销主链路开发拆 Issue CSV 前必须参考 |
| [需求 - 企业微信基础设施规约](./需求-企业微信基础设施规约.md) | 企业微信入口、免登/绑定、通讯录身份、消息通知、deeplink 和打卡采集边界规约 | 企业微信相关开发拆 Issue CSV 前必须参考 |
| [需求 - 请假考勤修正规约](./需求-请假考勤修正规约.md) | 请假、补卡、外出、加班与考勤修正模块级开发规约 | 考勤修正相关开发拆 Issue CSV 前必须参考 |
| [需求 - 采购费用审批规约](./需求-采购费用审批规约.md) | 采购申请、费用申请、供应商、金额、项目、附件、审批规则和业务关联模块级开发规约 | 采购/费用相关开发拆 Issue CSV 前必须参考 |
| [需求 - 合同附件归档规约](./需求-合同附件归档规约.md) | 合同台账、编号、非涉密附件、归档位置、权限审计和业务关联模块级开发规约 | 合同与附件归档相关开发拆 Issue CSV 前必须参考 |
| [需求 - 项目轻管理规约](./需求-项目轻管理规约.md) | 项目基础信息、成员、里程碑、任务、风险、交付记录和业务关联模块级开发规约 | 项目轻管理相关开发拆 Issue CSV 前必须参考 |
| [产品口径文档](./product-decisions.md) | 已拍板的产品边界和业务规则 | 与 PRD 冲突时,以更新后的 PRD 和最新 Issue CSV 为准 |
| [报销、发票与附件规则](./reimbursement-invoice-rules.md) | 报销、发票、OCR、附件的细则 | 报销相关开发必须同时参考 |
| [产品设计规则基线](./product-design-rules.md) | PC、移动、企业微信 WebView 的视觉和交互规则 | 页面调整必须参考 |
| [文档事实源状态矩阵](./文档事实源状态矩阵.md) | DOCG7 后的文档分类、当前口径和历史证据边界 | 判断文档是否能指导当前开发时先查这里 |
| [测试规约与回归门禁](./测试规约与回归门禁.md) | 当前测试事实源,固定自动化、视觉验证、真机 smoke、SKIP 和状态回填规则 | A3-A8 开发和后续非微小改动必须参考 |
| [开发交付与变更管理规约](./开发交付与变更管理规约.md) | 当前开发交付事实源,固定 Issue 生命周期、review、commit、工作区和完成输出规则 | 提交和交付前必须参考 |
| [AGENTS 项目规则](../AGENTS.md) | Agent 协作、Issue CSV、测试和提交规则 | 执行开发前必须遵守 |
| 文档 | 用途 |
| --- | --- |
| [海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md) | PRD 主事实源 |
| [文档事实源状态矩阵](./文档事实源状态矩阵.md) | 文档分类、删除恢复和冲突规则 |
| [产品设计规则](./产品设计规则.md) | PC、移动、企业微信 WebView 设计事实源 |
| [产品口径](./产品口径.md) | 已拍板产品边界和业务规则 |
| [需求 - 统一审批中心规约](./需求-统一审批中心规约.md) | 审批、催办、超时提醒、审批效率 |
| [报销发票附件规则](./报销发票附件规则.md) | 报销、发票、OCR、附件细则 |
| [需求 - 报销发票 OCR 规约](./需求-报销发票OCR规约.md) | 报销发票 OCR 模块规约 |
| [需求 - 企业微信基础设施规约](./需求-企业微信基础设施规约.md) | 企业微信入口、身份、消息、deeplink |
| [需求 - 请假考勤修正规约](./需求-请假考勤修正规约.md) | 请假、补卡、考勤修正 |
| [需求 - 采购费用审批规约](./需求-采购费用审批规约.md) | 采购、费用、附件、审批规则 |
| [需求 - 合同附件归档规约](./需求-合同附件归档规约.md) | 合同台账和附件归档边界 |
| [需求 - 项目轻管理规约](./需求-项目轻管理规约.md) | 项目轻管理边界 |
| [测试规约与回归门禁](./测试规约与回归门禁.md) | 自动化、视觉、真机、状态回填 |
| [开发交付与变更管理规约](./开发交付与变更管理规约.md) | Issue CSV、review、提交和交付 |
| [Agent开发交付实践](./Agent开发交付实践.md) | Agent 协作和交付实践 |
| [AGENTS 项目规则](../AGENTS.md) | 执行硬约束 |
## 当前操作手册
| 文档 | 用途 | 注意 |
| --- | --- | --- |
| [管理员手册](./admin-handbook.md) | 管理员上线、企业微信入口、权限、试点配置 | 适合小团队试运行 |
| [员工快速上手](./employee-quickstart.md) | 员工侧日常使用说明 | 面向普通员工 |
| [试运行与自动化验证 Runbook](./trialrun-runbook.md) | 本地、公网、企业微信试运行操作 | 涉及公网或企业微信真机时必须看 |
| [发布试运行准备清单](./trialrun/release-readiness-checklist.md) | 发布候选证据、权限直连审计、部署预检、live smoke 和小范围试运行顺序 | 从本地可回归进入公网/真机验收前必须看 |
| [公网 live smoke 与真实 OCR 准备清单](./trialrun/live-smoke-readiness.md) | 公网、真实 OCR、企业微信入口复核准备 | 只有部署后才能给出真机验收结论 |
| [真机公网测试清单](./trialrun/real-device-public-checklist.md) | 手机、企业微信、PDF 发票上传人工验证 | 用于上线前人工验收 |
| [R7 扩大试运行草案](./trialrun/r7-expanded-trialrun-prep.md) | R7 参与角色、范围、门禁、问题分级、每日收口和退出标准草案 | 仅为草案;真实 R7 仍需用户确认人员、窗口和 ME6-3 真机门禁或风险接受 |
| [OPS7 运维交接 Runbook](./trialrun/ops7-runbook.md) | 部署、回滚、备份恢复、账号交接、live readiness 和企业微信通知检查清单 | 不代表已执行生产配置变更、恢复演练或回滚 |
| [DOC7 试运行用户手册与 FAQ](./trialrun/r7-user-guide-and-faq.md) | 员工、审批人、财务在 R7 中使用报销、请假、采购、审批、企业微信和财务台账的说明 | 只描述当前已实现能力,不承诺预算、ERP、AI、完整差旅、复杂 BPM 或审批设计器 |
| 文档 | 用途 |
| --- | --- |
| [管理员手册](./管理员手册.md) | 管理员上线、权限、试运行配置 |
| [员工快速上手](./员工快速上手.md) | 员工侧使用说明 |
| [试运行与自动化验证手册](./试运行与自动化验证手册.md) | 本地、公网、企业微信和真实 OCR 验证 |
| [发布试运行准备清单](./trialrun/发布试运行准备清单.md) | 发布候选、权限审计、部署预检和试运行门禁 |
| [公网 Live Smoke 准备清单](./trialrun/公网LiveSmoke准备清单.md) | 公网、真实 OCR、企业微信入口复核条件 |
| [真机公网测试清单](./trialrun/真机公网测试清单.md) | 真实手机、企业微信、移动浏览器人工验收 |
## 实现状态与证据
## 草案和准备材料
| 文档 | 用途 | 注意 |
| --- | --- | --- |
| [实现状态矩阵](./feature-matrix.md) | 历史实现状态、完成证据、回归覆盖追踪 | 历史证据,不是 PRD,不作为新增需求来源 |
| [试运行覆盖矩阵](./trialrun/coverage-matrix.csv) | 试运行覆盖范围和缺口 | 历史证据;读取时结合最新 Issue CSV,不单独决定当前范围 |
| [项目级流程矩阵](./trialrun/project-wide-flow-matrix.csv) | 核心业务流、入口、测试覆盖映射 | 历史证据和 QA 参考,不作为当前需求来源 |
| [人工业务试运行报告](./trialrun/manual-trialrun-report.md) | R70 历史基底和 R6 之后批次收口追加记录 | 历史基底 + 当前追加证据;读取时看最新条目和最新 Issue CSV |
| [历史 TODO 清账映射](./todo-reconciliation.md) | 旧 TODO 的 implemented / superseded / still-open 追溯 | 历史证据,不用来生成新需求 |
| 文档 | 边界 |
| --- | --- |
| [R7 扩大试运行草案](./trialrun/R7扩大试运行草案.md) | 只做 R7 准备;真实 R7 未启动 |
| [OPS7 运维交接 Runbook](./trialrun/OPS7运维交接Runbook.md) | 不代表已执行生产配置变更、恢复演练或回滚 |
| [R7 用户手册与 FAQ](./trialrun/R7用户手册与FAQ.md) | 只描述已实现能力,不承诺预算、ERP、AI、完整差旅或复杂 BPM |
## 架构、集成与运维参考
## 历史证据入口
| 文档 | 用途 | 注意 |
| --- | --- | --- |
| [系统架构概览](./architecture.md) | 当前架构、部署视图和运行时边界 | 与部署现状有关时需结合最新部署报告 |
| [集成边界冻结](./integration-boundaries.md) | ERP、IM、AI、MCP、PWA 等集成边界 | 技术参考和历史证据;当前首批路线不接入飞书/钉钉,不因本文档扩大 ERP/AI 范围 |
| [领域事件清单](./domain-events.md) | 领域事件名和对外事件边界 | 技术参考和历史证据;面向集成和异步处理,不作为当前 MVP 扩围依据 |
| [MCP Tools](./mcp-tools.md) | MCP 工具启用边界 | 未启用的 MCP 不得假设可用 |
| [非功能基线](./ops/non-functional-baseline.md) | 安全、性能、回滚、上线最低要求 | 上线和发布前参考 |
| [测试策略](./ops/testing-strategy.md) | 自动化测试和门禁策略 | QA 规划参考 |
| [Agent 交付实践](./agent-development-practices.md) | Agent 协作开发、Issue CSV、验证和提交实践 | 与 PRD 第 2 章的软件开发流程配套阅读 |
| 文档 | 用途 |
| --- | --- |
| [历史功能状态矩阵](./历史功能状态矩阵.md) | 轻量历史功能索引;旧大表从 git 历史恢复 |
| [人工试运行报告](./trialrun/人工试运行报告.md) | R6 后当前状态和关键证据索引 |
| [试运行覆盖矩阵](./trialrun/试运行覆盖矩阵.csv) | 轻量覆盖摘要 |
| [项目级流程覆盖矩阵](./trialrun/项目级流程覆盖矩阵.csv) | `check-flow-coverage` 使用的最小流程矩阵 |
| [权限直连审计记录](./trialrun/权限直连审计记录.md) | 权限直连审计证据 |
| [移动信息架构视觉流程审查](./trialrun/移动信息架构视觉流程审查.md) | MIA7 审查结论,整改仍以 MIF7 为准 |
## 历史快照与归档参考
## 技术参考
| 文档 | 用途 | 注意 |
| --- | --- | --- |
| [实施计划](./implementation_plan.md) | 2026-02 Phase 1 引导计划和历史实施思路 | 历史归档参考,不是当前执行计划 |
| [技术栈与复用报告](./tech_stack_report.md) | 早期技术选型定案和复用说明 | 历史归档参考;技术栈仍有参考价值,范围说明已过时 |
| [invoicePool 路由拆分方案](./invoice-pool-refactor-plan.md) | 一次性拆分方案归档 | 历史归档参考,完成后只作追溯 |
| [试点迁移映射清单](./migration-mapping.md) | 旧系统迁移和切换边界 | 历史归档参考,仅在迁移/切换专项中使用 |
| [国内 OA 与费控系统最佳实践对照](./trialrun/domestic-oa-best-practices.md) | 外部最佳实践调研快照 | 历史归档参考,不替代当前 PRD |
| [ADR: 移动端路线决策](./adr/adr-mobile-strategy.md) | PWA、RN、小程序路线决策记录 | 保留 ADR 历史结论 |
| [ADR: 企业卡/虚拟卡管控能力预研](./adr/adr-enterprise-card-control.md) | 企业卡能力预研记录 | 不进入当前 MVP 首批范围 |
| 文档 | 说明 |
| --- | --- |
| [架构概览](./架构概览.md) | 当前架构和运行时边界 |
| [集成边界](./集成边界.md) | ERP、IM、AI、MCP、PWA 集成边界;不扩大当前 MVP 范围 |
| [领域事件清单](./领域事件清单.md) | 领域事件名和对外事件边界 |
| [MCP Tools](./mcp-tools.md) | 脚本和 AGENTS 强引用,保留英文文件名 |
| [非功能基线](./ops/非功能基线.md) | 安全、性能、回滚、上线最低要求 |
| [SLO 错误预算](./ops/SLO错误预算.md) | SLO 和错误预算 |
| [测试策略](./ops/测试策略.md) | 自动化测试和门禁策略 |
| [CI 回归报告归档](./ops/CI回归报告归档.md) | CI 回归报告归档 |
| [DORA 指标](./ops/DORA指标.md) | CFR 等 DORA 指标 |
| [链路追踪策略](./ops/链路追踪策略.md) | OpenTelemetry 追踪策略 |
| [ADR: 移动端路线决策](./adr/移动端路线决策.md) | PWA、RN、小程序路线历史决策 |
| [ADR: 企业卡/虚拟卡管控预研](./adr/企业卡虚拟卡管控预研.md) | 企业卡能力预研 |
## 已从当前树移除
这些文档不再作为当前资料维护;需要时从 git 历史恢复,例如 `git show 5da05eb:<旧路径>`。
| 旧路径 | 恢复说明 |
| --- | --- |
| `docs/implementation_plan.md` | 早期实施计划 |
| `docs/tech_stack_report.md` | 早期技术栈报告 |
| `docs/invoice-pool-refactor-plan.md` | invoicePool 一次性拆分方案 |
| `docs/migration-mapping.md` | 旧迁移映射 |
| `docs/MVP主线代码差距盘点.md` | A1 旧盘点 |
| `docs/todo-reconciliation.md` | 旧 TODO 清账 |
| `docs/mobile/pwa-regression-checklist.md` | 旧 PWA 回归清单 |
| `docs/trialrun/domestic-oa-best-practices.md` | 旧外部调研快照 |
| `docs/trialrun/async-ux-audit.csv` | 旧异步体验审计 CSV |
| `docs/trialrun/deployment-preflight-2026-05-10.md` | 旧部署预检记录 |
| `docs/requirements-specification.md` | 旧 PRD 跳转入口 |
## 阅读顺序
1. 要看“现在到底做什么”:读 [海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md)。
2. 要细化审批、报销、企业微信、考勤修正、采购费用、合同归档或项目轻管理开发任务:读对应模块规约,再拆 `issues/*.csv`。
3. 要开新开发任务:先读 PRD 第 2 章的软件开发项目流程,再更新需求或规则文档,并新建 `issues/*.csv`。
4. 要看“某个业务规则为什么这么定”:读 [产品口径文档](./product-decisions.md) 和对应规则文档。
5. 要判断测试、视觉验证、SKIP、状态回填和提交规则:读 [测试规约与回归门禁](./测试规约与回归门禁.md) 和 [开发交付与变更管理规约](./开发交付与变更管理规约.md)。
6. 要判断功能是否已经做过:读 [实现状态矩阵](./feature-matrix.md) 和最新相关 Issue CSV。
7. 要上线或真机验收:读 [试运行与自动化验证 Runbook](./trialrun-runbook.md)、[发布试运行准备清单](./trialrun/release-readiness-checklist.md)、live smoke 清单和最新部署结果。
## 明确废弃或不进入首批
- 飞书路线已废弃,不接入登录、通知、审批、文档或项目管理。
- 企业微信原生审批不作为正式审批流;企业微信只做入口、免登/绑定、通讯录身份、消息通知和打卡原始采集。
- 钉钉、小程序、复杂 BPM、重型项目管理、CRM、完整 ERP 不进入当前 MVP 首批范围。
1. 新需求:PRD + 对应模块规约 + 最新 Issue CSV。
2. 页面体验:产品设计规则。
3. 报销/发票:报销发票附件规则 + 报销 OCR 规约。
4. 试运行/部署/真机:试运行手册 + 发布清单 + 真机清单。
5. 历史追溯:历史功能状态矩阵 + git 历史 + 相关 Issue CSV。
@@ -7,9 +7,9 @@
**相关文档**:
- [文档索引](./文档索引.md)
- [海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md)
- [实现状态矩阵](./feature-matrix.md)
- [试运行覆盖矩阵](trialrun/coverage-matrix.csv)
- [人工试运行报告](trialrun/manual-trialrun-report.md)
- [实现状态矩阵](./历史功能状态矩阵.md)
- [试运行覆盖矩阵](trialrun/试运行覆盖矩阵.csv)
- [人工试运行报告](trialrun/人工试运行报告.md)
**2026-05-04 已核实部署基线**:
- 公网入口:`https://oa.hyinda.com`
+1 -1
查看文件
@@ -114,5 +114,5 @@ Issue 状态回填必须基于证据:
- 主 PRD 回答“做什么、为什么、如何验收”。
- 本文回答“如何测试和何时可过门禁”。
- `docs/trialrun-runbook.md` 回答“本地、公网、企业微信、真实 OCR 怎么操作”。
- `docs/试运行与自动化验证手册.md` 回答“本地、公网、企业微信、真实 OCR 怎么操作”。
- `docs/开发交付与变更管理规约.md` 回答“如何 review、提交和交付变更”。
+8 -8
查看文件
@@ -7,11 +7,11 @@
**相关文档**:
- [文档索引](./文档索引.md):人工审查入口和文档阅读顺序。
- [产品口径文档](./product-decisions.md):关键产品决策与边界。
- [功能状态矩阵](./feature-matrix.md):历史实现状态、覆盖证据和完成追踪,不作为 PRD 扩写入口。
- [管理员手册](./admin-handbook.md):试运行配置、企业微信入口和上线操作。
- [员工快速开始](./employee-quickstart.md):员工侧使用说明。
- [报销与发票规则](./reimbursement-invoice-rules.md):报销、发票、OCR、附件的细则。
- [产品口径文档](./产品口径.md):关键产品决策与边界。
- [功能状态矩阵](./历史功能状态矩阵.md):历史实现状态、覆盖证据和完成追踪,不作为 PRD 扩写入口。
- [管理员手册](./管理员手册.md):试运行配置、企业微信入口和上线操作。
- [员工快速开始](./员工快速上手.md):员工侧使用说明。
- [报销与发票规则](./报销发票附件规则.md):报销、发票、OCR、附件的细则。
- [需求 - 统一审批中心规约](./需求-统一审批中心规约.md):审批中心模块级开发规约。
- [需求 - 报销发票 OCR 规约](./需求-报销发票OCR规约.md):报销、发票、OCR、附件模块级开发规约。
- [需求 - 企业微信基础设施规约](./需求-企业微信基础设施规约.md):企业微信入口、免登、绑定、通知、deeplink 和打卡采集边界规约。
@@ -147,7 +147,7 @@ OA 是公司唯一正式审批中心。以下审批必须在 OA 内提交、审
## 6. 报销、发票、OCR、附件与财务导出
本章保留总纲口径。报销、发票、OCR、附件、查重、财务复核、付款、导出、费用类型矩阵、人工验真和验收数据集,以 [需求 - 报销发票 OCR 规约](./需求-报销发票OCR规约.md) 作为后续开发拆分依据;历史细则继续参考 [报销与发票规则](./reimbursement-invoice-rules.md)。
本章保留总纲口径。报销、发票、OCR、附件、查重、财务复核、付款、导出、费用类型矩阵、人工验真和验收数据集,以 [需求 - 报销发票 OCR 规约](./需求-报销发票OCR规约.md) 作为后续开发拆分依据;历史细则继续参考 [报销与发票规则](./报销发票附件规则.md)。
### 6.1 用户流程
@@ -377,8 +377,8 @@ OA 是公司唯一正式审批中心。以下审批必须在 OA 内提交、审
## 14. 文档维护规则
- 本文件回答“要做什么、为什么做、先做什么、不做什么、如何验收”。
- `docs/product-decisions.md` 记录已经拍板的产品口径。
- `docs/feature-matrix.md` 记录已经实现了什么和证据在哪里。
- `docs/产品口径.md` 记录已经拍板的产品口径。
- `docs/历史功能状态矩阵.md` 记录已经实现了什么和证据在哪里。
- `issues/*.csv` 是每轮开发执行合同。
- 需求变化必须先更新本文件或对应规则文档,再创建新的 Issue CSV。
- 不批量回改旧 Issue CSV 来伪造一致性;历史计划保留为历史快照。
@@ -13,9 +13,9 @@
1. 读取 `AGENTS.md`。
2. 读取最新 `issues/*.csv`。
3. 按任务读取事实源:
- 设计:`docs/product-design-rules.md`
- 报销发票:`docs/reimbursement-invoice-rules.md`
- Agent 交付:`docs/agent-development-practices.md`
- 设计:`docs/产品设计规则.md`
- 报销发票:`docs/报销发票附件规则.md`
- Agent 交付:`docs/Agent开发交付实践.md`
4. 检查 `git status --short`,保护用户已有改动。
## 本地验证
@@ -82,7 +82,7 @@ cd client && npm run build
- 手机企业微信实际点击应用入口。
- 企业微信授权或绑定确认。
真机公网测试按 [`docs/trialrun/real-device-public-checklist.md`](trialrun/real-device-public-checklist.md) 执行。可先生成报告模板:
真机公网测试按 [`docs/trialrun/真机公网测试清单.md`](trialrun/真机公网测试清单.md) 执行。可先生成报告模板:
```bash
node scripts/qa/create-real-device-report.mjs
@@ -95,14 +95,14 @@ node scripts/qa/create-real-device-report.mjs
- `BLOCKED`:缺少测试账号、企业微信后台配置、样票或网络等前置条件。
- `PAUSED`:用户或现场条件暂停验证;自动化通过也不能据此关闭真机门禁或把相关 Issue 标为完成。
公网 live smoke 和真实 OCR 准备按 [`docs/trialrun/live-smoke-readiness.md`](trialrun/live-smoke-readiness.md) 执行:
公网 live smoke 和真实 OCR 准备按 [`docs/trialrun/公网LiveSmoke准备清单.md`](trialrun/公网LiveSmoke准备清单.md) 执行:
```bash
node scripts/qa/check-live-smoke-env.mjs
LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-live-smoke-readiness.sh
```
发布候选进入公网或小范围试运行前,先按 [`docs/trialrun/release-readiness-checklist.md`](trialrun/release-readiness-checklist.md) 完成证据整理、权限直连审计、部署预检、live smoke 和试运行分级。
发布候选进入公网或小范围试运行前,先按 [`docs/trialrun/发布试运行准备清单.md`](trialrun/发布试运行准备清单.md) 完成证据整理、权限直连审计、部署预检、live smoke 和试运行分级。
系统应避免让已绑定用户反复登录。若手机企业微信能进入但仍要求登录,优先检查:
@@ -278,7 +278,7 @@
### 9.3 差旅统付主线
- `P20+TRAVEL-1` 已完成差旅申请、行程段、审批预算与 `travel_orders` 入站整合,作为对公统付的前置流程基线。
- `P20+TRAVEL-2` 固定采用企业卡 / 虚拟卡授权与交易导入路线,优先复用 `docs/adr/adr-enterprise-card-control.md` 的既有结论。
- `P20+TRAVEL-2` 固定采用企业卡 / 虚拟卡授权与交易导入路线,优先复用 `docs/adr/企业卡虚拟卡管控预研.md` 的既有结论。
- `P20+TRAVEL-3` 固定负责核销闭环与 ERP / AP 摘要桥接;个人垫资报销继续与对公统付并存,不互相替代。
### 9.4 PWA 兑现顺序
+1 -1
查看文件
@@ -5,7 +5,7 @@
**状态**:模块级开发规约
**上级事实源**:[海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md)
**审批总依据**:[需求 - 统一审批中心规约](./需求-统一审批中心规约.md)
**体验总依据**:[产品设计规则基线](./product-design-rules.md)
**体验总依据**:[产品设计规则基线](./产品设计规则.md)
本规约细化合同台账、合同编号、非涉密附件、归档位置、权限审计和业务关联要求。合同审批、合同变更审批和归档动作仍回到 OA 统一审批中心留痕;PC 和移动页面模式以产品设计规则基线为体验依据;本规约不替代公司法务制度。
+1 -1
查看文件
@@ -4,7 +4,7 @@
**日期**:2026-05-09
**状态**:模块级开发规约
**上级事实源**:[海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md)
**细则来源**:[报销、发票与附件规则](./reimbursement-invoice-rules.md)
**细则来源**:[报销、发票与附件规则](./报销发票附件规则.md)
本规约细化报销、发票、OCR、附件、查重、财务复核、付款和导出的产品要求。后续报销主链路开发必须先从本规约拆分 Issue CSV,再进入技术方案和代码实现。
+1 -1
查看文件
@@ -5,7 +5,7 @@
**状态**:模块级开发规约
**上级事实源**:[海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md)
**相关事实源**:[需求 - 统一审批中心规约](./需求-统一审批中心规约.md)、[需求 - 企业微信基础设施规约](./需求-企业微信基础设施规约.md)
**体验总依据**:[产品设计规则基线](./product-design-rules.md)
**体验总依据**:[产品设计规则基线](./产品设计规则.md)
本规约细化请假、补卡、外出、加班与考勤修正的产品要求。正式审批记录以 OA 为准;企业微信打卡只作为原始采集来源,不直接决定最终考勤结论。PC 和移动页面体验以产品设计规则基线为依据,不重复定义通用审批链和移动导航规则。
+1 -1
查看文件
@@ -5,7 +5,7 @@
**状态**:模块级开发规约
**上级事实源**:[海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md)
**审批总依据**:[需求 - 统一审批中心规约](./需求-统一审批中心规约.md)
**体验总依据**:[产品设计规则基线](./product-design-rules.md)
**体验总依据**:[产品设计规则基线](./产品设计规则.md)
本规约细化采购申请和费用申请的业务边界、字段、状态、权限、异常、验收场景和后续开发拆分建议。审批动作、状态机、审批规则矩阵、权限数据范围和留痕要求,以统一审批中心规约为总依据;PC 和移动页面模式以产品设计规则基线为体验依据;本规约只补充采购和费用业务自身规则。
+1 -1
查看文件
@@ -4,7 +4,7 @@
**日期**:2026-05-09
**状态**:模块级开发规约
**上级事实源**:[海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md)
**审批与体验依据**:[需求 - 统一审批中心规约](./需求-统一审批中心规约.md)、[产品设计规则基线](./product-design-rules.md)
**审批与体验依据**:[需求 - 统一审批中心规约](./需求-统一审批中心规约.md)、[产品设计规则基线](./产品设计规则.md)
本规约细化项目轻管理的业务边界、字段、状态、角色、业务关联、异常、验收场景和后续开发拆分建议。项目页目标是汇总关键事项和业务关联,帮助 10 人以下科技公司看清项目交付、风险和费用,不替代专业项目管理工具。项目相关审批和待办回到统一审批中心,PC 和移动页面模式以产品设计规则基线为依据。
@@ -0,0 +1,8 @@
ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes
DCL7-1,建立文档物理精简合同,"建立 DCL7 文档物理精简与中英文口径治理合同,固定删除、压缩、重命名、引用修复和验证范围。","1) DCL7 CSV 存在且校验通过;2) 明确本批只改文档、脚本引用和 Issue CSV;3) 不改业务代码、不部署、不读取密钥;4) 明确历史恢复方式为 git 历史。","流程级验证:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-12_22-38-40-docs-physical-cleanup-language-governance.csv。",python3,DONE,DONE,DONE,issues/2026-05-12_22-38-40-docs-physical-cleanup-language-governance.csv,[],只做文档治理;删除历史文档通过 git 历史恢复。
DCL7-2,删除确认不用的历史文档,"从当前 docs 树物理删除一次性历史计划、旧盘点、旧迁移映射、旧 PWA 清单、旧调研快照、旧部署预检记录和旧 PRD 跳转入口。","1) 指定历史文件已从 git 跟踪树移除;2) 不新建 docs/archive;3) 索引和状态矩阵记录这些材料已移除且可从 git 历史恢复;4) 当前事实源不依赖这些文件。","流程级验证:git status --short 显示目标文件删除;rg 旧文件名命中只允许出现在 DCL7 CSV、索引或状态矩阵的已移除说明。",git|rg,DONE,DONE,DONE,docs/implementation_plan.md|docs/tech_stack_report.md|docs/invoice-pool-refactor-plan.md|docs/migration-mapping.md|docs/MVP主线代码差距盘点.md|docs/todo-reconciliation.md|docs/mobile/pwa-regression-checklist.md|docs/trialrun/domestic-oa-best-practices.md|docs/trialrun/async-ux-audit.csv|docs/trialrun/deployment-preflight-2026-05-10.md|docs/requirements-specification.md,["DCL7-1"],不删除真实业务数据或运行时代码。
DCL7-3,压缩脚本依赖历史证据,"压缩 feature-matrix、manual-trialrun-report、coverage-matrix 和 project-wide-flow-matrix;同步 validate-feature-matrix 与 flow coverage 脚本,使它们不依赖旧大表或误导性长流水。","1) feature-matrix 成为轻量历史索引;2) manual report 保留 R6 后状态和关键证据索引;3) flow matrix 保留脚本所需最小当前覆盖数据;4) 相关脚本检查通过。","流程级验证:python3 scripts/validate-feature-matrix.py;node scripts/qa/check-flow-coverage.mjs --json。",python3|node,DONE,DONE,DONE,docs/feature-matrix.md|docs/trialrun/manual-trialrun-report.md|docs/trialrun/coverage-matrix.csv|docs/trialrun/project-wide-flow-matrix.csv|scripts/validate-feature-matrix.py|scripts/qa/check-flow-coverage.mjs,["DCL7-2"],压缩不改变业务状态;历史细节从 git 历史恢复。
DCL7-4,当前可读文档中文化,"将当前事实源、操作手册和用户可读文档改为中文文件名;脚本强引用或技术标准相关英文名暂留并在索引说明。","1) 管理员、员工、试运行、产品规则、产品口径、报销规则、架构、集成边界、领域事件等可读文档路径中文化;2) docs/mcp-tools.md 等脚本强引用文档保留英文名且在索引说明;3) 全局引用已修复。","流程级验证:rg -n '\\]\\(([^)#]+\\.md|[^)#]+\\.csv)' docs .agents AGENTS.md 人工抽查重命名链接;python3 scripts/validate-mcp-tools.py。",rg|python3,DONE,DONE,DONE,docs/*.md|docs/trialrun/*.md|AGENTS.md|.agents/skills/hyb-oa-delivery/SKILL.md|docs/agent-development-practices.md,["DCL7-3"],中文优先;不强行重命名脚本硬依赖技术文档。
DCL7-5,重写索引和状态矩阵,"将 docs/文档索引.md 改为唯一文档入口,只列当前可用文档、少量技术参考和已移除历史说明;同步 docs/文档事实源状态矩阵.md。","1) 索引清楚区分当前事实源、当前手册、技术参考、草案和已移除历史;2) 状态矩阵不再把已删除文档列为当前路径;3) R7 未启动、ME6-3 未关闭、MIF7 未完成口径不变。","流程级验证:rg -n '已从当前树移除|中文优先|ME6-3|MIF7|R7 未真实启动' docs/文档索引.md docs/文档事实源状态矩阵.md。",rg,DONE,DONE,DONE,docs/文档索引.md|docs/文档事实源状态矩阵.md,["DCL7-4"],不隐藏历史,只把历史移出当前工作树。
DCL7-6,治理引用和交付规则,"更新 AGENTS、Skill 和 Agent 交付实践,固定中文优先、删除历史文档通过 git 恢复、当前开发先读文档索引的规则。","1) AGENTS 和 Skill 指向新中文路径;2) 交付实践说明文档精简策略;3) 不再引用已删除英文/历史路径;4) Skill 校验通过。","流程级验证:python3 /home/shunli/.codex/skills/.system/skill-creator/scripts/quick_validate.py .agents/skills/hyb-oa-delivery;rg 旧路径确认无未解释引用。",python3|rg,DONE,DONE,DONE,AGENTS.md|.agents/skills/hyb-oa-delivery/SKILL.md|docs/agent-development-practices.md,["DCL7-5"],不改变项目协作硬约束,只更新文档路径。
DCL7-7,校验状态回填与提交,"执行 DCL7 全部校验、回填状态并提交中文 commit。","1) DCL7 CSV 校验通过;2) validate-feature-matrix、check-flow-coverage、validate-mcp-tools、Skill 校验通过;3) 旧文件名巡检仅命中允许位置;4) git diff --check 通过;5) 中文提交引用 DCL7。","流程级验证:validate_issues_csv.py 本 CSV;python3 scripts/validate-feature-matrix.py;node scripts/qa/check-flow-coverage.mjs --json;python3 scripts/validate-mcp-tools.py;quick_validate.py .agents/skills/hyb-oa-delivery;git diff --check。",python3|node|git|rg,DONE,DONE,DONE,issues/2026-05-12_22-38-40-docs-physical-cleanup-language-governance.csv,["DCL7-6"],本批不跑前后端构建,不部署公网。
无法渲染此文件,因为它包含了意外字符,其位于第 3 行和第 977 列。
+1 -1
查看文件
@@ -48,7 +48,7 @@
- **当前执行合同**:优先查看时间最新且已批准的 `issues/*.csv`;当前治理收口入口为 [2026-05-05_20-01-18-r90-r91-trialrun-closeout.csv](/home/shunli/Projects/hyb-oa/issues/2026-05-05_20-01-18-r90-r91-trialrun-closeout.csv:1)。
- **历史蓝图链**:P5 相关只把 [2026-02-09_13-39-02-p5-blueprint-v3.csv](/home/shunli/Projects/hyb-oa/issues/2026-02-09_13-39-02-p5-blueprint-v3.csv:1) 视为权威完成态;[2026-02-09_11-17-07-p5-blueprint.csv](/home/shunli/Projects/hyb-oa/issues/2026-02-09_11-17-07-p5-blueprint.csv:1) 和 [2026-02-09_12-34-42-p5-blueprint-v2.csv](/home/shunli/Projects/hyb-oa/issues/2026-02-09_12-34-42-p5-blueprint-v2.csv:1) 保留为历史快照,不再单独作为当前待办来源。
- **试运行链**:本地/外部试运行相关优先串读 `R70 -> R71 -> R73 -> R74 -> R75 -> R76 -> R77 -> R78 -> R79 -> R80 -> R82 -> R83-R86 -> R87 -> R88 -> R89 -> R90/R91`,不要只看单一 CSV 判断系统状态。
- **跨文档事实源**:业务能力现状优先结合 [feature-matrix.md](/home/shunli/Projects/hyb-oa/docs/feature-matrix.md:1)、[coverage-matrix.csv](/home/shunli/Projects/hyb-oa/docs/trialrun/coverage-matrix.csv:1) 和 [manual-trialrun-report.md](/home/shunli/Projects/hyb-oa/docs/trialrun/manual-trialrun-report.md:1) 阅读。
- **跨文档事实源**:业务能力现状优先结合 [历史功能状态矩阵.md](/home/shunli/Projects/hyb-oa/docs/历史功能状态矩阵.md:1)、[试运行覆盖矩阵.csv](/home/shunli/Projects/hyb-oa/docs/trialrun/试运行覆盖矩阵.csv:1) 和 [人工试运行报告.md](/home/shunli/Projects/hyb-oa/docs/trialrun/人工试运行报告.md:1) 阅读。
## 历史合同处理原则
- 不批量回改旧 CSV 的 `TODO/DOING/DONE` 来伪造一致性。
+1 -1
查看文件
@@ -5,7 +5,7 @@ import path from "node:path";
const rootDir = path.resolve(new URL("../..", import.meta.url).pathname);
const routerPath = path.join(rootDir, "client/src/router/index.tsx");
const navSchemaPath = path.join(rootDir, "client/src/features/navigation/schema.ts");
const flowMatrixPath = path.join(rootDir, "docs/trialrun/project-wide-flow-matrix.csv");
const flowMatrixPath = path.join(rootDir, "docs/trialrun/项目级流程覆盖矩阵.csv");
const serverRoutesDir = path.join(rootDir, "server/src/routes");
const e2eDir = path.join(rootDir, "client/tests/e2e");
+72 -142
查看文件
@@ -1,176 +1,106 @@
#!/usr/bin/env python3
"""Validate docs/feature-matrix.md against execution-contract CSV sources.
"""Validate the lightweight DCL7 document status baseline.
Checks:
- feature-matrix contains exactly one row per ID in CSV fact sources
- every ID from CSVs appears in matrix
- matrix does not contain unknown IDs
- every matrix row status equals DONE
- every fact-source CSV row is fully DONE on Dev/Review1/Regression axes
DCL7 removed the old full feature matrix from the current docs tree. Historical
details remain recoverable from git history and issue CSVs. This check now
guards the current lightweight status docs and the latest issue CSV contract
shape instead of requiring a large duplicated feature table.
"""
from __future__ import annotations
import csv
import re
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
MATRIX_PATH = ROOT / "docs" / "feature-matrix.md"
CSV_FACT_SOURCES = [
ROOT / "issues" / "2026-02-09_13-39-02-p5-blueprint-v3.csv",
ROOT / "issues" / "2026-02-09_23-30-00-p6-p8-remaining-work-master.csv",
ROOT / "issues" / "2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv",
ROOT / "issues" / "2026-02-10_10-35-30-p10-production-hardening.csv",
ROOT / "issues" / "2026-02-11-p11-p12-governance-mobile.csv",
ROOT / "issues" / "2026-02-12_01-09-41-p13-l5-governance.csv",
ROOT / "issues" / "2026-02-13_00-11-56-p14-l5-operationalization.csv",
ROOT / "issues" / "2026-03-06_14-30-00-p15a-l5-permission-decouple.csv",
ROOT / "issues" / "2026-03-06_14-30-00-p15b-l5-leave-v1.csv",
ROOT / "issues" / "2026-03-07_13-47-05-p16a-l5-master-data-core.csv",
ROOT / "issues" / "2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv",
ROOT / "issues" / "2026-03-07_17-14-39-p16c-l5-suppliers.csv",
ROOT / "issues" / "2026-03-07_18-15-03-r9-g2-p19-roadmap-refresh.csv",
ROOT / "issues" / "2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv",
ROOT / "issues" / "2026-03-07_19-33-09-p17a-l5-procurement-core.csv",
ROOT / "issues" / "2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv",
ROOT / "issues" / "2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv",
ROOT / "issues" / "2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv",
ROOT / "issues" / "2026-03-07_23-22-00-p19-l4-integration-readiness.csv",
ROOT / "issues" / "2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv",
ROOT / "issues" / "2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv",
ROOT / "issues" / "2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv",
ROOT / "issues" / "2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv",
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",
ROOT / "issues" / "2026-03-10_21-05-59-p20-travel-2-l5-corporate-payments-refresh.csv",
ROOT / "issues" / "2026-03-11_09-57-28-p20-travel-3-l5-reconciliation-erp-bridge-refresh.csv",
ROOT / "issues" / "2026-03-11_17-50-39-p21-pwa-1-l5-asset-scan-refresh.csv",
ROOT / "issues" / "2026-03-12_04-32-13-p21-pwa-2-l5-offline-deeplink-refresh.csv",
ROOT / "issues" / "2026-03-12_16-58-44-p22-prod-1-l5-production-hardening.csv",
ROOT / "issues" / "2026-03-13_10-30-00-r11-contract-reconciliation-and-spec-refresh.csv",
]
MATRIX_PATH = ROOT / "docs" / "历史功能状态矩阵.md"
STATE_MATRIX_PATH = ROOT / "docs" / "文档事实源状态矩阵.md"
INDEX_PATH = ROOT / "docs" / "文档索引.md"
ISSUES_DIR = ROOT / "issues"
ID_PATTERN = re.compile(r"^[A-Z][0-9][0-9A-Za-z-]*$")
STATUS_INDEX = 6
REQUIRED_COLUMNS = {
"ID",
"Title",
"Description",
"Acceptance",
"Test_Method",
"Tools",
"Dev_Status",
"Review1_Status",
"Regression_Status",
"Files",
"Dependencies",
"Notes",
}
def load_csv_rows(path: Path) -> list[dict[str, str]]:
with path.open(encoding="utf-8", newline="") as fp:
return list(csv.DictReader(fp))
def read_text(path: Path) -> str:
return path.read_text(encoding="utf-8")
def collect_expected_ids_and_source_status(paths: list[Path]) -> tuple[list[str], list[str]]:
ids: list[str] = []
source_errors: list[str] = []
def validate_latest_issue_csv() -> list[str]:
errors: list[str] = []
csv_files = sorted(ISSUES_DIR.glob("*.csv"))
if not csv_files:
return ["No issue CSV files found"]
latest = csv_files[-1]
with latest.open(encoding="utf-8", newline="") as fp:
reader = csv.DictReader(fp)
columns = set(reader.fieldnames or [])
missing = sorted(REQUIRED_COLUMNS - columns)
if missing:
errors.append(f"{latest.name} missing columns: {missing}")
rows = list(reader)
if not rows:
errors.append(f"{latest.name} has no issue rows")
for path in paths:
rows = load_csv_rows(path)
for row in rows:
row_id = (row.get("ID") or "").strip()
if not row_id:
continue
ids.append(row_id)
for key in ("Dev_Status", "Review1_Status", "Regression_Status"):
value = (row.get(key) or "").strip()
if value not in {"TODO", "DOING", "DONE"}:
errors.append(f"{latest.name}:{row.get('ID')} invalid {key}={value!r}")
dev_status = (row.get("Dev_Status") or "").strip().upper()
review_status = (row.get("Review1_Status") or "").strip().upper()
regression_status = (row.get("Regression_Status") or "").strip().upper()
if not (dev_status == review_status == regression_status == "DONE"):
source_errors.append(
f"{path.name}:{row_id} source status not all DONE "
f"(Dev={dev_status}, Review1={review_status}, Regression={regression_status})"
)
return ids, source_errors
def load_matrix_rows(path: Path) -> list[list[str]]:
rows: list[list[str]] = []
for line in path.read_text(encoding="utf-8").splitlines():
stripped = line.strip()
if not stripped.startswith("|"):
continue
if stripped.startswith("| ---"):
continue
parts = [part.strip() for part in stripped.strip("|").split("|")]
if not parts:
continue
row_id = parts[0]
if not ID_PATTERN.match(row_id):
continue
rows.append(parts)
return rows
return errors
def main() -> int:
errors: list[str] = []
if not MATRIX_PATH.exists():
errors.append(f"Missing matrix file: {MATRIX_PATH}")
for path in (MATRIX_PATH, STATE_MATRIX_PATH, INDEX_PATH):
if not path.exists():
errors.append(f"Missing required doc: {path.relative_to(ROOT)}")
for source in CSV_FACT_SOURCES:
if not source.exists():
errors.append(f"Missing csv file: {source}")
if not errors:
matrix = read_text(MATRIX_PATH)
state = read_text(STATE_MATRIX_PATH)
index = read_text(INDEX_PATH)
required_matrix_markers = [
"历史功能状态矩阵",
"git show 5da05eb:docs/feature-matrix.md",
"MIF7",
"ME6-3",
]
for marker in required_matrix_markers:
if marker not in matrix:
errors.append(f"{MATRIX_PATH.relative_to(ROOT)} missing marker: {marker}")
for marker in ("中文优先", "已从当前树移除", "MIF7", "ME6-3"):
if marker not in state and marker not in index:
errors.append(f"status/index docs missing marker: {marker}")
errors.extend(validate_latest_issue_csv())
if errors:
for err in errors:
print(f"[ERR] {err}")
return 1
expected_ids, source_status_errors = collect_expected_ids_and_source_status(CSV_FACT_SOURCES)
matrix_rows = load_matrix_rows(MATRIX_PATH)
matrix_ids = [row[0] for row in matrix_rows]
expected_id_set = set(expected_ids)
matrix_id_set = set(matrix_ids)
missing_in_matrix = sorted(expected_id_set - matrix_id_set)
extra_in_matrix = sorted(matrix_id_set - expected_id_set)
if missing_in_matrix:
errors.append(f"IDs missing in matrix: {missing_in_matrix}")
if extra_in_matrix:
errors.append(f"Extra IDs in matrix: {extra_in_matrix}")
duplicate_matrix_ids = sorted({item for item in matrix_ids if matrix_ids.count(item) > 1})
if duplicate_matrix_ids:
errors.append(f"Duplicate IDs in matrix: {duplicate_matrix_ids}")
if len(matrix_ids) != len(expected_ids):
errors.append(f"Row count mismatch: matrix={len(matrix_ids)} expected={len(expected_ids)}")
duplicate_expected_ids = sorted({item for item in expected_ids if expected_ids.count(item) > 1})
if duplicate_expected_ids:
errors.append(f"Duplicate IDs in fact-source CSVs: {duplicate_expected_ids}")
for row in matrix_rows:
if len(row) <= STATUS_INDEX:
errors.append(f"Malformed matrix row (too few columns): {row}")
continue
status = row[STATUS_INDEX].upper()
if status != "DONE":
errors.append(f"Non-DONE status in matrix for {row[0]}: {row[STATUS_INDEX]}")
errors.extend(source_status_errors)
if errors:
print("[ERR] feature-matrix validation failed")
print("[ERR] lightweight document status validation failed")
for err in errors:
print(f" - {err}")
return 1
source_names = ", ".join(path.name for path in CSV_FACT_SOURCES)
print(
f"[OK] feature-matrix matches fact sources ({source_names}) "
f"(IDs/status/count)"
)
print("[OK] lightweight document status baseline is valid")
return 0