完成五人团队正式内用最小收口(07-18-small-team-internal-readiness)

这个提交包含在:
2026-07-18 15:46:14 +08:00
父节点 58c8decef9
当前提交 5d0a5f9a38
共修改 134 个文件,包含 10790 行新增和 1413 行删除
@@ -0,0 +1,3 @@
{"file": ".trellis/spec/hyb-oa/project-governance.md", "reason": "检查 Trellis validate、governance、提交和任务收口"}
{"file": ".trellis/spec/hyb-oa/frontend-react-vite-design.md", "reason": "检查右上角操作区是否符合统一规则"}
{"file": ".trellis/spec/hyb-oa/docs-and-evidence.md", "reason": "检查截图、报告和任务记录是否安全"}
@@ -0,0 +1,79 @@
# 设计方案:页面右上角操作区
## 统一模型
页面分三层放动作:
1. **页面标题右上角**
- 只放页面级主操作。
- 最多一个主按钮 + 一个 `更多`。
- 主按钮必须是用户来到该页面最自然的创建/发起动作。
2. **列表工具栏 / 筛选区右侧**
- 放筛选、范围、导出、刷新、统计、批量、测试数据开关。
- 这些动作影响列表视图或当前查询范围,不是页面主操作。
- 默认只露出一到两个高频动作;导出、到期列表、测试数据、关联跳转等低频动作收进 `更多` 或高级筛选,避免工具栏形成第二排常驻按钮。
3. **行操作 / 详情操作区**
- 放 `查看详情`、`处理`、`继续编辑`、`查看进度`、`作废`、`归档` 等对象级动作。
- 风险动作必须在详情页或确认弹窗内完成。
## 右上角按钮规则
- 0 个按钮:工作台、待我处理、通知、只读记录页默认允许没有标题右侧按钮。
- 1 个按钮:有明确创建/发起动作的页面,只保留主按钮。
- 2 个按钮:主按钮 + `更多`。仅当存在必要页面级低频动作。
- 禁止 3 个及以上标题右侧按钮。
- 禁止把 `筛选`、`刷新`、`导出`、`显示测试数据` 直接放在标题右侧。
- 禁止为了视觉对齐给无主操作页面硬塞按钮。
## 页面应用
- `报销`:标题右上角 `新建报销`;统计/导出/范围切换在列表工具栏。
- `采购`:标题右上角 `新建采购`;筛选在列表工具栏。
- `合同`:标题右上角 `新增合同`;到期、导出、筛选进入列表工具栏/更多。
- `项目`:标题右上角 `新建项目`;合同入口和测试数据开关不在标题右上角。
- `资产`:标题右上角 `新增资产` + `更多`;更多内放扫码查找、资产分类。
- `付款`:标题右上角 `新建批次`;刷新在列表工具栏。
- `应付账款`:标题右上角无主按钮;刷新、导出在列表工具栏。
- `票据`:标题右上角 `上传票据` + `更多`;更多内放绑定和导出。
## 其他必须统一的页面规则
1. **命名规则**
菜单、页面标题、面包屑/返回入口使用同一个短名。业务对象内部可以叫 `采购申请`,但一级菜单和列表页标题统一叫 `采购`。
2. **标题区文案**
标题区只放标题、必要标签和主操作。默认不放副标题,不解释页面用途。
3. **筛选区**
状态切换优先用 tabs/chips;高频筛选一行展示;高级筛选统一由 `筛选` 打开。筛选入口属于列表工具栏,不属于页面标题区。
4. **列表工具区**
列表工具栏右侧只保留高频范围切换、`筛选` 或一个 `更多`。低频导出、到期、测试数据、关联跳转、排障动作不常驻外露。
5. **列表区**
所有业务列表保持单列首屏,不自动展开详情。表格列顺序统一为身份、业务关系、金额/日期、状态、操作。
6. **空状态**
空状态只说明当前筛选没有数据,并给一个真实下一步。不要写教学式流程说明。
7. **更多菜单**
`更多` 用于低频、导出、管理、排障或非主路径动作。浮层必须右对齐,不能被表格、卡片或滚动容器遮挡。
8. **详情与编辑**
详情页操作在右侧状态/操作面板;编辑页操作在底部或表单结尾固定区域。不要把详情操作塞回列表页标题右上角。
9. **权限**
无权限动作默认隐藏。配置缺失时才展示边界说明和配置入口。
10. **移动端**
移动端使用底部主操作和 `更多`,不复刻 PC 顶部多按钮。
## 实施策略
优先小步改造,不引入大 UI 框架:
1. 在现有 `WorkspaceHeader` / `PageHeader` 上继续使用 `actions`,先完成页面迁移。
2. 增加一个轻量共享 `HeaderActionGroup` 或等价模式,约束一主一更多。
3. 更新设计规范和 E2E 断言,防止新页面继续把多个工具塞到标题右侧。
@@ -0,0 +1,3 @@
{"file": ".trellis/spec/hyb-oa/project-governance.md", "reason": "Trellis task、编码前方案和提交规则"}
{"file": ".trellis/spec/hyb-oa/frontend-react-vite-design.md", "reason": "页面标题、业务列表、操作区和成熟企业后台设计规则"}
{"file": ".trellis/spec/hyb-oa/docs-and-evidence.md", "reason": "记录视觉复检证据和避免敏感信息入库"}
@@ -0,0 +1,16 @@
# 实施记录
## 本轮改造
- 新增 `HeaderActionGroup`,统一标题右侧按钮排列。
- 采购、合同、项目、资产、付款、应付账款、票据完成首轮标题右侧操作迁移。
- 创建类标题按钮保持主按钮样式;详情态只保留 `返回列表`。
- 合同和项目的低频列表工具收进 `更多`,避免工具栏持续堆叠。
- 应付账款 tabs 与 `刷新` / `导出` 调整为横向命令栏。
- 票据列表支持把绑定和导出放入列表工具栏,不再占用标题右侧。
## 视觉结论
- 标题区符合“0 个 / 1 个主操作 / 主操作 + 更多”的企业后台常规模式。
- 列表级 `筛选`、`导出`、`刷新`、测试数据和关联跳转不再作为标题右上角常驻按钮。
- 合同、付款、应付账款、票据截图已覆盖;后续页面改造继续按同一模板推进。
@@ -0,0 +1,124 @@
# 统一页面右上角操作区规划
## Goal
统一 PC 页面标题右上角按钮规划,解决当前业务页右上角按钮数量、优先级和位置不一致的问题。页面应采用成熟企业后台/Ant Design Pro 常见模式:页面标题区只承载页面级主操作,列表筛选、导出、刷新、测试数据、分类管理等低频或列表级工具进入列表工具栏、筛选区或 `更多`。
## Scope
- 前端 PC 页面标题右侧操作区、业务列表工具栏和相关 E2E/视觉断言。
- 首轮覆盖报销、采购、合同、项目、资产、付款、应付账款和票据等业务页。
- 只调整操作入口位置、按钮优先级、列表工具收纳和设计规范,不改变业务权限、接口、状态机或数据结构。
## What I Already Know
- 用户反馈:现在页面右上角按钮规划不统一。
- 产品背景:面向国内小于 10 人科技初创公司,系统应低认知负担、成熟常规、不创新。
- 既有规范要求:页面标题默认为 route 名称;Header primary action 只保留真实页面级主操作;低频工具不要堆在右上角。
- 当前代码审计发现:
- `报销`:标题右侧主要是 `新建报销`,列表工具在下方,相对接近目标。
- `采购`:标题右侧同时放 `新建采购` 和 `筛选`,筛选应进入列表工具区。
- `合同`:标题右侧同时放 `新增合同`、`到期列表`、`导出`、`筛选`,过载最明显。
- `项目`:标题右侧放 `合同`、`显示测试数据`、`新建项目`,页面级动作与排障开关混用。
- `资产`:标题右侧放 `新增资产`、`移动扫码查找`、`资产分类`,管理工具和主操作混用。
- `付款`:标题右侧放 `刷新`、`新建批次`,刷新不应占据标题主操作区。
- `应付账款`:标题右侧放 `刷新`、`导出`,只读列表页不应强制占用标题主按钮区。
- `票据`:标题右侧放 `上传票据`、`绑定`、`导出`,主操作与后续处理工具混用。
## Requirements
- 标题右上角只允许:
- 一个页面级主操作按钮,例如 `新建报销`、`新建采购`、`新增合同`、`新建项目`、`新增资产`、`新建批次`、`上传票据`。
- 最多一个 `更多`,用于页面级低频操作;当低频操作只有列表级含义时,放到列表工具栏,不放标题区。
- 详情/编辑模式可用一个 `返回列表`,但不与创建按钮并列。
- `筛选` 不放标题右上角;统一放在列表工具栏/筛选区右侧。
- `导出` 不作为标题区常驻按钮;统一进入列表工具栏右侧或 `更多`。
- `刷新` 不作为标题区常驻按钮;需要保留时进入列表工具栏,或作为低频工具。
- `显示测试数据` 属于排障/试运行开关,不放标题右上角,进入筛选/更多/排障区。
- `分类管理`、`扫码查找`、`到期列表`、`绑定` 等非创建动作,不与主创建按钮并列;按场景进入 `更多`、筛选区、管理入口或下方操作面板。
- 尽量通过共享组件或模板约束新页面,避免继续逐页漂移。
## Additional Consistency Rules To Review
- 页面标题:菜单名、页面主标题和浏览路径用词要一致;例如菜单 `合同`,页面标题也用 `合同`,不要在不同位置混用 `合同台账`、`合同管理`、`合同列表`。
- 说明文案:默认页面不展示解释性副标题;只在空状态、错误、权限、企业微信边界、不可逆操作和试运行边界中解释。
- 筛选布局:业务列表统一为“状态/范围 tabs 或 chips + 一行高频筛选 + 高级筛选入口”;不允许有的页面两行筛选、有的页面无筛选、有的页面把筛选放标题右上角。
- 列表列结构:业务列表统一按“对象身份、相对方/人员、金额/日期、状态、操作”组织;右侧固定操作列默认 `查看详情` / `处理` / `继续编辑`。
- 空状态:统一使用短标题 + 一句当前筛选结果 + 一个真实下一步;不要写流程说明。
- 更多菜单:所有 `更多` 都右对齐、浮层不被遮挡、只放低频动作;危险动作必须二次确认。
- 详情页:PC 统一为“顶部摘要 + 主事实/证据 + 右侧状态/操作区 + 历史”;列表页不默认在下方展开详情。
- 编辑页/面板:创建和编辑统一使用同一编辑模板;主按钮固定为 `保存` / `提交`,取消/返回在左或次级位置。
- 权限显隐:无权限动作直接隐藏;不要显示不可用按钮再解释一堆原因,除非是权限申请或配置缺失边界。
- 移动端对应:移动端不照搬 PC 右上角;统一为顶部标题 + 卡片列表/详情 + 底部主操作,次级动作进入 `更多`。
## Proposed Page-Level Changes
| 页面 | 标题右上角目标 | 迁移动作 |
| --- | --- | --- |
| `报销` | `新建报销` | 保持;检查导出/统计是否仍在列表工具栏。 |
| `采购` | `新建采购` | `筛选` 移到列表工具栏。 |
| `合同` | `新增合同` + `更多`(如需要) | `筛选` 移到筛选区;`导出` 移到列表工具栏/更多;`到期列表` 改为列表状态/筛选入口。 |
| `项目` | `新建项目` | `合同` 移为列表/详情关联入口;`显示测试数据` 移到筛选/排障入口。 |
| `资产` | `新增资产` + `更多` | `移动扫码查找`、`资产分类` 放入 `更多` 或管理面板,不与新增并列。 |
| `付款` | `新建批次` | `刷新` 移到列表工具栏。 |
| `应付账款` | 无主按钮,必要时 `更多` | `刷新`、`导出` 移到列表工具栏/更多。 |
| `票据` | `上传票据` + `更多` | `绑定`、`导出` 放入 `更多` 或列表工具栏。 |
## Out of Scope
- 不改变业务权限、审批规则、数据结构或接口。
- 不新增真实业务写入。
- 不重新设计移动端底部主操作;本任务先收敛 PC 页面标题右上角。
- 不部署公网;实现完成后先本地验证,部署另行获得批准。
## Acceptance Criteria
- [x] 业务列表页标题右上角符合“一主操作 + 最多一个更多”的规则。
- [x] `筛选`、`导出`、`刷新`、`显示测试数据` 不再作为标题右上角常驻按钮。
- [x] 采购、合同、项目、资产、付款、应付账款、票据至少完成首轮统一。
- [x] 规则写入前端设计规范,后续页面可复用。
- [x] 标题、筛选、列表列、空状态、详情/编辑操作区至少完成一致性审计,形成后续改造清单。
- [x] 前端 typecheck/build 通过。
- [x] 聚焦 Playwright/视觉复检覆盖主要业务页。
## Test Plan
```bash
cd client && npm run typecheck
cd client && npm run build
E2E_BASE_URL=http://127.0.0.1:5173 npx playwright test tests/e2e/r103-cross-page-ui-consistency.spec.ts --workers=1 --reporter=list
git diff --check
python3 ./.trellis/scripts/task.py validate 05-31-unified-page-header-actions
node scripts/qa/check-trellis-governance.mjs
```
## Technical Notes
- 设计裁决使用 `frontend-design` skill,并按成熟企业后台/Ant Design Pro 的页面区分:标题区负责页面级主操作,表格工具栏负责列表级工具。
- 相关规范:`.trellis/spec/hyb-oa/frontend-react-vite-design.md`
- 相关组件:`client/src/components/patterns/ListWorkspace.tsx`、`client/src/components/common/PageHeader.tsx`、`client/src/components/patterns/BusinessListTemplate.tsx`
## Closeout Verification (2026-07-16)
- 实现提交 `dcf34d7` 后,七个页面、`HeaderActionGroup` 和相关聚焦测试没有发生实现漂移。
- `cd client && npm run typecheck` 通过;`cd client && npm run build` 通过,Vite 转换 2381 个模块,PWA 生成 102 个预缓存条目,仅有既有 Browserslist 数据陈旧提示。
- 在 Vite dev 模式下运行 `r103-cross-page-ui-consistency.spec.ts` 为 3 passed;production preview 首次运行的 1 个失败是 PWA Service Worker 绕过 `page.route` mock 并回到登录页的验证环境问题,未作为产品 finding。
- 当前标题动作迁移本身通过静态复核,但任务不能归档:聚焦视觉覆盖仍缺项目/资产列表,且一致性审计发现权限显隐和旧测试漂移。
### Follow-up Findings
- `PaymentBatchesPage` 对只有复核权限、没有付款创建权限的用户仍显示 `新建批次`,点击后才出现无权限面板。
- `ContractsRegistryPage` 对只读合同用户仍显示新增、编辑、续约和归档入口,写接口最终会返回 403。
- `InvoicePoolPage` 已计算上传权限,但标题区 `上传票据` 没有按该权限隐藏。
- `assets-flow.spec.ts` 与 `manual/asset1d-public-trial.spec.ts` 仍把已迁入 `更多` 的 `资产分类` 当作直接按钮点击。
- `HeaderActionGroup` 目前只统一布局,不约束动作数量;缺少七页面统一标题动作合同测试,现有截图缺项目和资产列表。
上述 finding 需要独立修复 task;在修复并补齐视觉/回归覆盖前,本任务保持 `in_progress`,不得虚报完成或归档。
## Final Closeout Verification (2026-07-18)
- 承接任务 `07-18-small-team-internal-readiness` 已闭合上述 follow-up:付款复核角色看不到新建批次,应付账款导出按权限隐藏,合同只读角色看不到新增/编辑/续约/归档,票据无上传权限时 fail-closed;对应合成 Playwright 5/5 纳入最终候选门禁。
- `assets-flow.spec.ts` 和历史 manual 资产用例已改为通过标题区 `更多 -> 资产分类`;资产流程 spec 可解析,当前菜单行为由实际浏览器回归覆盖。
- `r103-cross-page-ui-consistency.spec.ts` 扩展为 8 项:七个页面标题区严格执行“一主操作 + 最多一个更多”,并覆盖项目/资产代表视觉、资产“更多 -> 资产分类”及核心页面动作合同。
- 当前 checkout 的 `bash scripts/qa/run-local-candidate.sh full` 最终为 44/44 passed、0 skipped/failed/unexpected;项目、资产、合同、付款、报销双断点截图及权限显隐 spec 均包含在候选 acceptance 集合。
- 本任务仅完成本地前端验收并归档;未部署、未公网复检,不能据此宣称线上可测。
@@ -0,0 +1,26 @@
{
"id": "unified-page-header-actions",
"name": "unified-page-header-actions",
"title": "统一页面右上角操作区规划",
"description": "统一 PC 页面标题右上角操作区规划,收敛主操作、更多、筛选、导出、刷新等按钮位置。",
"status": "completed",
"dev_type": null,
"scope": "frontend",
"package": null,
"priority": "P2",
"creator": "shunli",
"assignee": "shunli",
"createdAt": "2026-05-31",
"completedAt": "2026-07-18",
"branch": null,
"base_branch": "main",
"worktree_path": null,
"commit": null,
"pr_url": null,
"subtasks": [],
"children": [],
"parent": null,
"relatedFiles": [],
"notes": "2026-07-18 由 07-18-small-team-internal-readiness 闭合剩余项:付款/合同/票据权限显隐合成 Playwright 5/5,资产旧 E2E 改用更多菜单,r103 扩展为 8 项并覆盖七页面标题动作及项目/资产视觉;最终 local-candidate full 为 44/44、0 skipped/failed/unexpected。本任务仅本地验收,未部署或公网复检,可归档。",
"meta": {}
}
@@ -3,7 +3,7 @@
## 台账口径
- 本文件是当前任务唯一的分级与生命周期事实源。分域报告保留发现证据,但不再各自决定当前严重度或状态。
- 发现基线为 `bbb5c89`;当前本地增量目标为 `8f8606c`。发现时严重度不因后续修复而改写,收敛校准会在单元格中显式注明。
- 发现基线为 `bbb5c89`;原审查收口增量目标为 `8f8606c`。后续修复任务 `07-18-small-team-internal-readiness` 的规划基线为 `58c8dec`,其本地验证以该任务 `evidence.md` 所在工作提交为准。发现时严重度不因后续修复而改写,收敛校准会在单元格中显式注明。
- 发现状态、当前修复状态、部署状态、外部验证状态彼此独立。
- `NO_FIX_TO_DEPLOY` 表示尚无修复产物,不等于待部署;`NOT_APPLICABLE` 仅用于非运行时代码/纯测试合同。
- `ACTIVE_TASK_OPEN` 表示该项仍开放但已由现有活动 task 承载;本轮只做去重,不另建 task。`FOLLOW_UP_RECOMMENDED` 表示持续治理建议,不是已修复。
@@ -15,24 +15,24 @@
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `SEC-AUTH-001` | 认证 / 代理信任 | P0 | 高 | `CONFIRMED` | `LOCAL_FIX_VERIFIED` | `DEPLOYMENT_PENDING` | `EXTERNAL_BEHAVIOR_PENDING` | `business-security-review.md#bsr-sec-001`;归档任务 `07-17-auth-challenge-trusted-proxy-hardening` | 认证边界不足可能导致账号被未授权控制。 | 挑战单次有效、并发一致、来源可信且可审计。 | 当前 HEAD 聚焦负路径、完整服务端与隔离并发验证通过。 | 另行授权:部署与公网复核 |
| `SEC-ATT-001` | 业务附件 / 浏览器隔离 | P0 | 高 | `CONFIRMED` | `LOCAL_FIX_VERIFIED` | `DEPLOYMENT_PENDING` | `EXTERNAL_BEHAVIOR_PENDING` | `business-security-review.md#bsr-sec-002`;归档任务 `07-17-purchase-attachment-xss-hardening` | 主动内容可能破坏 OA 同源会话与业务数据边界。 | 实际内容验证、重新授权/审计、非执行下载。 | 当前 HEAD 策略/路由、完整服务端与聚焦浏览器验证通过。 | 另行授权:部署与公网复核 |
| `DATA-EMP-001` | 员工敏感数据授权 | P1 | 高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `EXTERNAL_BEHAVIOR_PENDING` | `business-security-review.md#bsr-authz-001` | 广泛能力可能读取超出岗位需要的员工敏感字段。 | 字段级授权与人员范围同时最小化。 | 只读跨层检查确认权限粒度不足,未读取真实资料。 | WP-1 员工敏感数据范围授权 |
| `PAY-STATE-001` | 付款状态机 / 并发 | P1 | 高 | `LIKELY` | `OPEN` | `NO_FIX_TO_DEPLOY` | `EXTERNAL_BEHAVIOR_PENDING` | `business-security-review.md#bsr-data-001` | 并发状态变化可能造成重复结果或证据覆盖。 | 条件更新/锁、幂等和不可覆盖审计保证单一结果。 | 静态事务检查发现保护证据不足,未连接数据库或执行付款。 | WP-2 付款状态一致性与审计 |
| `DATA-HR-ATT-001` | 员工合同附件 | P1 | 高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `EXTERNAL_BEHAVIOR_PENDING` | `business-security-review.md#bsr-priv-001` | 高敏合同资料可能受过宽权限控制且缺访问用途审计。 | 独立最小权限、对象级授权、安全 DTO 和下载审计。 | 只读路由/测试合同确认缺口,未读取真实合同。 | WP-3 员工合同附件权限与访问审计 |
| `DATA-EMP-001` | 员工敏感数据授权 | P1 | 高 | `CONFIRMED` | `LOCAL_FIX_VERIFIED` | `DEPLOYMENT_PENDING` | `EXTERNAL_BEHAVIOR_PENDING` | `business-security-review.md#bsr-authz-001`;任务 `07-18-small-team-internal-readiness/evidence.md` | 广泛能力可能读取超出岗位需要的员工敏感字段。 | 字段级授权与人员范围同时最小化。 | 当前工作提交的窄目录 DTO、字段/对象权限、员工统计敏感汇总独立授权、零敏感副作用矩阵与全量服务端门禁通过;未读取真实资料。 | WP-1 员工敏感数据范围授权 |
| `PAY-STATE-001` | 付款状态机 / 并发 | P1 | 高 | `LIKELY` | `LOCAL_FIX_VERIFIED` | `DEPLOYMENT_PENDING` | `EXTERNAL_BEHAVIOR_PENDING` | `business-security-review.md#bsr-data-001`;任务 `07-18-small-team-internal-readiness/evidence.md` | 并发状态变化可能造成重复结果或证据覆盖。 | 条件更新/锁、幂等和不可覆盖审计保证单一结果。 | 空隔离 PostgreSQL 应用 61 项 migration,五组竞态、审计/通知唯一性和临时库零残留通过;未执行真实付款。 | WP-2 付款状态一致性与审计 |
| `DATA-HR-ATT-001` | 员工合同附件 | P1 | 高 | `CONFIRMED` | `LOCAL_FIX_VERIFIED` | `DEPLOYMENT_PENDING` | `EXTERNAL_BEHAVIOR_PENDING` | `business-security-review.md#bsr-priv-001`;任务 `07-18-small-team-internal-readiness/evidence.md` | 高敏合同资料可能受过宽权限控制且缺访问用途审计。 | 独立最小权限、对象级授权、安全 DTO 和下载审计。 | 当前工作提交的独立权限、无内部路径 DTO、内容复验、审计先于响应及拒绝零文件读取测试通过;未读取真实合同。 | WP-3 员工合同附件权限与访问审计 |
| `DATA-EXPORT-001` | 统一导出 | P1 | 高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `NOT_REQUIRED` | `business-security-review.md#bsr-sec-003` | 导出内容可能在表格软件中形成非预期活动行为。 | 全部 CSV/表格出口统一安全编码并有合成负例。 | 静态检查确认缺少统一中和合同,未使用真实导出。 | WP-5 客户端数据生命周期与统一导出 |
| `PRIV-OFFLINE-001` | 客户端数据生命周期 | P1 | 高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `EXTERNAL_BEHAVIOR_PENDING` | `business-security-review.md#bsr-priv-002` | 退出或换账号后残留身份、审批或草稿可能被后续使用者读取。 | 先确认离线必要性,再按账号隔离、最小缓存并可靠清除。 | 静态检查确认持久化和清理未闭合,未检查真实设备。 | WP-5 客户端数据生命周期与统一导出 |
| `DATA-DOWNLOAD-001` | 下载凭证 / 日志面 | P2 | 中高 | `LIKELY` | `OPEN` | `NO_FIX_TO_DEPLOY` | `EXTERNAL_GATED` | `business-security-review.md#bsr-sec-004` | 短期访问凭据可能进入常规浏览器或边缘记录面。 | 使用当前认证上下文下载并最小化 URL、日志和缓存暴露。 | 代码存在风险可能性;真实边缘日志未获授权检查。 | WP-5 客户端数据生命周期与统一导出 |
| `DATA-ACL-001` | 受限资料规则 | P2 | 中高 | `LIKELY` | `OPEN` | `NO_FIX_TO_DEPLOY` | `NOT_REQUIRED` | `business-security-review.md#bsr-authz-002` | 已保存但未执行的规则会造成受限资料边界误判。 | 产品明确其为 ACL 或废弃元数据;保留则由后端强制执行。 | 静态检查确认规则与执行证据不一致。 | WP-5 客户端数据生命周期与统一导出 |
| `PAY-AUDIT-001` | 付款取消审计 | P2 | 高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `NOT_REQUIRED` | `business-security-review.md#bsr-data-002` | 取消责任与前后状态难以完整还原。 | 记录原因、操作者、前后状态与并发条件。 | 静态路由/模型检查确认缺口,未执行真实状态变化。 | WP-2 付款状态一致性与审计 |
| `PAY-AUDIT-001` | 付款取消审计 | P2 | 高 | `CONFIRMED` | `LOCAL_FIX_VERIFIED` | `DEPLOYMENT_PENDING` | `NOT_REQUIRED` | `business-security-review.md#bsr-data-002`;任务 `07-18-small-team-internal-readiness/evidence.md` | 取消责任与前后状态难以完整还原。 | 记录原因、操作者、前后状态与并发条件。 | 可空取消原因 migration、2–500 字原因、保留已执行项、回单留痕作废及 before/after 审计回归通过。 | WP-2 付款状态一致性与审计 |
| `WEB-DEFENSE-001` | 浏览器防御纵深 | P2 | 高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `EXTERNAL_BEHAVIOR_PENDING` | `business-security-review.md#bsr-sec-005` | 缺少内容执行限制会降低未知缺陷的纵深保护。 | 基于资源清单分阶段收紧 CSP 并保持附件独立沙箱。 | 本地配置确认当前未启用全站策略;未推断具体利用路径。 | WP-5 客户端数据生命周期与统一导出 |
| `UI-PERM-001` | PC 写动作显隐 | P2(收敛校准;原分域报告 P1/P2 不一) | 高 | `CONFIRMED` | `ACTIVE_TASK_OPEN` | `NO_FIX_TO_DEPLOY` | `NOT_REQUIRED` | `page-static-review.md#既有-finding-复核与去重`;`BSR-UX-001`;活动任务 `05-31-unified-page-header-actions` | 后端虽拒绝写入,PC 用户仍可能进入最终失败的流程。 | PC 显隐与后端拒绝共享同一能力合同,后端保持权威。 | 付款、合同、票据三处既有 PC finding 完成只读去重;移动导航由 `MOB-PERM-001` 单列。 | WP-6 页面权限显隐及旧标题任务收口 |
| `PAY-UX-001` | 付款业务可用性 | P1 | 高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `NOT_REQUIRED` | `page-static-review.md#page-p1-001` | 财务人员难以凭业务信息选择待付对象,可能错选或无法创建。 | 以待付池和业务编号/人员/金额选择对象,内部标识仅由系统传递。 | 静态页面与 E2E 合同确认普通流程依赖内部标识。 | WP-2 付款状态一致性与审计 |
| `UX-SAFE-001` | 不可逆证据 / 资金动作 | P1(收敛后边界) | 高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `NOT_REQUIRED` | `page-static-review.md#page-p1-002` | 误触可能删除不可逆证据或改变资金结果。 | 强确认展示对象、后果、可逆性与必要理由。 | 静态检查确认代表性高影响动作在 mutation 前缺少强确认。 | WP-6 页面权限显隐及旧标题任务收口 |
| `UI-PERM-001` | PC 写动作显隐 | P2(收敛校准;原分域报告 P1/P2 不一) | 高 | `CONFIRMED` | `LOCAL_FIX_VERIFIED` | `DEPLOYMENT_PENDING` | `NOT_REQUIRED` | `page-static-review.md#既有-finding-复核与去重`;`BSR-UX-001`;归档任务 `05-31-unified-page-header-actions`;任务 `07-18-small-team-internal-readiness/evidence.md` | 后端虽拒绝写入,PC 用户仍可能进入最终失败的流程。 | PC 显隐与后端拒绝共享同一能力合同,后端保持权威。 | 付款、合同、票据正负显隐合成 Playwright 5/5 与后端拒绝测试通过;旧标题任务已完成本地验收并归档。 | WP-6 页面权限显隐及旧标题任务收口 |
| `PAY-UX-001` | 付款业务可用性 | P1 | 高 | `CONFIRMED` | `LOCAL_FIX_VERIFIED` | `DEPLOYMENT_PENDING` | `NOT_REQUIRED` | `page-static-review.md#page-p1-001`;任务 `07-18-small-team-internal-readiness/evidence.md` | 财务人员难以凭业务信息选择待付对象,可能错选或无法创建。 | 以待付池和业务编号/人员/金额选择对象,内部标识仅由系统传递。 | 当前工作提交的候选接口权威复查及合成浏览器业务选择器通过,普通页面不要求粘贴内部 UUID。 | WP-2 付款状态一致性与审计 |
| `UX-SAFE-001` | 不可逆证据 / 资金动作 | P1(收敛后边界) | 高 | `CONFIRMED` | `LOCAL_FIX_VERIFIED` | `DEPLOYMENT_PENDING` | `NOT_REQUIRED` | `page-static-review.md#page-p1-002`;任务 `07-18-small-team-internal-readiness/evidence.md` | 误触可能删除不可逆证据或改变资金结果。 | 强确认展示对象、后果、可逆性与必要理由。 | 合成浏览器证明高敏附件删除与回单作废展示对象、后果和理由;取消或理由不足时零 mutation。 | WP-6 页面权限显隐及旧标题任务收口 |
| `UX-SAFE-002` | 可恢复管理动作 | P2(由原 PAGE-P1-002 拆分校准) | 高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `NOT_REQUIRED` | `page-static-review.md#page-p1-002` | 普通启停等可恢复动作存在误触和反馈不清。 | 使用轻确认或可撤销反馈,按可逆性分级。 | 只读检查确认部分可恢复动作仍直接执行。 | WP-6 页面权限显隐及旧标题任务收口 |
| `UX-FORM-001` | 核心长表单可靠性 | P1 | 高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `NOT_REQUIRED` | `page-static-review.md#page-p1-003` | 采购、报销、合同、资产等长输入可能因离开页面丢失。 | 共享 dirty-state 合同覆盖路由离开、刷新和记录切换。 | 静态检查未找到未保存保护实现。 | WP-6 页面权限显隐及旧标题任务收口 |
| `MOB-ATTEND-001` | 移动考勤入口 | P1(由原 PAGE-P1-004 拆分) | 高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `EXTERNAL_BEHAVIOR_PENDING` | `page-static-review.md#page-p1-004` | 企业微信/触控小屏考勤入口会回到原移动首页。 | 提供明确移动镜像或允许只读响应式页,不形成自循环。 | 静态路由解析确认自循环;真机点击待另行授权。 | WP-6 页面权限显隐及旧标题任务收口 |
| `MOB-TARGET-001` | 移动通知定位 | P2(由原 PAGE-P1-004 拆分校准) | 高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `EXTERNAL_BEHAVIOR_PENDING` | `page-static-review.md#page-p1-004` | 部分通知不能定位原业务对象,用户需重新查找。 | 每种通知保留稳定对象标识并验证最终 URL/内容。 | 静态链接映射确认目标参数不完整;真实通知待授权。 | WP-6 页面权限显隐及旧标题任务收口 |
| `UX-FORM-001` | 核心长表单可靠性 | P1 | 高 | `CONFIRMED` | `LOCAL_FIX_VERIFIED` | `DEPLOYMENT_PENDING` | `NOT_REQUIRED` | `page-static-review.md#page-p1-003`;任务 `07-18-small-team-internal-readiness/evidence.md` | 采购、报销、合同、资产等长输入可能因离开页面丢失。 | 共享 dirty-state 合同覆盖路由离开、刷新和记录切换。 | data router / `useBlocker` 共享保护在报销、采购、合同、资产中覆盖站内离开、返回/刷新和记录切换,合成浏览器通过。 | WP-6 页面权限显隐及旧标题任务收口 |
| `MOB-ATTEND-001` | 移动考勤入口 | P1(由原 PAGE-P1-004 拆分) | 高 | `CONFIRMED` | `LOCAL_FIX_VERIFIED` | `DEPLOYMENT_PENDING` | `EXTERNAL_BEHAVIOR_PENDING` | `page-static-review.md#page-p1-004`;任务 `07-18-small-team-internal-readiness/evidence.md` | 企业微信/触控小屏考勤入口会回到原移动首页。 | 提供明确移动镜像或允许只读响应式页,不形成自循环。 | `/mobile/attendance` 的 375×812 最终 URL、H1、角色、动作、错误和溢出断言通过;真机点击待另行授权。 | WP-6 页面权限显隐及旧标题任务收口 |
| `MOB-TARGET-001` | 移动通知定位 | P2(由原 PAGE-P1-004 拆分校准) | 高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `EXTERNAL_BEHAVIOR_PENDING` | `page-static-review.md#page-p1-004`;任务 `07-18-small-team-internal-readiness/evidence.md` | 部分通知不能定位原业务对象,用户需重新查找。 | 每种通知保留稳定对象标识并验证最终 URL/内容。 | 考勤目标增量已实现并验证;资产/盘点等其他对象定位未在本任务闭合,整体保持开放,真实通知待授权。 | WP-6 页面权限显隐及旧标题任务收口 |
| `SEARCH-NAV-001` | 全局搜索导航 | P2(收敛校准;原报告 P1) | 高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `NOT_REQUIRED` | `page-static-review.md#page-p1-005` | 点击部分搜索结果只到列表,不能确认命中对象。 | 对象型结果提供稳定详情或定位/高亮合同。 | 静态 href 与现有单实体 E2E 确认覆盖不完整。 | WP-6 页面权限显隐及旧标题任务收口 |
| `RESP-TABLE-001` | 中间断点表格 | P1 | 高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `NOT_REQUIRED` | `page-static-review.md#page-p1-006`;`browser-review.md` | 共享表格隐藏超出宽度,多个核心列表的右侧操作不可达。 | 操作列可见或容器可控横滚,页面本身不溢出。 | 768 下容器缺 58px、1024 下缺 106px 且 `overflow-x:hidden`;代表页面操作命中失败。 | WP-6 页面权限显隐及旧标题任务收口 |
| `RESP-TABLE-001` | 中间断点表格 | P1 | 高 | `CONFIRMED` | `LOCAL_FIX_VERIFIED` | `DEPLOYMENT_PENDING` | `NOT_REQUIRED` | `page-static-review.md#page-p1-006`;`browser-review.md`;任务 `07-18-small-team-internal-readiness/evidence.md` | 共享表格隐藏超出宽度,多个核心列表的右侧操作不可达。 | 操作列可见或容器可控横滚,页面本身不溢出。 | 项目、资产、合同、付款、报销在 768×1024 与 1024×768 下局部横滚、右侧操作命中、document 无横溢断言与脱敏截图通过。 | WP-6 页面权限显隐及旧标题任务收口 |
| `A11Y-FORM-001` | 表单可访问性 | P2(收敛校准;原报告 P1) | 高 | `CONFIRMED` | `FOLLOW_UP_RECOMMENDED` | `NO_FIX_TO_DEPLOY` | `NOT_REQUIRED` | `page-static-review.md#page-p1-007` | 辅助技术用户较难识别字段和动态错误。 | 共享字段/错误组件提供名称、关联、错误状态和 live feedback。 | 静态样例确认语义缺口;无行为证据证明核心流程完全不可完成。 | WP-6 页面权限显隐及旧标题任务收口 |
| `NAV-META-001` | 路由 / 标题元数据 | P2 | 高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `NOT_REQUIRED` | `page-static-review.md#page-p2-001` | 标题、最近访问和浏览器 tab 语义漂移。 | 统一 typed route manifest 与页面可控覆写。 | 静态映射确认缺失、误匹配与固定浏览器标题。 | WP-6 页面权限显隐及旧标题任务收口 |
| `ERR-RECOVERY-001` | 错误恢复 | P2 | 高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `NOT_REQUIRED` | `page-static-review.md#page-p2-002` | 403/404/渲染错误可能把用户带向隐藏旧入口。 | 所有恢复动作回到稳定工作台或安全上一页。 | 静态链接确认仍指向旧路径。 | WP-6 页面权限显隐及旧标题任务收口 |
@@ -40,13 +40,13 @@
| `UX-ERROR-001` | 普通页面错误文案 | P2 | 高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `NOT_REQUIRED` | `page-static-review.md#page-p2-004` | 用户先看到内部码/枚举,难以理解原因与下一步。 | 普通界面展示自然语言和恢复动作,诊断码仅进受控区域。 | 静态样例确认普通页面直接组合技术信息。 | WP-6 页面权限显隐及旧标题任务收口 |
| `A11Y-TABLE-001` | 表格键盘可达 | P2 | 高 | `CONFIRMED` | `FOLLOW_UP_RECOMMENDED` | `NO_FIX_TO_DEPLOY` | `NOT_REQUIRED` | `page-static-review.md#page-p2-005` | 键盘用户无法等价选择部分表格记录。 | 使用真实按钮/链接和明确选中状态。 | 静态样例确认行点击缺少键盘等价入口。 | WP-6 页面权限显隐及旧标题任务收口 |
| `A11Y-VISUAL-001` | 对比度 / 减弱动效 | P2 | 高 | `CONFIRMED` | `FOLLOW_UP_RECOMMENDED` | `NO_FIX_TO_DEPLOY` | `NOT_REQUIRED` | `page-static-review.md#page-p2-006` | 低视力与减弱动效用户体验下降。 | 共享 token 达到既定对比度并尊重 reduced motion。 | 静态 token/样式检查确认当前合同不足。 | WP-6 页面权限显隐及旧标题任务收口 |
| `QA-VISUAL-001` | 视觉证据可信度 | P2 | 高 | `CONFIRMED` | `OPEN` | `NOT_APPLICABLE` | `NOT_REQUIRED` | `page-static-review.md#page-p2-007` | 报告可能遗漏真实路由/中间断点却给出过强信心。 | 显式路由计划、最终 URL/标题/错误页断言和代表断点。 | 静态矩阵确认通配、旧路由和断点缺口。 | WP-4 发布门禁可信化 |
| `QA-VISUAL-001` | 视觉证据可信度 | P2 | 高 | `CONFIRMED` | `LOCAL_FIX_VERIFIED` | `NOT_APPLICABLE` | `NOT_REQUIRED` | `page-static-review.md#page-p2-007`;任务 `07-18-small-team-internal-readiness/evidence.md` | 报告可能遗漏真实路由/中间断点却给出过强信心。 | 显式路由计划、最终 URL/标题/错误页断言和代表断点。 | 71 条路由分类、10 个 source-bound witness、7 个 acceptance spec、代表断点和结果 parser 反例均通过。 | WP-4 发布门禁可信化 |
| `MOB-PERM-001` | 移动导航权限 | P2 | 中高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `NOT_REQUIRED` | `page-static-review.md#page-p2-008` | 最小权限角色看到无效入口或进入 403。 | 移动入口统一复用能力谓词,未授权默认隐藏。 | 静态导航与守卫对照确认不一致。 | WP-6 页面权限显隐及旧标题任务收口 |
| `QA-ASSET-001` | 资产 E2E 漂移 | P2 | 高 | `DUPLICATE` | `ACTIVE_TASK_OPEN` | `NOT_APPLICABLE` | `NOT_REQUIRED` | `page-static-review.md#page-dup-p2-001`;活动任务 `05-31-unified-page-header-actions` | 自动化仍按旧交互执行,不能证明当前页面。 | 测试跟随当前“更多”菜单交互,不为旧测试恢复旧按钮。 | 只读测试/页面对照确认重复项。 | WP-6 页面权限显隐及旧标题任务收口 |
| `QA-HEADER-001` | 标题动作合同 / 视觉覆盖 | P2 | 高 | `DUPLICATE` | `ACTIVE_TASK_OPEN` | `NOT_APPLICABLE` | `NOT_REQUIRED` | `page-static-review.md#page-dup-p2-002`;活动任务 `05-31-unified-page-header-actions` | 标题区可能继续堆叠动作且现有回归不报警。 | 可测试的主操作/更多槽位及项目、资产代表性视觉断言。 | 静态组件与测试矩阵确认重复项。 | WP-6 页面权限显隐及旧标题任务收口 |
| `QA-ASSET-001` | 资产 E2E 漂移 | P2 | 高 | `DUPLICATE` | `LOCAL_FIX_VERIFIED` | `NOT_APPLICABLE` | `NOT_REQUIRED` | `page-static-review.md#page-dup-p2-001`;归档任务 `05-31-unified-page-header-actions`;任务 `07-18-small-team-internal-readiness/evidence.md` | 自动化仍按旧交互执行,不能证明当前页面。 | 测试跟随当前“更多”菜单交互,不为旧测试恢复旧按钮。 | 资产 E2E 已改为“更多→资产分类”,spec 可解析且实际菜单行为/代表视觉由候选浏览器回归通过。 | WP-6 页面权限显隐及旧标题任务收口 |
| `QA-HEADER-001` | 标题动作合同 / 视觉覆盖 | P2 | 高 | `DUPLICATE` | `LOCAL_FIX_VERIFIED` | `NOT_APPLICABLE` | `NOT_REQUIRED` | `page-static-review.md#page-dup-p2-002`;归档任务 `05-31-unified-page-header-actions`;任务 `07-18-small-team-internal-readiness/evidence.md` | 标题区可能继续堆叠动作且现有回归不报警。 | 可测试的主操作/更多槽位及项目、资产代表性视觉断言。 | 七页面“一主操作+最多一个更多”合同、项目/资产代表视觉和资产菜单行为纳入 44/44 候选回归。 | WP-6 页面权限显隐及旧标题任务收口 |
| `QA-COVERAGE-001` | 风险型测试覆盖 | P2 | 高 | `CONFIRMED` | `OPEN` | `NOT_APPLICABLE` | `NOT_REQUIRED` | `engineering-review.md#测试资产与实测覆盖率` | 全量用例通过仍不能防止关键 worker/脚本覆盖退化。 | 对认证、资金、worker、迁移/恢复入口设置分层防回退门禁。 | 旧基线 coverage 与入口清单确认关键运行面无阈值。 | WP-4 发布门禁可信化 |
| `REL-GATE-001` | 发布门禁可信度 | P1 | 高 | `CONFIRMED` | `OPEN` | `NOT_APPLICABLE` | `NOT_REQUIRED` | `engineering-review.md#流程覆盖扫描可信度`、`#项目级发布门禁可执行性`;`current-head-delta.md` | 标准门禁不可移植且会把大量未映射路由报告成无高风险缺口。 | 仓库内可执行、显式映射/豁免、排除 manual/live、缺口非零退出并自测反例。 | 当前 HEAD 扫描 68 路由仍有 39 未映射却无 gap;标准 runner 依赖失效外部前置。 | WP-4 发布门禁可信化 |
| `MOB-ARCHIVE-001` | 移动归档详情响应式 | P2 | 高 | `CONFIRMED` | `OPEN` | `NO_FIX_TO_DEPLOY` | `EXTERNAL_BEHAVIOR_PENDING` | `baseline.md#移动路由静态合同`;`browser-review.md` | 长标识使详情内部内容被隐藏,用户无法横向找回。 | 保持路由/卡片/底栏基线并让详情长字段安全换行或可控滚动。 | 375×812 的 URL、H1、空态、列表和底栏通过;长详情 panel 351/457,约 105px 被 `overflow-x:hidden` 裁切。 | WP-6 页面权限显隐及旧标题任务收口 |
| `REL-GATE-001` | 发布门禁可信度 | P1 | 高 | `CONFIRMED` | `LOCAL_FIX_VERIFIED` | `NOT_APPLICABLE` | `NOT_REQUIRED` | `engineering-review.md#流程覆盖扫描可信度`、`#项目级发布门禁可执行性`;`current-head-delta.md`;任务 `07-18-small-team-internal-readiness/evidence.md` | 标准门禁不可移植且会把大量未映射路由报告成无高风险缺口。 | 仓库内可执行、显式映射/豁免、排除 manual/live、缺口非零退出并自测反例。 | `full` 门禁在仓库内 exit 0;71 路由、10/10 witness、7/7 acceptance、52 个反例与 44/44 浏览器结果通过,且 full/focused/list 标签分离。 | WP-4 发布门禁可信化 |
| `MOB-ARCHIVE-001` | 移动归档详情响应式 | P2 | 高 | `CONFIRMED` | `LOCAL_FIX_VERIFIED` | `DEPLOYMENT_PENDING` | `EXTERNAL_BEHAVIOR_PENDING` | `baseline.md#移动路由静态合同`;`browser-review.md`;任务 `07-18-small-team-internal-readiness/evidence.md` | 长标识使详情内部内容被隐藏,用户无法横向找回。 | 保持路由/卡片/底栏基线并让详情长字段安全换行或可控滚动。 | 375×812 的空态、记录、长详情、底栏与 document 横溢断言及脱敏截图通过;企业微信真机仍待授权。 | WP-6 页面权限显隐及旧标题任务收口 |
## 不进入 Finding 的观察与外部补证