# ECR-013B **Title:** AccountLifecycle(UserStatus 状态机 · 运营启停/封禁 · C 端拒绝) **Status:** **Closed** **Date:** 2026-08-07 **Approved:** 2026-08-07(Human) **Coding Start Authorization:** 2026-08-07(Human) **Closed:** 2026-08-07(Reviewer · Loop continuous) **Parent:** WAVE0-FROZEN (`27f27a1`) **Predecessor:** ECR-013A **Closed** **Change Level: L2**(行为:账户状态强制;栈与分层不变) ## Change 1. Active Feature Spec:`.ai/product/feature-spec/ops-account-lifecycle.md` 2. Domain:落实 `UserStatus` · `AccountStateTransition` 3. API 意图:`POST /admin/users/:id/status` · `GET .../status-transitions` 4. C 端:非 `active` → DeviceAuth/Bearer **拒绝** 5. RBAC additive:`admin.users.status.write` 6. **contract_diff**:`docs/CONTRACT_DIFF/ECR-013B.yaml`(P0) 7. **不含** soft-delete / UGC / 真支付 ## Motivation `users.status` 已存在但无运营迁移与会话阻断;013A 权限门禁就绪后可落地最小风控闭环。 ## Scope ### Allowed - Spec L0–L4 · Domain 对齐 · BD Draft · AC · feature-map §7 · TRACEABILITY · STATE · TASK ### Forbidden(Non-goals) - (实现轮已授权)soft-delete 仍禁;真支付 · UGC · Prompt - soft-delete · GDPR 擦除 - 真支付 · UGC · Prompt · Crisis 深化 ## Risk | Risk | Mitigation | |------|------------| | 误封超级用户/自测号 | reason 必填;Audit + transitions;可回迁 active | | 与 session 缓存不一致 | 每次请求读 User.status(本切片不引入长缓存) | | 权限码遗漏种子 | migration 写入 super_admin;integration 覆盖 | ## Acceptance Criteria 见 Spec `ops-account-lifecycle.md` L4:AC-F-01..04 · AC-S-01..04 · AC-P-01 · AC-O-01..02 契约轮完成标准: - [x] L0–L4 填满 - [x] contract_diff 已交 - [x] BD Draft + HANDOFF(禁 coding) - [x] Human **Approve** ECR+BD + Coding Start Authorization - [x] Implemented + TEST_REPORT - [x] Reviewer Closed ## Rollback - 契约轮:废弃 Draft - 实现轮:down migration + 回退 DeviceAuth 检查 ## Linked - Feature Spec: `.ai/product/feature-spec/ops-account-lifecycle.md` - PRODUCT_SPEC: `docs/PRODUCT_SPEC/ECR-013B-account-lifecycle.md` - ENGINEERING_SPEC: `docs/ENGINEERING_SPEC/ECR-013B-account-lifecycle.md` - BACKEND_DESIGN: `docs/BACKEND_DESIGN/BD-2026-013B-account-lifecycle.md` - CONTRACT_DIFF: `docs/CONTRACT_DIFF/ECR-013B.yaml` - Parent: WAVE0-FROZEN · Predecessor: ECR-013A