From ac0abafc0ed819f19fc9238dcf6a091d510ba31c Mon Sep 17 00:00:00 2001 From: shunli Date: Tue, 28 Jul 2026 15:35:35 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=B0=E5=BD=95Claude=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E5=A4=8D=E6=A0=B8=E7=BB=93=E8=AE=BA=EF=BC=8807-28-claude-produ?= =?UTF-8?q?ction-review-verification=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../check.jsonl | 1 + .../implement.jsonl | 1 + .../implement.md | 22 +++++ .../prd.md | 96 +++++++++++++++++++ .../task.json | 34 +++++++ 5 files changed, 154 insertions(+) create mode 100644 .trellis/tasks/07-28-claude-production-review-verification/check.jsonl create mode 100644 .trellis/tasks/07-28-claude-production-review-verification/implement.jsonl create mode 100644 .trellis/tasks/07-28-claude-production-review-verification/implement.md create mode 100644 .trellis/tasks/07-28-claude-production-review-verification/prd.md create mode 100644 .trellis/tasks/07-28-claude-production-review-verification/task.json diff --git a/.trellis/tasks/07-28-claude-production-review-verification/check.jsonl b/.trellis/tasks/07-28-claude-production-review-verification/check.jsonl new file mode 100644 index 00000000..9dd3234a --- /dev/null +++ b/.trellis/tasks/07-28-claude-production-review-verification/check.jsonl @@ -0,0 +1 @@ +{"_example": "Fill with {\"file\": \"\", \"reason\": \"\"}. Put spec/research files only — no code paths. Run `python3 .trellis/scripts/get_context.py --mode packages` to list available specs. Delete this line once real entries are added."} diff --git a/.trellis/tasks/07-28-claude-production-review-verification/implement.jsonl b/.trellis/tasks/07-28-claude-production-review-verification/implement.jsonl new file mode 100644 index 00000000..9dd3234a --- /dev/null +++ b/.trellis/tasks/07-28-claude-production-review-verification/implement.jsonl @@ -0,0 +1 @@ +{"_example": "Fill with {\"file\": \"\", \"reason\": \"\"}. Put spec/research files only — no code paths. Run `python3 .trellis/scripts/get_context.py --mode packages` to list available specs. Delete this line once real entries are added."} diff --git a/.trellis/tasks/07-28-claude-production-review-verification/implement.md b/.trellis/tasks/07-28-claude-production-review-verification/implement.md new file mode 100644 index 00000000..50bba472 --- /dev/null +++ b/.trellis/tasks/07-28-claude-production-review-verification/implement.md @@ -0,0 +1,22 @@ +# Claude生产复核结论只读核验:执行记录 + +## 1. 只读核验 + +- [x] 核验 02:30/07:10 稳定类别、当前 runtime identity、timer 状态和恢复点新鲜度。 +- [x] 静态确认 `deploy.sh` 不自动刷新 automatic-backup/WARCH3 units。 +- [x] 核验 workspace 历史提交、删除、远端可达性、忽略规则和敏感值模式计数。 +- [x] 核验 CEO fallback 白名单、默认值、active 非本人持有人、自审阻断和常量复用。 +- [x] 核验企微免密自动绑定的服务端、事务冲突、审计、稳定错误码和前端提示。 +- [x] 聚合核验生产成功登录、企微登录、binding、session、杨俊主管和报销状态。 + +## 2. 验证 + +- [x] 5 个聚焦 Vitest 文件、73 项测试通过。 +- [x] 全部生产命令为只读;未安装 timer、未改配置/数据、未发企微、未创建单据。 +- [x] task validate、Trellis governance、敏感内容、流程合同、文档注册和 Git 差异检查全部收口;文档审计仅保留既有 22 项 warning。 + +## 3. 输出边界 + +- 只记录计数、布尔值、稳定类别、短构建号和相对时间。 +- 不记录完整账号、userid、邮箱、手机号、宿主路径、Secret、日志原文或 payload。 +- 工程改进只列为后续任务,不在本任务实施。 diff --git a/.trellis/tasks/07-28-claude-production-review-verification/prd.md b/.trellis/tasks/07-28-claude-production-review-verification/prd.md new file mode 100644 index 00000000..46688725 --- /dev/null +++ b/.trellis/tasks/07-28-claude-production-review-verification/prd.md @@ -0,0 +1,96 @@ +# Claude生产复核结论只读核验 + +## Goal + +以仓库历史、当前生产只读状态和两个既有 Trellis task 为证据,逐项核验 Claude 的复核结论,区分“当前事实”“历史事实”“合理建议”和“需要另行批准的改进”,避免因时间点或指标口径不同误判真实登录、备份风险和当前业务阻断。 + +## Background + +- Claude 认为 02:30 自动备份因附件宿主挂载身份不匹配而失败,守卫按设计拒绝错误备份;并建议把备份 unit 刷新并入部署收尾。 +- Claude 认为个人 Trellis workspace 曾被提交后删除,但历史仍可取得;内容扫描风险低,不建议改写 Git 历史。 +- Claude 认为 CEO `finance` fallback 与企微免登实现正确。 +- Claude 认为截至其检查时没有任何真实登录,两个既有任务的真机验收和杨俊真实报销仍未完成,因此下一步应暂停新开发、先让马建勇真机登录,再让杨俊提交。 + +## Scope + +- 自动备份历史失败、当前 runtime identity、恢复点新鲜度和标准部署脚本的 unit 刷新能力。 +- 两个 Trellis workspace 历史提交及当前忽略规则。 +- CEO `finance` fallback 与企微首次免密绑定的代码、测试和生产只读状态。 +- active 账户成功登录统计、企微真机覆盖、杨俊主管链和真实报销状态。 + +## Requirements + +- 只读核验自动备份最近一次 02:30 失败的稳定类别、运行身份差异、最近成功恢复点年龄,以及当前 unit 与活动 Compose/PGDATA/附件/构建身份是否已经一致。 +- 静态核验标准部署脚本是否会自动刷新自动备份 units;区分“当前已经人工刷新”与“未来部署仍可能再次漂移”。 +- 核验 `0d58ff1`、`0551212` 和 `.trellis/.gitignore`,只对相关历史 blob 做敏感模式扫描,不输出 workspace 原文。 +- 核验 R-5 `finance` fallback 的白名单、active 非本人持有人、自审阻断、默认规则与常量单一来源。 +- 核验企微首次免密绑定的服务端映射错误码与前端提示,不把前端文案修正误判为完整后端实现来源。 +- 以生产只读数据和既有任务证据核验真实企微/OA 登录次数、人员范围、杨俊报销状态及未勾选验收项;明确证据时间,避免把“此前为 0”写成“当前仍为 0”。 +- 最终给出按优先级排序的行动建议,但不安装 timer、不修改部署脚本、不改任务勾选、不写生产数据、不创建报销、不发送企微消息。 + +## Acceptance Criteria + +- [x] 每一项 Claude 结论均标记为“确认 / 部分确认 / 已过时 / 不成立”,并附不泄密的证据来源。 +- [x] 明确当前自动备份数据风险、最近成功点、unit 当前一致性和 deploy 自动刷新缺口是否同时成立。 +- [x] 明确真实登录的统计口径及当前计数,不以 task checkbox 单独代替生产证据。 +- [x] 明确杨俊真实报销是否已提交,以及 CEO fallback 是否位于其直接阻断路径。 +- [x] 给出一个最小下一步,区分立即人工操作与后续需要新 Trellis task 的工程改进。 +- [x] 全程零生产写入、零企微写入、零真实业务单据创建,聊天和任务文件不出现 Secret、完整账号或原始 payload。 + +## Test Plan + +- 用 systemd、Docker inspect 和本地备份状态文件做生产只读身份矩阵;只输出布尔值、计数、短构建号和相对时间。 +- 用 Git object/history 检查 workspace 提交与删除,并只报告敏感模式计数。 +- 静态检查 workflow、approval rules、seed、企微路由/服务/前端提示并运行聚焦 Vitest。 +- 用生产 PostgreSQL 聚合查询成功认证审计、binding、active session、目标员工主管链和报销计数。 +- 运行 task validate、Trellis governance、敏感内容、流程合同、文档注册和 `git diff --check`。 + +## Out of Scope + +- 自动修复或重装备份 units。 +- 修改 `deploy.sh`、认证、审批或前端代码。 +- 代替马建勇、杨俊或其他员工完成真机登录与真实报销。 +- 改写 Git 历史清除已确认低风险的 workspace 提交。 + +## Technical Notes + +- 本任务不需要架构设计;因治理脚本将跨部署、认证和审批核验判定为复杂任务,补充 `implement.md` 记录只读执行顺序和门禁。 +- 生产查询只输出计数、布尔值、稳定类别、短构建号和相对时间,不输出人员完整账号、完整远端路径或审计原文。 + +## Review Results(2026-07-28) + +### 1. 自动备份 + +- **确认**:02:30 的稳定类别为 `phase_runtime_identity_failed`,唯一身份漂移是附件宿主挂载;07:10 的 `phase_stale_check_failed` 是同一 runtime identity 预检失败,不是第二个归档损坏。runner 在数据库 dump、附件归档和传输前失败关闭。 +- **已过时**:unit 仍绑定旧附件路径的说法只描述故障时点。当前唯一 server/db、Compose project、PGDATA、附件挂载和四个 service 的构建身份均一致;三项自动备份 timer 与 WARCH3 timer 均 enabled/active。 +- **部分确认**:最近成功点在 Claude 核验时约 11 小时;本次复核时约 8.1 小时且仍在 24/26 小时窗口内,但恢复点属于上一构建。当前数据新鲜度风险低,构建差异按合同是 finding,不是备份失败。 +- **确认**:`deploy/trialrun/deploy.sh` 没有调用自动备份或 WARCH3 安装器。规约已要求部署后比较并按需刷新,但标准脚本没有自动执行,未来部署仍可能再次漂移。 + +### 2. Trellis workspace Git 历史 + +- **确认**:`0d58ff1` 新增两份 workspace 文件共 394 行,`0551212` 删除;原提交已被远端分支包含,因此删除不等于从 Git 历史清除。 +- **确认**:对原提交 blob 做值形态扫描,凭证赋值、完整企微机器人地址、邮箱、手机号、私钥和银行卡样式均为 0;不建议为低风险内容改写共享历史。 +- **确认**:`.trellis/.gitignore` 当前已忽略 `workspace/`。 + +### 3. CEO `finance` fallback + +- **确认**:`finance` 与 `finance_mgr` 共用 `OWNER_SELF_FALLBACK_ROLE_CODES`,路由不再重复定义白名单;新规则默认 fallback 为 `finance`,三档 seed 的财务节点和 fallback 均为 `finance`。 +- **确认**:fallback 只接受 active、未归档且非申请人本人的角色持有人;申请人本人持有 fallback 角色、无非本人持有人和不支持角色均失败关闭。 +- **确认**:生产三条 active 规则的 fallback 均为 `finance`,active finance 持有人唯一。相关 5 个测试文件共 73 项通过。 +- **确认但非杨俊直接阻断**:杨俊的直属主管是 active CEO,`ceo` 具备 `expense.approve`;CEO fallback 解决的是 CEO 本人申请且无主管时的链路。 + +### 4. 企微首次免密绑定 + +- **确认**:服务端普通 OAuth 登录先走已有 binding;缺失时按精确 userid 或唯一企业邮箱匹配 active OA 员工,在事务中复核双向冲突、创建 binding、写脱敏审计并创建会话;冲突或 inactive 均失败关闭。 +- **确认**:服务端输出 `account_mapping_required`、`account_mapping_conflict`、`account_mapping_inactive`,前端分别展示对应提示。 +- **不成立**:`9b12451`“只有前端改动”的说法不成立。该提交同时修改后端路由并新增自动绑定服务及后端测试;“后端能力确实存在”的最终结论成立。 + +### 5. 真实登录与杨俊报销 + +- **已过时**:“当前没有任何人登录过”。生产口径为成功认证审计:6 个 active 账户、6 个 active binding,累计 12 次成功登录事件、3 个 active 登录人;其中企微成功 1 人,且该人是管理员,最近一次约 3.3 小时前。当前另有 1 个 active 会话人、2 个 active session。 +- **部分确认**:其余人员的企微真机验收仍未完成。生产企微成功登录仅 1 人、非管理员为 0;两个既有 task 的全员/目标员工验收项仍未勾选。 +- **确认**:杨俊 active 且 binding 唯一,但企微成功登录为 0;其名下真实报销总数和非草稿数均为 0。生产当前也没有任何报销单。 + +## Recommended Next Step + +立即人工操作只做一件事:请马建勇本人从企微工作台进入 OA。若成功,再请杨俊本人进入并提交真实报销;若失败,只记录页面稳定提示,不连续试错。后续工程改进另建 Trellis task,把部署后的 unit 身份比较与按需刷新收敛进标准部署收尾;本只读任务不实施该改动。 diff --git a/.trellis/tasks/07-28-claude-production-review-verification/task.json b/.trellis/tasks/07-28-claude-production-review-verification/task.json new file mode 100644 index 00000000..412621a9 --- /dev/null +++ b/.trellis/tasks/07-28-claude-production-review-verification/task.json @@ -0,0 +1,34 @@ +{ + "id": "claude-production-review-verification", + "name": "claude-production-review-verification", + "title": "Claude生产复核结论只读核验", + "description": "只读核验Claude对自动备份、Trellis历史、CEO财务兜底、企微免登和真实登录/报销状态的复核结论。", + "status": "in_progress", + "dev_type": null, + "scope": "只读核验自动备份、Git历史、审批fallback、企微免登和真实登录/报销状态", + "package": null, + "priority": "P2", + "creator": "shunli", + "assignee": "shunli", + "createdAt": "2026-07-28", + "completedAt": null, + "branch": null, + "base_branch": "main", + "worktree_path": null, + "commit": null, + "pr_url": null, + "subtasks": [], + "children": [], + "parent": null, + "relatedFiles": [ + "deploy/trialrun/deploy.sh", + "server/src/utils/workflow.js", + "server/src/routes/approvalRules.js", + "server/src/routes/wecomAuth.js", + "server/src/services/integrations/wecomLoginAutoBinding.js", + ".trellis/tasks/07-27-yang-jun-reimbursement-readiness/prd.md", + ".trellis/tasks/07-28-all-account-login-readiness/prd.md" + ], + "notes": "只读核验完成:Claude关于历史备份失败、Git历史、CEO fallback和企微后端能力的主体判断成立;无人登录已过时,杨俊尚未企微首登或提交报销。", + "meta": {} +}