记录Wave2公网部署验证(05-26-oa-seven-day-trial-live-ops)
这个提交包含在:
@@ -40,3 +40,24 @@
|
|||||||
- 前端视觉、布局审美、组件观感、字体、颜色、动效、间距和交互细节统一以 `frontend-design` skill 为裁决来源。
|
- 前端视觉、布局审美、组件观感、字体、颜色、动效、间距和交互细节统一以 `frontend-design` skill 为裁决来源。
|
||||||
- `docs/产品设计规则.md` 仅保留 hyb-oa 特有的目标用户、PC/移动/企业微信职责、页面分层、信息语义、OA/企微主办边界和验收边界。
|
- `docs/产品设计规则.md` 仅保留 hyb-oa 特有的目标用户、PC/移动/企业微信职责、页面分层、信息语义、OA/企微主办边界和验收边界。
|
||||||
- 已同步 AGENTS、Trellis frontend spec、文档索引、事实源矩阵、Agent 交付实践、试运行手册、测试规约和相关业务规约,避免后续 agent 继续引用旧的竞品/品牌/样板设计规则。
|
- 已同步 AGENTS、Trellis frontend spec、文档索引、事实源矩阵、Agent 交付实践、试运行手册、测试规约和相关业务规约,避免后续 agent 继续引用旧的竞品/品牌/样板设计规则。
|
||||||
|
|
||||||
|
## Wave2 公网部署与发布后验证
|
||||||
|
|
||||||
|
- 用户已批准将 PC 核心工作流 Wave2 前端改动部署到公网 OA,并要求部署和公网测试通过后再收尾。
|
||||||
|
- 部署命令:`SYNC_ENV=0 LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash deploy/trialrun/deploy.sh`
|
||||||
|
- 部署边界:未同步本地 `.env`,未改远端配置,未执行真实业务写入、真实付款、ERP 写入或企业微信写入。
|
||||||
|
- 部署脚本结果:环境契约校验通过,远端构建通过,Prisma migration status 通过,runtime smoke / external deps smoke / live smoke 通过,公网前端资源文案扫描 findings=0。
|
||||||
|
- 独立公网复核:
|
||||||
|
- `/ready`:`data.ok=true`
|
||||||
|
- `node scripts/qa/check-public-bundle-copy.mjs https://oa.hyinda.com`:findings=0
|
||||||
|
- `LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-live-smoke-readiness.sh`:`PASS`
|
||||||
|
- `E2E_BASE_URL=https://oa.hyinda.com npx playwright test tests/e2e/pc-core-workflow-visual-wave2.spec.ts --workers=1 --reporter=list`:1 passed
|
||||||
|
- 试运行只读巡检:
|
||||||
|
- 命令:`OAOPS1_REPORT_DIR=.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-oa-real-use-daily.sh`
|
||||||
|
- 结论:`PASS_OA_REAL_USE_DAILY_READY`
|
||||||
|
- findingCount:0
|
||||||
|
- 主报告:`research/postdeploy-20260527-wave2-public/summary.json`
|
||||||
|
- 文本摘要:`research/postdeploy-20260527-wave2-public/summary.txt`
|
||||||
|
- 证据脱敏修正:`scripts/qa/write-qa-summary.mjs` 已改为写入仓库相对 `reportDir/reportRef`,避免 live-readiness summary 记录完整本地路径。
|
||||||
|
- 视觉证据:`output/playwright/pc-core-workflow-visual-wave2/01-login.png`、`02-portal.png`、`03-reimbursements.png`、`04-workflow-tasks.png`
|
||||||
|
- 非阻断提示:部署同步时远端历史 `artifacts/qa-flow/wecom-controlled-trial-evidence-20260520-205320` 目录无法自动删除;不影响本次部署、构建或公网检查,后续可单独做远端 artifacts 清理。
|
||||||
|
|||||||
+129
@@ -0,0 +1,129 @@
|
|||||||
|
{
|
||||||
|
"mode": "oaops1-authenticated-readonly-probe",
|
||||||
|
"status": "PASS",
|
||||||
|
"baseUrl": "https://oa.hyinda.com",
|
||||||
|
"checkedAt": "2026-05-27T11:34:47.503Z",
|
||||||
|
"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": 2046
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"boundaries": {
|
||||||
|
"noBusinessWrites": true,
|
||||||
|
"noExportsByDefault": true,
|
||||||
|
"noFileUploads": true,
|
||||||
|
"noWeComWrites": true,
|
||||||
|
"noRealPaymentExecution": true
|
||||||
|
}
|
||||||
|
}
|
||||||
+129
@@ -0,0 +1,129 @@
|
|||||||
|
{
|
||||||
|
"mode": "oaops1-authenticated-readonly-probe",
|
||||||
|
"status": "PASS",
|
||||||
|
"baseUrl": "https://oa.hyinda.com",
|
||||||
|
"checkedAt": "2026-05-27T11:34:47.503Z",
|
||||||
|
"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": 2046
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"boundaries": {
|
||||||
|
"noBusinessWrites": true,
|
||||||
|
"noExportsByDefault": true,
|
||||||
|
"noFileUploads": true,
|
||||||
|
"noWeComWrites": true,
|
||||||
|
"noRealPaymentExecution": true
|
||||||
|
}
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"name": "authenticated-readonly-probe",
|
||||||
|
"status": "PASS",
|
||||||
|
"kind": "finding_allowed",
|
||||||
|
"code": 0,
|
||||||
|
"detail": "ok",
|
||||||
|
"logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/authenticated-readonly-probe.log",
|
||||||
|
"checkedAt": "2026-05-27T11:34:47.654Z"
|
||||||
|
}
|
||||||
+64
@@ -0,0 +1,64 @@
|
|||||||
|
{
|
||||||
|
"checkedAt": "2026-05-27T11:33:40.617Z",
|
||||||
|
"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": 77,
|
||||||
|
"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": 75,
|
||||||
|
"envEnabled": true,
|
||||||
|
"effectiveEnabled": true,
|
||||||
|
"effectiveReason": "flag_force_on_global"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"name": "live-feature-flags",
|
||||||
|
"status": "PASS",
|
||||||
|
"kind": "finding_allowed",
|
||||||
|
"code": 0,
|
||||||
|
"detail": "ok",
|
||||||
|
"logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/live-feature-flags.log",
|
||||||
|
"checkedAt": "2026-05-27T11:33:40.918Z"
|
||||||
|
}
|
||||||
+45
@@ -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=92 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
|
||||||
|
|
||||||
|
> [email protected] test:e2e:live
|
||||||
|
> playwright test tests/e2e/live-smoke.spec.ts
|
||||||
|
|
||||||
|
|
||||||
|
Running 3 tests using 1 worker
|
||||||
|
|
||||||
|
(node:650570) 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:650570) 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.9s)
|
||||||
|
✓ 2 tests/e2e/live-smoke.spec.ts:64:3 › live smoke › 管理员只读网页 smoke (10.6s)
|
||||||
|
✓ 3 tests/e2e/live-smoke.spec.ts:106:3 › live smoke › 员工只读网页 smoke (10.9s)
|
||||||
|
|
||||||
|
3 passed (28.0s)
|
||||||
|
>>> [live-readiness] 执行真实 OCR 样本复核
|
||||||
|
|
||||||
|
Running 1 test using 1 worker
|
||||||
|
|
||||||
|
(node:651349) 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:651349) 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":680,"transport":"ui","timings":{"uploadMs":680,"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 发票上传后进入可处理状态 (5.1s)
|
||||||
|
|
||||||
|
1 passed (8.9s)
|
||||||
|
[live-readiness][PASS] readiness 检查完成
|
||||||
|
[live-readiness] report=.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/live-smoke-readiness
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"name": "live-readiness",
|
||||||
|
"status": "PASS",
|
||||||
|
"kind": "finding_allowed",
|
||||||
|
"code": 0,
|
||||||
|
"detail": "ok",
|
||||||
|
"logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/live-readiness.log",
|
||||||
|
"checkedAt": "2026-05-27T11:32:29.441Z"
|
||||||
|
}
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"checkedAt": "2026-05-27T11:31:39.252Z",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
"authCapabilities": {
|
||||||
|
"ok": true,
|
||||||
|
"status": 200,
|
||||||
|
"emailDeliveryReady": true,
|
||||||
|
"emailDeliveryReasons": [],
|
||||||
|
"emailLoginCodeEnabled": true,
|
||||||
|
"passwordResetEnabled": true
|
||||||
|
}
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"name": "live-smoke-env",
|
||||||
|
"status": "PASS",
|
||||||
|
"kind": "finding_allowed",
|
||||||
|
"code": 0,
|
||||||
|
"detail": "ok",
|
||||||
|
"logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/live-smoke-env.log",
|
||||||
|
"checkedAt": "2026-05-27T11:31:39.326Z"
|
||||||
|
}
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"checkedAt": "2026-05-27T11:31:39.936Z",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
"authCapabilities": {
|
||||||
|
"ok": true,
|
||||||
|
"status": 200,
|
||||||
|
"emailDeliveryReady": true,
|
||||||
|
"emailDeliveryReasons": [],
|
||||||
|
"emailLoginCodeEnabled": true,
|
||||||
|
"passwordResetEnabled": true
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
Running 1 test using 1 worker
|
||||||
|
|
||||||
|
[live-ocr] {"alias":"SAMPLE-PDF-001","status":"ocr_failed","durationMs":680,"transport":"ui","timings":{"uploadMs":680,"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 发票上传后进入可处理状态 (5.1s)
|
||||||
|
|
||||||
|
1 passed (8.9s)
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
>>> 探活 live /ready: https://oa.hyinda.com/ready
|
||||||
|
>>> 执行 live smoke Playwright
|
||||||
|
|
||||||
|
> [email protected] 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 (10.6s)
|
||||||
|
✓ 3 tests/e2e/live-smoke.spec.ts:106:3 › live smoke › 员工只读网页 smoke (10.9s)
|
||||||
|
|
||||||
|
3 passed (28.0s)
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
[pending-ocr][SKIP] missing DATABASE_URL
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
[public-bundle-copy] base=https://oa.hyinda.com scanned=92 focused=2 findings=0
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"issueId": "OAOPS1",
|
||||||
|
"baseURL": "https://oa.hyinda.com",
|
||||||
|
"commit": "5f1e893",
|
||||||
|
"checkedAt": "2026-05-27T11:39:29.537Z",
|
||||||
|
"status": "PASS",
|
||||||
|
"mode": "live-smoke-readiness",
|
||||||
|
"reportDir": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/live-smoke-readiness",
|
||||||
|
"reportRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/live-smoke-readiness",
|
||||||
|
"groups": null,
|
||||||
|
"notes": "公网 /ready、public bundle、pending OCR、live smoke 和真实 OCR 可用性检查;缺少凭据或样票时按脚本规则记录 SKIP。"
|
||||||
|
}
|
||||||
+20
@@ -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、银行流水导入、真实支付直连继续冻结。
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
Running 1 test using 1 worker
|
||||||
|
|
||||||
|
(node:655414) 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:655414) 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 体验 (16.1s)
|
||||||
|
|
||||||
|
1 passed (21.1s)
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"name": "mobile-entry-matrix",
|
||||||
|
"status": "PASS",
|
||||||
|
"kind": "finding_allowed",
|
||||||
|
"code": 0,
|
||||||
|
"detail": "ok",
|
||||||
|
"logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/mobile-entry-matrix.log",
|
||||||
|
"checkedAt": "2026-05-27T11:35:16.194Z"
|
||||||
|
}
|
||||||
+392
@@ -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-27T11:32:34.313Z",
|
||||||
|
"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-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/oa-only-smoke-readiness/summary.json
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"name": "oa-only-smoke-readiness",
|
||||||
|
"status": "PASS",
|
||||||
|
"kind": "finding_allowed",
|
||||||
|
"code": 0,
|
||||||
|
"detail": "ok",
|
||||||
|
"logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/oa-only-smoke-readiness.log",
|
||||||
|
"checkedAt": "2026-05-27T11:32:34.475Z"
|
||||||
|
}
|
||||||
+391
@@ -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-27T11:32:34.313Z",
|
||||||
|
"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
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
{"requestId":"f4eb6750-c372-4d76-be63-50272bf30ff1","data":{"ok":true}}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"name": "public-ready",
|
||||||
|
"status": "PASS",
|
||||||
|
"kind": "required",
|
||||||
|
"code": 0,
|
||||||
|
"detail": "ok",
|
||||||
|
"logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/public-ready.log",
|
||||||
|
"checkedAt": "2026-05-27T11:31:38.642Z"
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"name": "report-privacy-smoke",
|
||||||
|
"status": "PASS",
|
||||||
|
"kind": "required",
|
||||||
|
"code": 0,
|
||||||
|
"detail": "ok",
|
||||||
|
"logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/report-privacy-smoke.log",
|
||||||
|
"checkedAt": "2026-05-27T11:36:58.042Z"
|
||||||
|
}
|
||||||
+294
@@ -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": "5f1e893",
|
||||||
|
"checkedAt": "2026-05-27T11:36:57.851Z",
|
||||||
|
"reportRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public",
|
||||||
|
"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-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/live-smoke-readiness/summary.json",
|
||||||
|
"findingCount": 0,
|
||||||
|
"openCount": 0
|
||||||
|
},
|
||||||
|
"oaOnlySmokeReadiness": {
|
||||||
|
"status": "PASS_OA_ONLY_SMOKE_READY",
|
||||||
|
"reportRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/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-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/public-ready.log",
|
||||||
|
"checkedAt": "2026-05-27T11:31:38.642Z"
|
||||||
|
},
|
||||||
|
"live-smoke-env": {
|
||||||
|
"name": "live-smoke-env",
|
||||||
|
"status": "PASS",
|
||||||
|
"kind": "finding_allowed",
|
||||||
|
"code": 0,
|
||||||
|
"detail": "ok",
|
||||||
|
"logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/live-smoke-env.log",
|
||||||
|
"checkedAt": "2026-05-27T11:31:39.326Z"
|
||||||
|
},
|
||||||
|
"live-readiness": {
|
||||||
|
"name": "live-readiness",
|
||||||
|
"status": "PASS",
|
||||||
|
"kind": "finding_allowed",
|
||||||
|
"code": 0,
|
||||||
|
"detail": "ok",
|
||||||
|
"logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/live-readiness.log",
|
||||||
|
"checkedAt": "2026-05-27T11:32:29.441Z"
|
||||||
|
},
|
||||||
|
"oa-only-smoke-readiness": {
|
||||||
|
"name": "oa-only-smoke-readiness",
|
||||||
|
"status": "PASS",
|
||||||
|
"kind": "finding_allowed",
|
||||||
|
"code": 0,
|
||||||
|
"detail": "ok",
|
||||||
|
"logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/oa-only-smoke-readiness.log",
|
||||||
|
"checkedAt": "2026-05-27T11:32:34.475Z"
|
||||||
|
},
|
||||||
|
"live-feature-flags": {
|
||||||
|
"name": "live-feature-flags",
|
||||||
|
"status": "PASS",
|
||||||
|
"kind": "finding_allowed",
|
||||||
|
"code": 0,
|
||||||
|
"detail": "ok",
|
||||||
|
"logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/live-feature-flags.log",
|
||||||
|
"checkedAt": "2026-05-27T11:33:40.918Z"
|
||||||
|
},
|
||||||
|
"authenticated-readonly-probe": {
|
||||||
|
"name": "authenticated-readonly-probe",
|
||||||
|
"status": "PASS",
|
||||||
|
"kind": "finding_allowed",
|
||||||
|
"code": 0,
|
||||||
|
"detail": "ok",
|
||||||
|
"logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/authenticated-readonly-probe.log",
|
||||||
|
"checkedAt": "2026-05-27T11:34:47.654Z"
|
||||||
|
},
|
||||||
|
"mobile-entry-matrix": {
|
||||||
|
"name": "mobile-entry-matrix",
|
||||||
|
"status": "PASS",
|
||||||
|
"kind": "finding_allowed",
|
||||||
|
"code": 0,
|
||||||
|
"detail": "ok",
|
||||||
|
"logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/mobile-entry-matrix.log",
|
||||||
|
"checkedAt": "2026-05-27T11:35:16.194Z"
|
||||||
|
},
|
||||||
|
"wecom-rendering-matrix": {
|
||||||
|
"name": "wecom-rendering-matrix",
|
||||||
|
"status": "PASS",
|
||||||
|
"kind": "finding_allowed",
|
||||||
|
"code": 0,
|
||||||
|
"detail": "ok",
|
||||||
|
"logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/wecom-rendering-matrix.log",
|
||||||
|
"checkedAt": "2026-05-27T11:36:36.466Z"
|
||||||
|
},
|
||||||
|
"wecom-entry": {
|
||||||
|
"name": "wecom-entry",
|
||||||
|
"status": "PASS",
|
||||||
|
"kind": "finding_allowed",
|
||||||
|
"code": 0,
|
||||||
|
"detail": "ok",
|
||||||
|
"logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/wecom-entry.log",
|
||||||
|
"checkedAt": "2026-05-27T11:36:57.242Z"
|
||||||
|
},
|
||||||
|
"report-privacy-smoke": {
|
||||||
|
"name": "report-privacy-smoke",
|
||||||
|
"status": "PASS",
|
||||||
|
"kind": "required",
|
||||||
|
"code": 0,
|
||||||
|
"detail": "ok",
|
||||||
|
"logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/report-privacy-smoke.log",
|
||||||
|
"checkedAt": "2026-05-27T11:36:57.641Z"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"readonlyProbe": {
|
||||||
|
"mode": "oaops1-authenticated-readonly-probe",
|
||||||
|
"status": "PASS",
|
||||||
|
"baseUrl": "https://oa.hyinda.com",
|
||||||
|
"checkedAt": "2026-05-27T11:34:47.503Z",
|
||||||
|
"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": 2046
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"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"
|
||||||
|
}
|
||||||
+24
@@ -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-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
|
||||||
|
Running 2 tests using 1 worker
|
||||||
|
|
||||||
|
(node:657516) 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:657516) 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 企微入口:普通浏览器下只提示企业微信工作台打开 (3.6s)
|
||||||
|
✓ 2 tests/e2e/wecom-entry.spec.ts:66:1 › E2E 企微入口:企业微信场景优先显示企微 CTA,并展示未绑定提示 (3.3s)
|
||||||
|
|
||||||
|
2 passed (12.9s)
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"name": "wecom-entry",
|
||||||
|
"status": "PASS",
|
||||||
|
"kind": "finding_allowed",
|
||||||
|
"code": 0,
|
||||||
|
"detail": "ok",
|
||||||
|
"logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/wecom-entry.log",
|
||||||
|
"checkedAt": "2026-05-27T11:36:57.242Z"
|
||||||
|
}
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
Running 8 tests using 1 worker
|
||||||
|
|
||||||
|
(node:656029) 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:656029) 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 图标且跨视口不挤压 (8.8s)
|
||||||
|
✓ 2 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:588:7 › WCM6 企业微信多手机移动渲染稳定化 › 360 Android 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (8.3s)
|
||||||
|
✓ 3 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:588:7 › WCM6 企业微信多手机移动渲染稳定化 › 375 iPhone 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (8.0s)
|
||||||
|
✓ 4 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:588:7 › WCM6 企业微信多手机移动渲染稳定化 › 390 iPhone12 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (8.7s)
|
||||||
|
✓ 5 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:588:7 › WCM6 企业微信多手机移动渲染稳定化 › 393 Android 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (8.4s)
|
||||||
|
✓ 6 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:588:7 › WCM6 企业微信多手机移动渲染稳定化 › 414 iPhone 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (8.0s)
|
||||||
|
✓ 7 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:588:7 › WCM6 企业微信多手机移动渲染稳定化 › 430 iPhone 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (8.7s)
|
||||||
|
✓ 8 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:604:5 › WCM6 企业微信多手机移动渲染稳定化 › 390 iPhone12 企业微信 字体失败 › Material Symbols 字体失败时核心移动入口仍稳定 (8.0s)
|
||||||
|
|
||||||
|
8 passed (1.2m)
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"name": "wecom-rendering-matrix",
|
||||||
|
"status": "PASS",
|
||||||
|
"kind": "finding_allowed",
|
||||||
|
"code": 0,
|
||||||
|
"detail": "ok",
|
||||||
|
"logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/postdeploy-20260527-wave2-public/wecom-rendering-matrix.log",
|
||||||
|
"checkedAt": "2026-05-27T11:36:36.466Z"
|
||||||
|
}
|
||||||
@@ -31,6 +31,17 @@ function optionalValue(value) {
|
|||||||
return value?.trim() || null;
|
return value?.trim() || null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function reportRef(file) {
|
||||||
|
const absolute = path.resolve(file);
|
||||||
|
const relative = path.relative(rootDir, absolute);
|
||||||
|
if (relative && !relative.startsWith("..") && !path.isAbsolute(relative)) {
|
||||||
|
return relative;
|
||||||
|
}
|
||||||
|
return path.basename(absolute);
|
||||||
|
}
|
||||||
|
|
||||||
|
const reportDirRef = reportRef(reportDir);
|
||||||
|
|
||||||
const summary = {
|
const summary = {
|
||||||
issueId: optionalValue(process.env.QA_ISSUE_ID),
|
issueId: optionalValue(process.env.QA_ISSUE_ID),
|
||||||
baseURL: optionalValue(process.env.QA_BASE_URL) ||
|
baseURL: optionalValue(process.env.QA_BASE_URL) ||
|
||||||
@@ -40,11 +51,12 @@ const summary = {
|
|||||||
checkedAt: new Date().toISOString(),
|
checkedAt: new Date().toISOString(),
|
||||||
status: optionalValue(process.env.QA_STATUS) || "UNKNOWN",
|
status: optionalValue(process.env.QA_STATUS) || "UNKNOWN",
|
||||||
mode: optionalValue(process.env.QA_MODE),
|
mode: optionalValue(process.env.QA_MODE),
|
||||||
reportDir: path.resolve(reportDir),
|
reportDir: reportDirRef,
|
||||||
|
reportRef: reportDirRef,
|
||||||
groups: optionalValue(process.env.BUSINESS_FLOW_GROUPS),
|
groups: optionalValue(process.env.BUSINESS_FLOW_GROUPS),
|
||||||
notes: optionalValue(process.env.QA_SUMMARY_NOTES),
|
notes: optionalValue(process.env.QA_SUMMARY_NOTES),
|
||||||
};
|
};
|
||||||
|
|
||||||
mkdirSync(reportDir, { recursive: true });
|
mkdirSync(reportDir, { recursive: true });
|
||||||
writeFileSync(path.join(reportDir, "summary.json"), JSON.stringify(summary, null, 2), "utf8");
|
writeFileSync(path.join(reportDir, "summary.json"), JSON.stringify(summary, null, 2), "utf8");
|
||||||
console.log(`[qa-summary] ${summary.status} ${path.join(reportDir, "summary.json")}`);
|
console.log(`[qa-summary] ${summary.status} ${reportRef(path.join(reportDir, "summary.json"))}`);
|
||||||
|
|||||||
在新工单中引用
屏蔽一个用户