diff --git a/.trellis/tasks/08-08-production-authenticated-readiness/implement.md b/.trellis/tasks/08-08-production-authenticated-readiness/implement.md index 99d7d831..483d64d7 100644 --- a/.trellis/tasks/08-08-production-authenticated-readiness/implement.md +++ b/.trellis/tasks/08-08-production-authenticated-readiness/implement.md @@ -1,6 +1,6 @@ # 生产登录态只读验收:执行计划与证据 -> 当前状态:IN PROGRESS。规划已通过用户只读复核并启动;生产只读引导首轮在发布来源门禁处停止,尚未查询生产账号或尝试登录。 +> 当前状态:IN PROGRESS / LOGIN PAUSED。生产只读基线与账号诊断已完成;admin/employee identifier 均 `matchedBy=none`,因此在登录前停止,登录态 UI 尚未验收。 ## 1. 规划确认 @@ -17,47 +17,49 @@ - [x] 运行 `task.py start`,当前 task 状态为 `in_progress`。 - [x] 确认生产只读授权仍有效;本任务没有账号/权限/合同写入授权。 - [x] 确认已部署产品 SHA 基线为 `0224ad8`,不以当前 HEAD 替代。 -- [ ] 确认 `command -v npx`;浏览器只能使用单 worker、零 retry。 -- [ ] 创建本轮独立、gitignored 的 evidence 目录;不得复用历史 PASS。 +- [x] `command -v npx` 可用;若凭据恢复,浏览器只能使用单 worker、零 retry。 +- [x] 生产 preflight 使用两个独立时间戳报告引用;未复用历史 PASS,任务文档只记脱敏摘要。 ## 3. 执行顺序 ### Phase A:生产只读基线 -- [ ] 复用受控身份引导和 read-only preflight,确认唯一生产目标。 -- [ ] 人工阅读脱敏后的 migration status:65 条 applied、pending/failed/diverged 均无异常。 -- [ ] 核对运行/公网 build SHA 为已部署产品候选。 -- [ ] 查询 PRE `terminatedRows`,记录 `rollbackWindow=OPEN|CLOSED` 与时间顺序。 +- [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:登录前账号诊断 -- [ ] 使用 `BEGIN READ ONLY` 查询 admin;输出仅含 role key、matchedBy、active/archived/locked、failureCount、expectedRoleReady。 -- [ ] 使用同一查询合同诊断 employee。 -- [ ] 人工确认 identifier 只按 email/phone 登录语义匹配,未把 employee_no 当作可登录身份。 -- [ ] 按 PRD R3 分流;如需密码修改、解锁、激活或角色变更,立即标 `PAUSED` 并停止登录。 -- [ ] 记录本轮到此为止的登录尝试数;预期仍为 0。 +- [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。 + +执行备注:账号诊断前两次远端包装探针分别在脚本解码和 Compose 必填候选标识处未产生约定查询 marker,均不计为查询成功;修正为注入已验证产品候选完整/12 位标识后,唯一有效诊断事务返回 `transaction=read_only`。这些失败均先于数据库事务和登录。 ### Phase C:有限登录(仅凭据合法恢复后) -- [ ] 从受控 secret store 在同一进程注入新鲜凭据,不回显、不落盘。 -- [ ] admin 最多一次登录;失败立即停止并复查 failureCount/locked。 -- [ ] employee 最多一次登录;失败立即停止并复查 failureCount/locked。 -- [ ] 记录每角色 attempts、HTTP 结果、前后失败计数;禁止第二次尝试。 +- [ ] PAUSED:受控 secret 中现有 identifier 已失配,尚无经账号持有人确认的新鲜凭据。 +- [ ] PAUSED:admin 未登录,attempts=0。 +- [ ] PAUSED:employee 未登录,attempts=0。 +- [x] 已记录每角色 attempts=0;没有第二次尝试,也没有增加失败计数。 ### Phase D:登录态只读验收 -- [ ] 管理员打开合同台账与现有合同详情,验证自然中文状态和只读摘要。 -- [ ] 如有 active/expired 样本:监听 terminate POST,验证终止面板、10 字提示、原因不足 10 字、按钮 disabled;不打开确认层,结束时 POST=0。 -- [ ] 员工执行合同权限负向路径;未扩大权限、未删除断言。 -- [ ] 如有 archived 样本,只读验证字段锁定;无样本记 `PAUSED`。 -- [ ] 如已有 terminated 样本,只读验证中文标签与终止事实;无样本记 `PAUSED`,不得创建。 +- [ ] PAUSED:管理员会话未建立,未进入合同台账或详情。 +- [ ] PAUSED:未进入终止面板;未填写原因、未打开确认层、terminate POST=0。 +- [ ] PAUSED:员工会话未建立,未执行权限负向路径;未扩大权限或删除断言。 +- [ ] PAUSED:未在无登录态情况下探查 archived 样本,未创建数据。 +- [ ] PAUSED:PRE/POST 均证明 terminatedRows=0,因此无现有 terminated 样本可验;未制造样本。 ### Phase E:窗口复核与收口 -- [ ] 无论前序 PASS/PAUSED,查询 POST `terminatedRows` 和窗口状态。 -- [ ] 对比 PRE/POST;若 OPEN→CLOSED 且 terminate POST=0,记录真实用户同期使用及只能 roll-forward/hotfix。 -- [ ] 汇总生产账号/权限/合同写入计数;本任务预期均为 0。 -- [ ] 启动只读 reviewer,reviewer 不修改代码或生产状态。 +- [x] 前序 PAUSED 后仍查询 POST:`terminatedRows=0`、`rollbackWindow=OPEN`、`basis=terminated_status_count`。 +- [x] PRE/POST 均为 OPEN/0,未发现同期真实用户关闭窗口。 +- [x] 汇总:登录 attempts=0、terminate POST=0、生产账号/权限/合同/schema 写入=0。 +- [x] 启动只读 reviewer,reviewer 未修改代码或生产状态;首轮 `PASS_WITH_FINDINGS` 的两项证据措辞已修订,最终复查结论 `PASS`。 - [ ] 按实际证据更新 PRD AC;不得把缺失样本或凭据阻塞勾成通过。 ## 4. 预期证据表 @@ -78,6 +80,8 @@ - [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. 当前结论 -规划已收敛并获批启动。首轮生产只读引导完成 13/13 聚合体检后,在本地发布来源校验处 fail-closed;原因是已批准的任务规划尚未形成 clean/published commit。该轮未进入生产 migration status、窗口查询、账号查询或登录。先提交并推送已复核规划,再从完整只读门禁重跑,不使用 override。 +生产只读基线与账号诊断已执行。首轮来源门禁因规划未形成 clean/published commit 停止;规划提交 `4f3f761` 推送后重跑通过。最终诊断为 admin/employee identifier 均不匹配 email/phone,故按硬门禁停在登录前;PRE/POST 窗口均 OPEN/0,未发生任何登录、终止、账号、权限、合同或 schema 写入。登录态 UI AC 保持 PAUSED,等待账号持有人从合法来源恢复仓库外新鲜凭据;本任务不修改生产账号。 diff --git a/.trellis/tasks/08-08-production-authenticated-readiness/prd.md b/.trellis/tasks/08-08-production-authenticated-readiness/prd.md index 69af5308..db6d3fff 100644 --- a/.trellis/tasks/08-08-production-authenticated-readiness/prd.md +++ b/.trellis/tasks/08-08-production-authenticated-readiness/prd.md @@ -74,15 +74,15 @@ ## Acceptance Criteria -- [ ] AC1:已确认生产运行/公网 SHA 对应已部署产品候选 `0224ad8`,65 条 migration 仍全部 applied,未触发部署或 schema 写入。 -- [ ] AC2:任何登录前已对管理员、员工分别完成只读状态诊断;证据包含 `matchedBy`、active/archived/locked、失败计数和期望角色是否就绪,不含账号或凭据明文。 -- [ ] AC3:账号诊断已按 identifier 失配、密码凭据失效、锁定、停用/角色漂移之一形成可解释结论;凡需要修改生产账号状态的分支均 `PAUSED` 并另行批准,没有用重复登录试错推进。 -- [ ] AC4:仅在合法凭据恢复且所有登录前门禁通过时,管理员、员工各执行不超过一次登录;`workers=1`、`retries=0`,任一失败后复查失败计数/锁定状态且没有第二次尝试。若凭据未恢复,本 AC 保持 `PAUSED`,不得勾选。 -- [ ] AC5:管理员已只读打开合同详情;对既有 `active/expired` 合同仅验证终止面板、10 字提示和按钮初始禁用,终止原因保持不足 10 字,确认层未打开,终止端点 `POST` 计数为 0。 -- [ ] AC6:员工合同权限负向路径通过,未扩大权限或删除断言;现有 archived/terminated 样本的只读检查按数据实际情况记录 PASS 或 `PAUSED`,未创建数据补齐样本。 -- [ ] AC7:验收前后均记录 `terminatedRows` 与 `rollbackWindow=OPEN|CLOSED`;若窗口变化,已明确记录真实用户使用与只能 roll-forward/hotfix 的后果。本任务真实合同终止写入计数为 0。 -- [ ] AC8:只读 reviewer 已复核账号诊断、登录尝试计数、终止请求计数、窗口双快照和证据脱敏;task validate、process contract、governance、sensitive scan、diff check 均通过。 -- [ ] AC9:最终结论准确区分“已部署”“登录态验收通过”“可告知用户测试”;任一必需登录态项目仍 `PAUSED` 时,不得告知用户可以测试。 +- [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 均为 `matchedBy=none`,结论为不符合现行 email/phone 精确登录合同;登录尝试数保持 0,未用旧密码试错,恢复仓库外凭据前保持 `PAUSED`。 +- [ ] AC4 — PAUSED:管理员、员工合法新鲜凭据尚未恢复;本轮各角色登录尝试均为 0,没有使用旧凭据消耗一次预算。 +- [ ] AC5 — PAUSED:因登录前 identifier 门禁失败,未建立管理员会话,未进入合同详情或终止面板;终止端点 `POST` 计数为 0,确认层未打开。 +- [ ] AC6 — PAUSED:因登录前 identifier 门禁失败,未执行员工权限负向或 archived/terminated 样本 UI 检查;未扩大权限、修改断言或制造数据。 +- [x] AC7:验收前后均为 `terminatedRows=0`、`rollbackWindow=OPEN`、`basis=terminated_status_count`;窗口未变化,本任务真实合同终止写入计数为 0。 +- [x] AC8:只读 reviewer 最终结论 `PASS`,已复核账号诊断、登录尝试计数、终止请求计数、窗口双快照和证据脱敏;task validate、process contract、governance、sensitive scan、diff check 均通过。 +- [x] AC9:结论明确为产品已部署、生产基线健康,但登录态验收仍 `PAUSED`;当前不得告知用户可以测试。 ## Out of Scope diff --git a/.trellis/tasks/08-08-production-authenticated-readiness/task.json b/.trellis/tasks/08-08-production-authenticated-readiness/task.json index e58794c6..a5f60ee4 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": "仅规划,尚未启动实施。前一部署任务已完成 65 条迁移与匿名鉴权,但管理员/员工验收凭据均返回 401;本任务禁止用重复登录试错诊断,禁止修改生产账号或产生真实合同终止写入。", + "notes": "生产只读基线通过:公网产品 SHA 匹配已部署候选,65 条 migration applied、pending=none,PRE/POST 均 rollbackWindow=OPEN、terminatedRows=0。管理员与员工仓库外 identifier 在 BEGIN READ ONLY 诊断中均 matchedBy=none,不符合现行 email/phone 登录合同;账号属性记 N/A,登录 attempts=0、terminate POST=0、生产写入=0。只读 reviewer 最终 PASS。登录态 UI 验收保持 PAUSED,等待账号持有人合法恢复新鲜仓库外凭据;不得修改生产账号推进。", "meta": {} -} \ No newline at end of file +}