From 00fecf2a03ead7b77f702854331ef18014a3312c Mon Sep 17 00:00:00 2001 From: shunli Date: Sat, 8 Aug 2026 23:40:50 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=8A=E6=96=AD(08-08-production-authenticat?= =?UTF-8?q?ed-readiness):=20=E6=A0=B8=E5=AE=9A=E9=82=AE=E4=BB=B6=E9=87=8D?= =?UTF-8?q?=E7=BD=AE=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../implement.md | 16 +++++++++++++--- .../prd.md | 7 ++++--- .../task.json | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/.trellis/tasks/08-08-production-authenticated-readiness/implement.md b/.trellis/tasks/08-08-production-authenticated-readiness/implement.md index a2d7ba11..45a99f2b 100644 --- a/.trellis/tasks/08-08-production-authenticated-readiness/implement.md +++ b/.trellis/tasks/08-08-production-authenticated-readiness/implement.md @@ -45,6 +45,16 @@ - [x] employee:非管理员 employee 候选 5、passwordMatchCount=0,无法在不猜人的情况下选定验收账号。 - [x] 未把正确管理员 identifier 写入 task、对话或仓库,也未修改仓库外 secret;密码重置/员工账号选择转为独立批准事项。 +自助密码重置可用性只读核对: + +- [x] 运行容器 `EMAIL_ENABLED=false`;公网 `/api/auth/capabilities` 独立返回 `emailDeliveryReady=false`、原因 `email_disabled`。 +- [x] 唯一活跃管理员有 email,`passwordResetLocked=false`、`passwordResetRequestCount=0`;未调用 `/forgot-password`,未生成验证码、增加请求计数或触发邮件。 +- [x] `~/.hyb-oa/smtp-live.env` 的本地存在不等同于生产邮件通道启用;启用生产邮件需要配置变更与重启,超出当前只读授权。 +- [x] 选择更窄的后续路径:如获单独批准,优先使用仓库既有 `reset-active-admin-password.js` 的 exact-admin、bcrypt、事务与审计合同,不手写 hash SQL,不修改角色、员工启用状态或 email。 +- [x] 已识别脚本完整副作用:设置 `must_change_password`、清理认证失败/锁定状态、递增 token version、撤销活跃会话、失效密码重置/邮件登录验证码并写不可删除的审计。批准请求必须逐项披露。 +- [x] 如另行批准,旧 hash 仅能在受控生产现场以最小权限短期保存,作为有限凭据恢复材料;不进入仓库、task、普通日志或对话,不构成上述副作用的完整回滚,并须在验收/恢复窗口关闭后立即销毁。 +- [x] 邮件能力与 break-glass 建议只读 reviewer 首轮 `PASS_WITH_FINDINGS` 的两项证据边界已修订,最终复查为 `PASS`;reviewer 未修改文件或生产状态。 + 执行备注:账号诊断前两次远端包装探针分别在脚本解码和 Compose 必填候选标识处未产生约定查询 marker,均不计为查询成功;修正为注入已验证产品候选完整/12 位标识后,唯一有效诊断事务返回 `transaction=read_only`。这些失败均先于数据库事务和登录。 ### Phase C:有限登录(仅凭据合法恢复后) @@ -64,8 +74,8 @@ ### Phase E:窗口复核与收口 -- [x] 首次账号分流 PAUSED 后查询 POST,扩展只读诊断后再次查询最终 POST;三次均为 `terminatedRows=0`、`rollbackWindow=OPEN`、`basis=terminated_status_count`。 -- [x] 三次窗口证据均为 OPEN/0,未发现同期真实用户关闭窗口。 +- [x] 首次账号分流、扩展账号诊断、邮件能力诊断后均查询 POST;连同初始 PRE 共四次,均为 `terminatedRows=0`、`rollbackWindow=OPEN`、`basis=terminated_status_count`。 +- [x] 四次窗口证据均为 OPEN/0,未发现同期真实用户关闭窗口。 - [x] 汇总:登录 attempts=0、terminate POST=0、生产账号/权限/合同/schema 写入=0。 - [x] 扩展诊断只读 reviewer 首轮 `PASS_WITH_FINDINGS` 要求收窄员工密码与 UI PAUSED 措辞,修订后最终复查为 `PASS`;reviewer 未修改代码或生产状态。 - [ ] 按实际证据更新 PRD AC;不得把缺失样本或凭据阻塞勾成通过。 @@ -92,4 +102,4 @@ ## 6. 当前结论 -生产只读基线与账号诊断已执行。首轮来源门禁因规划未形成 clean/published commit 停止;规划提交 `4f3f761` 推送后重跑通过。扩展只读诊断证明旧 identifier 也不是 employee_no;唯一活跃管理员的 email 可解析、未锁定且 failureCount=0,但现有密码不匹配,员工侧有 5 个候选且密码匹配数为 0。三次窗口均 OPEN/0,登录 attempts=0,未发生终止、账号、权限、合同或 schema 写入。登录态 UI AC 保持 PAUSED;密码重置或员工账号选择需要单独批准。 +生产只读基线与账号诊断已执行。扩展诊断证明唯一活跃管理员的 email 可解析、未锁定且 failureCount=0,但现有密码不匹配;员工侧目标不唯一且现有验收密码不匹配活跃候选。生产邮件能力为 disabled,管理员密码重置请求未锁定且计数为 0,未发送验证码。四次窗口均 OPEN/0,登录 attempts=0,未发生终止、账号、权限、合同或 schema 写入。登录态 UI AC 保持 PAUSED;下一步建议另行批准既有 break-glass 脚本,但批准必须覆盖其完整认证副作用。旧 hash 仅是短期高敏有限恢复材料,不是完整回滚。 diff --git a/.trellis/tasks/08-08-production-authenticated-readiness/prd.md b/.trellis/tasks/08-08-production-authenticated-readiness/prd.md index f0100627..82147a52 100644 --- a/.trellis/tasks/08-08-production-authenticated-readiness/prd.md +++ b/.trellis/tasks/08-08-production-authenticated-readiness/prd.md @@ -77,11 +77,11 @@ - [x] AC1:生产运行/公网 SHA 对应已部署产品候选 `0224ad8`(短标识 `0224ad83d7f8`);65 条 migration 仍全部 applied、pending=none,未触发部署或 schema 写入。 - [x] AC2:任何登录前已对管理员、员工完成同一 `BEGIN READ ONLY` 查询合同;查询设计覆盖 `matchedBy`、active/archived/locked、失败计数和期望角色是否就绪。两个 identifier 实际均 `matchedBy=none`,故账号属性记为 `N/A` 而非生产事实,不含账号或凭据明文。 - [x] AC3:两个仓库外 identifier 均不匹配 email/phone/employee_no。只读角色候选与远端内存密码 hash 比对进一步证明:唯一活跃管理员可解析为 email、未锁定、失败计数为 0,但现有管理员密码不匹配;员工有 5 个活跃非管理员候选,现有员工验收密码对这些候选的匹配数为 0。登录尝试保持 0,未输出 identifier/hash。 -- [ ] AC4 — PAUSED:管理员正确 identifier 已在只读内存中唯一解析,但现有密码确认失效;员工目标账号仍不唯一,现有验收密码不匹配任何活跃非管理员候选。密码重置或账号选择需要单独批准,本轮各角色登录尝试均为 0。 +- [ ] AC4 — PAUSED:管理员正确 identifier 已在只读内存中唯一解析,但现有密码确认失效;生产 `EMAIL_ENABLED=false`,公网 capabilities 为 `emailDeliveryReady=false / email_disabled`,自助重置不可用。管理员受控直接重置需要单独批准;员工目标账号仍不唯一。本轮各角色登录尝试均为 0。 - [ ] AC5 — PAUSED:管理员 identifier 已解析但密码不匹配,未建立管理员会话,未进入合同详情或终止面板;终止端点 `POST` 计数为 0,确认层未打开。 - [ ] AC6 — PAUSED:员工目标账号未唯一确定且现有验收密码不匹配活跃候选,未执行权限负向或 archived/terminated 样本 UI 检查;未扩大权限、修改断言或制造数据。 -- [x] AC7:初始、登录前停止后、扩展只读诊断后共三次窗口证据均为 `terminatedRows=0`、`rollbackWindow=OPEN`、`basis=terminated_status_count`;窗口未变化,本任务真实合同终止写入计数为 0。 -- [x] AC8:扩展诊断的只读 reviewer 首轮 `PASS_WITH_FINDINGS` 已完成措辞修订,最终复查为 `PASS`;task validate、process contract、governance、sensitive scan、diff check 均通过。 +- [x] AC7:初始、登录前停止后、扩展账号诊断后、邮件能力诊断后共四次窗口证据均为 `terminatedRows=0`、`rollbackWindow=OPEN`、`basis=terminated_status_count`;窗口未变化,本任务真实合同终止写入计数为 0。 +- [x] AC8:邮件能力与 break-glass 建议新增审查首轮 `PASS_WITH_FINDINGS` 的两项措辞已修订,最终复查为 `PASS`;task validate、process contract、governance、sensitive scan、diff check 均通过。 - [x] AC9:结论明确为产品已部署、生产基线健康,但登录态验收仍 `PAUSED`;当前不得告知用户可以测试。 ## Out of Scope @@ -99,6 +99,7 @@ - 没有同构预发环境;本任务主动放弃确认层视觉验收,以降低不可逆误操作风险。 - 既有生产可能没有 archived 或 terminated 样本;缺少数据时相应只读断言保持 `PAUSED`,不得为覆盖率制造业务数据。 - 如果仓库外凭据确已失效,本任务可能在账号诊断阶段结束而无法完成登录态验收;这是真实阻塞,不授权以生产账号写入换取通过。 +- 若后续另行批准 `reset-active-admin-password.js`,它不仅更新 password hash,还会设置 `must_change_password`、清理认证失败/锁定状态、递增 token version、撤销活跃会话、失效验证码并写审计。旧 hash 只能作为高敏、短期、受限访问的有限凭据恢复材料,不能回滚这些其他效果,也不能删除审计;不得把它称为完整回滚。 ## Operational Inputs (not committed) diff --git a/.trellis/tasks/08-08-production-authenticated-readiness/task.json b/.trellis/tasks/08-08-production-authenticated-readiness/task.json index 0f73c6e6..1b520690 100644 --- a/.trellis/tasks/08-08-production-authenticated-readiness/task.json +++ b/.trellis/tasks/08-08-production-authenticated-readiness/task.json @@ -31,6 +31,6 @@ "deploy/trialrun/production-preflight-remote.sh", ".trellis/spec/hyb-oa/deployment-trialrun.md" ], - "notes": "生产只读基线通过:公网产品 SHA 匹配已部署候选,65 条 migration applied、pending=none,三次窗口均 rollbackWindow=OPEN、terminatedRows=0。旧 admin/employee identifier 均不匹配 email/phone/employee_no;远端只读离线比对显示唯一活跃管理员 email 可解析、未锁定、failureCount=0,但现有密码不匹配;员工有 5 个活跃非管理员候选,现有验收密码对候选匹配数为 0,目标账号仍未唯一确定。登录 attempts=0、terminate POST=0、生产写入=0;扩展诊断只读 reviewer 最终 PASS。登录态 UI 验收保持 PAUSED;密码重置或员工账号选择需单独批准。", + "notes": "生产只读基线通过:公网产品 SHA 匹配已部署候选,65 条 migration applied、pending=none,四次窗口均 rollbackWindow=OPEN、terminatedRows=0。唯一活跃管理员 email 可解析、未锁定、failureCount=0,但现有密码不匹配;员工目标账号未唯一确定。生产 EMAIL_ENABLED=false,公网 email delivery 原因为 email_disabled;管理员 password reset 未锁定且请求计数 0,未发送验证码。登录 attempts=0、terminate POST=0、生产写入=0。登录态 UI 验收保持 PAUSED;建议另行批准既有 break-glass 脚本,其 must_change_password、token/session/code/lock/audit 副作用须完整接受。旧 hash 仅可作为短期高敏有限恢复材料,不构成完整回滚。", "meta": {} }