84 行
5.4 KiB
Markdown
84 行
5.4 KiB
Markdown
# 生产登录态只读验收:执行计划与证据
|
||
|
||
> 当前状态:IN PROGRESS。规划已通过用户只读复核并启动;生产只读引导首轮在发布来源门禁处停止,尚未查询生产账号或尝试登录。
|
||
|
||
## 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 替代。
|
||
- [ ] 确认 `command -v npx`;浏览器只能使用单 worker、零 retry。
|
||
- [ ] 创建本轮独立、gitignored 的 evidence 目录;不得复用历史 PASS。
|
||
|
||
## 3. 执行顺序
|
||
|
||
### Phase A:生产只读基线
|
||
|
||
- [ ] 复用受控身份引导和 read-only preflight,确认唯一生产目标。
|
||
- [ ] 人工阅读脱敏后的 migration status:65 条 applied、pending/failed/diverged 均无异常。
|
||
- [ ] 核对运行/公网 build SHA 为已部署产品候选。
|
||
- [ ] 查询 PRE `terminatedRows`,记录 `rollbackWindow=OPEN|CLOSED` 与时间顺序。
|
||
|
||
### Phase B:登录前账号诊断
|
||
|
||
- [ ] 使用 `BEGIN READ ONLY` 查询 admin;输出仅含 role key、matchedBy、active/archived/locked、failureCount、expectedRoleReady。
|
||
- [ ] 使用同一查询合同诊断 employee。
|
||
- [ ] 人工确认 identifier 只按 email/phone 登录语义匹配,未把 employee_no 当作可登录身份。
|
||
- [ ] 按 PRD R3 分流;如需密码修改、解锁、激活或角色变更,立即标 `PAUSED` 并停止登录。
|
||
- [ ] 记录本轮到此为止的登录尝试数;预期仍为 0。
|
||
|
||
### Phase C:有限登录(仅凭据合法恢复后)
|
||
|
||
- [ ] 从受控 secret store 在同一进程注入新鲜凭据,不回显、不落盘。
|
||
- [ ] admin 最多一次登录;失败立即停止并复查 failureCount/locked。
|
||
- [ ] employee 最多一次登录;失败立即停止并复查 failureCount/locked。
|
||
- [ ] 记录每角色 attempts、HTTP 结果、前后失败计数;禁止第二次尝试。
|
||
|
||
### Phase D:登录态只读验收
|
||
|
||
- [ ] 管理员打开合同台账与现有合同详情,验证自然中文状态和只读摘要。
|
||
- [ ] 如有 active/expired 样本:监听 terminate POST,验证终止面板、10 字提示、原因不足 10 字、按钮 disabled;不打开确认层,结束时 POST=0。
|
||
- [ ] 员工执行合同权限负向路径;未扩大权限、未删除断言。
|
||
- [ ] 如有 archived 样本,只读验证字段锁定;无样本记 `PAUSED`。
|
||
- [ ] 如已有 terminated 样本,只读验证中文标签与终止事实;无样本记 `PAUSED`,不得创建。
|
||
|
||
### Phase E:窗口复核与收口
|
||
|
||
- [ ] 无论前序 PASS/PAUSED,查询 POST `terminatedRows` 和窗口状态。
|
||
- [ ] 对比 PRE/POST;若 OPEN→CLOSED 且 terminate POST=0,记录真实用户同期使用及只能 roll-forward/hotfix。
|
||
- [ ] 汇总生产账号/权限/合同写入计数;本任务预期均为 0。
|
||
- [ ] 启动只读 reviewer,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。
|
||
|
||
## 6. 当前结论
|
||
|
||
规划已收敛并获批启动。首轮生产只读引导完成 13/13 聚合体检后,在本地发布来源校验处 fail-closed;原因是已批准的任务规划尚未形成 clean/published commit。该轮未进入生产 migration status、窗口查询、账号查询或登录。先提交并推送已复核规划,再从完整只读门禁重跑,不使用 override。
|