# 多维系统审查与问题分级 ## Goal 以 2026-07-16 当前本地 `main` 为审查对象,从业务功能、页面体验、视觉与交互、权限与状态机、数据与安全、测试与性能、运维与文档等多个角度检查已经完成的系统,形成可复现、可去重、可排序的 P0/P1/P2 finding 和后续治理路线,而不是在审查过程中边看边改。 ## Scope - 审查当前本地前端、后端、数据模型、自动化、部署/运行脚本和现行文档事实源。 - 覆盖功能与业务闭环、权限/状态机/数据、页面/设计/跨端、安全/隐私/依赖、测试/性能/可靠性、运维/交付/文档。 - 只运行本地、无凭据、无业务写入的静态检查、构建、单测、mock E2E 和浏览器复核。 - 产出证据化 finding、风险地图和建议修复波次;不在本任务实施业务修复。 ## What I Already Know - 遗留任务和运行手册已经完成收口;当前工作树在审查 task 创建前干净。 - 最后有证据的公网部署来源为 `df26922`;当前本地 `main` 包含后续修复与收口,但尚未 push、部署或完成公网复检。本任务只审查本地基线,不能代表当前公网状态。 - 技术栈为 React + TypeScript + Vite + Tailwind 前端,以及 Fastify + Prisma + PostgreSQL 后端。 - 当前仓库约有 75 个前端页面文件、60 个前端组件文件、76 个路由声明、68 个后端 route 文件、63 个 service 文件、117 个 Prisma model。 - 自动化资产约有 63 个 Playwright spec、153 个后端测试文件和 50 个 QA 脚本;前端源码目录没有独立 unit spec,页面行为主要由 E2E 覆盖。 - 页面操作区任务已登记 5 类既有 finding:付款/合同/票据权限显隐、资产旧测试交互、标题动作合同与项目/资产视觉覆盖不足。本轮应复核和去重,不重复制造同一问题。 - `ui-ux-pro-max` 对企业后台给出的高价值检查项包括键盘可达、可见焦点、表格移动适配、表单反馈、标题层级、移动端横向滚动、固定导航遮挡和响应式断点;其生成的红/金活泼视觉建议与当前成熟 OA 基线不匹配,不作为换肤或重品牌依据。 - 用户已经确认:先完成收口,再独立从功能、页面、设计等多个角度审查系统并查看问题。 ## Confirmed Constraints - 用户于 2026-07-16 选择方案 1:审查采用“先广度扫描和风险分级,再对高风险链路深挖”的方式,避免只看页面或只跑测试。 - 用户于 2026-07-16 已最终批准本 PRD 与 `design.md`,可以启动本地只读审查;外部动作仍未授权。 - 默认只使用本地、mock、静态和无凭据验证;不连接生产数据库,不运行 live spec,不执行真实 OCR、企微写入、付款、部署或公网配置动作。 - 审查输出写入当前 Trellis task 的 `research/` 和 PRD,不新建重复的业务手册或泛化审计文档。 - finding 只有在有代码位置、命令结果、截图或稳定复现步骤时才标为已确认;需要公网、真机或真实角色才能判断的事项单列为 `EXTERNAL_GATED`,不虚报 PASS/FAIL。 ## Open Questions - 无。 ## Requirements (Evolving) ### 1. 功能与业务闭环 - 按实际小团队使用路径审查登录/身份、工作台、报销与 PDF OCR、审批、采购、合同、项目、资产、票据、付款批次/AP/代账交接、人员/考勤/企微边界和系统管理。 - 对每个域确认入口、创建/编辑/提交、审批/复核、异常/撤回、附件/证据、导出/归档、权限与审计是否闭环。 - 区分“代码存在”“自动化通过”“本地可用”“公网已部署”“真实业务已验证”,不得互相替代。 ### 2. 权限、状态机与数据 - 对照路由显隐、前端动作显隐和后端权限校验,检查只读角色、跨人员数据、管理能力和高敏附件边界。 - 抽查核心状态机的合法迁移、幂等、并发、失败回滚、撤回/归档和审计记录。 - 检查 Prisma schema、迁移、route/service/前端类型之间的字段和枚举一致性;不执行数据库 reset 或生产 drift 修复。 ### 3. 页面、信息架构与设计 - 建立 PC 页面清单、移动页面清单和企微入口映射,检查菜单、路由、标题、面包屑、列表/详情/编辑结构及空/错/加载/无权限状态。 - 检查视觉层级、间距、密度、颜色/对比度、图标、表格、表单、弹窗、危险操作、反馈、焦点与键盘可达性。 - 检查 375、768、1024、1440 等代表性视口,并按产品规则补充必要的小屏和企业微信 UA;不以普通浏览器 UA 代替真机结论。 - 设计审查尊重既有品牌与组件体系,不把外部推荐的调色板或字体直接当作改版结论。 ### 4. 跨端和外部边界 - 检查 PC、移动、企业微信 deeplink/通知/只读镜像之间的功能归属与信息一致性。 - 对 OA 主办、企微主办、OA 镜像、应急接管和高敏附件归属进行抽查,避免入口存在但业务责任不清。 - 需要真实企业微信、真机、live OCR 或公网来源确认的 finding 只记录准入条件和证据缺口。 ### 5. 安全、依赖与隐私 - 静态检查认证、授权、上传/下载、导出、日志、错误响应、敏感内容、Secret/env、依赖风险和外部集成 fail-closed 边界。 - 不在报告中写真实票据、合同正文、完整账号、银行资料、token、Secret、完整本地路径或原始 payload。 ### 6. 测试、性能与可靠性 - 评估后端测试、前端 E2E、视觉测试、权限测试和 QA runner 对真实核心路径的覆盖与重复/陈旧/脆弱情况。 - 检查构建体积、懒加载、列表/搜索/表格、重复请求、长任务、轮询、后台 job、失败重试、超时和可观测性风险;先测量再给性能建议。 - 环境性失败、测试缺陷和产品缺陷分开归类。 ### 7. 运维、交付与文档 - 检查部署来源、环境合同、迁移/回滚、readiness、备份恢复准入、试运行、告警、巡检、操作手册和培训材料是否一致。 - 不把历史 `issues/*.csv` 当作当前执行合同,不把旧试运行或旧公网证据当作当前 PASS。 ### 8. Finding 合同 - 每条 finding 至少包含:ID、维度、严重级别、置信度、状态、证据、复现、影响、建议、修复边界、是否需要用户决策、是否已有 task。 - `P0`:存在现实的数据泄露/丢失、越权、高风险资金或系统不可用风险,或核心业务无法继续且没有可接受绕行。 - `P1`:核心业务链路、广泛角色权限、关键数据一致性或主要跨端体验显著受损,但存在临时绕行或影响范围可控。 - `P2`:局部一致性、可用性、维护性、覆盖率、性能观察项或文档问题,不阻断核心业务。 - 状态使用 `CONFIRMED`、`LIKELY`、`EXTERNAL_GATED`、`DUPLICATE`、`NOT_AN_ISSUE`,避免把证据不足的问题强行定级。 ## Initial Acceptance Criteria(Superseded) > 以下清单保留原始全维审查合同,用于说明发现阶段的覆盖意图。2026-07-17 > 起本任务按后文“风险收敛收口”验收,不据此声称已经完成穷尽式全仓审计。 - 固定本地审查 commit、环境边界、命令和生成物清理规则。 - 建立功能域 × 角色 × 页面/接口 × 证据的审查矩阵。 - 覆盖核心业务闭环、权限/状态机/数据、页面/设计、跨端、安全、测试/性能、运维/文档八大类。 - 运行批准范围内的基础门禁与聚焦自动化;所有失败按产品/测试/环境分类。 - 关键 PC/移动页面形成可追溯的结构或截图证据,不把旧截图当作当前基线。 - 已有页面操作区 finding 完成复核和去重。 - 所有确认 finding 具备证据、复现、影响和建议;外部受限项明确准入条件。 - 输出管理摘要、P0/P1/P2 清单、跨域根因、建议修复波次和需要用户决策的事项。 - 审查阶段不修改业务代码、schema、配置或真实数据,不自动创建一批修复实现。 - task validate、Trellis governance、敏感内容检查和 `git diff --check` 通过。 ## Risk Convergence Closeout(2026-07-17) ### Closeout Decision **Context**:原发现基线为 `bbb5c89`,当前本地目标已前移到 `8f8606c`,期间两个原 P0 已在独立任务完成本地修复与归档。继续按原始清单扩大审查会降低边际收益,也会混淆发现历史、当前修复、部署和外部行为。 **Decision**:本任务从“继续扩大全维扫描”转为“风险收敛收口”。保留原基线与分域报告,新增当前 HEAD delta、唯一 finding 台账、本地浏览器行为证据和双层脱敏规则;不修改业务代码,不创建下游修复 task,只登记推荐工作包顺序。 **Consequences**:可以稳定回答“发现过什么、当前本地修到哪里、哪些尚未部署或外部验证”,但不能据此声称当前代码已部署、公网角色可用、企微真机通过或真实业务已经完成新一轮试运行。 ### Management Summary - 唯一台账共 34 条:发现时 P0 2、P1 11、P2 21;当前开放 P0 为 0。 - 两个原 P0 均保持发现时 P0/`CONFIRMED`,当前为 `LOCAL_FIX_VERIFIED`、`DEPLOYMENT_PENDING`、`EXTERNAL_BEHAVIOR_PENDING`。 - 当前最重要的开放项是员工敏感数据范围、付款状态一致性、高敏合同附件和发布门禁可信度。 - 两个已本地修复 P0 的部署与外部行为复核是另行授权的 Gate 0;六个工作包只排序本地开放问题,不能替代 Gate 0。 - 768×1024 与 1024×768 浏览器量测确认共享表格容器隐藏超宽内容,多个核心列表的右侧操作不可达,`RESP-TABLE-001` 定为 P1。 - 375×812 归档页的路由、空态、列表和底栏通过;长详情内部约 105px 被隐藏,形成 P2 `MOB-ARCHIVE-001`。这一区分证明静态移动路由合同失败本身不直接等于产品缺陷。 - 后端正确拒绝的按钮显隐、全局搜索列表落点、通知目标缺失、可恢复动作确认和持续可访问性治理均按批准口径收敛为 P2;移动考勤入口自循环保留 P1。 - 页面工作包内部先处理不可逆/资金动作确认、核心长表单保护、移动考勤自循环和中间断点表格四条 P1,再处理权限显隐与现有 `05-31` 任务;其他页面 P2 按触达治理,不一次打成巨型实施任务。 ### Revised Acceptance Mapping | 收口验收项 | 状态 | 证据 | | --- | --- | --- | | 保留原基线并补当前 HEAD delta,不改写历史结论 | PASS | `research/baseline.md`、`research/current-head-delta.md` | | 形成唯一 finding 台账,统一分级、去重和四层状态 | PASS | `research/findings.md` | | 完成 375 移动归档与 768/1024 五个共享表格页面行为量测 | PASS | `research/browser-review.md`、`research/evidence/local-browser-8f8606c/` | | 安全材料完成双层脱敏并沉淀稳定摘要规则 | PASS | `research/business-security-review.md`、`.trellis/spec/hyb-oa/security-privacy.md` | | 发现/修复/部署/外部验证状态分离成为稳定证据合同 | PASS | `design.md`、`.trellis/spec/hyb-oa/docs-and-evidence.md` | | 后续工作包按批准顺序登记且未创建下游 task | PASS | `research/findings.md#推荐工作包顺序` | | 当前 HEAD 全量本地基础门禁与收口治理门禁 | `COMPLETE_WITH_KNOWN_FINDINGS` | `research/current-head-delta.md#最终本地收口门禁`;完整基础门禁通过,专项移动合同按预期失败,流程覆盖证据保持不可信 finding,均未被掩盖。 | | 提交范围仅含当前 task、必要 spec 与脱敏合成截图 | PASS | `git status`、`git diff --check` 与最终只读 reviewer;0 blocker / 0 major / 0 minor。 | ### Revised Closeout Acceptance - [x] 原发现基线 `bbb5c89` 和当前目标 `8f8606c` 均有明确、不可互相替代的证据。 - [x] 所有分域 finding 已映射到唯一台账,批准的严重度校准和拆分已执行。 - [x] 两个原 P0 分别记录本地修复、部署和外部行为状态,没有改写发现时严重度。 - [x] 浏览器证据记录 viewport、最终 URL、标题、角色 fixture、横向溢出、操作可达和底栏边界,且只使用合成数据。 - [x] 普通安全摘要不含攻击步骤、载荷、绕过方式、概率推演、可组合接口细节或真实环境资料。 - [x] 外部未覆盖项标记为 `EXTERNAL_GATED`、`EXTERNAL_BEHAVIOR_PENDING` 或后续工作包。 - [x] 全量本地基础门禁、task validate、governance、敏感扫描、文档 registry、测试资产清单和 `git diff --check` 已按当前工作树重跑。 - [x] 只读复核确认 P0/P1 当前状态、提交范围和未授权边界准确。 ### Uncovered And Authorization-Gated Boundaries - 未部署,未检查公网 build SHA、边缘响应头、真实代理链或公网角色矩阵。 - 未连接生产数据库,未执行迁移状态、drift、备份恢复、并发付款或任何真实数据写入。 - 未读取真实员工档案、合同正文、附件、票据、银行资料、导出文件或客户端设备存储。 - 未执行企业微信真机、真实通知、真实 OCR、在线依赖审计或外部服务写入。 - 旧 Day 1–Day 4 试运行不复用;未来部署和外部门禁通过后必须从新的 Day 1 开始。 - 上述边界不阻塞本地只读审查归档,但阻塞“已部署”“可公网测试”和“真实业务通过”等对外表述。 ## Definition of Done - 当前本地系统的主要能力、页面和风险有可追溯的审查覆盖,而不是只罗列已有测试。 - finding 分级一致、去重、可复现,并能直接转成后续独立 Trellis task。 - 明确哪些结论只适用于本地,哪些仍需部署、公网、真机或真实角色验证。 - 给出推荐修复顺序,但不在本任务实施业务修复。 ## Feasible Approaches ### 方案 1:全维度风险优先(推荐) - 先做全系统静态、自动化和页面矩阵扫描,快速形成 P0/P1/P2 初版;再对 P0/P1 及跨域根因深挖。 - 优点:覆盖用户要求的多个角度,较早暴露致命风险,也能控制审查范围。 - 代价:首轮每个业务域的深度有限,需要第二轮按高风险聚焦。 ### 方案 2:核心业务流深挖优先 - 先深挖报销/OCR/审批、采购/合同/项目、付款/AP 和人员/企微主链,再补页面与横向治理。 - 优点:核心业务证据最扎实。 - 代价:页面、设计、文档和低频管理能力的问题会较晚出现。 ### 方案 3:页面与设计优先 - 先完成全部路由、PC/移动视口、信息架构、交互和视觉一致性审查,再回到后端与业务闭环。 - 优点:用户可见问题收敛快。 - 代价:越权、状态机和数据一致性等高风险问题可能被延后。 ## Decision (ADR-lite) **Context**:系统覆盖前后端、移动/企微、财务与审批等多个域;只做页面审查会遗漏越权、状态机和数据风险,只深挖业务流又会延后用户可见问题。 **Decision**:采用方案 1。第一轮先建立全系统资产和证据矩阵,完成八大维度广度扫描并形成 P0/P1/P2 初版;随后只对 P0/P1、跨域共因和证据冲突进行第二轮深挖。 **Consequences**:可以尽早得到完整风险地图,并控制审查期间不混入修复。代价是首轮不会对每个 P2 做同等深度分析;P2 在风险地图稳定后按修复波次再展开。 ## Execution Plan ### Wave 1:冻结基线与全量资产矩阵 - 记录本地 commit、环境、功能域、角色、路由、页面、API、schema、测试和事实源。 - 运行基础静态/构建/单测门禁,分类现有失败和 warning。 ### Wave 2:业务、权限、状态机、数据与安全扫描 - 追踪核心业务闭环和代表角色的正/负路径。 - 对导航、动作、API 权限与数据范围做跨层对照。 - 检查状态迁移、附件/导出、审计、敏感内容和外部集成边界。 ### Wave 3:页面、设计、响应式与跨端扫描 - 使用本地 Vite dev + Playwright 复核核心 PC/移动页面和企业微信 UA 布局。 - 检查信息架构、视觉层级、表单/表格/反馈、键盘/焦点、危险操作和跨端归属。 - 复核并去重页面操作区任务已有 5 类 finding。 ### Wave 4:测试、性能、可靠性、运维与文档扫描 - 评估 63 个 E2E spec、153 个后端测试文件和 50 个 QA 脚本的覆盖、重复、陈旧和环境脆弱性。 - 基于构建/运行证据检查性能、任务调度、重试、可观测性、部署来源、回滚、备份和文档培训。 ### Wave 5:Finding 收敛与独立复核 - 统一 finding schema,合并重复问题和跨域根因。 - 对 P0/P1、权限、状态机、迁移和审批规则 finding 做独立只读复核。 - 输出管理摘要、问题分级、修复波次、外部补证项和需要用户决策的事项。 ## Test Plan (Draft) ```bash cd server && npm run prisma:validate cd server && npm test cd client && npm run typecheck cd client && npm run build cd client && npx playwright test --list node scripts/qa/check-process-contract.mjs --baseline --json node scripts/qa/check-oa-permission-matrix.mjs node scripts/qa/check-mobile-route-contract.mjs node scripts/qa/check-sensitive-content.mjs node scripts/qa/audit-docs.mjs --check-registry node scripts/qa/check-trellis-governance.mjs git diff --check ``` - Playwright 实跑范围在方案确认后冻结,优先选择本地 mock、核心流程、权限直连、跨页面一致性、项目级视觉和移动路由相关 spec;明确排除 `manual/` 和 `live-smoke.spec.ts`。 - 浏览器复核需要本地 Vite dev,避免 production preview 的 PWA Service Worker 绕过 route mock;生成物只清理本轮明确产生的目录。 ## Out of Scope - 修复审查发现的业务代码、页面、schema、测试或文档问题。 - push、部署、公网检查、生产配置、数据库 reset、真实数据、企业微信写入、真实付款和真实 OCR。 - 补造旧试运行、真机或人工业务闭环证据。 - 为追求 warning 数字归零而批量重写历史证据或无关脚本。 ## Technical Notes - 审查设计见 `design.md`。 - 基线盘点见 `research/audit-scope-baseline.md`。 - 事实源入口:`docs/文档索引.md`、`docs/文档事实源状态矩阵.md`。 - 设计事实与工程规则:`docs/产品设计规则.md`、`.trellis/spec/hyb-oa/frontend-react-vite-design.md`。 - 权限、审批、报销/OCR、企微、部署和安全分别读取 `.trellis/spec/hyb-oa/` 对应规约。