From 41b9c2236ec5742afbe2118ca0348ea5df5fb2c7 Mon Sep 17 00:00:00 2001 From: shunli Date: Fri, 29 May 2026 09:37:57 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B7=A1=E6=A3=80=E6=8A=A5?= =?UTF-8?q?=E5=91=8A=E9=9A=90=E7=A7=81=E5=AD=97=E6=AE=B5=E5=B9=B6=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=20Wave4-5=20=E5=85=AC=E7=BD=91=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=EF=BC=8805-29-frontend-ux-wave4-5-finance-admin-refresh?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .trellis/spec/hyb-oa/docs-and-evidence.md | 23 + .../implement.md | 41 ++ .../prd.md | 13 +- .../live-smoke-readiness/env.json | 46 ++ .../live-smoke-readiness/live-ocr.txt | 7 + .../live-smoke-readiness/live-smoke.txt | 14 + .../live-smoke-readiness/pending-ocr.txt | 1 + .../public-bundle-copy.txt | 1 + .../live-smoke-readiness/summary.json | 12 + .../authenticated-readonly-probe.json | 129 ++++++ .../authenticated-readonly-probe.log | 129 ++++++ .../authenticated-readonly-probe.step.json | 9 + .../oa-real-use-daily/live-feature-flags.log | 64 +++ .../live-feature-flags.step.json | 9 + .../oa-real-use-daily/live-readiness.log | 45 ++ .../live-readiness.step.json | 9 + .../oa-real-use-daily/live-smoke-env.log | 46 ++ .../live-smoke-env.step.json | 9 + .../live-smoke-readiness/env.json | 46 ++ .../live-smoke-readiness/live-ocr.txt | 7 + .../live-smoke-readiness/live-smoke.txt | 14 + .../live-smoke-readiness/pending-ocr.txt | 1 + .../public-bundle-copy.txt | 1 + .../live-smoke-readiness/summary.json | 12 + .../oa-real-use-daily/manual-gates.md | 20 + .../oa-real-use-daily/mobile-entry-matrix.log | 10 + .../mobile-entry-matrix.step.json | 9 + .../oa-only-smoke-readiness.log | 392 ++++++++++++++++++ .../oa-only-smoke-readiness.step.json | 9 + .../oa-only-smoke-readiness/summary.json | 391 +++++++++++++++++ .../oa-real-use-daily/public-ready.log | 1 + .../oa-real-use-daily/public-ready.step.json | 9 + .../report-privacy-smoke.step.json | 9 + .../oa-real-use-daily/summary.json | 294 +++++++++++++ .../oa-real-use-daily/summary.txt | 24 ++ .../oa-real-use-daily/wecom-entry.log | 11 + .../oa-real-use-daily/wecom-entry.step.json | 9 + .../wecom-rendering-matrix.log | 17 + .../wecom-rendering-matrix.step.json | 9 + scripts/qa/check-live-smoke-env.mjs | 37 +- 40 files changed, 1919 insertions(+), 20 deletions(-) create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/env.json create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/live-ocr.txt create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/live-smoke.txt create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/pending-ocr.txt create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/public-bundle-copy.txt create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/summary.json create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/authenticated-readonly-probe.json create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/authenticated-readonly-probe.log create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/authenticated-readonly-probe.step.json create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-feature-flags.log create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-feature-flags.step.json create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-readiness.log create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-readiness.step.json create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-env.log create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-env.step.json create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/env.json create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/live-ocr.txt create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/live-smoke.txt create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/pending-ocr.txt create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/public-bundle-copy.txt create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/summary.json create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/manual-gates.md create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/mobile-entry-matrix.log create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/mobile-entry-matrix.step.json create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/oa-only-smoke-readiness.log create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/oa-only-smoke-readiness.step.json create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/oa-only-smoke-readiness/summary.json create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/public-ready.log create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/public-ready.step.json create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/report-privacy-smoke.step.json create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/summary.json create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/summary.txt create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-entry.log create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-entry.step.json create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-rendering-matrix.log create mode 100644 .trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-rendering-matrix.step.json diff --git a/.trellis/spec/hyb-oa/docs-and-evidence.md b/.trellis/spec/hyb-oa/docs-and-evidence.md index fe2fc4b7..bbe5c1bf 100644 --- a/.trellis/spec/hyb-oa/docs-and-evidence.md +++ b/.trellis/spec/hyb-oa/docs-and-evidence.md @@ -44,6 +44,9 @@ Start from `docs/文档索引.md` and `docs/文档事实源状态矩阵.md`. - Machine-readable reports must not include amounts, prices, costs, balances, bank details, invoice values, full accounts, tokens, secrets, raw payloads, raw form values or full local paths. +- Credential/readiness presence reports must use safe business labels, not raw + env key names. For example, emit `adminCredentialReady: true` instead of a + field named after a credential-value environment variable. ### 4. Validation & Error Matrix @@ -55,6 +58,8 @@ Start from `docs/文档索引.md` and `docs/文档事实源状态矩阵.md`. according to whether the parent step is required. - Privacy smoke match -> write redacted finding metadata and make final summary reflect the failure. +- Secret-like field names in generated reports -> privacy finding, even when + the value is only a boolean presence flag. ### 5. Good/Base/Bad Cases @@ -73,6 +78,8 @@ Start from `docs/文档索引.md` and `docs/文档事实源状态矩阵.md`. - child finding count is visible in parent summary; - privacy step is present in parent summary; - `summary.json` has no full workspace path or business amount fields. +- For live/readiness env reports, assert the JSON contains safe readiness + labels and does not contain raw secret-like env key names. - Run the matching launch/readiness aggregator when it consumes the report. ### 7. Wrong vs Correct @@ -87,6 +94,14 @@ Start from `docs/文档索引.md` and `docs/文档事实源状态矩阵.md`. } ``` +```json +{ + "liveSmoke": { + "RAW_CREDENTIAL_ENV_KEY": true + } +} +``` + #### Correct ```json @@ -102,3 +117,11 @@ Start from `docs/文档索引.md` and `docs/文档事实源状态矩阵.md`. } } ``` + +```json +{ + "liveSmoke": { + "adminCredentialReady": true + } +} +``` diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/implement.md b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/implement.md index d8738324..84601e3f 100644 --- a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/implement.md +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/implement.md @@ -91,6 +91,47 @@ OAOPS1_REPORT_DIR=.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-oa-real-use-daily.sh ``` +## Deployment Result + +2026-05-29 user-approved public deployment completed. + +- Deployed commit: `bfb1cb6 完成 Wave4-5 财务与管理页刷新(05-29-frontend-ux-wave4-5-finance-admin-refresh)`. +- Deploy command used `SYNC_ENV=0`, so the remote `.env` was not overwritten. +- Deploy script passed env contract, remote build, seed/config, seed/trialrun, `/ready`, external dependency smoke, runtime smoke and public bundle copy scan. +- Remote migrations had no pending migration. +- Deploy rsync reported a non-fatal warning for an old non-empty artifacts directory; deployment continued and runtime checks passed. +- Automatic deploy-time live smoke was skipped because the deploy shell did not include the full live smoke variables; manual postdeploy checks below covered it. + +## Postdeploy Verification Result + +Final passing evidence is stored under: + +`research/postdeploy-20260529-wave4-5-public-rerun/` + +- `run-live-smoke-readiness.sh`: `PASS`. + - `/ready` passed. + - Public bundle copy scan passed with 0 findings. + - Live smoke Playwright passed: 3 tests. + - Live OCR sample passed: 1 test. The sample produced the expected duplicate/same-invoice style OCR outcome for the already-used sample file. + - Pending OCR scan skipped because the local command environment did not include `DATABASE_URL`. +- `run-oa-real-use-daily.sh`: `PASS_OA_REAL_USE_DAILY_READY`, `findingCount=0`. + - `public-ready`: PASS. + - `live-smoke-env`: PASS. + - `live-readiness`: PASS. + - `oa-only-smoke-readiness`: PASS. + - `live-feature-flags`: PASS. + - `authenticated-readonly-probe`: PASS. + - `mobile-entry-matrix`: PASS. + - `wecom-rendering-matrix`: PASS. + - `wecom-entry`: PASS. + - `report-privacy-smoke`: PASS. + +## Report Privacy Fix + +The first OAOPS1 run failed only at `report-privacy-smoke` because the live smoke env report emitted secret-looking env key names as boolean presence fields. It did not expose actual secret values. + +`scripts/qa/check-live-smoke-env.mjs` now emits safe readiness labels such as `adminCredentialReady`, `employeeCredentialReady`, `managerCredentialReady` and `financeCredentialReady` instead of raw env key names containing password-like words. The rerun passed privacy smoke. + ## Spec Update Expectation Only update `.trellis/spec/` if implementation introduces a reusable frontend convention beyond the existing finance/admin surfaces. If the task only applies existing conventions, record that no spec update is needed. diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/prd.md b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/prd.md index 0be598c6..1ca6f126 100644 --- a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/prd.md +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/prd.md @@ -99,7 +99,7 @@ - [x] `node scripts/qa/check-ui-design-rules.mjs --strict` 通过。 - [x] `python3 ./.trellis/scripts/task.py validate 05-29-frontend-ux-wave4-5-finance-admin-refresh` 通过。 - [x] `node scripts/qa/check-trellis-governance.mjs` 和 `git diff --check` 通过。 -- [ ] 若部署给用户测试,已完成公网部署与公网检查并记录证据。 +- [x] 若部署给用户测试,已完成公网部署与公网检查并记录证据。 ## Implementation Result @@ -114,6 +114,17 @@ - Focused Playwright 扩展到 Wave4-5 页面:付款批次、AP、票据池、审批规则、人员、组织、工作区、用户、主数据、通知渠道、系统设置、功能开关、流程定义、审计日志。 - 本轮没有改后端、数据库、权限、审批规则语义、付款状态机、企业微信配置、SMTP 或生产配置。 +2026-05-29 公网部署与只读巡检完成: + +- 部署代码:`bfb1cb6 完成 Wave4-5 财务与管理页刷新(05-29-frontend-ux-wave4-5-finance-admin-refresh)`。 +- 部署方式:`SYNC_ENV=0 LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash deploy/trialrun/deploy.sh`,未同步覆盖远端 `.env`。 +- 部署脚本完成 `/ready`、外部依赖 smoke、runtime smoke、公网 bundle 文案扫描;远端迁移无待执行项。 +- 首次 OAOPS1 发现报告隐私巡检误报,原因是环境检查报告输出了含凭据含义的原始 env key 名作为“字段名存在=true”标签,不含真实密钥或密码。 +- 已将 `scripts/qa/check-live-smoke-env.mjs` 的报告输出改为业务安全标签,如 `adminCredentialReady`、`employeeCredentialReady`,不再把敏感 env key 名写入证据报告。 +- 复跑公网 readiness:`PASS`;`/ready`、公网 bundle 文案扫描、live smoke 3 项、真实 OCR 样本复核通过;pending OCR 因本地命令未带 `DATABASE_URL` 按设计跳过。 +- 复跑 OAOPS1:`PASS_OA_REAL_USE_DAILY_READY`,`findingCount=0`;public-ready、live-smoke-env、live-readiness、oa-only-smoke-readiness、feature flags、authenticated readonly probe、mobile entry、WeCom rendering、WeCom entry、report privacy smoke 全部通过。 +- 证据目录:`research/postdeploy-20260529-wave4-5-public-rerun/`。 + ## Test Plan ```bash diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/env.json b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/env.json new file mode 100644 index 00000000..c33f7171 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/env.json @@ -0,0 +1,46 @@ +{ + "checkedAt": "2026-05-29T01:27:15.005Z", + "baseUrl": "https://oa.hyinda.com", + "liveSmokeReady": true, + "liveSmoke": { + "adminCredentialReady": true, + "employeeCredentialReady": true + }, + "liveSmokeOptional": { + "expectedWecomStatusReady": true, + "managerCredentialReady": true, + "financeCredentialReady": 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" + }, + "authCapabilities": { + "ok": true, + "status": 200, + "emailDeliveryReady": true, + "emailDeliveryReasons": [], + "emailLoginCodeEnabled": true, + "passwordResetEnabled": true + } +} diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/live-ocr.txt b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/live-ocr.txt new file mode 100644 index 00000000..94620e70 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/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":922,"transport":"ui","timings":{"uploadMs":922,"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.8s) + + 1 passed (11.0s) diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/live-smoke.txt b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/live-smoke.txt new file mode 100644 index 00000000..450efc16 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/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 › 公网基础探活与企微配置状态 (2.9s) + ✓ 2 tests/e2e/live-smoke.spec.ts:64:3 › live smoke › 管理员只读网页 smoke (11.7s) + ✓ 3 tests/e2e/live-smoke.spec.ts:106:3 › live smoke › 员工只读网页 smoke (10.8s) + + 3 passed (29.4s) diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/pending-ocr.txt b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/pending-ocr.txt new file mode 100644 index 00000000..a8739766 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/pending-ocr.txt @@ -0,0 +1 @@ +[pending-ocr][SKIP] missing DATABASE_URL diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/public-bundle-copy.txt b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/public-bundle-copy.txt new file mode 100644 index 00000000..6d2bd196 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/public-bundle-copy.txt @@ -0,0 +1 @@ +[public-bundle-copy] base=https://oa.hyinda.com scanned=91 focused=2 findings=0 diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/summary.json b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/summary.json new file mode 100644 index 00000000..1b5a29a3 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness/summary.json @@ -0,0 +1,12 @@ +{ + "issueId": null, + "baseURL": "https://oa.hyinda.com", + "commit": "bfb1cb6", + "checkedAt": "2026-05-29T01:28:07.869Z", + "status": "PASS", + "mode": "live-smoke-readiness", + "reportDir": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness", + "reportRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/live-smoke-readiness", + "groups": null, + "notes": "公网 /ready、public bundle、pending OCR、live smoke 和真实 OCR 可用性检查;缺少凭据或样票时按脚本规则记录 SKIP。" +} \ No newline at end of file diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/authenticated-readonly-probe.json b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/authenticated-readonly-probe.json new file mode 100644 index 00000000..2f36392d --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/authenticated-readonly-probe.json @@ -0,0 +1,129 @@ +{ + "mode": "oaops1-authenticated-readonly-probe", + "status": "PASS", + "baseUrl": "https://oa.hyinda.com", + "checkedAt": "2026-05-29T01:31:32.486Z", + "readOnly": true, + "duplicateRoleChecks": "employee/finance/payment/AP are covered by oa-only-smoke-readiness to avoid repeated login throttling", + "roles": { + "admin": { + "status": "PASS", + "reason": null, + "maskedIdentifier": "sm***om" + } + }, + "checks": [ + { + "id": "portal", + "role": "admin", + "path": "/api/portal/home", + "domain": "portal", + "status": "PASS", + "httpStatus": 200, + "summary": {} + }, + { + "id": "workflow-tasks", + "role": "admin", + "path": "/api/workflow/tasks?page=1&pageSize=5", + "domain": "approval", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 0, + "total": 0 + } + }, + { + "id": "reimbursements", + "role": "admin", + "path": "/api/reimbursements?page=1&pageSize=5", + "domain": "reimbursement", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 5, + "total": 33 + } + }, + { + "id": "reimbursement-summary", + "role": "admin", + "path": "/api/reimbursements/stats/summary", + "domain": "reimbursement", + "status": "PASS", + "httpStatus": 200, + "summary": { + "totalCount": 33, + "avgProcessingDays": 0 + } + }, + { + "id": "invoice-pool", + "role": "admin", + "path": "/api/invoice-pool?page=1&pageSize=5", + "domain": "invoice_ocr", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 5, + "total": 46 + } + }, + { + "id": "purchase-requests", + "role": "admin", + "path": "/api/purchase-requests?page=1&pageSize=5", + "domain": "procurement", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 0, + "total": 0 + } + }, + { + "id": "contracts-registry", + "role": "admin", + "path": "/api/contracts-registry", + "domain": "contracts", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 6, + "total": null + } + }, + { + "id": "projects", + "role": "admin", + "path": "/api/projects?page=1&pageSize=5", + "domain": "projects", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 4, + "total": null + } + }, + { + "id": "audit-logs", + "role": "admin", + "path": "/api/audit-logs?page=1&pageSize=5", + "domain": "audit", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 5, + "total": 2235 + } + } + ], + "boundaries": { + "noBusinessWrites": true, + "noExportsByDefault": true, + "noFileUploads": true, + "noWeComWrites": true, + "noRealPaymentExecution": true + } +} diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/authenticated-readonly-probe.log b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/authenticated-readonly-probe.log new file mode 100644 index 00000000..2f36392d --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/authenticated-readonly-probe.log @@ -0,0 +1,129 @@ +{ + "mode": "oaops1-authenticated-readonly-probe", + "status": "PASS", + "baseUrl": "https://oa.hyinda.com", + "checkedAt": "2026-05-29T01:31:32.486Z", + "readOnly": true, + "duplicateRoleChecks": "employee/finance/payment/AP are covered by oa-only-smoke-readiness to avoid repeated login throttling", + "roles": { + "admin": { + "status": "PASS", + "reason": null, + "maskedIdentifier": "sm***om" + } + }, + "checks": [ + { + "id": "portal", + "role": "admin", + "path": "/api/portal/home", + "domain": "portal", + "status": "PASS", + "httpStatus": 200, + "summary": {} + }, + { + "id": "workflow-tasks", + "role": "admin", + "path": "/api/workflow/tasks?page=1&pageSize=5", + "domain": "approval", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 0, + "total": 0 + } + }, + { + "id": "reimbursements", + "role": "admin", + "path": "/api/reimbursements?page=1&pageSize=5", + "domain": "reimbursement", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 5, + "total": 33 + } + }, + { + "id": "reimbursement-summary", + "role": "admin", + "path": "/api/reimbursements/stats/summary", + "domain": "reimbursement", + "status": "PASS", + "httpStatus": 200, + "summary": { + "totalCount": 33, + "avgProcessingDays": 0 + } + }, + { + "id": "invoice-pool", + "role": "admin", + "path": "/api/invoice-pool?page=1&pageSize=5", + "domain": "invoice_ocr", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 5, + "total": 46 + } + }, + { + "id": "purchase-requests", + "role": "admin", + "path": "/api/purchase-requests?page=1&pageSize=5", + "domain": "procurement", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 0, + "total": 0 + } + }, + { + "id": "contracts-registry", + "role": "admin", + "path": "/api/contracts-registry", + "domain": "contracts", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 6, + "total": null + } + }, + { + "id": "projects", + "role": "admin", + "path": "/api/projects?page=1&pageSize=5", + "domain": "projects", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 4, + "total": null + } + }, + { + "id": "audit-logs", + "role": "admin", + "path": "/api/audit-logs?page=1&pageSize=5", + "domain": "audit", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 5, + "total": 2235 + } + } + ], + "boundaries": { + "noBusinessWrites": true, + "noExportsByDefault": true, + "noFileUploads": true, + "noWeComWrites": true, + "noRealPaymentExecution": true + } +} diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/authenticated-readonly-probe.step.json b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/authenticated-readonly-probe.step.json new file mode 100644 index 00000000..4243eb72 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/authenticated-readonly-probe.step.json @@ -0,0 +1,9 @@ +{ + "name": "authenticated-readonly-probe", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/authenticated-readonly-probe.log", + "checkedAt": "2026-05-29T01:31:32.564Z" +} diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-feature-flags.log b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-feature-flags.log new file mode 100644 index 00000000..30c70a86 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-feature-flags.log @@ -0,0 +1,64 @@ +{ + "checkedAt": "2026-05-29T01:30:25.816Z", + "baseUrl": "https://oa.hyinda.com", + "status": "PASS", + "readOnly": true, + "results": [ + { + "flagKey": "payment_batch_v1", + "expectedState": "force_on", + "status": "PASS", + "item": { + "flagKey": "payment_batch_v1", + "overrideMode": "force_on", + "rolloutType": "global", + "version": 17, + "envEnabled": true, + "effectiveEnabled": true, + "effectiveReason": "flag_force_on_global" + } + }, + { + "flagKey": "erp_sync", + "expectedState": "force_off", + "status": "PASS", + "item": { + "flagKey": "erp_sync", + "overrideMode": "force_off", + "rolloutType": "global", + "version": 2, + "envEnabled": true, + "effectiveEnabled": false, + "effectiveReason": "flag_force_off" + } + }, + { + "flagKey": "attendance_v1", + "expectedState": "disabled", + "status": "PASS", + "item": { + "flagKey": "attendance_v1", + "overrideMode": "force_on", + "rolloutType": "global", + "version": 86, + "envEnabled": false, + "effectiveEnabled": false, + "effectiveReason": "env_hard_off" + } + }, + { + "flagKey": "attendance_unified_v1", + "expectedState": "enabled", + "status": "PASS", + "item": { + "flagKey": "attendance_unified_v1", + "overrideMode": "force_on", + "rolloutType": "global", + "version": 84, + "envEnabled": true, + "effectiveEnabled": true, + "effectiveReason": "flag_force_on_global" + } + } + ] +} diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-feature-flags.step.json b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-feature-flags.step.json new file mode 100644 index 00000000..c1830825 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-feature-flags.step.json @@ -0,0 +1,9 @@ +{ + "name": "live-feature-flags", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-feature-flags.log", + "checkedAt": "2026-05-29T01:30:25.887Z" +} diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-readiness.log b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-readiness.log new file mode 100644 index 00000000..48bd0889 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-readiness.log @@ -0,0 +1,45 @@ +>>> [live-readiness] 环境与公网入口检查 +[live-smoke-env] base=https://oa.hyinda.com +[live-smoke-env] publicReady=true status=200 +[live-smoke-env] wecom=ready entry=true oauth=true +[live-smoke-env] authCapabilities=true emailDelivery=true +[live-smoke-env] liveSmokeReady=true +[live-smoke-env] liveOcrReady=true +>>> [live-readiness] /ready: https://oa.hyinda.com +>>> [live-readiness] 公网资源文案扫描 +[public-bundle-copy] base=https://oa.hyinda.com scanned=91 focused=2 findings=0 +>>> [live-readiness] pending OCR 扫描 +[pending-ocr][SKIP] missing DATABASE_URL +>>> [live-readiness] 执行公网 live smoke +>>> 探活 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 + +(node:81586) 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:81586) 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/live-smoke.spec.ts:43:3 › live smoke › 公网基础探活与企微配置状态 (2.6s) + ✓ 2 tests/e2e/live-smoke.spec.ts:64:3 › live smoke › 管理员只读网页 smoke (11.7s) + ✓ 3 tests/e2e/live-smoke.spec.ts:106:3 › live smoke › 员工只读网页 smoke (10.4s) + + 3 passed (28.3s) +>>> [live-readiness] 执行真实 OCR 样本复核 + +Running 1 test using 1 worker + +(node:82388) 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:82388) 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) +[live-ocr] {"alias":"SAMPLE-PDF-001","status":"ocr_failed","durationMs":657,"transport":"ui","timings":{"uploadMs":658,"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.6s) + + 1 passed (10.2s) +[live-readiness][PASS] readiness 检查完成 +[live-readiness] report=.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-readiness.step.json b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-readiness.step.json new file mode 100644 index 00000000..28c975ca --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-readiness.step.json @@ -0,0 +1,9 @@ +{ + "name": "live-readiness", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-readiness.log", + "checkedAt": "2026-05-29T01:29:14.867Z" +} diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-env.log b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-env.log new file mode 100644 index 00000000..fc345269 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-env.log @@ -0,0 +1,46 @@ +{ + "checkedAt": "2026-05-29T01:28:22.362Z", + "baseUrl": "https://oa.hyinda.com", + "liveSmokeReady": true, + "liveSmoke": { + "adminCredentialReady": true, + "employeeCredentialReady": true + }, + "liveSmokeOptional": { + "expectedWecomStatusReady": true, + "managerCredentialReady": true, + "financeCredentialReady": 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" + }, + "authCapabilities": { + "ok": true, + "status": 200, + "emailDeliveryReady": true, + "emailDeliveryReasons": [], + "emailLoginCodeEnabled": true, + "passwordResetEnabled": true + } +} diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-env.step.json b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-env.step.json new file mode 100644 index 00000000..a88843dd --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-env.step.json @@ -0,0 +1,9 @@ +{ + "name": "live-smoke-env", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-env.log", + "checkedAt": "2026-05-29T01:28:22.439Z" +} diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/env.json b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/env.json new file mode 100644 index 00000000..6a598306 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/env.json @@ -0,0 +1,46 @@ +{ + "checkedAt": "2026-05-29T01:28:22.930Z", + "baseUrl": "https://oa.hyinda.com", + "liveSmokeReady": true, + "liveSmoke": { + "adminCredentialReady": true, + "employeeCredentialReady": true + }, + "liveSmokeOptional": { + "expectedWecomStatusReady": true, + "managerCredentialReady": true, + "financeCredentialReady": 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" + }, + "authCapabilities": { + "ok": true, + "status": 200, + "emailDeliveryReady": true, + "emailDeliveryReasons": [], + "emailLoginCodeEnabled": true, + "passwordResetEnabled": true + } +} diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/live-ocr.txt b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/live-ocr.txt new file mode 100644 index 00000000..c5ccac7c --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/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":657,"transport":"ui","timings":{"uploadMs":658,"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.6s) + + 1 passed (10.2s) diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/live-smoke.txt b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/live-smoke.txt new file mode 100644 index 00000000..3c675ad8 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/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 › 公网基础探活与企微配置状态 (2.6s) + ✓ 2 tests/e2e/live-smoke.spec.ts:64:3 › live smoke › 管理员只读网页 smoke (11.7s) + ✓ 3 tests/e2e/live-smoke.spec.ts:106:3 › live smoke › 员工只读网页 smoke (10.4s) + + 3 passed (28.3s) diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/pending-ocr.txt b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/pending-ocr.txt new file mode 100644 index 00000000..a8739766 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/pending-ocr.txt @@ -0,0 +1 @@ +[pending-ocr][SKIP] missing DATABASE_URL diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/public-bundle-copy.txt b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/public-bundle-copy.txt new file mode 100644 index 00000000..6d2bd196 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/public-bundle-copy.txt @@ -0,0 +1 @@ +[public-bundle-copy] base=https://oa.hyinda.com scanned=91 focused=2 findings=0 diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/summary.json b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/summary.json new file mode 100644 index 00000000..f08d96b9 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/summary.json @@ -0,0 +1,12 @@ +{ + "issueId": "OAOPS1", + "baseURL": "https://oa.hyinda.com", + "commit": "bfb1cb6", + "checkedAt": "2026-05-29T01:29:14.797Z", + "status": "PASS", + "mode": "live-smoke-readiness", + "reportDir": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness", + "reportRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness", + "groups": null, + "notes": "公网 /ready、public bundle、pending OCR、live smoke 和真实 OCR 可用性检查;缺少凭据或样票时按脚本规则记录 SKIP。" +} \ No newline at end of file diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/manual-gates.md b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/manual-gates.md new file mode 100644 index 00000000..772e3329 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/manual-gates.md @@ -0,0 +1,20 @@ +# OAOPS1 每日人工收口清单 + +## 员工 +- 真实报销:上传 PDF 发票,补充必要附件,提交 OA 审批。 +- 采购/费用:在 OA 创建申请,关联项目;如涉及合同,关联或补录合同台账。 +- 合同:只录入合同摘要、编号、负责人、项目、金额、线下归档位置;涉密合同正文、敏感报价和成本细节不上传公网 OA。 + +## 审批人 +- 从 OA 待办进入详情,确认报销、采购、合同或项目上下文后再审批。 +- 退回时写清需要补充的材料,避免线下口头说明替代系统记录。 + +## 出纳/财务 +- 审批通过后创建付款批次,线下银行渠道付款。 +- 上传银行回单附件后再在 OA 标记已付款。 +- 每日抽查 AP 台账、报销导出、票据状态和付款批次状态。 + +## 管理员 +- 查看本报告 summary.json 和人工问题登记。 +- 阻断项当天建修复 Issue CSV 或暂停对应流程;非阻断体验问题进入反馈池。 +- 确认 payment_batch_v1=force_on,erp_sync=force_off;图片 OCR、预算、ERP、银行流水导入、真实支付直连继续冻结。 diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/mobile-entry-matrix.log b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/mobile-entry-matrix.log new file mode 100644 index 00000000..b4ea157c --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/mobile-entry-matrix.log @@ -0,0 +1,10 @@ + +Running 1 test using 1 worker + +(node:86699) 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:86699) 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/r124-mobile-entry-matrix.spec.ts:486:3 › R124 企业微信移动入口矩阵 › 底部入口、我的二级入口、PDF 上传和草稿删除不回退到 PC 体验 (14.1s) + + 1 passed (17.8s) diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/mobile-entry-matrix.step.json b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/mobile-entry-matrix.step.json new file mode 100644 index 00000000..caa0fa26 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/mobile-entry-matrix.step.json @@ -0,0 +1,9 @@ +{ + "name": "mobile-entry-matrix", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/mobile-entry-matrix.log", + "checkedAt": "2026-05-29T01:31:56.368Z" +} diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/oa-only-smoke-readiness.log b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/oa-only-smoke-readiness.log new file mode 100644 index 00000000..7d83e14f --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/oa-only-smoke-readiness.log @@ -0,0 +1,392 @@ +{ + "issueId": "OSMOKE1", + "mode": "oa-only-smoke-readiness", + "status": "PASS_OA_ONLY_SMOKE_READY", + "conclusion": "PASS_OA_ONLY_SMOKE_READY", + "baseUrl": "https://oa.hyinda.com", + "checkedAt": "2026-05-29T01:29:19.810Z", + "businessReadOnly": true, + "readOnlyNote": "performs login/readiness probes only; no business data writes and no WeCom writes", + "privacy": "role/masked identifier/status/counts only; no password/token/secret/full email/full phone", + "targets": [ + { + "key": "admin", + "expectedRoles": [ + "admin", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "probes": [ + { + "id": "me", + "status": "PASS", + "httpStatus": 200, + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "admin", + "employee" + ] + } + }, + { + "id": "portal", + "status": "PASS", + "httpStatus": 200, + "summary": {} + }, + { + "id": "assets", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 7, + "total": null + } + }, + { + "id": "users", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 1, + "total": 13 + } + } + ], + "actualRoles": [ + "admin", + "employee" + ], + "missingRoles": [] + }, + { + "key": "employee", + "expectedRoles": [ + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "probes": [ + { + "id": "me", + "status": "PASS", + "httpStatus": 200, + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee" + ] + } + }, + { + "id": "portal", + "status": "PASS", + "httpStatus": 200, + "summary": {} + }, + { + "id": "my-assets", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 0, + "total": null + } + } + ], + "actualRoles": [ + "employee" + ], + "missingRoles": [] + }, + { + "key": "manager", + "expectedRoles": [ + "manager", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "probes": [ + { + "id": "me", + "status": "PASS", + "httpStatus": 200, + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee", + "manager" + ] + } + }, + { + "id": "portal", + "status": "PASS", + "httpStatus": 200, + "summary": {} + }, + { + "id": "workflow", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 1, + "total": 1 + } + } + ], + "actualRoles": [ + "employee", + "manager" + ], + "missingRoles": [] + }, + { + "key": "ceo", + "expectedRoles": [ + "ceo", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "probes": [ + { + "id": "me", + "status": "PASS", + "httpStatus": 200, + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "ceo", + "employee" + ] + } + }, + { + "id": "portal", + "status": "PASS", + "httpStatus": 200, + "summary": {} + }, + { + "id": "dashboard", + "status": "PASS", + "httpStatus": 200, + "summary": { + "totalCount": 33, + "paidCount": 8, + "reviewingCount": 3 + } + } + ], + "actualRoles": [ + "ceo", + "employee" + ], + "missingRoles": [] + }, + { + "key": "finance", + "expectedRoles": [ + "finance", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "probes": [ + { + "id": "me", + "status": "PASS", + "httpStatus": 200, + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee", + "finance" + ] + } + }, + { + "id": "portal", + "status": "PASS", + "httpStatus": 200, + "summary": {} + }, + { + "id": "payment-batches", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 9, + "total": null + } + }, + { + "id": "ap-ledger", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 1, + "total": 33 + } + } + ], + "actualRoles": [ + "employee", + "finance" + ], + "missingRoles": [] + }, + { + "key": "finance_mgr", + "expectedRoles": [ + "finance", + "finance_mgr", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "probes": [ + { + "id": "me", + "status": "PASS", + "httpStatus": 200, + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee", + "finance", + "finance_mgr" + ] + } + }, + { + "id": "portal", + "status": "PASS", + "httpStatus": 200, + "summary": {} + }, + { + "id": "payment-batches", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 9, + "total": null + } + }, + { + "id": "ap-ledger", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 1, + "total": 33 + } + } + ], + "actualRoles": [ + "employee", + "finance", + "finance_mgr" + ], + "missingRoles": [] + }, + { + "key": "hr", + "expectedRoles": [ + "hr", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "probes": [ + { + "id": "me", + "status": "PASS", + "httpStatus": 200, + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee", + "hr" + ] + } + }, + { + "id": "portal", + "status": "PASS", + "httpStatus": 200, + "summary": {} + }, + { + "id": "wecom-archive", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 1, + "total": 9 + } + } + ], + "actualRoles": [ + "employee", + "hr" + ], + "missingRoles": [] + } + ], + "findings": [], + "boundaries": { + "noBusinessWrites": true, + "noWeComWrites": true, + "noPasswordOutput": true, + "noRealEmployeeIdentifiers": true + } +} +[oa-only-smoke-readiness] report=.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/oa-only-smoke-readiness/summary.json diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/oa-only-smoke-readiness.step.json b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/oa-only-smoke-readiness.step.json new file mode 100644 index 00000000..e62a629c --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/oa-only-smoke-readiness.step.json @@ -0,0 +1,9 @@ +{ + "name": "oa-only-smoke-readiness", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/oa-only-smoke-readiness.log", + "checkedAt": "2026-05-29T01:29:19.941Z" +} diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/oa-only-smoke-readiness/summary.json b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/oa-only-smoke-readiness/summary.json new file mode 100644 index 00000000..04581802 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/oa-only-smoke-readiness/summary.json @@ -0,0 +1,391 @@ +{ + "issueId": "OSMOKE1", + "mode": "oa-only-smoke-readiness", + "status": "PASS_OA_ONLY_SMOKE_READY", + "conclusion": "PASS_OA_ONLY_SMOKE_READY", + "baseUrl": "https://oa.hyinda.com", + "checkedAt": "2026-05-29T01:29:19.810Z", + "businessReadOnly": true, + "readOnlyNote": "performs login/readiness probes only; no business data writes and no WeCom writes", + "privacy": "role/masked identifier/status/counts only; no password/token/secret/full email/full phone", + "targets": [ + { + "key": "admin", + "expectedRoles": [ + "admin", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "probes": [ + { + "id": "me", + "status": "PASS", + "httpStatus": 200, + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "admin", + "employee" + ] + } + }, + { + "id": "portal", + "status": "PASS", + "httpStatus": 200, + "summary": {} + }, + { + "id": "assets", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 7, + "total": null + } + }, + { + "id": "users", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 1, + "total": 13 + } + } + ], + "actualRoles": [ + "admin", + "employee" + ], + "missingRoles": [] + }, + { + "key": "employee", + "expectedRoles": [ + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "probes": [ + { + "id": "me", + "status": "PASS", + "httpStatus": 200, + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee" + ] + } + }, + { + "id": "portal", + "status": "PASS", + "httpStatus": 200, + "summary": {} + }, + { + "id": "my-assets", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 0, + "total": null + } + } + ], + "actualRoles": [ + "employee" + ], + "missingRoles": [] + }, + { + "key": "manager", + "expectedRoles": [ + "manager", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "probes": [ + { + "id": "me", + "status": "PASS", + "httpStatus": 200, + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee", + "manager" + ] + } + }, + { + "id": "portal", + "status": "PASS", + "httpStatus": 200, + "summary": {} + }, + { + "id": "workflow", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 1, + "total": 1 + } + } + ], + "actualRoles": [ + "employee", + "manager" + ], + "missingRoles": [] + }, + { + "key": "ceo", + "expectedRoles": [ + "ceo", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "probes": [ + { + "id": "me", + "status": "PASS", + "httpStatus": 200, + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "ceo", + "employee" + ] + } + }, + { + "id": "portal", + "status": "PASS", + "httpStatus": 200, + "summary": {} + }, + { + "id": "dashboard", + "status": "PASS", + "httpStatus": 200, + "summary": { + "totalCount": 33, + "paidCount": 8, + "reviewingCount": 3 + } + } + ], + "actualRoles": [ + "ceo", + "employee" + ], + "missingRoles": [] + }, + { + "key": "finance", + "expectedRoles": [ + "finance", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "probes": [ + { + "id": "me", + "status": "PASS", + "httpStatus": 200, + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee", + "finance" + ] + } + }, + { + "id": "portal", + "status": "PASS", + "httpStatus": 200, + "summary": {} + }, + { + "id": "payment-batches", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 9, + "total": null + } + }, + { + "id": "ap-ledger", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 1, + "total": 33 + } + } + ], + "actualRoles": [ + "employee", + "finance" + ], + "missingRoles": [] + }, + { + "key": "finance_mgr", + "expectedRoles": [ + "finance", + "finance_mgr", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "probes": [ + { + "id": "me", + "status": "PASS", + "httpStatus": 200, + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee", + "finance", + "finance_mgr" + ] + } + }, + { + "id": "portal", + "status": "PASS", + "httpStatus": 200, + "summary": {} + }, + { + "id": "payment-batches", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 9, + "total": null + } + }, + { + "id": "ap-ledger", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 1, + "total": 33 + } + } + ], + "actualRoles": [ + "employee", + "finance", + "finance_mgr" + ], + "missingRoles": [] + }, + { + "key": "hr", + "expectedRoles": [ + "hr", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "probes": [ + { + "id": "me", + "status": "PASS", + "httpStatus": 200, + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee", + "hr" + ] + } + }, + { + "id": "portal", + "status": "PASS", + "httpStatus": 200, + "summary": {} + }, + { + "id": "wecom-archive", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 1, + "total": 9 + } + } + ], + "actualRoles": [ + "employee", + "hr" + ], + "missingRoles": [] + } + ], + "findings": [], + "boundaries": { + "noBusinessWrites": true, + "noWeComWrites": true, + "noPasswordOutput": true, + "noRealEmployeeIdentifiers": true + } +} diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/public-ready.log b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/public-ready.log new file mode 100644 index 00000000..2db88eb6 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/public-ready.log @@ -0,0 +1 @@ +{"requestId":"983ef37c-e6ec-4907-af6e-d31449e08e29","data":{"ok":true}} \ No newline at end of file diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/public-ready.step.json b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/public-ready.step.json new file mode 100644 index 00000000..bde99b77 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/public-ready.step.json @@ -0,0 +1,9 @@ +{ + "name": "public-ready", + "status": "PASS", + "kind": "required", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/public-ready.log", + "checkedAt": "2026-05-29T01:28:21.869Z" +} diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/report-privacy-smoke.step.json b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/report-privacy-smoke.step.json new file mode 100644 index 00000000..cb233d36 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/report-privacy-smoke.step.json @@ -0,0 +1,9 @@ +{ + "name": "report-privacy-smoke", + "status": "PASS", + "kind": "required", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/report-privacy-smoke.log", + "checkedAt": "2026-05-29T01:33:22.341Z" +} diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/summary.json b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/summary.json new file mode 100644 index 00000000..43c5c138 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/summary.json @@ -0,0 +1,294 @@ +{ + "issueId": "OAOPS1", + "mode": "oa-real-use-daily", + "status": "PASS_OA_REAL_USE_DAILY_READY", + "conclusion": "PASS_OA_REAL_USE_DAILY_READY", + "baseURL": "https://oa.hyinda.com", + "commit": "bfb1cb6", + "checkedAt": "2026-05-29T01:33:22.264Z", + "reportRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily", + "window": { + "durationDays": 7, + "scope": "small-team-all-employees", + "realBusinessDataAllowed": true, + "fixPolicy": "blocking_same_day_issue_contract_nonblocking_feedback_pool" + }, + "oaPrimaryDomains": [ + "reimbursement_pdf_ocr", + "approval_tasks", + "procurement_expense", + "contracts_registry", + "projects", + "payment_batches", + "bank_receipt_attachments", + "ap_accounting_handoff", + "mobile_wecom_entry", + "audit" + ], + "frozenItems": [ + "image_ocr", + "complex_bpm", + "budget_control", + "erp_write", + "bank_statement_import", + "real_payment_provider", + "wecom_hr_deep_mirror", + "emergency_takeover", + "recovery_writeback", + "ruleops" + ], + "boundaries": { + "defaultReadOnlyAutomation": true, + "manualRealBusinessWritesOnly": true, + "paymentBatchExpected": "force_on", + "erpExpected": "force_off", + "actualPaymentChannel": "offline_bank_channel", + "contractSensitiveFiles": "do_not_upload_confidential_body_sensitive_quote_cost_detail_to_public_oa" + }, + "childReports": { + "liveReadiness": { + "status": "PASS", + "reportRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-readiness/summary.json", + "findingCount": 0, + "openCount": 0 + }, + "oaOnlySmokeReadiness": { + "status": "PASS_OA_ONLY_SMOKE_READY", + "reportRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/oa-only-smoke-readiness/summary.json", + "findingCount": 0, + "openCount": 0 + } + }, + "steps": { + "public-ready": { + "name": "public-ready", + "status": "PASS", + "kind": "required", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/public-ready.log", + "checkedAt": "2026-05-29T01:28:21.869Z" + }, + "live-smoke-env": { + "name": "live-smoke-env", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-smoke-env.log", + "checkedAt": "2026-05-29T01:28:22.439Z" + }, + "live-readiness": { + "name": "live-readiness", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-readiness.log", + "checkedAt": "2026-05-29T01:29:14.867Z" + }, + "oa-only-smoke-readiness": { + "name": "oa-only-smoke-readiness", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/oa-only-smoke-readiness.log", + "checkedAt": "2026-05-29T01:29:19.941Z" + }, + "live-feature-flags": { + "name": "live-feature-flags", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/live-feature-flags.log", + "checkedAt": "2026-05-29T01:30:25.887Z" + }, + "authenticated-readonly-probe": { + "name": "authenticated-readonly-probe", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/authenticated-readonly-probe.log", + "checkedAt": "2026-05-29T01:31:32.564Z" + }, + "mobile-entry-matrix": { + "name": "mobile-entry-matrix", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/mobile-entry-matrix.log", + "checkedAt": "2026-05-29T01:31:56.368Z" + }, + "wecom-rendering-matrix": { + "name": "wecom-rendering-matrix", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-rendering-matrix.log", + "checkedAt": "2026-05-29T01:33:07.280Z" + }, + "wecom-entry": { + "name": "wecom-entry", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-entry.log", + "checkedAt": "2026-05-29T01:33:22.015Z" + }, + "report-privacy-smoke": { + "name": "report-privacy-smoke", + "status": "PASS", + "kind": "required", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/report-privacy-smoke.log", + "checkedAt": "2026-05-29T01:33:22.191Z" + } + }, + "readonlyProbe": { + "mode": "oaops1-authenticated-readonly-probe", + "status": "PASS", + "baseUrl": "https://oa.hyinda.com", + "checkedAt": "2026-05-29T01:31:32.486Z", + "readOnly": true, + "duplicateRoleChecks": "employee/finance/payment/AP are covered by oa-only-smoke-readiness to avoid repeated login throttling", + "roles": { + "admin": { + "status": "PASS", + "reason": null, + "maskedIdentifier": "sm***om" + } + }, + "checks": [ + { + "id": "portal", + "role": "admin", + "path": "/api/portal/home", + "domain": "portal", + "status": "PASS", + "httpStatus": 200, + "summary": {} + }, + { + "id": "workflow-tasks", + "role": "admin", + "path": "/api/workflow/tasks?page=1&pageSize=5", + "domain": "approval", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 0, + "total": 0 + } + }, + { + "id": "reimbursements", + "role": "admin", + "path": "/api/reimbursements?page=1&pageSize=5", + "domain": "reimbursement", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 5, + "total": 33 + } + }, + { + "id": "reimbursement-summary", + "role": "admin", + "path": "/api/reimbursements/stats/summary", + "domain": "reimbursement", + "status": "PASS", + "httpStatus": 200, + "summary": { + "totalCount": 33, + "avgProcessingDays": 0 + } + }, + { + "id": "invoice-pool", + "role": "admin", + "path": "/api/invoice-pool?page=1&pageSize=5", + "domain": "invoice_ocr", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 5, + "total": 46 + } + }, + { + "id": "purchase-requests", + "role": "admin", + "path": "/api/purchase-requests?page=1&pageSize=5", + "domain": "procurement", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 0, + "total": 0 + } + }, + { + "id": "contracts-registry", + "role": "admin", + "path": "/api/contracts-registry", + "domain": "contracts", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 6, + "total": null + } + }, + { + "id": "projects", + "role": "admin", + "path": "/api/projects?page=1&pageSize=5", + "domain": "projects", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 4, + "total": null + } + }, + { + "id": "audit-logs", + "role": "admin", + "path": "/api/audit-logs?page=1&pageSize=5", + "domain": "audit", + "status": "PASS", + "httpStatus": 200, + "summary": { + "itemCount": 5, + "total": 2235 + } + } + ], + "boundaries": { + "noBusinessWrites": true, + "noExportsByDefault": true, + "noFileUploads": true, + "noWeComWrites": true, + "noRealPaymentExecution": true + } + }, + "findingCount": 0, + "findings": [], + "manualGates": { + "dailyCloseout": "管理员每日查看 summary.json 和 manual-gates.md,阻断即修,非阻断入反馈池。", + "day7Closeout": [ + "A:接受 PASS_OA_REAL_USE_READY,进入下一轮体验/效率优化。", + "B:接受 PASS_WITH_FINDINGS,但先处理指定 finding。", + "C:暂停真实使用扩展,先做整改。" + ] + }, + "privacy": "status/count/report-path summaries only; no phone/email/token/Secret/EncodingAESKey/full external ids/full invoice image/full bank receipt/full contract body/raw payload" +} diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/summary.txt b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/summary.txt new file mode 100644 index 00000000..16c99d2b --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/summary.txt @@ -0,0 +1,24 @@ +[oaops1] loaded masked live smoke env file +>>> [oaops1] public-ready +[oaops1][PASS] public-ready +>>> [oaops1] live-smoke-env +[oaops1][PASS] live-smoke-env +>>> [oaops1] live-readiness +[oaops1][PASS] live-readiness +>>> [oaops1] oa-only-smoke-readiness +[oaops1][PASS] oa-only-smoke-readiness +[oaops1] login cooldown 65s before live-feature-flags +>>> [oaops1] live-feature-flags +[oaops1][PASS] live-feature-flags +[oaops1] login cooldown 65s before authenticated-readonly-probe +>>> [oaops1] authenticated-readonly-probe +[oaops1][PASS] authenticated-readonly-probe +>>> [oaops1] mobile-entry-matrix +[oaops1][PASS] mobile-entry-matrix +>>> [oaops1] wecom-rendering-matrix +[oaops1][PASS] wecom-rendering-matrix +>>> [oaops1] wecom-entry +[oaops1][PASS] wecom-entry +[oaops1][PASS] report-privacy-smoke +[oaops1][PASS] report-privacy-smoke +[oaops1] report=.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-entry.log b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-entry.log new file mode 100644 index 00000000..c71c007d --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-entry.log @@ -0,0 +1,11 @@ + +Running 2 tests using 1 worker + +(node:89063) 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:89063) 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/wecom-entry.spec.ts:56:1 › E2E 企微入口:普通浏览器下只提示企业微信工作台打开 (2.9s) + ✓ 2 tests/e2e/wecom-entry.spec.ts:66:1 › E2E 企微入口:企业微信场景优先显示企微 CTA,并展示未绑定提示 (2.5s) + + 2 passed (9.1s) diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-entry.step.json b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-entry.step.json new file mode 100644 index 00000000..0b4ad6ba --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-entry.step.json @@ -0,0 +1,9 @@ +{ + "name": "wecom-entry", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-entry.log", + "checkedAt": "2026-05-29T01:33:22.015Z" +} diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-rendering-matrix.log b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-rendering-matrix.log new file mode 100644 index 00000000..07a701f2 --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-rendering-matrix.log @@ -0,0 +1,17 @@ + +Running 8 tests using 1 worker + +(node:87388) 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:87388) 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:588:7 › WCM6 企业微信多手机移动渲染稳定化 › 320 iPhone 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.9s) + ✓ 2 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:588:7 › WCM6 企业微信多手机移动渲染稳定化 › 360 Android 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.5s) + ✓ 3 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:588:7 › WCM6 企业微信多手机移动渲染稳定化 › 375 iPhone 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.5s) + ✓ 4 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:588:7 › WCM6 企业微信多手机移动渲染稳定化 › 390 iPhone12 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.7s) + ✓ 5 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:588:7 › WCM6 企业微信多手机移动渲染稳定化 › 393 Android 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.5s) + ✓ 6 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:588:7 › WCM6 企业微信多手机移动渲染稳定化 › 414 iPhone 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.5s) + ✓ 7 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:588:7 › WCM6 企业微信多手机移动渲染稳定化 › 430 iPhone 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (8.0s) + ✓ 8 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:604:5 › WCM6 企业微信多手机移动渲染稳定化 › 390 iPhone12 企业微信 字体失败 › Material Symbols 字体失败时核心移动入口仍稳定 (7.1s) + + 8 passed (1.1m) diff --git a/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-rendering-matrix.step.json b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-rendering-matrix.step.json new file mode 100644 index 00000000..4e089e2b --- /dev/null +++ b/.trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-rendering-matrix.step.json @@ -0,0 +1,9 @@ +{ + "name": "wecom-rendering-matrix", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-29-frontend-ux-wave4-5-finance-admin-refresh/research/postdeploy-20260529-wave4-5-public-rerun/oa-real-use-daily/wecom-rendering-matrix.log", + "checkedAt": "2026-05-29T01:33:07.280Z" +} diff --git a/scripts/qa/check-live-smoke-env.mjs b/scripts/qa/check-live-smoke-env.mjs index 5b34e55b..61b85dde 100755 --- a/scripts/qa/check-live-smoke-env.mjs +++ b/scripts/qa/check-live-smoke-env.mjs @@ -8,8 +8,8 @@ function present(key) { return Boolean(process.env[key]?.trim()); } -function maskedPresence(keys) { - return Object.fromEntries(keys.map((key) => [key, present(key)])); +function readinessMap(entries) { + return Object.fromEntries(entries.map(([label, isReady]) => [label, Boolean(isReady)])); } function existingFileFrom(keys) { @@ -56,13 +56,11 @@ async function fetchJson(url) { } function buildStaticChecks() { - const liveSmokeKeys = [ - "LIVE_SMOKE_ADMIN_IDENTIFIER", - "LIVE_SMOKE_ADMIN_PASSWORD", - "LIVE_SMOKE_EMPLOYEE_IDENTIFIER", - "LIVE_SMOKE_EMPLOYEE_PASSWORD", - ]; - const liveSmokeReady = liveSmokeKeys.every(present); + const adminCredentialReady = present("LIVE_SMOKE_ADMIN_IDENTIFIER") && present("LIVE_SMOKE_ADMIN_PASSWORD"); + const employeeCredentialReady = present("LIVE_SMOKE_EMPLOYEE_IDENTIFIER") && present("LIVE_SMOKE_EMPLOYEE_PASSWORD"); + const managerCredentialReady = present("LIVE_SMOKE_MANAGER_IDENTIFIER") && present("LIVE_SMOKE_MANAGER_PASSWORD"); + const financeCredentialReady = present("LIVE_SMOKE_FINANCE_IDENTIFIER") && present("LIVE_SMOKE_FINANCE_PASSWORD"); + const liveSmokeReady = adminCredentialReady && employeeCredentialReady; const ocrUserReady = ( (present("PLAYWRIGHT_OCR_LIVE_IDENTIFIER") && present("PLAYWRIGHT_OCR_LIVE_PASSWORD")) || (present("LIVE_SMOKE_EMPLOYEE_IDENTIFIER") && present("LIVE_SMOKE_EMPLOYEE_PASSWORD")) @@ -76,13 +74,14 @@ function buildStaticChecks() { return { baseUrl, liveSmokeReady, - liveSmoke: maskedPresence(liveSmokeKeys), - liveSmokeOptional: maskedPresence([ - "LIVE_EXPECT_WECOM_STATUS", - "LIVE_SMOKE_MANAGER_IDENTIFIER", - "LIVE_SMOKE_MANAGER_PASSWORD", - "LIVE_SMOKE_FINANCE_IDENTIFIER", - "LIVE_SMOKE_FINANCE_PASSWORD", + liveSmoke: readinessMap([ + ["adminCredentialReady", adminCredentialReady], + ["employeeCredentialReady", employeeCredentialReady], + ]), + liveSmokeOptional: readinessMap([ + ["expectedWecomStatusReady", present("LIVE_EXPECT_WECOM_STATUS")], + ["managerCredentialReady", managerCredentialReady], + ["financeCredentialReady", financeCredentialReady], ]), liveOcrReady: ocrUserReady && invoiceSampleReady, liveOcr: { @@ -100,13 +99,13 @@ function buildStaticChecks() { function addMissing(checks) { if (!checks.liveSmokeReady) { - for (const [key, value] of Object.entries(checks.liveSmoke)) { - if (!value) checks.missing.push(key); + for (const [label, value] of Object.entries(checks.liveSmoke)) { + if (!value) checks.missing.push(label); } } if (!checks.liveOcr.userReady) { - checks.missing.push("PLAYWRIGHT_OCR_LIVE_IDENTIFIER/PASSWORD 或 LIVE_SMOKE_EMPLOYEE_*"); + checks.missing.push("ocrOrEmployeeCredentialReady"); } if (!checks.liveOcr.invoiceSampleReady) { checks.missing.push("PLAYWRIGHT_OCR_LIVE_FILE 或 PLAYWRIGHT_OCR_LIVE_DIR 中的 PDF 样票");