oa-seven-day-trial-live-ops 启动7天真实试运行Day1

这个提交包含在:
2026-05-26 18:50:16 +08:00
父节点 74f8410f99
当前提交 311c732679
共修改 36 个文件,包含 1969 行新增和 0 行删除
@@ -0,0 +1,3 @@
{"file": ".trellis/spec/hyb-oa/project-governance.md", "reason": "Validate Trellis task and approval boundaries"}
{"file": ".trellis/spec/hyb-oa/docs-and-evidence.md", "reason": "Validate daily evidence report handling"}
{"file": ".trellis/spec/hyb-oa/security-privacy.md", "reason": "Validate no sensitive content is persisted"}
@@ -0,0 +1,4 @@
{"file": ".trellis/spec/hyb-oa/project-governance.md", "reason": "Trellis task governance, approval and commit boundaries"}
{"file": ".trellis/spec/hyb-oa/deployment-trialrun.md", "reason": "Public OA quasi-production and live-operation boundaries"}
{"file": ".trellis/spec/hyb-oa/docs-and-evidence.md", "reason": "Evidence summaries, reportRef, finding and privacy contracts"}
{"file": ".trellis/spec/hyb-oa/security-privacy.md", "reason": "Sensitive data exclusions for task evidence"}
@@ -0,0 +1,27 @@
# 实施记录
## 执行策略
本任务是运行启动与证据任务,不改业务代码、不改远端配置、不执行真实业务自动写入。实施方式为:
1. 固定启动日期和 Day 7 收口日期。
2. 用 `scripts/qa/run-oa-real-use-daily.sh` 执行 Day 1 只读巡检。
3. 将报告保存在当前 Trellis task 的 `research/day1-oa-real-use-daily/`。
4. 将自动化结论写入 `research/day1-start-summary.md`。
5. 后续 Day 2-Day 7 继续每日运行同一只读巡检,并由现场按 `manual-gates.md` 完成人工业务动作和问题收口。
## 风险控制
- 自动化只读:不创建、提交、审批、付款或导出真实业务数据。
- 真实业务写入仅由现场人员在公网 OA 内人工完成。
- 发现 blocker 时暂停对应流程,并另建最小修复任务。
- 报告中只保留状态、计数和相对证据路径,不保留敏感原文。
- Day 1 启动不等于 Day 7 Go/No-Go,不提前宣布最终正式启用完成。
## Day 1 结果
- 运行命令:`OAOPS1_REPORT_DIR=.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily 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/day1-oa-real-use-daily/summary.json`
- 启动摘要:`research/day1-start-summary.md`
@@ -0,0 +1,117 @@
# OA 7天真实试运行启动与每日运营
## Goal
在 2026-05-26 启动 OA 小团队 7 天真实使用稳定化,进入“真实业务人工使用 + 每日只读自动巡检 + 当天问题分级收口”的运行节奏。目标不是宣布最终正式启用完成,而是用连续 7 天证据证明公网 OA 能稳定承载报销/PDF OCR、审批、采购/费用、合同台账、项目、付款批次、AP 交接、移动/企业微信入口和审计留痕。
## Start Confirmation
- 用户已在 2026-05-26 明确确认“现在就可以开始”。
- 启动日期:`2026-05-26`。
- 预计 Day 7 收口日期:`2026-06-01`。
- 自动化边界:每日巡检只读;真实业务写入只由人工在公网 OA 内完成。
- 暂停/继续决策:发现阻断时先记录证据和影响,由用户/管理层决定继续、暂停或拆修复任务。
## Scope
- 启动 OAOPS1 7 天真实使用稳定化的 Day 1 记录。
- 执行并留存 Day 1 公网只读自动巡检证据。
- 生成现场人工每日收口清单,指导员工、审批人、财务/出纳和管理员按角色完成真实业务动作。
- 只记录脱敏摘要、状态、计数和相对证据路径。
- 后续 Day 2-Day 7 继续按同一节奏运行每日只读巡检和人工问题收口。
## What I Already Know
- 公网环境已在前序任务部署并验证,结论为 `READY_FOR_TRIAL_START_CONFIRMATION`。
- 最新部署后验证任务已归档:`.trellis/tasks/archive/2026-05/05-26-oa-frontend-postdeploy-public-verification/`。
- 部署后已通过 `/ready`、live smoke / OCR readiness、权限矩阵、PC 只读视觉矩阵、移动入口矩阵和企业微信渲染矩阵。
- `docs/管理员手册.md` 已定义 OAOPS1 七天真实使用稳定化:每日运行 `bash scripts/qa/run-oa-real-use-daily.sh`,真实业务写入由人工完成。
- `docs/试运行与自动化验证手册.md` 要求首周每日检查公网健康、PC 登录、移动/企业微信入口、报销/PDF OCR、审批、请假、采购、通知、付款批次、AP 和审计日志。
- OALAUNCH1 最终启用仍需 Day 7 Go/No-Go,不得把 Day 1 启动误写成最终正式启用完成。
## Assumptions
- 本任务默认采用中国时区日期口径记录试运行日历:Day 1 为 2026-05-26。
- 自动化巡检负责人为本 Codex/Trellis 会话执行者;业务样本负责人按角色在现场分配,不在本任务中编造个人姓名。
- 今日先完成 Day 1 启动记录和只读巡检;真实业务动作由现场按管理员手册人工执行。
- 如果现场后续补充具体负责人姓名,只更新本任务证据或后续 Day N 记录,不倒改启动事实。
## Requirements
- 创建 Trellis 任务记录真实试运行启动,不依赖聊天作为唯一证据。
- 启动当天必须运行一次只读自动巡检:
- `OAOPS1_REPORT_DIR=<task-research-dir>/day1-oa-real-use-daily LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-oa-real-use-daily.sh`
- 巡检报告必须保存脱敏摘要引用,不保存密码、token、Secret、完整账号、完整本地路径、原始票据、合同正文、银行资料或 raw payload。
- 每日人工业务动作按角色完成:
- 员工:真实报销/PDF 发票、采购/费用、必要项目或合同关联。
- 审批人:从 OA 待办进入详情审批或退回。
- 财务/出纳:付款批次、线下付款、回单附件、已付款标记、AP/报销/票据抽查。
- 管理员:权限、审计、合同台账、项目关联和每日巡检报告收口。
- 冻结项继续冻结:图片 OCR、复杂 BPM、预算硬控、ERP 写入、银行流水导入、真实支付接口、企业微信 HR 深镜像、应急接管、恢复回写和 RuleOps。
- 出现以下情况时当天暂停对应流程并拆最小修复任务:
- 无法登录、无法提交或审批核心单据。
- 报销/PDF OCR、查重、付款批次、AP、审计日志出现不可解释阻断。
- 权限越权、敏感资料泄露或冻结项被误开启。
- `/ready` 异常、live readiness 阻断或两个以上高优先级问题无法解释。
## Acceptance Criteria
- [x] Day 1 启动日期和边界已记录。
- [x] Day 1 只读自动巡检已运行并保存摘要。
- [x] 巡检结论为 `PASS_OA_REAL_USE_DAILY_READY` 或 `PASS_WITH_FINDINGS` 且 finding 可解释;若阻断则不继续扩大真实使用。
- [x] `payment_batch_v1=force_on`,`erp_sync=force_off`,冻结项未被误开启。
- [x] 人工业务动作清单已交给现场按角色执行。
- [x] Day 7 Go/No-Go 仍保持待执行,不提前宣称最终启用完成。
## Definition of Done
- Day 1 启动证据齐全,报告可追溯。
- 没有把只读自动化结果误写成真实业务闭环完成。
- 没有执行真实付款、ERP 写入、企业微信写入、数据库重置/恢复或自动创建真实业务数据。
- 后续 Day 2-Day 7 有明确执行节奏:每日巡检、人工问题登记、阻断即修、非阻断进入反馈池。
## Out of Scope
- 不宣布最终正式启用完成。
- 不执行真实支付接口、不导入银行流水、不写 ERP。
- 不自动创建、提交、审批或付款真实业务单据。
- 不上传或保存涉密合同正文、敏感报价、完整银行流水、真实密码、token、Secret、完整账号、完整本地路径或 raw payload。
- 不扩大前端改版、审批设计器、预算硬控、图片 OCR、复杂 BPM 或企业微信深镜像范围。
## Test Plan
Day 1 启动巡检:
```bash
mkdir -p .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily
OAOPS1_REPORT_DIR=.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily \
LIVE_SMOKE_BASE_URL=https://oa.hyinda.com \
bash scripts/qa/run-oa-real-use-daily.sh
```
收口检查:
```bash
python3 ./.trellis/scripts/task.py validate 05-26-oa-seven-day-trial-live-ops
node scripts/qa/check-trellis-governance.mjs
git diff --check
```
Day 2-Day 7:
```bash
OAOPS1_REPORT_DIR=.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/dayN-oa-real-use-daily \
LIVE_SMOKE_BASE_URL=https://oa.hyinda.com \
bash scripts/qa/run-oa-real-use-daily.sh
```
## Technical Notes
- Workflow: `.trellis/workflow.md`
- Project specs: `.trellis/spec/hyb-oa/`
- Admin runbook: `docs/管理员手册.md`
- Trial runbook: `docs/试运行与自动化验证手册.md`
- Launch checklist: `docs/trialrun/发布试运行准备清单.md`
- Daily readonly runner: `scripts/qa/run-oa-real-use-daily.sh`
- Final launch readiness runner: `scripts/qa/run-oa-final-launch-readiness.sh`
- Prior public verification: `.trellis/tasks/archive/2026-05/05-26-oa-frontend-postdeploy-public-verification/research/postdeploy-summary.md`
@@ -0,0 +1,129 @@
{
"mode": "oaops1-authenticated-readonly-probe",
"status": "PASS",
"baseUrl": "https://oa.hyinda.com",
"checkedAt": "2026-05-26T10:14:44.953Z",
"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": 1957
}
}
],
"boundaries": {
"noBusinessWrites": true,
"noExportsByDefault": true,
"noFileUploads": true,
"noWeComWrites": true,
"noRealPaymentExecution": true
}
}
@@ -0,0 +1,129 @@
{
"mode": "oaops1-authenticated-readonly-probe",
"status": "PASS",
"baseUrl": "https://oa.hyinda.com",
"checkedAt": "2026-05-26T10:14:44.953Z",
"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": 1957
}
}
],
"boundaries": {
"noBusinessWrites": true,
"noExportsByDefault": true,
"noFileUploads": true,
"noWeComWrites": true,
"noRealPaymentExecution": true
}
}
@@ -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/day1-oa-real-use-daily/authenticated-readonly-probe.log",
"checkedAt": "2026-05-26T10:14:45.047Z"
}
@@ -0,0 +1,64 @@
{
"checkedAt": "2026-05-26T10:13:38.373Z",
"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": 71,
"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": 69,
"envEnabled": true,
"effectiveEnabled": true,
"effectiveReason": "flag_force_on_global"
}
}
]
}
@@ -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/day1-oa-real-use-daily/live-feature-flags.log",
"checkedAt": "2026-05-26T10:13:38.450Z"
}
@@ -0,0 +1,44 @@
>>> [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] 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:1705555) 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:1705555) 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.3s)
✓ 2 tests/e2e/live-smoke.spec.ts:64:3 › live smoke › 管理员只读网页 smoke (11.3s)
✓ 3 tests/e2e/live-smoke.spec.ts:106:3 › live smoke › 员工只读网页 smoke (9.7s)
3 passed (27.1s)
>>> [live-readiness] 执行真实 OCR 样本复核
Running 1 test using 1 worker
(node:1706642) 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:1706642) 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":977,"transport":"ui","timings":{"uploadMs":977,"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.1s)
1 passed (10.0s)
[live-readiness][PASS] readiness 检查完成
[live-readiness] report=.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness
@@ -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/day1-oa-real-use-daily/live-readiness.log",
"checkedAt": "2026-05-26T10:12:27.422Z"
}
@@ -0,0 +1,42 @@
{
"checkedAt": "2026-05-26T10:11:37.357Z",
"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"
}
}
@@ -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/day1-oa-real-use-daily/live-smoke-env.log",
"checkedAt": "2026-05-26T10:11:37.604Z"
}
@@ -0,0 +1,42 @@
{
"checkedAt": "2026-05-26T10:11:38.197Z",
"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"
}
}
@@ -0,0 +1,7 @@
Running 1 test using 1 worker
[live-ocr] {"alias":"SAMPLE-PDF-001","status":"ocr_failed","durationMs":977,"transport":"ui","timings":{"uploadMs":977,"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.1s)
1 passed (10.0s)
@@ -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.3s)
✓ 2 tests/e2e/live-smoke.spec.ts:64:3 › live smoke › 管理员只读网页 smoke (11.3s)
✓ 3 tests/e2e/live-smoke.spec.ts:106:3 › live smoke › 员工只读网页 smoke (9.7s)
3 passed (27.1s)
@@ -0,0 +1 @@
[pending-ocr][SKIP] missing DATABASE_URL
@@ -0,0 +1 @@
[public-bundle-copy] base=https://oa.hyinda.com scanned=92 focused=2 findings=0
@@ -0,0 +1,11 @@
{
"issueId": "OAOPS1",
"baseURL": "https://oa.hyinda.com",
"commit": "74f8410",
"checkedAt": "2026-05-26T10:12:27.348Z",
"status": "PASS",
"mode": "live-smoke-readiness",
"reportRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness",
"groups": null,
"notes": "公网 /ready、public bundle、pending OCR、live smoke 和真实 OCR 可用性检查;缺少凭据或样票时按脚本规则记录 SKIP。"
}
@@ -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、银行流水导入、真实支付直连继续冻结。
@@ -0,0 +1,10 @@
Running 1 test using 1 worker
(node:1713822) 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:1713822) 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 体验 (13.9s)
1 passed (17.5s)
@@ -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/day1-oa-real-use-daily/mobile-entry-matrix.log",
"checkedAt": "2026-05-26T10:15:08.808Z"
}
@@ -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-26T10:12:32.163Z",
"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/day1-oa-real-use-daily/oa-only-smoke-readiness/summary.json
@@ -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/day1-oa-real-use-daily/oa-only-smoke-readiness.log",
"checkedAt": "2026-05-26T10:12:32.263Z"
}
@@ -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-26T10:12:32.163Z",
"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
}
}
@@ -0,0 +1 @@
{"requestId":"4cbe3fe5-d139-4f74-89f1-8680e05fe46b","data":{"ok":true}}
@@ -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/day1-oa-real-use-daily/public-ready.log",
"checkedAt": "2026-05-26T10:11:36.837Z"
}
@@ -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/day1-oa-real-use-daily/report-privacy-smoke.log",
"checkedAt": "2026-05-26T10:16:33.921Z"
}
@@ -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": "74f8410",
"checkedAt": "2026-05-26T10:16:33.831Z",
"reportRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-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-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/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/day1-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-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/public-ready.log",
"checkedAt": "2026-05-26T10:11:36.837Z"
},
"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/day1-oa-real-use-daily/live-smoke-env.log",
"checkedAt": "2026-05-26T10:11:37.604Z"
},
"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/day1-oa-real-use-daily/live-readiness.log",
"checkedAt": "2026-05-26T10:12:27.422Z"
},
"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/day1-oa-real-use-daily/oa-only-smoke-readiness.log",
"checkedAt": "2026-05-26T10:12:32.263Z"
},
"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/day1-oa-real-use-daily/live-feature-flags.log",
"checkedAt": "2026-05-26T10:13:38.450Z"
},
"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/day1-oa-real-use-daily/authenticated-readonly-probe.log",
"checkedAt": "2026-05-26T10:14:45.047Z"
},
"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/day1-oa-real-use-daily/mobile-entry-matrix.log",
"checkedAt": "2026-05-26T10:15:08.808Z"
},
"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/day1-oa-real-use-daily/wecom-rendering-matrix.log",
"checkedAt": "2026-05-26T10:16:15.645Z"
},
"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/day1-oa-real-use-daily/wecom-entry.log",
"checkedAt": "2026-05-26T10:16:33.575Z"
},
"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/day1-oa-real-use-daily/report-privacy-smoke.log",
"checkedAt": "2026-05-26T10:16:33.748Z"
}
},
"readonlyProbe": {
"mode": "oaops1-authenticated-readonly-probe",
"status": "PASS",
"baseUrl": "https://oa.hyinda.com",
"checkedAt": "2026-05-26T10:14:44.953Z",
"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": 1957
}
}
],
"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"
}
@@ -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/day1-oa-real-use-daily
@@ -0,0 +1,11 @@
Running 2 tests using 1 worker
(node:1717026) 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:1717026) 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:30:1 › E2E 企微入口:普通浏览器下企微按钮为次级入口 (6.5s)
✓ 2 tests/e2e/wecom-entry.spec.ts:63:1 › E2E 企微入口:企业微信场景优先显示企微 CTA,并展示未绑定提示 (1.9s)
2 passed (12.0s)
@@ -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/day1-oa-real-use-daily/wecom-entry.log",
"checkedAt": "2026-05-26T10:16:33.575Z"
}
@@ -0,0 +1,17 @@
Running 8 tests using 1 worker
(node:1714831) 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:1714831) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
(Use `node --trace-warnings ...` to show where the warning was created)
✓ 1 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:572:7 › WCM6 企业微信多手机移动渲染稳定化 › 320 iPhone 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.1s)
✓ 2 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:572:7 › WCM6 企业微信多手机移动渲染稳定化 › 360 Android 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.1s)
✓ 3 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:572:7 › WCM6 企业微信多手机移动渲染稳定化 › 375 iPhone 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.4s)
✓ 4 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:572:7 › WCM6 企业微信多手机移动渲染稳定化 › 390 iPhone12 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.3s)
✓ 5 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:572:7 › WCM6 企业微信多手机移动渲染稳定化 › 393 Android 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.1s)
✓ 6 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:572:7 › WCM6 企业微信多手机移动渲染稳定化 › 414 iPhone 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.2s)
✓ 7 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:572:7 › WCM6 企业微信多手机移动渲染稳定化 › 430 iPhone 企业微信 › 核心移动入口使用 SVG 图标且跨视口不挤压 (7.0s)
✓ 8 tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts:588:5 › WCM6 企业微信多手机移动渲染稳定化 › 390 iPhone12 企业微信 字体失败 › Material Symbols 字体失败时核心移动入口仍稳定 (7.1s)
8 passed (1.0m)
@@ -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/day1-oa-real-use-daily/wecom-rendering-matrix.log",
"checkedAt": "2026-05-26T10:16:15.645Z"
}
@@ -0,0 +1,53 @@
# Day 1 启动摘要
## 结论
`PASS_OA_REAL_USE_DAILY_READY`
OA 7 天真实使用稳定化已按 2026-05-26 启动。Day 1 只读自动巡检通过,未发现 blocker 或 finding。真实业务写入仍仅由现场人工在公网 OA 内完成;本次自动化没有创建、提交、审批、付款或导出真实业务数据。
## 时间窗口
- Day 1:2026-05-26
- Day 7 计划收口:2026-06-01
- 公网地址:`https://oa.hyinda.com`
- 巡检 commit:`74f8410`
## 自动巡检结果
| 项目 | 结论 |
| --- | --- |
| `/ready` | PASS |
| live smoke 环境 | PASS |
| live readiness | PASS |
| OA-only 角色只读 smoke | PASS |
| 功能开关 | PASS |
| 认证只读探针 | PASS |
| 移动入口矩阵 | PASS |
| 企业微信多视口渲染矩阵 | PASS |
| 企业微信入口 | PASS |
| 报告隐私扫描 | PASS |
## 关键边界
- `payment_batch_v1=force_on`。
- `erp_sync=force_off`。
- 图片 OCR、复杂 BPM、预算硬控、ERP 写入、银行流水导入、真实支付接口、企业微信 HR 深镜像、应急接管、恢复回写和 RuleOps 继续冻结。
- OCR live 样票进入重复/相同发票的可解释终态,不作为阻断。
- 本轮报告只保留状态、计数和相对证据路径,不保留密码、token、Secret、完整账号、票据原件、合同正文、银行资料或 raw payload。
## 证据
- 主报告:`research/day1-oa-real-use-daily/summary.json`
- 人工每日收口清单:`research/day1-oa-real-use-daily/manual-gates.md`
- live readiness 子报告:`research/day1-oa-real-use-daily/live-smoke-readiness/summary.json`
- OA-only smoke 子报告:`research/day1-oa-real-use-daily/oa-only-smoke-readiness/summary.json`
## 现场人工动作
Day 1 后现场按角色执行真实业务动作:
- 员工:真实报销/PDF 发票、采购/费用申请,必要时关联项目或合同。
- 审批人:从 OA 待办进入详情审批或退回。
- 财务/出纳:付款批次、线下银行付款、回单附件、已付款标记、AP/报销/票据抽查。
- 管理员:查看 `summary.json` 和 `manual-gates.md`,阻断当天建修复任务,非阻断进入反馈池。
@@ -0,0 +1,31 @@
{
"id": "oa-seven-day-trial-live-ops",
"name": "oa-seven-day-trial-live-ops",
"title": "OA 7天真实试运行启动与每日运营",
"description": "启动 OA 7 天真实使用稳定化,记录 Day 1 只读巡检、人工业务动作边界和后续每日运营节奏。",
"status": "in_progress",
"dev_type": null,
"scope": "ops/evidence",
"package": null,
"priority": "P2",
"creator": "shunli",
"assignee": "shunli",
"createdAt": "2026-05-26",
"completedAt": null,
"branch": null,
"base_branch": "main",
"worktree_path": null,
"commit": null,
"pr_url": null,
"subtasks": [],
"children": [],
"parent": null,
"relatedFiles": [
"docs/管理员手册.md",
"docs/试运行与自动化验证手册.md",
"scripts/qa/run-oa-real-use-daily.sh",
"scripts/qa/run-oa-final-launch-readiness.sh"
],
"notes": "",
"meta": {}
}