# 生产登录态只读验收:执行计划与证据 > 当前状态:IN PROGRESS / LOGIN PAUSED。生产只读基线与扩展账号诊断已完成;唯一活跃管理员的 email 可解析但现有密码离线比对不匹配,员工 identity 不唯一且密码匹配数为 0,因此在登录前停止。 ## 1. 规划确认 - [x] 前一部署任务证据确认:产品候选 `0224ad8`,65 条 migration applied,部署结束时 `rollbackWindow=OPEN`、`terminatedRows=0`,管理员/员工凭据均 401。 - [x] auth 路由确认:identifier 仅接受 email/phone;401、403、423 分别覆盖不存在/密码错误、停用、锁定;失败会更新计数和锁定状态。 - [x] 账号 dry-run helper 确认:可借鉴 `BEGIN READ ONLY` 与脱敏输出,但 employee_no 匹配宽于真实登录合同,`--apply` 明确排除。 - [x] 终止入口确认:仅 active/expired 显示;draft/archived 无法作为 UI 误点的服务端状态机兜底。 - [x] 安全验收选择:不打开确认层,只检查终止按钮初始禁用,并记录 terminate POST=0。 - [x] 回滚窗口选择:验收前后双快照,查询失败不得默认 OPEN。 ## 2. 启动门禁(规划批准后) - [x] 用户完成规划只读复核并明确批准实施。 - [x] 运行 `task.py start`,当前 task 状态为 `in_progress`。 - [x] 确认生产只读授权仍有效;本任务没有账号/权限/合同写入授权。 - [x] 确认已部署产品 SHA 基线为 `0224ad8`,不以当前 HEAD 替代。 - [x] `command -v npx` 可用;若凭据恢复,浏览器只能使用单 worker、零 retry。 - [x] 生产 preflight 使用两个独立时间戳报告引用;未复用历史 PASS,任务文档只记脱敏摘要。 ## 3. 执行顺序 ### Phase A:生产只读基线 - [x] 复用受控身份引导和 read-only preflight,精确身份组与 13/13 聚合体检通过。 - [x] migration reconciliation 为 65 条 applied、pending=none,未见 failed/diverged 异常;只读 wrapper 未进入 `deploy.sh`。 - [x] 公网 build 短标识为 `0224ad83d7f8`,与已部署产品候选匹配;未把当前文档 HEAD 当作产品 SHA。 - [x] PRE 为 `terminatedRows=0`、`rollbackWindow=OPEN`、`basis=terminated_status_count`。 ### Phase B:登录前账号诊断 - [x] 使用同一 `BEGIN READ ONLY` 事务查询 admin/employee;查询合同覆盖 role key、matchedBy、active/archived/locked、failureCount、expectedRoleReady。 - [x] 两个角色均返回 `matchedBy=none`;由于没有匹配到账号,active/archived/locked、failureCount、expectedRoleReady 均记为 `N/A`,不把占位值当作生产账号事实;未输出 identifier、账号、锁定时间或角色明细。 - [x] 查询只按 email/phone 精确匹配,未把 employee_no 当作可登录身份。 - [x] 按 PRD R3 分流为仓库外 identifier 过期或不符合现行登录合同;标 `PAUSED`,没有进入密码、解锁、激活或授权写入。 - [x] 登录尝试数:admin=0、employee=0。 经用户确认继续只读定性后,补充完成: - [x] 旧 identifier 对生产 `employee_no` 的精确匹配也均为 false,排除“只是把员工编号误当登录名”。 - [x] 在远端 `BEGIN READ ONLY` 事务内按角色筛选活跃候选,并用现有仓库外密码与候选 hash 离线比较;密码与 hash 均未离开远端内存。 - [x] admin:活跃候选 1、正确 identifier 可唯一解析为 email、locked=false、failureCount=0、passwordMatchCount=0。 - [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:有限登录(仅凭据合法恢复后) - [ ] PAUSED:管理员 identifier 已可只读解析,但现有密码确认失效;员工目标账号不唯一,现有验收密码不匹配任何活跃非管理员候选。密码重置/账号选择尚未获独立批准。 - [ ] PAUSED:admin 未登录,attempts=0。 - [ ] PAUSED:employee 未登录,attempts=0。 - [x] 已记录每角色 attempts=0;没有第二次尝试,也没有增加失败计数。 ### Phase D:登录态只读验收 - [ ] PAUSED:管理员会话未建立,未进入合同台账或详情。 - [ ] PAUSED:未进入终止面板;未填写原因、未打开确认层、terminate POST=0。 - [ ] PAUSED:员工会话未建立,未执行权限负向路径;未扩大权限或删除断言。 - [ ] PAUSED:未在无登录态情况下探查 archived 样本,未创建数据。 - [ ] PAUSED:PRE/POST 均证明 terminatedRows=0,因此无现有 terminated 样本可验;未制造样本。 ### Phase E:窗口复核与收口 - [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;不得把缺失样本或凭据阻塞勾成通过。 ## 4. 预期证据表 | 证据 | 允许记录 | 禁止记录 | | --- | --- | --- | | 版本/迁移 | 候选 SHA、applied/pending/异常计数 | 数据库名、连接串、SSH identity | | 账号诊断 | role key、matchedBy、布尔、失败计数 | identifier、邮箱、手机号、员工编号、hash、锁定时间原值 | | 登录 | 角色、attempts、HTTP 状态 | 密码、cookie、token、request payload | | 合同 UI | 中文状态、按钮 disabled、POST 计数 | 合同正文、相对方、金额、终止原因 | | 窗口 | PRE/POST count、OPEN/CLOSED、顺序 | 原始数据库输出或业务行 | ## 5. 规划门禁结果 - [x] `python3 ./.trellis/scripts/task.py validate 08-08-production-authenticated-readiness`:PASS。 - [x] `node scripts/qa/check-process-contract.mjs --baseline --json`:PASS,0 errors / 0 warnings。 - [x] `node scripts/qa/check-trellis-governance.mjs --json`:PASS,0 errors / 0 warnings。 - [x] `node scripts/qa/check-sensitive-content.mjs`:PASS,0 findings。 - [x] `git diff --check`:PASS。 执行后复跑同一组门禁仍 PASS;docs registry audit 为 0 errors / 1 个既有“22 个未注册 docs 文件”warning,本任务未新增或修改 `docs/` 文件。 ## 6. 当前结论 生产只读基线与账号诊断已执行。扩展诊断证明唯一活跃管理员的 email 可解析、未锁定且 failureCount=0,但现有密码不匹配;员工侧目标不唯一且现有验收密码不匹配活跃候选。生产邮件能力为 disabled,管理员密码重置请求未锁定且计数为 0,未发送验证码。四次窗口均 OPEN/0,登录 attempts=0,未发生终止、账号、权限、合同或 schema 写入。登录态 UI AC 保持 PAUSED;下一步建议另行批准既有 break-glass 脚本,但批准必须覆盖其完整认证副作用。旧 hash 仅是短期高敏有限恢复材料,不是完整回滚。