diff --git a/artifacts/r94/post-fix-contracts-desktop-permission-2026-05-06.json b/artifacts/r94/post-fix-contracts-desktop-permission-2026-05-06.json new file mode 100644 index 00000000..79f2ed2d --- /dev/null +++ b/artifacts/r94/post-fix-contracts-desktop-permission-2026-05-06.json @@ -0,0 +1,14 @@ +{ + "generatedAt": "2026-05-05T16:27:58.735Z", + "baseURL": "https://oa.hyinda.com", + "route": "/contracts-registry", + "viewport": "desktop1440", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-post-fix/desktop1440-contracts-registry.png", + "httpErrors": [], + "consoleErrors": [], + "api403": [], + "metrics": { + "finalUrl": "https://oa.hyinda.com/contracts-registry", + "textSample": "备用模块合同台账你好,Employeesearch搜索searchEmployee合同台账维护合同元数据、生命周期、到期预警与导出,不在 OA 存放涉密正文附件。导出 CSV导出 Excel返回项目到期预警0份合同将在 30 天内到期展开到期列表新建合同台账补齐合同类型、金额、签署/生效/到期日期,续约将自动创建新的草稿合同。合同编号合同类型采购合同销售合同服务合同框架协议其他状态activedraftarchived关联项目未关联相对方摘要合同金额币种签署日期生效日期到期日" + } +} diff --git a/artifacts/r94/post-fix-mobile-audit-2026-05-06.json b/artifacts/r94/post-fix-mobile-audit-2026-05-06.json new file mode 100644 index 00000000..8cd19c20 --- /dev/null +++ b/artifacts/r94/post-fix-mobile-audit-2026-05-06.json @@ -0,0 +1,233 @@ +{ + "generatedAt": "2026-05-05T16:27:25.218Z", + "baseURL": "https://oa.hyinda.com", + "loginFailure": null, + "tablePages": [], + "api403": [], + "offscreenPages": [], + "results": [ + { + "route": "/assets", + "viewport": "mobile360", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-post-fix/mobile360-assets.png", + "httpErrors": [], + "consoleErrors": [], + "metrics": { + "path": "/assets", + "finalUrl": "https://oa.hyinda.com/assets", + "viewportWidth": 360, + "visibleTableCount": 0, + "visibleTables": [], + "offscreenInteractives": [], + "tinyInteractives": [ + { + "tag": "button", + "text": "", + "left": 16, + "top": 36, + "right": 43, + "bottom": 80, + "width": 27, + "height": 44 + }, + { + "tag": "input", + "text": "", + "left": 41, + "top": 660, + "right": 57, + "bottom": 676, + "width": 16, + "height": 16 + } + ], + "mainTextSample": "主导航资产你好,Employeesearch搜索searchEmployee资产台账维护资产分类与资产卡片,支持法体、成本中心和采购来源引用。移动扫码查找资产分类分类编码分类名称单据分类使用系统默认固定资产卡片 (ASSET_CARD_DEFAULT)启用分类暂无资产分类编码名称状态全部状态库存中使用中维修中已退役已归档全部分类全部法体试运行法体全部成本中心全部归属人暂无资产卡片资产分类状态归属人暂无资产卡片请先从列表选择资产卡片,或点击“新建资产卡片”。" + } + }, + { + "route": "/notifications", + "viewport": "mobile360", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-post-fix/mobile360-notifications.png", + "httpErrors": [], + "consoleErrors": [], + "metrics": { + "path": "/notifications", + "finalUrl": "https://oa.hyinda.com/notifications", + "viewportWidth": 360, + "visibleTableCount": 0, + "visibleTables": [], + "offscreenInteractives": [], + "tinyInteractives": [ + { + "tag": "button", + "text": "", + "left": 16, + "top": 36, + "right": 40, + "bottom": 80, + "width": 24, + "height": 44 + } + ], + "mainTextSample": "工作台/notifications你好,Employeesearch搜索searchEmployee通知站内通知与待办提醒。全部标为已读返回仪表盘全部未读类型全部审批待办报销请假采购差旅资产盘点未读 0 条暂无通知标题时间状态操作暂无通知第 1 / 1 页上一页下一页" + } + }, + { + "route": "/purchase-requests", + "viewport": "mobile360", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-post-fix/mobile360-purchase-requests.png", + "httpErrors": [], + "consoleErrors": [], + "metrics": { + "path": "/purchase-requests", + "finalUrl": "https://oa.hyinda.com/purchase-requests", + "viewportWidth": 360, + "visibleTableCount": 0, + "visibleTables": [], + "offscreenInteractives": [], + "tinyInteractives": [ + { + "tag": "button", + "text": "", + "left": 16, + "top": 36, + "right": 38, + "bottom": 80, + "width": 22, + "height": 44 + } + ], + "mainTextSample": "工作台/purchase-requests你好,Employeesearch搜索searchEmployee采购申请支持草稿、附件、提交、撤回与经理单步审批的轻采购流程。新建采购全部状态草稿审批中已通过已驳回已取消全部供应商全部法体试运行法体全部成本中心采购单列表共 0 条暂无采购申请单据申请人状态金额暂无采购申请第 1 / 1 页上一页下一页请先在左侧选择采购单,或新建一张采购草稿。" + } + }, + { + "route": "/contracts-registry", + "viewport": "mobile360", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-post-fix/mobile360-contracts-registry.png", + "httpErrors": [], + "consoleErrors": [], + "metrics": { + "path": "/contracts-registry", + "finalUrl": "https://oa.hyinda.com/contracts-registry", + "viewportWidth": 360, + "visibleTableCount": 0, + "visibleTables": [], + "offscreenInteractives": [], + "tinyInteractives": [ + { + "tag": "button", + "text": "", + "left": 16, + "top": 36, + "right": 43, + "bottom": 80, + "width": 27, + "height": 44 + } + ], + "mainTextSample": "备用模块合同台账你好,Employeesearch搜索searchEmployee合同台账维护合同元数据、生命周期、到期预警与导出,不在 OA 存放涉密正文附件。导出 CSV导出 Excel返回项目到期预警0份合同将在 30 天内到期展开到期列表新建合同台账补齐合同类型、金额、签署/生效/到期日期,续约将自动创建新的草稿合同。合同编号合同类型采购合同销售合同服务合同框架协议其他状态activedraftarchived关联项目未关联相对方摘要合同金额币种签署日期生效日期到期日" + } + }, + { + "route": "/assets", + "viewport": "mobile390", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-post-fix/mobile390-assets.png", + "httpErrors": [], + "consoleErrors": [], + "metrics": { + "path": "/assets", + "finalUrl": "https://oa.hyinda.com/assets", + "viewportWidth": 390, + "visibleTableCount": 0, + "visibleTables": [], + "offscreenInteractives": [], + "tinyInteractives": [ + { + "tag": "input", + "text": "", + "left": 41, + "top": 660, + "right": 57, + "bottom": 676, + "width": 16, + "height": 16 + } + ], + "mainTextSample": "主导航资产你好,Employeesearch搜索searchEmployee资产台账维护资产分类与资产卡片,支持法体、成本中心和采购来源引用。移动扫码查找资产分类分类编码分类名称单据分类使用系统默认固定资产卡片 (ASSET_CARD_DEFAULT)启用分类暂无资产分类编码名称状态全部状态库存中使用中维修中已退役已归档全部分类全部法体试运行法体全部成本中心全部归属人暂无资产卡片资产分类状态归属人暂无资产卡片请先从列表选择资产卡片,或点击“新建资产卡片”。" + } + }, + { + "route": "/notifications", + "viewport": "mobile390", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-post-fix/mobile390-notifications.png", + "httpErrors": [], + "consoleErrors": [], + "metrics": { + "path": "/notifications", + "finalUrl": "https://oa.hyinda.com/notifications", + "viewportWidth": 390, + "visibleTableCount": 0, + "visibleTables": [], + "offscreenInteractives": [], + "tinyInteractives": [ + { + "tag": "button", + "text": "", + "left": 16, + "top": 36, + "right": 48, + "bottom": 80, + "width": 32, + "height": 44 + } + ], + "mainTextSample": "工作台/notifications你好,Employeesearch搜索searchEmployee通知站内通知与待办提醒。全部标为已读返回仪表盘全部未读类型全部审批待办报销请假采购差旅资产盘点未读 0 条暂无通知标题时间状态操作暂无通知第 1 / 1 页上一页下一页" + } + }, + { + "route": "/purchase-requests", + "viewport": "mobile390", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-post-fix/mobile390-purchase-requests.png", + "httpErrors": [], + "consoleErrors": [], + "metrics": { + "path": "/purchase-requests", + "finalUrl": "https://oa.hyinda.com/purchase-requests", + "viewportWidth": 390, + "visibleTableCount": 0, + "visibleTables": [], + "offscreenInteractives": [], + "tinyInteractives": [ + { + "tag": "button", + "text": "", + "left": 16, + "top": 36, + "right": 40, + "bottom": 80, + "width": 24, + "height": 44 + } + ], + "mainTextSample": "工作台/purchase-requests你好,Employeesearch搜索searchEmployee采购申请支持草稿、附件、提交、撤回与经理单步审批的轻采购流程。新建采购全部状态草稿审批中已通过已驳回已取消全部供应商全部法体试运行法体全部成本中心采购单列表共 0 条暂无采购申请单据申请人状态金额暂无采购申请第 1 / 1 页上一页下一页请先在左侧选择采购单,或新建一张采购草稿。" + } + }, + { + "route": "/contracts-registry", + "viewport": "mobile390", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-post-fix/mobile390-contracts-registry.png", + "httpErrors": [], + "consoleErrors": [], + "metrics": { + "path": "/contracts-registry", + "finalUrl": "https://oa.hyinda.com/contracts-registry", + "viewportWidth": 390, + "visibleTableCount": 0, + "visibleTables": [], + "offscreenInteractives": [], + "tinyInteractives": [], + "mainTextSample": "备用模块合同台账你好,Employeesearch搜索searchEmployee合同台账维护合同元数据、生命周期、到期预警与导出,不在 OA 存放涉密正文附件。导出 CSV导出 Excel返回项目到期预警0份合同将在 30 天内到期展开到期列表新建合同台账补齐合同类型、金额、签署/生效/到期日期,续约将自动创建新的草稿合同。合同编号合同类型采购合同销售合同服务合同框架协议其他状态activedraftarchived关联项目未关联相对方摘要合同金额币种签署日期生效日期到期日" + } + } + ] +} diff --git a/artifacts/r94/preflight-mobile-audit-2026-05-06.json b/artifacts/r94/preflight-mobile-audit-2026-05-06.json new file mode 100644 index 00000000..e02596ab --- /dev/null +++ b/artifacts/r94/preflight-mobile-audit-2026-05-06.json @@ -0,0 +1,507 @@ +{ + "summary": { + "generatedAt": "2026-05-05T16:09:19.921Z", + "baseURL": "https://oa.hyinda.com", + "results": 16, + "tablePages": [ + "/assets@mobile360", + "/notifications@mobile360", + "/purchase-requests@mobile360", + "/assets@mobile390", + "/notifications@mobile390", + "/purchase-requests@mobile390" + ], + "api403": [ + "/contracts-registry@mobile360", + "/contracts-registry@mobile390" + ] + }, + "results": [ + { + "route": "/assets", + "viewport": "mobile360", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile360-assets.png", + "metrics": { + "path": "/assets", + "title": "海音达工作台", + "visibleTableCount": 1, + "tables": [ + { + "testid": null, + "left": 42, + "right": 318, + "width": 276, + "top": 695, + "bottom": 735 + } + ], + "offscreen": [], + "smallTargets": [ + { + "label": "打开菜单", + "width": 27, + "height": 44 + }, + { + "label": "INPUT", + "width": 16, + "height": 16 + } + ], + "bodyOverflowX": 0, + "mobileLikeCards": 2 + }, + "httpErrors": [], + "consoleErrors": [] + }, + { + "route": "/notifications", + "viewport": "mobile360", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile360-notifications.png", + "metrics": { + "path": "/notifications", + "title": "海音达工作台", + "visibleTableCount": 1, + "tables": [ + { + "testid": "notifications-table", + "left": 42, + "right": 318, + "width": 276, + "top": 475, + "bottom": 561 + } + ], + "offscreen": [], + "smallTargets": [ + { + "label": "打开菜单", + "width": 24, + "height": 44 + }, + { + "label": "全部", + "width": 52, + "height": 36 + }, + { + "label": "未读", + "width": 52, + "height": 36 + } + ], + "bodyOverflowX": 0, + "mobileLikeCards": 2 + }, + "httpErrors": [], + "consoleErrors": [] + }, + { + "route": "/purchase-requests", + "viewport": "mobile360", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile360-purchase-requests.png", + "metrics": { + "path": "/purchase-requests", + "title": "海音达工作台", + "visibleTableCount": 1, + "tables": [ + { + "testid": "purchase-requests-table", + "left": 42, + "right": 318, + "width": 276, + "top": 681, + "bottom": 773 + } + ], + "offscreen": [], + "smallTargets": [ + { + "label": "打开菜单", + "width": 22, + "height": 44 + } + ], + "bodyOverflowX": 0, + "mobileLikeCards": 3 + }, + "httpErrors": [], + "consoleErrors": [] + }, + { + "route": "/team", + "viewport": "mobile360", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile360-team.png", + "metrics": { + "path": "/team", + "title": "海音达工作台", + "visibleTableCount": 0, + "tables": [], + "offscreen": [], + "smallTargets": [ + { + "label": "打开菜单", + "width": 27, + "height": 44 + } + ], + "bodyOverflowX": 0, + "mobileLikeCards": 3 + }, + "httpErrors": [], + "consoleErrors": [] + }, + { + "route": "/leave-requests", + "viewport": "mobile360", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile360-leave-requests.png", + "metrics": { + "path": "/leave-requests", + "title": "海音达工作台", + "visibleTableCount": 0, + "tables": [], + "offscreen": [], + "smallTargets": [ + { + "label": "打开菜单", + "width": 27, + "height": 44 + } + ], + "bodyOverflowX": 0, + "mobileLikeCards": 14 + }, + "httpErrors": [], + "consoleErrors": [] + }, + { + "route": "/todos", + "viewport": "mobile360", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile360-todos.png", + "metrics": { + "path": "/todos", + "title": "海音达工作台", + "visibleTableCount": 0, + "tables": [], + "offscreen": [], + "smallTargets": [ + { + "label": "打开菜单", + "width": 27, + "height": 44 + } + ], + "bodyOverflowX": 0, + "mobileLikeCards": 14 + }, + "httpErrors": [], + "consoleErrors": [] + }, + { + "route": "/attendance", + "viewport": "mobile360", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile360-attendance.png", + "metrics": { + "path": "/attendance", + "title": "海音达工作台", + "visibleTableCount": 0, + "tables": [], + "offscreen": [], + "smallTargets": [ + { + "label": "打开菜单", + "width": 27, + "height": 44 + }, + { + "label": "我的考勤", + "width": 80, + "height": 36 + } + ], + "bodyOverflowX": 0, + "mobileLikeCards": 10 + }, + "httpErrors": [], + "consoleErrors": [] + }, + { + "route": "/contracts-registry", + "viewport": "mobile360", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile360-contracts-registry.png", + "metrics": { + "path": "/contracts-registry", + "title": "海音达工作台", + "visibleTableCount": 0, + "tables": [], + "offscreen": [], + "smallTargets": [ + { + "label": "打开菜单", + "width": 27, + "height": 44 + } + ], + "bodyOverflowX": 0, + "mobileLikeCards": 3 + }, + "httpErrors": [ + { + "status": 403, + "url": "https://oa.hyinda.com/api/employees?page=1&pageSize=100&status=active" + }, + { + "status": 403, + "url": "https://oa.hyinda.com/api/employees?page=1&pageSize=100&status=active" + } + ], + "consoleErrors": [ + "Failed to load resource: the server responded with a status of 403 ()", + "Failed to load resource: the server responded with a status of 403 ()" + ] + }, + { + "route": "/assets", + "viewport": "mobile390", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile390-assets.png", + "metrics": { + "path": "/assets", + "title": "海音达工作台", + "visibleTableCount": 1, + "tables": [ + { + "testid": null, + "left": 42, + "right": 348, + "width": 306, + "top": 695, + "bottom": 735 + } + ], + "offscreen": [], + "smallTargets": [ + { + "label": "打开菜单", + "width": 35, + "height": 44 + }, + { + "label": "INPUT", + "width": 16, + "height": 16 + } + ], + "bodyOverflowX": 0, + "mobileLikeCards": 3 + }, + "httpErrors": [], + "consoleErrors": [] + }, + { + "route": "/notifications", + "viewport": "mobile390", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile390-notifications.png", + "metrics": { + "path": "/notifications", + "title": "海音达工作台", + "visibleTableCount": 1, + "tables": [ + { + "testid": "notifications-table", + "left": 42, + "right": 348, + "width": 306, + "top": 475, + "bottom": 561 + } + ], + "offscreen": [], + "smallTargets": [ + { + "label": "打开菜单", + "width": 32, + "height": 44 + }, + { + "label": "全部", + "width": 52, + "height": 36 + }, + { + "label": "未读", + "width": 52, + "height": 36 + } + ], + "bodyOverflowX": 0, + "mobileLikeCards": 2 + }, + "httpErrors": [], + "consoleErrors": [] + }, + { + "route": "/purchase-requests", + "viewport": "mobile390", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile390-purchase-requests.png", + "metrics": { + "path": "/purchase-requests", + "title": "海音达工作台", + "visibleTableCount": 1, + "tables": [ + { + "testid": "purchase-requests-table", + "left": 42, + "right": 348, + "width": 306, + "top": 681, + "bottom": 773 + } + ], + "offscreen": [], + "smallTargets": [ + { + "label": "打开菜单", + "width": 24, + "height": 44 + } + ], + "bodyOverflowX": 0, + "mobileLikeCards": 3 + }, + "httpErrors": [], + "consoleErrors": [] + }, + { + "route": "/team", + "viewport": "mobile390", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile390-team.png", + "metrics": { + "path": "/team", + "title": "海音达工作台", + "visibleTableCount": 0, + "tables": [], + "offscreen": [], + "smallTargets": [ + { + "label": "打开菜单", + "width": 35, + "height": 44 + } + ], + "bodyOverflowX": 0, + "mobileLikeCards": 3 + }, + "httpErrors": [], + "consoleErrors": [] + }, + { + "route": "/leave-requests", + "viewport": "mobile390", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile390-leave-requests.png", + "metrics": { + "path": "/leave-requests", + "title": "海音达工作台", + "visibleTableCount": 0, + "tables": [], + "offscreen": [], + "smallTargets": [ + { + "label": "打开菜单", + "width": 35, + "height": 44 + } + ], + "bodyOverflowX": 0, + "mobileLikeCards": 17 + }, + "httpErrors": [], + "consoleErrors": [] + }, + { + "route": "/todos", + "viewport": "mobile390", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile390-todos.png", + "metrics": { + "path": "/todos", + "title": "海音达工作台", + "visibleTableCount": 0, + "tables": [], + "offscreen": [], + "smallTargets": [ + { + "label": "打开菜单", + "width": 35, + "height": 44 + } + ], + "bodyOverflowX": 0, + "mobileLikeCards": 17 + }, + "httpErrors": [], + "consoleErrors": [] + }, + { + "route": "/attendance", + "viewport": "mobile390", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile390-attendance.png", + "metrics": { + "path": "/attendance", + "title": "海音达工作台", + "visibleTableCount": 0, + "tables": [], + "offscreen": [], + "smallTargets": [ + { + "label": "打开菜单", + "width": 35, + "height": 44 + }, + { + "label": "我的考勤", + "width": 80, + "height": 36 + } + ], + "bodyOverflowX": 0, + "mobileLikeCards": 12 + }, + "httpErrors": [], + "consoleErrors": [] + }, + { + "route": "/contracts-registry", + "viewport": "mobile390", + "screenshot": "/home/shunli/Projects/hyb-oa/output/playwright/r94-preflight/mobile390-contracts-registry.png", + "metrics": { + "path": "/contracts-registry", + "title": "海音达工作台", + "visibleTableCount": 0, + "tables": [], + "offscreen": [], + "smallTargets": [ + { + "label": "打开菜单", + "width": 35, + "height": 44 + } + ], + "bodyOverflowX": 0, + "mobileLikeCards": 3 + }, + "httpErrors": [ + { + "status": 403, + "url": "https://oa.hyinda.com/api/employees?page=1&pageSize=100&status=active" + }, + { + "status": 403, + "url": "https://oa.hyinda.com/api/employees?page=1&pageSize=100&status=active" + } + ], + "consoleErrors": [ + "Failed to load resource: the server responded with a status of 403 ()", + "Failed to load resource: the server responded with a status of 403 ()" + ] + } + ] +} \ No newline at end of file diff --git a/issues/2026-05-06_00-09-33-r94-r95-mobile-permission-closeout.csv b/issues/2026-05-06_00-09-33-r94-r95-mobile-permission-closeout.csv new file mode 100644 index 00000000..11308bc3 --- /dev/null +++ b/issues/2026-05-06_00-09-33-r94-r95-mobile-permission-closeout.csv @@ -0,0 +1,8 @@ +ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes +A1,R94/R95 执行合同冻结,"基于 2026-05-06 最新公网 360/390px 预检,把后续剩余问题收敛为三类移动端表格清零和合同台账权限一致性。","Issue CSV 字段完整并通过校验;本轮只处理 `/assets`、`/notifications`、`/purchase-requests`、`/contracts-registry`,不扩展新业务能力。","命令:`python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-06_00-09-33-r94-r95-mobile-permission-closeout.csv`。业务:确认最新公网预检 `artifacts/r94/preflight-mobile-audit-2026-05-06.json` 只剩目标页面仍有移动表格或 403。",manual,DONE,DONE,DONE,issues/2026-05-06_00-09-33-r94-r95-mobile-permission-closeout.csv,[],2026-05-06:CSV 已创建并通过校验;回滚路径:删除本 CSV;本轮不处理已在 R93 解决的票据/报销/移动上传。 +A2,资产页移动端卡片化,"把资产页在 360/390px 下仍可见的资产表格改为移动卡片或移动列表,桌面表格保持原交互。","1) `/assets` mobile360/mobile390 主区域 `visibleTableCount=0`;2) 分类和资产列表核心字段可读,操作入口不出屏;3) 桌面资产表格仍可用;4) 小触控目标不增加。","命令:`cd client && npm run typecheck && npm run build`;Playwright 公网/本地视觉探针检查 `/assets` mobile360/mobile390,无可见 table、无 offscreen interactive。业务:员工手机查看资产信息不需要横向表格。",playwright|typescript,DONE,DONE,DONE,client/src/pages/AssetRegistryPage.tsx|client/src/router/lazy/AssetRegistryPage.ts,["A1"],2026-05-06:资产分类与资产列表已改为移动卡片;公网 post-fix 视觉复测 `/assets` mobile360/mobile390 visibleTableCount=0 且无出屏交互;回滚路径:恢复资产页组件改动。 +A3,通知页移动端卡片化,"把通知页在 360/390px 下仍可见的通知表格改为移动消息卡片,桌面表格保持原交互。","1) `/notifications` mobile360/mobile390 主区域 `visibleTableCount=0`;2) 标题、类型、状态、时间和操作在卡片内可读可点;3) 未读/全部筛选不回归;4) 桌面表格仍可用。","命令:`cd client && npm run typecheck && npm run build`;Playwright 视觉探针检查 `/notifications` mobile360/mobile390,无可见 table、无 offscreen interactive。业务:员工手机查看通知不需要横向表格。",playwright|typescript,DONE,DONE,DONE,client/src/pages/NotificationsPage.tsx|client/src/router/lazy/NotificationsPage.ts,["A1"],2026-05-06:通知列表已改为移动消息卡片;公网 post-fix 视觉复测 `/notifications` mobile360/mobile390 visibleTableCount=0 且无出屏交互;回滚路径:恢复通知页组件改动。 +A4,采购页移动端卡片化,"把采购申请页在 360/390px 下仍可见的采购表格改为移动单据卡片,桌面表格保持原交互。","1) `/purchase-requests` mobile360/mobile390 主区域 `visibleTableCount=0`;2) 采购标题、状态、金额、申请人和查看入口可读可点;3) 新建/导出等页头操作不出屏;4) 桌面表格仍可用。","命令:`cd client && npm run typecheck && npm run build`;Playwright 视觉探针检查 `/purchase-requests` mobile360/mobile390,无可见 table、无 offscreen interactive。业务:员工手机查看采购单不需要横向表格。",playwright|typescript,DONE,DONE,DONE,client/src/pages/PurchaseRequestsPage.tsx|client/src/router/lazy/PurchaseRequestsPage.ts,["A1"],2026-05-06:采购列表以及采购明细和附件已补移动卡片/分组表单;公网 post-fix 视觉复测 `/purchase-requests` mobile360/mobile390 visibleTableCount=0 且无出屏交互;回滚路径:恢复采购页组件改动。 +A5,合同台账员工视角权限一致性,"修复 `/contracts-registry` 员工视角页面可进入但内部请求 `/api/employees` 返回 403 的噪声,统一页面数据依赖与权限。","1) 员工访问 `/contracts-registry` 不再触发 `/api/employees` 403;2) 若员工无人员目录权限,筛选/负责人选择降级为不可用或仅显示已有文本;3) 管理/有权限角色保留人员筛选能力;4) 页面不出现空白或错误风暴。","命令:`cd client && npm run typecheck && npm run build`;公网 Playwright 检查 `/contracts-registry` mobile360/mobile390/desktop1440,`httpErrors` 中无 403;必要时补前端权限判断测试。业务:员工进入合同台账时页面权限边界一致。",playwright|typescript,DONE,DONE,DONE,client/src/pages/ContractsRegistryPage.tsx|client/src/api/employees.ts|client/src/auth/permissions.ts,["A1"],2026-05-06:合同台账按 system.users/report.dashboard.view 跳过无权员工列表请求;无目录权限时责任人改为只读说明且保存不改责任人;公网 mobile360/mobile390/desktop1440 均无 403;回滚路径:恢复合同台账页权限判断。 +A6,R94/R95 自动化视觉复测,"对本轮修改页面执行 360/390px 自动化视觉复测,并保留 JSON/截图证据。","1) `/assets`、`/notifications`、`/purchase-requests` mobile360/mobile390 `visibleTableCount=0`;2) `/contracts-registry` 无 API 403;3) 复测 JSON 写入 `artifacts/r94/`;4) 截图写入 ignored `output/playwright/`。","命令:Playwright 只读视觉脚本扫描 `/assets`、`/notifications`、`/purchase-requests`、`/contracts-registry` 的 mobile360/mobile390,并解析 JSON 断言。业务:手机端剩余主问题关闭且权限噪声消失。",playwright,DONE,DONE,DONE,artifacts/r94|output/playwright/r94-*,"[""A2"",""A3"",""A4"",""A5""]",2026-05-06:公网 post-fix 复测写入 artifacts/r94/post-fix-mobile-audit-2026-05-06.json 和 artifacts/r94/post-fix-contracts-desktop-permission-2026-05-06.json;截图在 ignored output/playwright/r94-post-fix;回滚路径:删除新增审计产物。 +A7,R94/R95 构建部署与中文提交,"完成本地构建、远端部署、远端 smoke、公网视觉复测,并按中文分批提交。","1) `npm run typecheck` 与 `npm run build` 通过;2) 远端 `/ready`、external deps smoke、runtime smoke 通过;3) 公网 post-deploy 视觉复测通过;4) commit message 使用中文并引用 R94/R95;5) `git status --short` 干净。","命令:`cd client && npm run typecheck && npm run build`;远端 `docker-compose ... up -d --build server`、`init`、`smoke-external-deps.js`、`smoke-trialrun-runtime.js`;公网 Playwright 复测。业务:公网用户实际看到修复后的移动端与权限行为。",playwright|ssh|git,DONE,DONE,DONE,N/A,["A6"],2026-05-06:本地 typecheck/build 通过;deploy/trialrun/deploy.sh 完成;远端 /ready external deps smoke runtime smoke 补跑均通过;已按中文分批提交;回滚路径:revert commit 或重建上一版 Docker 镜像。