From 9f211b973e626a1d28d7af2792a2503ae3afcd3d Mon Sep 17 00:00:00 2001 From: shunli Date: Tue, 26 May 2026 14:40:37 +0800 Subject: [PATCH] =?UTF-8?q?oaops1-seven-day-trial-prep=20=E5=87=86?= =?UTF-8?q?=E5=A4=87=207=20=E5=A4=A9=E7=9C=9F=E5=AE=9E=E8=AF=95=E8=BF=90?= =?UTF-8?q?=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../check.jsonl | 4 + .../implement.jsonl | 4 + .../implement.md | 24 + .../05-26-oaops1-seven-day-trial-prep/prd.md | 125 + .../prep-permission-matrix/summary.json | 2285 +++++++++++++++++ .../prep-permission-matrix/summary.md | 28 + .../research/prep-readiness.md | 39 + .../task.json | 32 + 8 files changed, 2541 insertions(+) create mode 100644 .trellis/tasks/05-26-oaops1-seven-day-trial-prep/check.jsonl create mode 100644 .trellis/tasks/05-26-oaops1-seven-day-trial-prep/implement.jsonl create mode 100644 .trellis/tasks/05-26-oaops1-seven-day-trial-prep/implement.md create mode 100644 .trellis/tasks/05-26-oaops1-seven-day-trial-prep/prd.md create mode 100644 .trellis/tasks/05-26-oaops1-seven-day-trial-prep/research/prep-permission-matrix/summary.json create mode 100644 .trellis/tasks/05-26-oaops1-seven-day-trial-prep/research/prep-permission-matrix/summary.md create mode 100644 .trellis/tasks/05-26-oaops1-seven-day-trial-prep/research/prep-readiness.md create mode 100644 .trellis/tasks/05-26-oaops1-seven-day-trial-prep/task.json diff --git a/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/check.jsonl b/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/check.jsonl new file mode 100644 index 00000000..4492e92a --- /dev/null +++ b/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/check.jsonl @@ -0,0 +1,4 @@ +{"file": ".trellis/spec/hyb-oa/deployment-trialrun.md", "reason": "检查准备工作没有越过公网部署、配置和真实数据边界。"} +{"file": ".trellis/spec/hyb-oa/docs-and-evidence.md", "reason": "检查报告和 PRD 是否只保存相对引用、状态和脱敏证据。"} +{"file": ".trellis/spec/hyb-oa/security-privacy.md", "reason": "检查任务文件和 research 目录未写入敏感信息。"} +{"file": ".trellis/tasks/05-26-oaops1-seven-day-trial-prep/research/prep-readiness.md", "reason": "核对准备预检、人工确认项和证据引用是否完整。"} diff --git a/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/implement.jsonl b/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/implement.jsonl new file mode 100644 index 00000000..ee44f806 --- /dev/null +++ b/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/implement.jsonl @@ -0,0 +1,4 @@ +{"file": ".trellis/spec/hyb-oa/deployment-trialrun.md", "reason": "公网 OA、部署、试运行和真实数据操作边界。"} +{"file": ".trellis/spec/hyb-oa/docs-and-evidence.md", "reason": "QA summary、证据引用、脱敏和报告聚合契约。"} +{"file": ".trellis/spec/hyb-oa/security-privacy.md", "reason": "Trellis 任务和报告不得保存的敏感信息边界。"} +{"file": ".trellis/tasks/05-26-oaops1-seven-day-trial-prep/research/prep-readiness.md", "reason": "本任务启动准备预检结论和人工待确认项。"} diff --git a/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/implement.md b/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/implement.md new file mode 100644 index 00000000..73d90324 --- /dev/null +++ b/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/implement.md @@ -0,0 +1,24 @@ +# Implementation Notes + +## Plan + +1. 建立 Trellis task,作为 OAOPS1 7 天真实试运行准备阶段的执行合同。 +2. 读取现有试运行事实源、OALAUNCH1 closeout 证据、OAOPS1 巡检改进证据和 Trellis spec。 +3. 执行只读准备预检: + - `bash -n scripts/qa/run-oa-real-use-daily.sh` + - `bash -n scripts/qa/run-oa-final-launch-readiness.sh` + - live smoke / OCR / 公网 `/ready` / 企业微信配置检查 + - 公网权限矩阵只读检查 +4. 将准备结论写入 `prd.md` 和 `research/prep-readiness.md`。 +5. 通过 Trellis task validate、治理检查和 diff 检查。 + +## Current Result + +- live smoke 和真实 OCR 条件已具备。 +- 公网 `/ready` 和企业微信配置只读检查通过。 +- 权限矩阵只读预检通过,报告在 `research/prep-permission-matrix/summary.json`。 +- 仍需用户人工确认 7 天窗口起始日期、每日负责人、真实业务样本安排、备份恢复演练证据和 Day 7 Go/No-Go 方式。 + +## Boundaries + +本任务不部署、不改公网配置、不写真实业务数据、不写企业微信、不执行真实付款、不恢复或重置生产数据库。 diff --git a/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/prd.md b/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/prd.md new file mode 100644 index 00000000..b1823a80 --- /dev/null +++ b/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/prd.md @@ -0,0 +1,125 @@ +# OAOPS1 7 天真实试运行准备 + +## Goal + +为 OAOPS1 7 天小团队真实使用稳定化做好启动准备:确认公网只读基线、live smoke/OCR 条件、权限矩阵、人工业务闭环证据模板、每日巡检节奏和最终 OALAUNCH1 Go/No-Go 输入,确保后续启动窗口时不会把自动化通过误解为最终正式启用完成。 + +本任务只做准备和只读验证;不部署、不改生产配置、不写公网业务数据、不写企业微信、不执行付款、不做生产数据库恢复。 + +## Scope + +- 创建 OAOPS1 7 天真实试运行的 Trellis 执行合同。 +- 汇总当前 OALAUNCH1/OAOPS1 已知缺口、启动条件和人工证据要求。 +- 执行启动前只读预检,包括脚本语法、live smoke/OCR 条件、公网健康、企业微信配置和权限矩阵。 +- 记录每日巡检、Day 7 汇总和 Go/No-Go 所需输入。 +- 不进入真实 7 天计数,不执行业务写入或生产变更。 + +## What I Already Know + +- 当前没有活动任务,本任务从 Trellis planning 阶段创建。 +- OALAUNCH1 最新结论仍是 `PAUSED_MANUAL_CONFIRMATION`,不是 `PASS_OA_LAUNCH_READY`。 +- 仍阻断最终启用的关键门禁包括: + - OAOPS1 真实业务闭环:报销/PDF OCR/审批/付款/AP、采购/费用/项目或合同、合同台账/归档/权限。 + - 连续 7 天稳定化起始日期和每日巡检证据。 + - 备份恢复演练或影子库恢复证据。 + - 数据治理培训和运营支持证据。 + - Day 7 人工 Go/No-Go 结论。 +- 巡检脚本已完成改进:父级 summary 能传播子报告 finding,报告引用使用相对路径,隐私扫描不会打印原始敏感命中。 +- 本机已有 live smoke env 文件;只读公网预检显示 live smoke、真实 OCR 样票、公网 `/ready` 和企业微信配置均满足启动前自动化条件。 +- 本轮只读权限矩阵预检已通过:7 个角色、43 个正例、42 个负例,报告见 `research/prep-permission-matrix/summary.json`。 + +## Assumptions + +- 7 天窗口按自然日连续计算,必须由用户确认 `OALAUNCH_STABILIZATION_START_DATE=YYYY-MM-DD` 后才能进入正式计数。 +- 真实业务写入只由人工在公网 OA 内完成;Codex 自动化只做只读巡检和证据汇总。 +- 真实发票 PDF、合同/回单/归档资料只在 OA 或线下安全位置处理;Trellis task、docs、聊天和自动化报告只记录脱敏摘要、状态、数量和相对证据引用。 +- 若某天出现 blocker,默认当天另建最小修复 Trellis task;不在 7 天窗口任务里扩大范围或临时绕过生产规则。 + +## Requirements + +- 固定 7 天窗口启动前输入: + - 起始日期。 + - 当日负责人、问题登记负责人、暂停决策人。 + - 首批真实业务参与角色:员工、审批人、财务/出纳、管理员。 + - 每日巡检执行人和报告存放口径。 +- 准备并确认人工业务闭环证据要求: + - 至少 1 条真实报销 PDF OCR -> 审批 -> 付款批次 -> 银行回单 -> 已付款 -> AP 导出。 + - 至少 1 条采购/费用审批,并关联项目或合同。 + - 至少 1 条合同台账,记录归档位置摘要、权限边界和必要附件审计。 + - 资产台账 ASSET1D 后续抽查责任人或保管人。 +- 每日巡检必须覆盖: + - 公网 `/ready`。 + - live smoke 和真实 OCR 条件。 + - `payment_batch_v1=force_on`、`erp_sync=force_off`、冻结项未误开启。 + - 只读业务探针、移动入口、企业微信入口/渲染、隐私扫描。 + - 子报告 finding、SKIP、PARTIAL、PAUSED 均进入父级 summary。 +- 最终 OALAUNCH1 输入必须能被 `scripts/qa/run-oa-final-launch-readiness.sh` 聚合: + - `OALAUNCH_STABILIZATION_START_DATE`。 + - `OALAUNCH_BACKUP_EVIDENCE`。 + - `OALAUNCH_PERMISSION_EVIDENCE`。 + - `OALAUNCH_BUSINESS_EVIDENCE`。 + - `OALAUNCH_POLICY_EVIDENCE` 如需覆盖默认 OPOLICY1 证据。 + - `OALAUNCH_MANUAL_ACCEPT` 只能在 Day 7 人工决策后设置。 + +## Acceptance Criteria + +- [ ] 当前任务记录 7 天真实试运行的启动条件、边界和证据要求。 +- [ ] 当前任务记录本轮只读准备预检结果和证据引用。 +- [ ] 明确哪些事项启动前已具备,哪些仍需用户人工确认或执行。 +- [ ] 明确每日巡检命令、最终汇总命令和预期状态解释。 +- [ ] 明确不得自动执行的操作:部署、生产配置变更、真实业务写入、企业微信写入、真实付款、生产数据库恢复。 +- [ ] Trellis 任务校验和治理检查通过。 + +## Definition Of Done + +- PRD 与准备清单完整。 +- 只读预检结果保存在当前任务 research 下,且不含密码、token、Secret、完整账号、完整本地路径、合同正文、银行资料、原始票据或 raw payload。 +- 用户拿到清楚的下一步人工输入清单:起始日期、负责人、每日问题登记方式、备份恢复证据计划、业务闭环样本安排。 +- 不把本任务误归档为 7 天试运行完成;本任务只是启动准备。 + +## Out Of Scope + +- 不启动真实 7 天计数,除非用户明确确认起始日期。 +- 不创建、提交、审批或付款真实单据。 +- 不部署、不同步远端文件、不改公网 `.env`。 +- 不写企业微信消息、通讯录、审批或回调数据。 +- 不做生产数据库恢复、重置或迁移。 +- 不启用图片 OCR、复杂 BPM、预算、ERP 写入、银行流水导入、真实支付接口、企业微信 HR 深镜像、应急接管、恢复回写或 RuleOps。 + +## Test Plan + +- `bash -n scripts/qa/run-oa-real-use-daily.sh` +- `bash -n scripts/qa/run-oa-final-launch-readiness.sh` +- 只读公网条件预检:`LIVE_SMOKE_BASE_URL=https://oa.hyinda.com node scripts/qa/check-live-smoke-env.mjs --json` +- 只读权限矩阵预检:`LIVE_SMOKE_BASE_URL=https://oa.hyinda.com OA_PERMISSION_MATRIX_REPORT_DIR= node scripts/qa/check-oa-permission-matrix.mjs` +- `python3 ./.trellis/scripts/task.py validate 05-26-oaops1-seven-day-trial-prep` +- `node scripts/qa/check-trellis-governance.mjs` +- `git diff --check` + +正式启动后每日命令另按用户确认执行: + +```bash +bash scripts/qa/run-oa-real-use-daily.sh +``` + +Day 7 汇总命令另按证据路径补齐后执行: + +```bash +OALAUNCH_STABILIZATION_START_DATE= \ +OALAUNCH_BACKUP_EVIDENCE= \ +OALAUNCH_PERMISSION_EVIDENCE= \ +OALAUNCH_BUSINESS_EVIDENCE= \ +bash scripts/qa/run-oa-final-launch-readiness.sh +``` + +## Technical Notes + +- 试运行事实源:`docs/试运行与自动化验证手册.md`、`docs/管理员手册.md`。 +- live smoke 条件:`docs/trialrun/公网LiveSmoke准备清单.md`。 +- 发布/试运行边界:`docs/trialrun/发布试运行准备清单.md`。 +- 真机和企业微信人工验收:`docs/trialrun/真机公网测试清单.md`。 +- Trellis spec:`.trellis/spec/hyb-oa/deployment-trialrun.md`、`.trellis/spec/hyb-oa/docs-and-evidence.md`、`.trellis/spec/hyb-oa/security-privacy.md`。 +- 上游证据: + - OALAUNCH1 closeout:`.trellis/tasks/archive/2026-05/05-26-oalaunch1-final-readiness-closeout/research/initial-readiness/summary.json`。 + - OAOPS1 巡检改进后验证:`.trellis/tasks/archive/2026-05/05-26-oaops1-patrol-feature-review/research/oaops1-after-patrol-fix-final/summary.json`。 + - 本任务权限矩阵预检:`research/prep-permission-matrix/summary.json`。 diff --git a/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/research/prep-permission-matrix/summary.json b/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/research/prep-permission-matrix/summary.json new file mode 100644 index 00000000..e77e2333 --- /dev/null +++ b/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/research/prep-permission-matrix/summary.json @@ -0,0 +1,2285 @@ +{ + "issueId": "OANEXT2-4", + "status": "PASS_PERMISSION_MATRIX_READY", + "checkedAt": "2026-05-26T06:27:32.887Z", + "baseUrl": "https://oa.hyinda.com", + "privacy": "redacted role/status/count evidence only; no password, token, Secret, full account, invoice, contract, attachment, or raw payload", + "counts": { + "roles": 7, + "positiveProbes": 43, + "negativeProbes": 42 + }, + "issues": [], + "results": [ + { + "key": "employee", + "expectedRoles": [ + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "actualRoles": [ + "employee" + ], + "probes": [ + { + "id": "me", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee" + ] + } + }, + { + "id": "portal", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [ + { + "path": "data.roleCapabilities.canApproveTasks", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.canUseFinance", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.canManageSystem", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.isAdminOnly", + "status": "PASS", + "expected": false, + "actual": false + } + ], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "roleCapabilities": { + "canApproveTasks": false, + "canManageSystem": false, + "canSubmitApplications": true, + "canUseFinance": false, + "canViewTeam": false, + "isAdminOnly": false + } + } + }, + { + "id": "own-invoices", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": 22 + } + }, + { + "id": "navigation", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [ + { + "type": "visible", + "href": "/portal", + "status": "PASS" + }, + { + "type": "visible", + "href": "/reimbursements", + "status": "PASS" + }, + { + "type": "visible", + "href": "/assets", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/workflow/tasks", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/ap-operations", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/payment-batches", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/audit-logs", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/settings", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/feature-flags", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/integrations/erp", + "status": "PASS" + } + ], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "navigationItemCount": 10 + } + }, + { + "id": "budget", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "ap", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "ap-ledger", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "payment-batches", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "all-invoices", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "audit-logs", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "notification-deliveries", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "system-feature-flags", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "erp-status", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "payroll-items", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "performance-cycles", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "travel-requests", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "global-search-sensitive", + "kind": "negative", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [ + { + "type": "forbidden_entity_type", + "value": "contract_registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "confidential_doc_ref", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "travel_request", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/contracts-registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/travel-requests", + "status": "PASS", + "matchedCount": 0 + } + ], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 7, + "total": null + } + } + ], + "missingRoles": [] + }, + { + "key": "manager", + "expectedRoles": [ + "manager", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "actualRoles": [ + "employee", + "manager" + ], + "probes": [ + { + "id": "me", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee", + "manager" + ] + } + }, + { + "id": "portal", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [ + { + "path": "data.roleCapabilities.canApproveTasks", + "status": "PASS", + "expected": true, + "actual": true + }, + { + "path": "data.roleCapabilities.canUseFinance", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.canManageSystem", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.isAdminOnly", + "status": "PASS", + "expected": false, + "actual": false + } + ], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "roleCapabilities": { + "canApproveTasks": true, + "canManageSystem": false, + "canSubmitApplications": true, + "canUseFinance": false, + "canViewTeam": true, + "isAdminOnly": false + } + } + }, + { + "id": "workflow", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 1, + "total": 1 + } + }, + { + "id": "navigation", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [ + { + "type": "visible", + "href": "/workflow/tasks", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/ap-operations", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/payment-batches", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/audit-logs", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/settings", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/feature-flags", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/integrations/erp", + "status": "PASS" + } + ], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "navigationItemCount": 15 + } + }, + { + "id": "ap", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "ap-ledger", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "payment-batches", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "audit-logs", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "erp-status", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "payroll-items", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "performance-cycles", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "travel-requests", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "global-search-sensitive", + "kind": "negative", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [ + { + "type": "forbidden_entity_type", + "value": "contract_registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "confidential_doc_ref", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "travel_request", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/contracts-registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/travel-requests", + "status": "PASS", + "matchedCount": 0 + } + ], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 10, + "total": null + } + } + ], + "missingRoles": [] + }, + { + "key": "finance", + "expectedRoles": [ + "finance", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "actualRoles": [ + "employee", + "finance" + ], + "probes": [ + { + "id": "me", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee", + "finance" + ] + } + }, + { + "id": "portal", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [ + { + "path": "data.roleCapabilities.canApproveTasks", + "status": "PASS", + "expected": true, + "actual": true + }, + { + "path": "data.roleCapabilities.canUseFinance", + "status": "PASS", + "expected": true, + "actual": true + }, + { + "path": "data.roleCapabilities.canManageSystem", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.isAdminOnly", + "status": "PASS", + "expected": false, + "actual": false + } + ], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "roleCapabilities": { + "canApproveTasks": true, + "canManageSystem": false, + "canSubmitApplications": true, + "canUseFinance": true, + "canViewTeam": true, + "isAdminOnly": false + } + } + }, + { + "id": "all-invoices", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": 46 + } + }, + { + "id": "payment-batches", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 9, + "total": null + } + }, + { + "id": "ap-ledger", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": 33 + } + }, + { + "id": "navigation", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [ + { + "type": "visible", + "href": "/invoice-pool", + "status": "PASS" + }, + { + "type": "visible", + "href": "/payment-batches", + "status": "PASS" + }, + { + "type": "visible", + "href": "/ap-operations", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/audit-logs", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/settings", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/feature-flags", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/integrations/erp", + "status": "PASS" + } + ], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "navigationItemCount": 18 + } + }, + { + "id": "audit-logs", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "notification-deliveries", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "system-feature-flags", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "erp-status", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "payroll-items", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "performance-cycles", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "travel-requests", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "global-search-sensitive", + "kind": "negative", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [ + { + "type": "forbidden_entity_type", + "value": "contract_registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "confidential_doc_ref", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "travel_request", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/contracts-registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/travel-requests", + "status": "PASS", + "matchedCount": 0 + } + ], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 9, + "total": null + } + } + ], + "missingRoles": [] + }, + { + "key": "finance_mgr", + "expectedRoles": [ + "finance", + "finance_mgr", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "actualRoles": [ + "employee", + "finance", + "finance_mgr" + ], + "probes": [ + { + "id": "me", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee", + "finance", + "finance_mgr" + ] + } + }, + { + "id": "portal", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [ + { + "path": "data.roleCapabilities.canApproveTasks", + "status": "PASS", + "expected": true, + "actual": true + }, + { + "path": "data.roleCapabilities.canUseFinance", + "status": "PASS", + "expected": true, + "actual": true + }, + { + "path": "data.roleCapabilities.canManageSystem", + "status": "PASS", + "expected": true, + "actual": true + }, + { + "path": "data.roleCapabilities.isAdminOnly", + "status": "PASS", + "expected": false, + "actual": false + } + ], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "roleCapabilities": { + "canApproveTasks": true, + "canManageSystem": true, + "canSubmitApplications": true, + "canUseFinance": true, + "canViewTeam": true, + "isAdminOnly": false + } + } + }, + { + "id": "all-invoices", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": 46 + } + }, + { + "id": "payment-batches", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 9, + "total": null + } + }, + { + "id": "ap-ledger", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": 33 + } + }, + { + "id": "erp-status", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 3, + "total": null + } + }, + { + "id": "audit-logs", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": 1903 + } + }, + { + "id": "notification-deliveries", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": null + } + }, + { + "id": "system-feature-flags", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 26, + "total": null + } + }, + { + "id": "navigation", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [ + { + "type": "visible", + "href": "/invoice-pool", + "status": "PASS" + }, + { + "type": "visible", + "href": "/payment-batches", + "status": "PASS" + }, + { + "type": "visible", + "href": "/ap-operations", + "status": "PASS" + }, + { + "type": "visible", + "href": "/audit-logs", + "status": "PASS" + }, + { + "type": "visible", + "href": "/system/feature-flags", + "status": "PASS" + }, + { + "type": "visible", + "href": "/system/integrations/erp", + "status": "PASS" + } + ], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "navigationItemCount": 27 + } + } + ], + "missingRoles": [] + }, + { + "key": "hr", + "expectedRoles": [ + "hr", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "actualRoles": [ + "employee", + "hr" + ], + "probes": [ + { + "id": "me", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "employee", + "hr" + ] + } + }, + { + "id": "portal", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [ + { + "path": "data.roleCapabilities.canApproveTasks", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.canUseFinance", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.canManageSystem", + "status": "PASS", + "expected": true, + "actual": true + }, + { + "path": "data.roleCapabilities.isAdminOnly", + "status": "PASS", + "expected": false, + "actual": false + } + ], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "roleCapabilities": { + "canApproveTasks": false, + "canManageSystem": true, + "canSubmitApplications": true, + "canUseFinance": false, + "canViewTeam": true, + "isAdminOnly": false + } + } + }, + { + "id": "wecom-archive", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": 9 + } + }, + { + "id": "navigation", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [ + { + "type": "visible", + "href": "/people", + "status": "PASS" + }, + { + "type": "visible", + "href": "/system/settings", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/ap-operations", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/payment-batches", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/audit-logs", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/feature-flags", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/integrations/erp", + "status": "PASS" + } + ], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "navigationItemCount": 16 + } + }, + { + "id": "ap-ledger", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "payment-batches", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "audit-logs", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "system-feature-flags", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "payroll-items", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "performance-cycles", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "global-search-sensitive", + "kind": "negative", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [ + { + "type": "forbidden_entity_type", + "value": "contract_registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "confidential_doc_ref", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "travel_request", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/contracts-registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/travel-requests", + "status": "PASS", + "matchedCount": 0 + } + ], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 4, + "total": null + } + } + ], + "missingRoles": [] + }, + { + "key": "ceo", + "expectedRoles": [ + "ceo", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "actualRoles": [ + "ceo", + "employee" + ], + "probes": [ + { + "id": "me", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "ceo", + "employee" + ] + } + }, + { + "id": "portal", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [ + { + "path": "data.roleCapabilities.canApproveTasks", + "status": "PASS", + "expected": true, + "actual": true + }, + { + "path": "data.roleCapabilities.canUseFinance", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.canManageSystem", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.isAdminOnly", + "status": "PASS", + "expected": false, + "actual": false + } + ], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "roleCapabilities": { + "canApproveTasks": true, + "canManageSystem": false, + "canSubmitApplications": true, + "canUseFinance": false, + "canViewTeam": true, + "isAdminOnly": false + } + } + }, + { + "id": "dashboard", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "totalCount": 33, + "paidCount": 8, + "reviewingCount": 3 + } + }, + { + "id": "navigation", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [ + { + "type": "visible", + "href": "/workflow/tasks", + "status": "PASS" + }, + { + "type": "visible", + "href": "/budgets", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/ap-operations", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/payment-batches", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/audit-logs", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/feature-flags", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/system/integrations/erp", + "status": "PASS" + } + ], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "navigationItemCount": 15 + } + }, + { + "id": "system-feature-flags", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "notification-deliveries", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "payroll-items", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "performance-cycles", + "kind": "negative", + "status": "PASS", + "httpStatus": 403, + "expectedStatuses": [ + 403, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "code": "PERM_001", + "message": "无权限" + } + }, + { + "id": "global-search-sensitive", + "kind": "negative", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [ + { + "type": "forbidden_entity_type", + "value": "contract_registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "confidential_doc_ref", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_entity_type", + "value": "travel_request", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/contracts-registry", + "status": "PASS", + "matchedCount": 0 + }, + { + "type": "forbidden_href_prefix", + "value": "/travel-requests", + "status": "PASS", + "matchedCount": 0 + } + ], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 9, + "total": null + } + } + ], + "missingRoles": [] + }, + { + "key": "admin", + "expectedRoles": [ + "admin", + "employee" + ], + "maskedIdentifier": "sm***@***.com", + "login": { + "status": "PASS", + "reason": null, + "code": null + }, + "roleMatch": "PASS", + "actualRoles": [ + "admin", + "employee" + ], + "probes": [ + { + "id": "me", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "status": "active", + "notificationPushEnabled": true, + "roleCodes": [ + "admin", + "employee" + ] + } + }, + { + "id": "portal", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [ + { + "path": "data.roleCapabilities.canApproveTasks", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.canUseFinance", + "status": "PASS", + "expected": false, + "actual": false + }, + { + "path": "data.roleCapabilities.canManageSystem", + "status": "PASS", + "expected": true, + "actual": true + }, + { + "path": "data.roleCapabilities.isAdminOnly", + "status": "PASS", + "expected": true, + "actual": true + } + ], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "roleCapabilities": { + "canApproveTasks": false, + "canManageSystem": true, + "canSubmitApplications": true, + "canUseFinance": false, + "canViewTeam": true, + "isAdminOnly": true + } + } + }, + { + "id": "users", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 1, + "total": 13 + } + }, + { + "id": "audit-logs", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": 1906 + } + }, + { + "id": "notification-deliveries", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 5, + "total": null + } + }, + { + "id": "system-feature-flags", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 26, + "total": null + } + }, + { + "id": "payroll-items", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 0, + "total": null + } + }, + { + "id": "performance-cycles", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 1, + "total": null + } + }, + { + "id": "global-search", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200, + 409 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 10, + "total": null + } + }, + { + "id": "assets", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "itemCount": 7, + "total": null + } + }, + { + "id": "navigation", + "kind": "positive", + "status": "PASS", + "httpStatus": 200, + "expectedStatuses": [ + 200 + ], + "dataExpectations": [], + "navigationExpectations": [ + { + "type": "visible", + "href": "/audit-logs", + "status": "PASS" + }, + { + "type": "visible", + "href": "/system/settings", + "status": "PASS" + }, + { + "type": "visible", + "href": "/system/feature-flags", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/workflow/tasks", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/ap-operations", + "status": "PASS" + }, + { + "type": "hidden", + "href": "/payment-batches", + "status": "PASS" + } + ], + "searchExpectations": [], + "sensitiveKeyHits": [], + "summary": { + "navigationItemCount": 26 + } + } + ], + "missingRoles": [] + } + ] +} diff --git a/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/research/prep-permission-matrix/summary.md b/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/research/prep-permission-matrix/summary.md new file mode 100644 index 00000000..1626bbc8 --- /dev/null +++ b/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/research/prep-permission-matrix/summary.md @@ -0,0 +1,28 @@ +# OA 权限矩阵脱敏自动验证报告 + +生成时间:2026-05-26T06:27:32.887Z +结论:PASS_PERMISSION_MATRIX_READY + +## 统计 + +- 角色数:7 +- 正向探针:43 +- 负向探针:42 +- 问题数:0 + +## 角色结果 + +| 角色 | 登录 | 角色匹配 | 探针通过/总数 | +| --- | --- | --- | ---: | +| employee | PASS | PASS | 17/17 | +| manager | PASS | PASS | 13/13 | +| finance | PASS | PASS | 14/14 | +| finance_mgr | PASS | PASS | 10/10 | +| hr | PASS | PASS | 11/11 | +| ceo | PASS | PASS | 9/9 | +| admin | PASS | PASS | 11/11 | + +## 说明 + +- 本报告只输出角色、HTTP 状态、脱敏账号和摘要计数,不输出密码、token、Secret、完整账号、合同正文、票据内容或原始 payload。 +- 409 表示功能门禁关闭且未泄露数据;对财务/AP/付款等冻结或受控功能可作为可解释拒绝。 diff --git a/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/research/prep-readiness.md b/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/research/prep-readiness.md new file mode 100644 index 00000000..d18e741a --- /dev/null +++ b/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/research/prep-readiness.md @@ -0,0 +1,39 @@ +# OAOPS1 7 天真实试运行准备预检 + +## 只读预检结论 + +- `bash -n scripts/qa/run-oa-real-use-daily.sh`:通过。 +- `bash -n scripts/qa/run-oa-final-launch-readiness.sh`:通过。 +- live smoke env 文件:存在。 +- live smoke / OCR 条件:已具备,缺项为空。 +- 公网 `/ready`:200。 +- 企业微信配置:ready,入口启用,OAuth 启用,默认回到移动端。 +- 权限矩阵:`PASS_PERMISSION_MATRIX_READY`,7 个角色、43 个正例、42 个负例。 + +## 已具备 + +- 自动化只读巡检脚本语法通过。 +- 最终启用汇总脚本语法通过。 +- live smoke 管理员和员工账号条件具备。 +- 真实 OCR 测试用户和 PDF 样票条件具备。 +- 经理、财务等可选 live smoke 账号条件具备。 +- 公网入口和企业微信配置可达。 +- 权限矩阵只读负例/正例通过。 + +## 仍需人工确认 + +- 7 天窗口起始日期。 +- 每日业务负责人、问题登记负责人和暂停决策人。 +- 员工、审批人、财务/出纳、管理员的真实业务执行安排。 +- 备份恢复演练方式和脱敏证据位置。 +- 数据治理/资料上传边界培训完成证据。 +- Day 7 Go/No-Go 只能在窗口结束后人工确认。 + +## 证据引用 + +- 权限矩阵报告:`research/prep-permission-matrix/summary.json`。 +- 本准备 PRD:`prd.md`。 + +## 边界 + +本预检未执行部署、生产配置修改、真实业务写入、企业微信写入、真实付款或生产数据库恢复。 diff --git a/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/task.json b/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/task.json new file mode 100644 index 00000000..a931baf3 --- /dev/null +++ b/.trellis/tasks/05-26-oaops1-seven-day-trial-prep/task.json @@ -0,0 +1,32 @@ +{ + "id": "oaops1-seven-day-trial-prep", + "name": "oaops1-seven-day-trial-prep", + "title": "OAOPS1 7天真实试运行准备", + "description": "准备 OAOPS1 7 天小团队真实使用稳定化启动条件、只读预检和人工证据清单。", + "status": "in_progress", + "dev_type": null, + "scope": "trialrun-prep", + "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": [ + "scripts/qa/run-oa-real-use-daily.sh", + "scripts/qa/run-oa-final-launch-readiness.sh", + "scripts/qa/check-oa-permission-matrix.mjs", + "docs/试运行与自动化验证手册.md", + "docs/管理员手册.md" + ], + "notes": "", + "meta": {} +}