From 311c7326792790857912cb73ff04101af94c28ad Mon Sep 17 00:00:00 2001 From: shunli Date: Tue, 26 May 2026 18:50:16 +0800 Subject: [PATCH] =?UTF-8?q?oa-seven-day-trial-live-ops=20=E5=90=AF?= =?UTF-8?q?=E5=8A=A87=E5=A4=A9=E7=9C=9F=E5=AE=9E=E8=AF=95=E8=BF=90?= =?UTF-8?q?=E8=A1=8CDay1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../check.jsonl | 3 + .../implement.jsonl | 4 + .../implement.md | 27 ++ .../05-26-oa-seven-day-trial-live-ops/prd.md | 117 ++++++ .../authenticated-readonly-probe.json | 129 ++++++ .../authenticated-readonly-probe.log | 129 ++++++ .../authenticated-readonly-probe.step.json | 9 + .../live-feature-flags.log | 64 +++ .../live-feature-flags.step.json | 9 + .../day1-oa-real-use-daily/live-readiness.log | 44 ++ .../live-readiness.step.json | 9 + .../day1-oa-real-use-daily/live-smoke-env.log | 42 ++ .../live-smoke-env.step.json | 9 + .../live-smoke-readiness/env.json | 42 ++ .../live-smoke-readiness/live-ocr.txt | 7 + .../live-smoke-readiness/live-smoke.txt | 14 + .../live-smoke-readiness/pending-ocr.txt | 1 + .../public-bundle-copy.txt | 1 + .../live-smoke-readiness/summary.json | 11 + .../day1-oa-real-use-daily/manual-gates.md | 20 + .../mobile-entry-matrix.log | 10 + .../mobile-entry-matrix.step.json | 9 + .../oa-only-smoke-readiness.log | 392 ++++++++++++++++++ .../oa-only-smoke-readiness.step.json | 9 + .../oa-only-smoke-readiness/summary.json | 391 +++++++++++++++++ .../day1-oa-real-use-daily/public-ready.log | 1 + .../public-ready.step.json | 9 + .../report-privacy-smoke.step.json | 9 + .../day1-oa-real-use-daily/summary.json | 294 +++++++++++++ .../day1-oa-real-use-daily/summary.txt | 24 ++ .../day1-oa-real-use-daily/wecom-entry.log | 11 + .../wecom-entry.step.json | 9 + .../wecom-rendering-matrix.log | 17 + .../wecom-rendering-matrix.step.json | 9 + .../research/day1-start-summary.md | 53 +++ .../task.json | 31 ++ 36 files changed, 1969 insertions(+) create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/check.jsonl create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/implement.jsonl create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/implement.md create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/prd.md create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/authenticated-readonly-probe.json create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/authenticated-readonly-probe.log create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/authenticated-readonly-probe.step.json create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-feature-flags.log create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-feature-flags.step.json create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-readiness.log create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-readiness.step.json create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-env.log create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-env.step.json create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/env.json create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/live-ocr.txt create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/live-smoke.txt create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/pending-ocr.txt create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/public-bundle-copy.txt create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/summary.json create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/manual-gates.md create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/mobile-entry-matrix.log create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/mobile-entry-matrix.step.json create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/oa-only-smoke-readiness.log create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/oa-only-smoke-readiness.step.json create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/oa-only-smoke-readiness/summary.json create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/public-ready.log create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/public-ready.step.json create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/report-privacy-smoke.step.json create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/summary.json create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/summary.txt create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/wecom-entry.log create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/wecom-entry.step.json create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/wecom-rendering-matrix.log create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/wecom-rendering-matrix.step.json create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-start-summary.md create mode 100644 .trellis/tasks/05-26-oa-seven-day-trial-live-ops/task.json diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/check.jsonl b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/check.jsonl new file mode 100644 index 00000000..b6b6435b --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/check.jsonl @@ -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"} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/implement.jsonl b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/implement.jsonl new file mode 100644 index 00000000..66930459 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/implement.jsonl @@ -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"} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/implement.md b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/implement.md new file mode 100644 index 00000000..1cbc64bc --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/implement.md @@ -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` diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/prd.md b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/prd.md new file mode 100644 index 00000000..c8811b60 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/prd.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=/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` diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/authenticated-readonly-probe.json b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/authenticated-readonly-probe.json new file mode 100644 index 00000000..dced4bb9 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/authenticated-readonly-probe.json @@ -0,0 +1,129 @@ +{ + "mode": "oaops1-authenticated-readonly-probe", + "status": "PASS", + "baseUrl": "https://oa.hyinda.com", + "checkedAt": "2026-05-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 + } +} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/authenticated-readonly-probe.log b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/authenticated-readonly-probe.log new file mode 100644 index 00000000..dced4bb9 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/authenticated-readonly-probe.log @@ -0,0 +1,129 @@ +{ + "mode": "oaops1-authenticated-readonly-probe", + "status": "PASS", + "baseUrl": "https://oa.hyinda.com", + "checkedAt": "2026-05-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 + } +} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/authenticated-readonly-probe.step.json b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/authenticated-readonly-probe.step.json new file mode 100644 index 00000000..2ca15272 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/authenticated-readonly-probe.step.json @@ -0,0 +1,9 @@ +{ + "name": "authenticated-readonly-probe", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/authenticated-readonly-probe.log", + "checkedAt": "2026-05-26T10:14:45.047Z" +} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-feature-flags.log b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-feature-flags.log new file mode 100644 index 00000000..35b523d1 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-feature-flags.log @@ -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" + } + } + ] +} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-feature-flags.step.json b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-feature-flags.step.json new file mode 100644 index 00000000..cd9822bd --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-feature-flags.step.json @@ -0,0 +1,9 @@ +{ + "name": "live-feature-flags", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-feature-flags.log", + "checkedAt": "2026-05-26T10:13:38.450Z" +} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-readiness.log b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-readiness.log new file mode 100644 index 00000000..b530bb04 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-readiness.log @@ -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 + +> client@0.1.0 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 diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-readiness.step.json b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-readiness.step.json new file mode 100644 index 00000000..a69bd624 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-readiness.step.json @@ -0,0 +1,9 @@ +{ + "name": "live-readiness", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-readiness.log", + "checkedAt": "2026-05-26T10:12:27.422Z" +} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-env.log b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-env.log new file mode 100644 index 00000000..07f79b51 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-env.log @@ -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" + } +} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-env.step.json b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-env.step.json new file mode 100644 index 00000000..b399c3c7 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-env.step.json @@ -0,0 +1,9 @@ +{ + "name": "live-smoke-env", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-env.log", + "checkedAt": "2026-05-26T10:11:37.604Z" +} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/env.json b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/env.json new file mode 100644 index 00000000..9fc239d8 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/env.json @@ -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" + } +} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/live-ocr.txt b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/live-ocr.txt new file mode 100644 index 00000000..3bd2980c --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/live-ocr.txt @@ -0,0 +1,7 @@ + +Running 1 test using 1 worker + +[live-ocr] {"alias":"SAMPLE-PDF-001","status":"ocr_failed","durationMs":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) diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/live-smoke.txt b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/live-smoke.txt new file mode 100644 index 00000000..d56754a7 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/live-smoke.txt @@ -0,0 +1,14 @@ +>>> 探活 live /ready: https://oa.hyinda.com/ready +>>> 执行 live smoke Playwright + +> client@0.1.0 test:e2e:live +> playwright test tests/e2e/live-smoke.spec.ts + + +Running 3 tests using 1 worker + + ✓ 1 tests/e2e/live-smoke.spec.ts:43:3 › live smoke › 公网基础探活与企微配置状态 (2.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) diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/pending-ocr.txt b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/pending-ocr.txt new file mode 100644 index 00000000..a8739766 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/pending-ocr.txt @@ -0,0 +1 @@ +[pending-ocr][SKIP] missing DATABASE_URL diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/public-bundle-copy.txt b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/public-bundle-copy.txt new file mode 100644 index 00000000..4b7806a8 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/public-bundle-copy.txt @@ -0,0 +1 @@ +[public-bundle-copy] base=https://oa.hyinda.com scanned=92 focused=2 findings=0 diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/summary.json b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/summary.json new file mode 100644 index 00000000..ce3eb25d --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/live-smoke-readiness/summary.json @@ -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。" +} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/manual-gates.md b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/manual-gates.md new file mode 100644 index 00000000..772e3329 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/manual-gates.md @@ -0,0 +1,20 @@ +# OAOPS1 每日人工收口清单 + +## 员工 +- 真实报销:上传 PDF 发票,补充必要附件,提交 OA 审批。 +- 采购/费用:在 OA 创建申请,关联项目;如涉及合同,关联或补录合同台账。 +- 合同:只录入合同摘要、编号、负责人、项目、金额、线下归档位置;涉密合同正文、敏感报价和成本细节不上传公网 OA。 + +## 审批人 +- 从 OA 待办进入详情,确认报销、采购、合同或项目上下文后再审批。 +- 退回时写清需要补充的材料,避免线下口头说明替代系统记录。 + +## 出纳/财务 +- 审批通过后创建付款批次,线下银行渠道付款。 +- 上传银行回单附件后再在 OA 标记已付款。 +- 每日抽查 AP 台账、报销导出、票据状态和付款批次状态。 + +## 管理员 +- 查看本报告 summary.json 和人工问题登记。 +- 阻断项当天建修复 Issue CSV 或暂停对应流程;非阻断体验问题进入反馈池。 +- 确认 payment_batch_v1=force_on,erp_sync=force_off;图片 OCR、预算、ERP、银行流水导入、真实支付直连继续冻结。 diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/mobile-entry-matrix.log b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/mobile-entry-matrix.log new file mode 100644 index 00000000..e05beaf3 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/mobile-entry-matrix.log @@ -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) diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/mobile-entry-matrix.step.json b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/mobile-entry-matrix.step.json new file mode 100644 index 00000000..049265e6 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/mobile-entry-matrix.step.json @@ -0,0 +1,9 @@ +{ + "name": "mobile-entry-matrix", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/mobile-entry-matrix.log", + "checkedAt": "2026-05-26T10:15:08.808Z" +} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/oa-only-smoke-readiness.log b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/oa-only-smoke-readiness.log new file mode 100644 index 00000000..a642c76e --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/oa-only-smoke-readiness.log @@ -0,0 +1,392 @@ +{ + "issueId": "OSMOKE1", + "mode": "oa-only-smoke-readiness", + "status": "PASS_OA_ONLY_SMOKE_READY", + "conclusion": "PASS_OA_ONLY_SMOKE_READY", + "baseUrl": "https://oa.hyinda.com", + "checkedAt": "2026-05-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 diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/oa-only-smoke-readiness.step.json b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/oa-only-smoke-readiness.step.json new file mode 100644 index 00000000..ecebe857 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/oa-only-smoke-readiness.step.json @@ -0,0 +1,9 @@ +{ + "name": "oa-only-smoke-readiness", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-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" +} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/oa-only-smoke-readiness/summary.json b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/oa-only-smoke-readiness/summary.json new file mode 100644 index 00000000..8df2037a --- /dev/null +++ b/.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,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 + } +} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/public-ready.log b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/public-ready.log new file mode 100644 index 00000000..e201133f --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/public-ready.log @@ -0,0 +1 @@ +{"requestId":"4cbe3fe5-d139-4f74-89f1-8680e05fe46b","data":{"ok":true}} \ No newline at end of file diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/public-ready.step.json b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/public-ready.step.json new file mode 100644 index 00000000..25919297 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/public-ready.step.json @@ -0,0 +1,9 @@ +{ + "name": "public-ready", + "status": "PASS", + "kind": "required", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/public-ready.log", + "checkedAt": "2026-05-26T10:11:36.837Z" +} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/report-privacy-smoke.step.json b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/report-privacy-smoke.step.json new file mode 100644 index 00000000..c5ff261c --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/report-privacy-smoke.step.json @@ -0,0 +1,9 @@ +{ + "name": "report-privacy-smoke", + "status": "PASS", + "kind": "required", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/report-privacy-smoke.log", + "checkedAt": "2026-05-26T10:16:33.921Z" +} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/summary.json b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/summary.json new file mode 100644 index 00000000..d721fd28 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/summary.json @@ -0,0 +1,294 @@ +{ + "issueId": "OAOPS1", + "mode": "oa-real-use-daily", + "status": "PASS_OA_REAL_USE_DAILY_READY", + "conclusion": "PASS_OA_REAL_USE_DAILY_READY", + "baseURL": "https://oa.hyinda.com", + "commit": "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" +} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/summary.txt b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/summary.txt new file mode 100644 index 00000000..e540a5fb --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/summary.txt @@ -0,0 +1,24 @@ +[oaops1] loaded masked live smoke env file +>>> [oaops1] public-ready +[oaops1][PASS] public-ready +>>> [oaops1] live-smoke-env +[oaops1][PASS] live-smoke-env +>>> [oaops1] live-readiness +[oaops1][PASS] live-readiness +>>> [oaops1] oa-only-smoke-readiness +[oaops1][PASS] oa-only-smoke-readiness +[oaops1] login cooldown 65s before live-feature-flags +>>> [oaops1] live-feature-flags +[oaops1][PASS] live-feature-flags +[oaops1] login cooldown 65s before authenticated-readonly-probe +>>> [oaops1] authenticated-readonly-probe +[oaops1][PASS] authenticated-readonly-probe +>>> [oaops1] mobile-entry-matrix +[oaops1][PASS] mobile-entry-matrix +>>> [oaops1] wecom-rendering-matrix +[oaops1][PASS] wecom-rendering-matrix +>>> [oaops1] wecom-entry +[oaops1][PASS] wecom-entry +[oaops1][PASS] report-privacy-smoke +[oaops1][PASS] report-privacy-smoke +[oaops1] report=.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/wecom-entry.log b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/wecom-entry.log new file mode 100644 index 00000000..08127f68 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/wecom-entry.log @@ -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) diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/wecom-entry.step.json b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/wecom-entry.step.json new file mode 100644 index 00000000..c1f118c6 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/wecom-entry.step.json @@ -0,0 +1,9 @@ +{ + "name": "wecom-entry", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/wecom-entry.log", + "checkedAt": "2026-05-26T10:16:33.575Z" +} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/wecom-rendering-matrix.log b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/wecom-rendering-matrix.log new file mode 100644 index 00000000..9210941b --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/wecom-rendering-matrix.log @@ -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) diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/wecom-rendering-matrix.step.json b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/wecom-rendering-matrix.step.json new file mode 100644 index 00000000..176b5665 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/wecom-rendering-matrix.step.json @@ -0,0 +1,9 @@ +{ + "name": "wecom-rendering-matrix", + "status": "PASS", + "kind": "finding_allowed", + "code": 0, + "detail": "ok", + "logRef": ".trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-oa-real-use-daily/wecom-rendering-matrix.log", + "checkedAt": "2026-05-26T10:16:15.645Z" +} diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-start-summary.md b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-start-summary.md new file mode 100644 index 00000000..85508079 --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/research/day1-start-summary.md @@ -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`,阻断当天建修复任务,非阻断进入反馈池。 diff --git a/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/task.json b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/task.json new file mode 100644 index 00000000..1977e2ad --- /dev/null +++ b/.trellis/tasks/05-26-oa-seven-day-trial-live-ops/task.json @@ -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": {} +}