From fe0780c551a0482244d8052a1a59a46a7e6f2fd1 Mon Sep 17 00:00:00 2001 From: shunli Date: Tue, 26 May 2026 17:53:56 +0800 Subject: [PATCH] =?UTF-8?q?oa-frontend-postdeploy-public-verification=20?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=85=AC=E7=BD=91=E9=83=A8=E7=BD=B2=E5=90=8E?= =?UTF-8?q?=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prd.md | 20 +- .../postdeploy-live-smoke-readiness/env.json | 42 + .../live-ocr.txt | 7 + .../live-smoke.txt | 14 + .../pending-ocr.txt | 1 + .../public-bundle-copy.txt | 1 + .../summary.json | 11 + .../postdeploy-mobile-entry-matrix/output.log | 15 + .../summary.json | 892 +++++++ .../postdeploy-permission-matrix/summary.json | 2285 +++++++++++++++++ .../postdeploy-permission-matrix/summary.md | 28 + .../research/postdeploy-summary.md | 43 + .../output.log | 17 + 13 files changed, 3366 insertions(+), 10 deletions(-) create mode 100644 .trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/env.json create mode 100644 .trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/live-ocr.txt create mode 100644 .trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/live-smoke.txt create mode 100644 .trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/pending-ocr.txt create mode 100644 .trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/public-bundle-copy.txt create mode 100644 .trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/summary.json create mode 100644 .trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-mobile-entry-matrix/output.log create mode 100644 .trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-oafront3-pc-readonly/summary.json create mode 100644 .trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-permission-matrix/summary.json create mode 100644 .trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-permission-matrix/summary.md create mode 100644 .trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-summary.md create mode 100644 .trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-wecom-rendering-matrix/output.log diff --git a/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/prd.md b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/prd.md index 2773127a..a825703b 100644 --- a/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/prd.md +++ b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/prd.md @@ -57,16 +57,16 @@ ## Acceptance Criteria -- [ ] 用户明确批准执行公网部署。 -- [ ] 部署前本地门禁通过。 -- [ ] `SYNC_ENV=0 bash deploy/trialrun/deploy.sh` 成功,不覆盖远端 `.env`。 -- [ ] 部署后公网 `/ready` 通过。 -- [ ] 部署后 live smoke / OCR readiness 通过或可解释。 -- [ ] 部署后权限矩阵 `PASS_PERMISSION_MATRIX_READY`。 -- [ ] 部署后 PC 只读视觉矩阵无 P1 blocker。 -- [ ] 部署后移动入口和企业微信渲染矩阵通过。 -- [ ] 所有报告保存到当前 task 的 `research/` 或既有 `artifacts/qa-flow/`,且只在 task 中引用脱敏相对路径。 -- [ ] Trellis validate、governance 和 `git diff --check` 通过。 +- [x] 用户明确批准执行公网部署。 +- [x] 部署前本地门禁通过。 +- [x] `SYNC_ENV=0 bash deploy/trialrun/deploy.sh` 成功,不覆盖远端 `.env`。 +- [x] 部署后公网 `/ready` 通过。 +- [x] 部署后 live smoke / OCR readiness 通过或可解释。 +- [x] 部署后权限矩阵 `PASS_PERMISSION_MATRIX_READY`。 +- [x] 部署后 PC 只读视觉矩阵无 P1 blocker。 +- [x] 部署后移动入口和企业微信渲染矩阵通过。 +- [x] 所有报告保存到当前 task 的 `research/` 或既有 `artifacts/qa-flow/`,且只在 task 中引用脱敏相对路径。 +- [x] Trellis validate、governance 和 `git diff --check` 通过。 ## Definition Of Done diff --git a/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/env.json b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/env.json new file mode 100644 index 00000000..2f400368 --- /dev/null +++ b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/env.json @@ -0,0 +1,42 @@ +{ + "checkedAt": "2026-05-26T09:45:41.133Z", + "baseUrl": "https://oa.hyinda.com", + "liveSmokeReady": true, + "liveSmoke": { + "LIVE_SMOKE_ADMIN_IDENTIFIER": true, + "LIVE_SMOKE_ADMIN_PASSWORD": true, + "LIVE_SMOKE_EMPLOYEE_IDENTIFIER": true, + "LIVE_SMOKE_EMPLOYEE_PASSWORD": true + }, + "liveSmokeOptional": { + "LIVE_EXPECT_WECOM_STATUS": true, + "LIVE_SMOKE_MANAGER_IDENTIFIER": true, + "LIVE_SMOKE_MANAGER_PASSWORD": true, + "LIVE_SMOKE_FINANCE_IDENTIFIER": true, + "LIVE_SMOKE_FINANCE_PASSWORD": true + }, + "liveOcrReady": true, + "liveOcr": { + "userReady": true, + "invoiceSampleReady": true, + "invoiceFileProvided": true, + "invoiceFileReady": true, + "invoiceBatchDirProvided": false, + "invoiceBatchDirReady": false, + "allowDuplicate": true + }, + "missing": [], + "publicReady": { + "ok": true, + "status": 200 + }, + "wecomConfig": { + "ok": true, + "status": 200, + "statusText": "ready", + "entryEnabled": true, + "oauthEnabled": true, + "defaultReturnTo": "/mobile", + "loginUrl": "/api/auth/wecom/login?returnTo=%2Fmobile" + } +} diff --git a/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/live-ocr.txt b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/live-ocr.txt new file mode 100644 index 00000000..16c1f549 --- /dev/null +++ b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/live-ocr.txt @@ -0,0 +1,7 @@ + +Running 1 test using 1 worker + +[live-ocr] {"alias":"SAMPLE-PDF-001","status":"ocr_failed","durationMs":634,"transport":"ui","timings":{"uploadMs":634,"terminalWaitMs":0},"reasonCategory":"duplicate_or_same_invoice","fieldHits":{"invoiceId":false,"invoiceCodeOrNumber":false,"sellerName":false,"totalAmount":false,"invoiceDate":false}} + ✓ 1 tests/e2e/manual/live-invoice-ocr.spec.ts:8:1 › 手工 live 腾讯 OCR 辅助复核:真实 VAT 发票上传后进入可处理状态 (6.0s) + + 1 passed (9.6s) diff --git a/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/live-smoke.txt b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/live-smoke.txt new file mode 100644 index 00000000..85e60d2d --- /dev/null +++ b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/live-smoke.txt @@ -0,0 +1,14 @@ +>>> 探活 live /ready: https://oa.hyinda.com/ready +>>> 执行 live smoke Playwright + +> client@0.1.0 test:e2e:live +> playwright test tests/e2e/live-smoke.spec.ts + + +Running 3 tests using 1 worker + + ✓ 1 tests/e2e/live-smoke.spec.ts:43:3 › live smoke › 公网基础探活与企微配置状态 (1.8s) + ✓ 2 tests/e2e/live-smoke.spec.ts:64:3 › live smoke › 管理员只读网页 smoke (11.6s) + ✓ 3 tests/e2e/live-smoke.spec.ts:106:3 › live smoke › 员工只读网页 smoke (10.5s) + + 3 passed (27.7s) diff --git a/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/pending-ocr.txt b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/pending-ocr.txt new file mode 100644 index 00000000..a8739766 --- /dev/null +++ b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/pending-ocr.txt @@ -0,0 +1 @@ +[pending-ocr][SKIP] missing DATABASE_URL diff --git a/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/public-bundle-copy.txt b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/public-bundle-copy.txt new file mode 100644 index 00000000..4b7806a8 --- /dev/null +++ b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/public-bundle-copy.txt @@ -0,0 +1 @@ +[public-bundle-copy] base=https://oa.hyinda.com scanned=92 focused=2 findings=0 diff --git a/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/summary.json b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/summary.json new file mode 100644 index 00000000..0cdf4ae6 --- /dev/null +++ b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness/summary.json @@ -0,0 +1,11 @@ +{ + "issueId": null, + "baseURL": "https://oa.hyinda.com", + "commit": "d829e44", + "checkedAt": "2026-05-26T09:46:31.838Z", + "status": "PASS", + "mode": "live-smoke-readiness", + "reportDir": ".trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-live-smoke-readiness", + "groups": null, + "notes": "公网 /ready、public bundle、pending OCR、live smoke 和真实 OCR 可用性检查;缺少凭据或样票时按脚本规则记录 SKIP。" +} diff --git a/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-mobile-entry-matrix/output.log b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-mobile-entry-matrix/output.log new file mode 100644 index 00000000..ee05a4c6 --- /dev/null +++ b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-mobile-entry-matrix/output.log @@ -0,0 +1,15 @@ + +Running 6 tests using 1 worker + +(node:1644539) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:1644539) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) + ✓ 1 tests/e2e/dg7-mobile-information-dedupe.spec.ts:884:3 › MIF7 移动信息架构整改 › 首页常用入口不重复底部 Tab,员工进度页按状态分标签 (35.6s) + ✓ 2 tests/e2e/dg7-mobile-information-dedupe.spec.ts:933:3 › MIF7 移动信息架构整改 › 审批人首页只保留轻待办摘要,审批页按待我审批和已处理分组 (5.4s) + ✓ 3 tests/e2e/dg7-mobile-information-dedupe.spec.ts:1008:3 › MIF7 移动信息架构整改 › 通知中心事件化,点击通知直达业务详情且返回来源页 (7.7s) + ✓ 4 tests/e2e/dg7-mobile-information-dedupe.spec.ts:1056:3 › MIF7 移动信息架构整改 › 报销详情统一详情壳,直接进入请假详情返回进度标签 (7.1s) + ✓ 5 tests/e2e/dg7-mobile-information-dedupe.spec.ts:1112:3 › MIF7 移动信息架构整改 › 财务首页角色化摘要只对财务角色展示 (7.2s) + ✓ 6 tests/e2e/r124-mobile-entry-matrix.spec.ts:486:3 › R124 企业微信移动入口矩阵 › 底部入口、我的二级入口、PDF 上传和草稿删除不回退到 PC 体验 (12.9s) + + 6 passed (1.3m) diff --git a/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-oafront3-pc-readonly/summary.json b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-oafront3-pc-readonly/summary.json new file mode 100644 index 00000000..b99c063f --- /dev/null +++ b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-oafront3-pc-readonly/summary.json @@ -0,0 +1,892 @@ +{ + "issueId": "OAFRONT3-1", + "mode": "pc-readonly-visual-evidence", + "status": "PASS_PC_READONLY_VISUAL_READY", + "conclusion": "PASS_PC_READONLY_VISUAL_READY", + "baseUrl": "https://oa.hyinda.com", + "checkedAt": "2026-05-26T09:49:00.322Z", + "readOnly": true, + "viewport": "1440x960", + "roleCount": 7, + "routeCount": 32, + "screenshotDir": "output/playwright/oafront3-pc-readonly-postdeploy", + "reportDir": ".trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-oafront3-pc-readonly", + "roles": [ + { + "role": "employee", + "login": "PASS" + }, + { + "role": "manager", + "login": "PASS" + }, + { + "role": "finance", + "login": "PASS" + }, + { + "role": "finance_mgr", + "login": "PASS" + }, + { + "role": "admin", + "login": "PASS" + }, + { + "role": "ceo", + "login": "PASS" + }, + { + "role": "hr", + "login": "PASS" + } + ], + "routes": [ + { + "role": "employee", + "route": "/portal", + "label": "员工工作台", + "layer": "A", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/portal", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/employee-portal.png", + "metrics": { + "title": "海音达工作台", + "textLength": 786, + "headingCount": 1, + "tableCount": 0, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "employee", + "route": "/reimbursements", + "label": "员工报销列表", + "layer": "A", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/reimbursements", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/employee-reimbursements.png", + "metrics": { + "title": "海音达工作台", + "textLength": 718, + "headingCount": 1, + "tableCount": 1, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "employee", + "route": "/invoice-pool", + "label": "员工票据中心", + "layer": "B", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/invoice-pool", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/employee-invoice-pool.png", + "metrics": { + "title": "海音达工作台", + "textLength": 3447, + "headingCount": 1, + "tableCount": 1, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "employee", + "route": "/purchase-requests", + "label": "员工采购申请", + "layer": "B", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/purchase-requests", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/employee-purchase-requests.png", + "metrics": { + "title": "海音达工作台", + "textLength": 1085, + "headingCount": 1, + "tableCount": 3, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "employee", + "route": "/assets", + "label": "员工资产台账", + "layer": "B", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/assets", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/employee-assets.png", + "metrics": { + "title": "海音达工作台", + "textLength": 830, + "headingCount": 1, + "tableCount": 2, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "employee", + "route": "/payment-batches", + "label": "员工付款权限负例", + "layer": "B", + "expectation": "forbidden_ok", + "status": "FORBIDDEN_EXPECTED", + "finalPath": "/403", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/employee-payment-batches.png", + "metrics": { + "title": "海音达工作台", + "textLength": 56, + "headingCount": 1, + "tableCount": 0, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": true, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "manager", + "route": "/portal", + "label": "主管工作台", + "layer": "A", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/portal", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/manager-portal.png", + "metrics": { + "title": "海音达工作台", + "textLength": 984, + "headingCount": 1, + "tableCount": 0, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "manager", + "route": "/workflow/tasks", + "label": "主管审批待办", + "layer": "A", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/workflow/tasks", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/manager-workflow-tasks.png", + "metrics": { + "title": "海音达工作台", + "textLength": 550, + "headingCount": 1, + "tableCount": 1, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "manager", + "route": "/purchase-requests", + "label": "主管采购申请", + "layer": "B", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/purchase-requests", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/manager-purchase-requests.png", + "metrics": { + "title": "海音达工作台", + "textLength": 475, + "headingCount": 1, + "tableCount": 1, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "manager", + "route": "/projects", + "label": "主管项目列表", + "layer": "B", + "expectation": "optional", + "status": "PASS", + "finalPath": "/projects", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/manager-projects.png", + "metrics": { + "title": "海音达工作台", + "textLength": 777, + "headingCount": 1, + "tableCount": 0, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "finance", + "route": "/portal", + "label": "财务工作台", + "layer": "A", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/portal", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/finance-portal.png", + "metrics": { + "title": "海音达工作台", + "textLength": 1009, + "headingCount": 1, + "tableCount": 0, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "finance", + "route": "/invoice-pool", + "label": "财务票据中心", + "layer": "B", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/invoice-pool", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/finance-invoice-pool.png", + "metrics": { + "title": "海音达工作台", + "textLength": 526, + "headingCount": 1, + "tableCount": 1, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "finance", + "route": "/payment-batches", + "label": "财务付款批次", + "layer": "B", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/payment-batches", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/finance-payment-batches.png", + "metrics": { + "title": "海音达工作台", + "textLength": 1726, + "headingCount": 1, + "tableCount": 0, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "finance", + "route": "/ap-operations", + "label": "财务 AP 运营", + "layer": "B", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/ap-operations", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/finance-ap-operations.png", + "metrics": { + "title": "海音达工作台", + "textLength": 736, + "headingCount": 1, + "tableCount": 1, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "finance", + "route": "/reimbursements", + "label": "财务报销列表", + "layer": "A", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/reimbursements", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/finance-reimbursements.png", + "metrics": { + "title": "海音达工作台", + "textLength": 453, + "headingCount": 1, + "tableCount": 1, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "finance_mgr", + "route": "/portal", + "label": "财务负责人工作台", + "layer": "A", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/portal", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/finance_mgr-portal.png", + "metrics": { + "title": "海音达工作台", + "textLength": 1111, + "headingCount": 1, + "tableCount": 0, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "finance_mgr", + "route": "/workflow/tasks", + "label": "财务负责人审批待办", + "layer": "A", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/workflow/tasks", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/finance_mgr-workflow-tasks.png", + "metrics": { + "title": "海音达工作台", + "textLength": 839, + "headingCount": 1, + "tableCount": 1, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "finance_mgr", + "route": "/payment-batches", + "label": "财务负责人付款批次", + "layer": "B", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/payment-batches", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/finance_mgr-payment-batches.png", + "metrics": { + "title": "海音达工作台", + "textLength": 1792, + "headingCount": 1, + "tableCount": 0, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "finance_mgr", + "route": "/ap-operations", + "label": "财务负责人 AP 运营", + "layer": "B", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/ap-operations", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/finance_mgr-ap-operations.png", + "metrics": { + "title": "海音达工作台", + "textLength": 809, + "headingCount": 1, + "tableCount": 1, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "finance_mgr", + "route": "/audit-logs", + "label": "财务负责人审计日志", + "layer": "C", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/audit-logs", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/finance_mgr-audit-logs.png", + "metrics": { + "title": "海音达工作台", + "textLength": 3519, + "headingCount": 1, + "tableCount": 1, + "uuidCount": 40, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "admin", + "route": "/portal", + "label": "管理员工作台", + "layer": "A", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/portal", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/admin-portal.png", + "metrics": { + "title": "海音达工作台", + "textLength": 896, + "headingCount": 1, + "tableCount": 0, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "admin", + "route": "/assets", + "label": "管理员资产台账", + "layer": "B", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/assets", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/admin-assets.png", + "metrics": { + "title": "海音达工作台", + "textLength": 3586, + "headingCount": 1, + "tableCount": 2, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "admin", + "route": "/contracts-registry", + "label": "管理员合同台账", + "layer": "B", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/contracts-registry", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/admin-contracts-registry.png", + "metrics": { + "title": "海音达工作台", + "textLength": 1612, + "headingCount": 1, + "tableCount": 0, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "admin", + "route": "/system/workspace", + "label": "管理员工作区设置", + "layer": "C", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/system/workspace", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/admin-system-workspace.png", + "metrics": { + "title": "海音达工作台", + "textLength": 1718, + "headingCount": 1, + "tableCount": 1, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "admin", + "route": "/system/approval-rules", + "label": "管理员审批规则", + "layer": "C", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/system/approval-rules", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/admin-system-approval-rules.png", + "metrics": { + "title": "海音达工作台", + "textLength": 983, + "headingCount": 1, + "tableCount": 1, + "uuidCount": 3, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "admin", + "route": "/system/feature-flags", + "label": "管理员功能开关", + "layer": "C", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/system/feature-flags", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/admin-system-feature-flags.png", + "metrics": { + "title": "海音达工作台", + "textLength": 4638, + "headingCount": 1, + "tableCount": 1, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "ceo", + "route": "/portal", + "label": "负责人工作台", + "layer": "A", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/portal", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/ceo-portal.png", + "metrics": { + "title": "海音达工作台", + "textLength": 928, + "headingCount": 1, + "tableCount": 0, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "ceo", + "route": "/workflow/tasks", + "label": "负责人审批待办", + "layer": "A", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/workflow/tasks", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/ceo-workflow-tasks.png", + "metrics": { + "title": "海音达工作台", + "textLength": 465, + "headingCount": 1, + "tableCount": 1, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "ceo", + "route": "/budgets", + "label": "负责人预算视图", + "layer": "B", + "expectation": "optional", + "status": "PASS", + "finalPath": "/budgets", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/ceo-budgets.png", + "metrics": { + "title": "海音达工作台", + "textLength": 493, + "headingCount": 1, + "tableCount": 1, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "hr", + "route": "/portal", + "label": "HR 工作台", + "layer": "A", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/portal", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/hr-portal.png", + "metrics": { + "title": "海音达工作台", + "textLength": 926, + "headingCount": 1, + "tableCount": 0, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "hr", + "route": "/people", + "label": "HR 人员管理", + "layer": "C", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/people", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/hr-people.png", + "metrics": { + "title": "海音达工作台", + "textLength": 2822, + "headingCount": 2, + "tableCount": 1, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 5, + "rawJsonBlockCount": 0, + "englishFound": [ + "Employee", + "Admin" + ], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + }, + { + "role": "hr", + "route": "/wecom-approval-archive", + "label": "HR 企微归档", + "layer": "B", + "expectation": "accessible", + "status": "PASS", + "finalPath": "/wecom-approval-archive", + "screenshot": "output/playwright/oafront3-pc-readonly-postdeploy/hr-wecom-approval-archive.png", + "metrics": { + "title": "海音达工作台", + "textLength": 728, + "headingCount": 1, + "tableCount": 0, + "uuidCount": 0, + "rawStatusTokenCount": 0, + "longNumberCount": 0, + "rawJsonBlockCount": 0, + "englishFound": [], + "datePlaceholderCount": 0, + "clippedCount": 0, + "forbiddenLike": false, + "appErrorLike": false, + "navPortalCopy": false + } + } + ], + "findingCount": 0, + "findings": [], + "boundaries": { + "noBusinessWrites": true, + "noFileUploads": true, + "noFormSubmits": true, + "noExports": true, + "noWeComWrites": true, + "noRealPaymentExecution": true + }, + "privacy": "no password/token/secret/full email/full phone/full local sensitive path/raw invoice/contract body/bank receipt/raw payload in JSON report" +} diff --git a/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-permission-matrix/summary.json b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-permission-matrix/summary.json new file mode 100644 index 00000000..8b475da1 --- /dev/null +++ b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-permission-matrix/summary.json @@ -0,0 +1,2285 @@ +{ + "issueId": "OANEXT2-4", + "status": "PASS_PERMISSION_MATRIX_READY", + "checkedAt": "2026-05-26T09:46:58.583Z", + "baseUrl": "https://oa.hyinda.com", + "privacy": "redacted role/status/count evidence only; no password, token, Secret, full account, invoice, contract, attachment, or raw payload", + "counts": { + "roles": 7, + "positiveProbes": 43, + "negativeProbes": 42 + }, + "issues": [], + "results": [ + { + "key": "employee", + "expectedRoles": [ + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "actualRoles": [ + "employee" + ], + "probes": [ + { + "id": "me", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee" + ] + } + }, + { + "id": "portal", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [ + { + "path": "data.roleCapabilities.canApproveTasks", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.canUseFinance", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.canManageSystem", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.isAdminOnly", + "status": "PASS", + "expected": false, + "actual": false + } + ], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "roleCapabilities": { + "canApproveTasks": false, + "canManageSystem": false, + "canSubmitApplications": true, + "canUseFinance": false, + "canViewTeam": false, + "isAdminOnly": false + } + } + }, + { + "id": "own-invoices", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": 22 + } + }, + { + "id": "navigation", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [ + { + "type": "visible", + "href": "/portal", + "status": "PASS" + }, + { + "type": "visible", + "href": "/reimbursements", + "status": "PASS" + }, + { + "type": "visible", + "href": "/assets", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/workflow/tasks", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/ap-operations", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/payment-batches", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/audit-logs", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/settings", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/feature-flags", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/integrations/erp", + "status": "PASS" + } + ], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "navigationItemCount": 10 + } + }, + { + "id": "budget", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "ap", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "ap-ledger", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "payment-batches", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "all-invoices", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "audit-logs", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "notification-deliveries", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "system-feature-flags", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "erp-status", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "payroll-items", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "performance-cycles", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "travel-requests", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "global-search-sensitive", + "kind": "negative", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [ + { + "type": "forbidden_entity_type", + "value": "contract_registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "confidential_doc_ref", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "travel_request", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/contracts-registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/travel-requests", + "status": "PASS", + "matchedCount": 0 + } + ], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 7, + "total": null + } + } + ], + "missingRoles": [] + }, + { + "key": "manager", + "expectedRoles": [ + "manager", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "actualRoles": [ + "employee", + "manager" + ], + "probes": [ + { + "id": "me", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee", + "manager" + ] + } + }, + { + "id": "portal", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [ + { + "path": "data.roleCapabilities.canApproveTasks", + "status": "PASS", + "expected": true, + "actual": true + }, + { + "path": "data.roleCapabilities.canUseFinance", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.canManageSystem", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.isAdminOnly", + "status": "PASS", + "expected": false, + "actual": false + } + ], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "roleCapabilities": { + "canApproveTasks": true, + "canManageSystem": false, + "canSubmitApplications": true, + "canUseFinance": false, + "canViewTeam": true, + "isAdminOnly": false + } + } + }, + { + "id": "workflow", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 1, + "total": 1 + } + }, + { + "id": "navigation", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [ + { + "type": "visible", + "href": "/workflow/tasks", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/ap-operations", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/payment-batches", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/audit-logs", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/settings", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/feature-flags", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/integrations/erp", + "status": "PASS" + } + ], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "navigationItemCount": 15 + } + }, + { + "id": "ap", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "ap-ledger", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "payment-batches", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "audit-logs", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "erp-status", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "payroll-items", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "performance-cycles", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "travel-requests", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "global-search-sensitive", + "kind": "negative", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [ + { + "type": "forbidden_entity_type", + "value": "contract_registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "confidential_doc_ref", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "travel_request", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/contracts-registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/travel-requests", + "status": "PASS", + "matchedCount": 0 + } + ], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 10, + "total": null + } + } + ], + "missingRoles": [] + }, + { + "key": "finance", + "expectedRoles": [ + "finance", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "actualRoles": [ + "employee", + "finance" + ], + "probes": [ + { + "id": "me", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee", + "finance" + ] + } + }, + { + "id": "portal", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [ + { + "path": "data.roleCapabilities.canApproveTasks", + "status": "PASS", + "expected": true, + "actual": true + }, + { + "path": "data.roleCapabilities.canUseFinance", + "status": "PASS", + "expected": true, + "actual": true + }, + { + "path": "data.roleCapabilities.canManageSystem", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.isAdminOnly", + "status": "PASS", + "expected": false, + "actual": false + } + ], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "roleCapabilities": { + "canApproveTasks": true, + "canManageSystem": false, + "canSubmitApplications": true, + "canUseFinance": true, + "canViewTeam": true, + "isAdminOnly": false + } + } + }, + { + "id": "all-invoices", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": 46 + } + }, + { + "id": "payment-batches", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 9, + "total": null + } + }, + { + "id": "ap-ledger", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": 33 + } + }, + { + "id": "navigation", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [ + { + "type": "visible", + "href": "/invoice-pool", + "status": "PASS" + }, + { + "type": "visible", + "href": "/payment-batches", + "status": "PASS" + }, + { + "type": "visible", + "href": "/ap-operations", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/audit-logs", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/settings", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/feature-flags", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/integrations/erp", + "status": "PASS" + } + ], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "navigationItemCount": 18 + } + }, + { + "id": "audit-logs", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "notification-deliveries", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "system-feature-flags", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "erp-status", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "payroll-items", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "performance-cycles", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "travel-requests", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "global-search-sensitive", + "kind": "negative", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [ + { + "type": "forbidden_entity_type", + "value": "contract_registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "confidential_doc_ref", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "travel_request", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/contracts-registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/travel-requests", + "status": "PASS", + "matchedCount": 0 + } + ], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 9, + "total": null + } + } + ], + "missingRoles": [] + }, + { + "key": "finance_mgr", + "expectedRoles": [ + "finance", + "finance_mgr", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "actualRoles": [ + "employee", + "finance", + "finance_mgr" + ], + "probes": [ + { + "id": "me", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee", + "finance", + "finance_mgr" + ] + } + }, + { + "id": "portal", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [ + { + "path": "data.roleCapabilities.canApproveTasks", + "status": "PASS", + "expected": true, + "actual": true + }, + { + "path": "data.roleCapabilities.canUseFinance", + "status": "PASS", + "expected": true, + "actual": true + }, + { + "path": "data.roleCapabilities.canManageSystem", + "status": "PASS", + "expected": true, + "actual": true + }, + { + "path": "data.roleCapabilities.isAdminOnly", + "status": "PASS", + "expected": false, + "actual": false + } + ], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "roleCapabilities": { + "canApproveTasks": true, + "canManageSystem": true, + "canSubmitApplications": true, + "canUseFinance": true, + "canViewTeam": true, + "isAdminOnly": false + } + } + }, + { + "id": "all-invoices", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": 46 + } + }, + { + "id": "payment-batches", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 9, + "total": null + } + }, + { + "id": "ap-ledger", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": 33 + } + }, + { + "id": "erp-status", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 3, + "total": null + } + }, + { + "id": "audit-logs", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": 1933 + } + }, + { + "id": "notification-deliveries", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": null + } + }, + { + "id": "system-feature-flags", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 26, + "total": null + } + }, + { + "id": "navigation", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [ + { + "type": "visible", + "href": "/invoice-pool", + "status": "PASS" + }, + { + "type": "visible", + "href": "/payment-batches", + "status": "PASS" + }, + { + "type": "visible", + "href": "/ap-operations", + "status": "PASS" + }, + { + "type": "visible", + "href": "/audit-logs", + "status": "PASS" + }, + { + "type": "visible", + "href": "/system/feature-flags", + "status": "PASS" + }, + { + "type": "visible", + "href": "/system/integrations/erp", + "status": "PASS" + } + ], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "navigationItemCount": 27 + } + } + ], + "missingRoles": [] + }, + { + "key": "hr", + "expectedRoles": [ + "hr", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "actualRoles": [ + "employee", + "hr" + ], + "probes": [ + { + "id": "me", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee", + "hr" + ] + } + }, + { + "id": "portal", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [ + { + "path": "data.roleCapabilities.canApproveTasks", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.canUseFinance", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.canManageSystem", + "status": "PASS", + "expected": true, + "actual": true + }, + { + "path": "data.roleCapabilities.isAdminOnly", + "status": "PASS", + "expected": false, + "actual": false + } + ], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "roleCapabilities": { + "canApproveTasks": false, + "canManageSystem": true, + "canSubmitApplications": true, + "canUseFinance": false, + "canViewTeam": true, + "isAdminOnly": false + } + } + }, + { + "id": "wecom-archive", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": 9 + } + }, + { + "id": "navigation", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [ + { + "type": "visible", + "href": "/people", + "status": "PASS" + }, + { + "type": "visible", + "href": "/system/settings", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/ap-operations", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/payment-batches", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/audit-logs", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/feature-flags", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/integrations/erp", + "status": "PASS" + } + ], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "navigationItemCount": 16 + } + }, + { + "id": "ap-ledger", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "payment-batches", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "audit-logs", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "system-feature-flags", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "payroll-items", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "performance-cycles", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "global-search-sensitive", + "kind": "negative", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [ + { + "type": "forbidden_entity_type", + "value": "contract_registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "confidential_doc_ref", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "travel_request", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/contracts-registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/travel-requests", + "status": "PASS", + "matchedCount": 0 + } + ], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 4, + "total": null + } + } + ], + "missingRoles": [] + }, + { + "key": "ceo", + "expectedRoles": [ + "ceo", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "actualRoles": [ + "ceo", + "employee" + ], + "probes": [ + { + "id": "me", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "ceo", + "employee" + ] + } + }, + { + "id": "portal", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [ + { + "path": "data.roleCapabilities.canApproveTasks", + "status": "PASS", + "expected": true, + "actual": true + }, + { + "path": "data.roleCapabilities.canUseFinance", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.canManageSystem", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.isAdminOnly", + "status": "PASS", + "expected": false, + "actual": false + } + ], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "roleCapabilities": { + "canApproveTasks": true, + "canManageSystem": false, + "canSubmitApplications": true, + "canUseFinance": false, + "canViewTeam": true, + "isAdminOnly": false + } + } + }, + { + "id": "dashboard", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "totalCount": 33, + "paidCount": 8, + "reviewingCount": 3 + } + }, + { + "id": "navigation", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [ + { + "type": "visible", + "href": "/workflow/tasks", + "status": "PASS" + }, + { + "type": "visible", + "href": "/budgets", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/ap-operations", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/payment-batches", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/audit-logs", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/feature-flags", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/integrations/erp", + "status": "PASS" + } + ], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "navigationItemCount": 15 + } + }, + { + "id": "system-feature-flags", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "notification-deliveries", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "payroll-items", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "performance-cycles", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "global-search-sensitive", + "kind": "negative", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [ + { + "type": "forbidden_entity_type", + "value": "contract_registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "confidential_doc_ref", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "travel_request", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/contracts-registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/travel-requests", + "status": "PASS", + "matchedCount": 0 + } + ], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 9, + "total": null + } + } + ], + "missingRoles": [] + }, + { + "key": "admin", + "expectedRoles": [ + "admin", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "actualRoles": [ + "admin", + "employee" + ], + "probes": [ + { + "id": "me", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "admin", + "employee" + ] + } + }, + { + "id": "portal", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [ + { + "path": "data.roleCapabilities.canApproveTasks", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.canUseFinance", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.canManageSystem", + "status": "PASS", + "expected": true, + "actual": true + }, + { + "path": "data.roleCapabilities.isAdminOnly", + "status": "PASS", + "expected": true, + "actual": true + } + ], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "roleCapabilities": { + "canApproveTasks": false, + "canManageSystem": true, + "canSubmitApplications": true, + "canUseFinance": false, + "canViewTeam": true, + "isAdminOnly": true + } + } + }, + { + "id": "users", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 1, + "total": 13 + } + }, + { + "id": "audit-logs", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": 1936 + } + }, + { + "id": "notification-deliveries", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": null + } + }, + { + "id": "system-feature-flags", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 26, + "total": null + } + }, + { + "id": "payroll-items", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 0, + "total": null + } + }, + { + "id": "performance-cycles", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 1, + "total": null + } + }, + { + "id": "global-search", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 10, + "total": null + } + }, + { + "id": "assets", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 7, + "total": null + } + }, + { + "id": "navigation", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [ + { + "type": "visible", + "href": "/audit-logs", + "status": "PASS" + }, + { + "type": "visible", + "href": "/system/settings", + "status": "PASS" + }, + { + "type": "visible", + "href": "/system/feature-flags", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/workflow/tasks", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/ap-operations", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/payment-batches", + "status": "PASS" + } + ], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "navigationItemCount": 26 + } + } + ], + "missingRoles": [] + } + ] +} diff --git a/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-permission-matrix/summary.md b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-permission-matrix/summary.md new file mode 100644 index 00000000..2b727b44 --- /dev/null +++ b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-permission-matrix/summary.md @@ -0,0 +1,28 @@ +# OA 权限矩阵脱敏自动验证报告 + +生成时间:2026-05-26T09:46:58.583Z +结论:PASS_PERMISSION_MATRIX_READY + +## 统计 + +- 角色数:7 +- 正向探针:43 +- 负向探针:42 +- 问题数:0 + +## 角色结果 + +| 角色 | 登录 | 角色匹配 | 探针通过/总数 | +| --- | --- | --- | ---: | +| employee | PASS | PASS | 17/17 | +| manager | PASS | PASS | 13/13 | +| finance | PASS | PASS | 14/14 | +| finance_mgr | PASS | PASS | 10/10 | +| hr | PASS | PASS | 11/11 | +| ceo | PASS | PASS | 9/9 | +| admin | PASS | PASS | 11/11 | + +## 说明 + +- 本报告只输出角色、HTTP 状态、脱敏账号和摘要计数,不输出密码、token、Secret、完整账号、合同正文、票据内容或原始 payload。 +- 409 表示功能门禁关闭且未泄露数据;对财务/AP/付款等冻结或受控功能可作为可解释拒绝。 diff --git a/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-summary.md b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-summary.md new file mode 100644 index 00000000..146e3c50 --- /dev/null +++ b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-summary.md @@ -0,0 +1,43 @@ +# Postdeploy Public Verification Summary + +## Conclusion + +`READY_FOR_TRIAL_START_CONFIRMATION` + +The public trial environment has been deployed from commit `d829e44` with +`SYNC_ENV=0`. The deployment did not overwrite the remote `.env`. Public +post-deploy checks passed, and the latest PC frontend cleanup is now covered by +public visual and smoke evidence. + +## Checks + +| Check | Status | Evidence | +| --- | --- | --- | +| Pre-deploy client build | PASS | command output in session | +| UI design rules | PASS | `check-ui-design-rules --strict`, 0 findings | +| Deploy script | PASS | `SYNC_ENV=0 bash deploy/trialrun/deploy.sh` | +| Deploy live smoke | PASS | deploy script live smoke, 3 passed | +| Public bundle copy scan | PASS | deploy script scanned 92 resources, 0 findings | +| Live smoke readiness | PASS | `research/postdeploy-live-smoke-readiness/summary.json` | +| Permission matrix | PASS | `research/postdeploy-permission-matrix/summary.json` | +| PC readonly visual matrix | PASS | `research/postdeploy-oafront3-pc-readonly/summary.json` | +| Mobile entry matrix | PASS | `research/postdeploy-mobile-entry-matrix/output.log` | +| WeCom rendering matrix | PASS | `research/postdeploy-wecom-rendering-matrix/output.log` | + +## Notes + +- Live OCR sample ended in a duplicate/same-invoice terminal category and the + Playwright check passed; this is a known acceptable live sample outcome. +- Pending OCR helper scan was `SKIP` because local `DATABASE_URL` was not loaded + for that helper. This did not block readiness because live smoke and live OCR + checks passed. +- During rsync, deployment printed a non-blocking cleanup warning for an old + remote `artifacts/` directory. The deployment script continued and completed + all runtime checks. + +## Boundaries + +- No real business write automation was executed. +- No Enterprise WeChat write was executed. +- No payment, bank import, ERP write, database reset, restore, or remote `.env` + overwrite was executed. diff --git a/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-wecom-rendering-matrix/output.log b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-wecom-rendering-matrix/output.log new file mode 100644 index 00000000..a53d5409 --- /dev/null +++ b/.trellis/tasks/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-wecom-rendering-matrix/output.log @@ -0,0 +1,17 @@ + +Running 8 tests using 1 worker + +(node:1648689) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) +(node:1648689) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) + ✓ 1 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:572:7 › WCM6 企业微信多手机移动渲染稳定化 › 320 iPhone 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.2s) + ✓ 2 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:572:7 › WCM6 企业微信多手机移动渲染稳定化 › 360 Android 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.4s) + ✓ 3 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:572:7 › WCM6 企业微信多手机移动渲染稳定化 › 375 iPhone 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.6s) + ✓ 4 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:572:7 › WCM6 企业微信多手机移动渲染稳定化 › 390 iPhone12 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.6s) + ✓ 5 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:572:7 › WCM6 企业微信多手机移动渲染稳定化 › 393 Android 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.1s) + ✓ 6 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:572:7 › WCM6 企业微信多手机移动渲染稳定化 › 414 iPhone 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.4s) + ✓ 7 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:572:7 › WCM6 企业微信多手机移动渲染稳定化 › 430 iPhone 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.1s) + ✓ 8 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:588:5 › WCM6 企业微信多手机移动渲染稳定化 › 390 iPhone12 企业微信 字体失败 › Material Symbols 字体失败时核心移动入口仍稳定 (7.1s) + + 8 passed (1.0m)