| 改动面 | 最小改动 | 主责 | 验证 |
|---|---|---|---|
| 前端账号入口 | 在当前账号信息附近增加“修改密码” | UI/前端 | 所有启用角色可见,不影响现有导航 |
| 修改密码表单 | 当前密码、新密码、确认密码和基本提示 | UI/前端 | 错误、提交中、成功和后端离线状态 |
| 后端本人改密接口 | 依据登录身份修改本人密码 | 后端 | 当前密码校验、越权、边界和异常 |
| 登录状态 | 修改成功后清除当前登录并返回登录页 | 前端/后端 | 旧密码失败、新密码成功 |
| 主管账号管理 | 保持现有新建账号和重置密码流程 | 前端/后端 | 原功能回归不受影响 |
| 最小测试 | 覆盖MVP十项验收标准 | 开发/测试 | 自动化或可复验的最小测试记录 |
127.0.0.1以生成数据启动单进程、单写实例,确认不读取data/并提供停止入口。Gate R只冻结第一阶段最小实现材料,不把延期安全能力重新并入MVP。以下各项必须有明确结论、责任角色和可复核证据;任一适用项未PASS时不得进入业务实现。
| 编号 | 必须冻结的内容 | 主责角色 | 通过条件 |
|---|---|---|---|
| R-01 | 本人改密专用接口契约 | 架构、后端、前端、安全 | 路径、方法、认证方式、请求字段、响应字段明确;不接受目标账号参数;当前密码和新密码只进入请求体 |
| R-02 | 登录身份与账号状态 | 架构、后端、安全、测试 | 只使用后端已认证身份;未登录、停用账号和越权构造均被拒绝 |
| R-03 | 密码与确认规则 | 后端、前端、测试 | 8至64字符的计数口径、两端空格不裁剪、新旧不同、确认密码归属及前后端一致性明确 |
| R-04 | 原子更新、并发与失败语义 | 架构、后端、测试 | 校验和写入的顺序、并发冲突、失败不落盘、旧密码保留及错误返回明确 |
| R-05 | 成功退出与重新认证 | 前端、后端、架构、测试 | 成功后清理当前登录并返回登录页;旧密码失败、新密码成功;完整多设备会话撤销继续延期 |
| R-06 | 最小交互规格 | UI、前端 | 顶部入口、三字段表单、提交/取消、移动端单列、焦点与关闭、防重、提示和无障碍规则明确 |
| R-07 | 稳定错误码和页面映射 | 架构、后端、前端、UI、测试 | 未登录、停用、当前密码错误、规则错误、新旧相同、并发冲突和后端不可用均有稳定且不泄密的映射 |
| R-08 | 敏感值与故障关闭 | 安全、前端、后端、运维 | 密码不进入URL、查询参数、响应、日志、文档或浏览器持久化;后端离线不回退;非本地隔离环境使用HTTPS |
| R-09 | 十项验收测试矩阵 | 测试、前端、后端、安全 | 隔离环境、虚构角色账号、正常/异常/越权/停用/离线/敏感值用例、自动化或可复验入口明确 |
| R-10 | 测试数据复位与回滚 | 运维、架构、后端、测试 | 环境身份、备份点、虚构账号密码复位、失败回滚、验证与责任人明确;禁止接触生产账号数据 |
| R-11 | 实现拆分与精确基线计划 | 前端、后端、架构、测试 | 前后端改动边界、自测项、精确diff/commit冻结方式及Gate C输入明确,不夹带模块化重构 |
| 角色 | 首轮结论 | 事件 | 当前处理 |
|---|---|---|---|
| 架构与数据治理 | PASS | COLLAB-20260717-077 | 分项通过;负责收敛唯一接口契约 |
| UI与交互设计 | PASS | COLLAB-20260717-078 | 交互规格已冻结 |
| 前端开发 | CHANGES_REQUESTED | COLLAB-20260717-079 | QUEUE-024保持WAITING,等待唯一契约后复评 |
| 后端开发 | PASS | COLLAB-20260717-080 | 分项通过;须确认架构收敛契约可实施 |
| 代码审核与安全 | PASS | COLLAB-20260717-081 | 安全停止线与Gate C证据已冻结 |
| 测试与质量 | CHANGES_REQUESTED | COLLAB-20260717-082 | QUEUE-027保持WAITING,等待唯一契约和可执行入口后复评 |
| 运维与发布 | PASS | COLLAB-20260717-083 | 隔离测试环境机械方案已冻结 |
当前必须收敛的技术差异:
POST /api/v1/me/password/change,后端建议POST /api/account/change-password。204 No Content,后端建议200和脱敏成功标识。共同事实保持不变:账号只来自后端认证上下文、不接受目标账号字段、停用账号拒绝、失败不落盘、同账号并发最多一次成功、后端离线失败关闭、成功后当前登录失效、密码不进入URL/响应/日志/文档/持久化。
协作事件标题已只读复核为76个且76个唯一,重复0;测试和安全在文件并发更新期间看到的重复快照不再作为持续阻塞。
以下契约由架构与数据治理在COLLAB-20260717-087收敛为PASS,取代首轮架构和后端分项中的全部备选接口。产品需求版本仍为v0.3-MVP;v0.4仅是Gate R技术契约版本。
POST /api/v1/me/password/change。Content-Type:application/json。Authorization头建立的后端认证上下文;账号不得来自路径、查询参数或请求体。currentPassword: string和newPassword: string。confirmPassword只属于前端防误输入校验,不发送后端;它和任何用户名、用户ID、角色、状态、Token或未知字段均按INVALID_REQUEST拒绝。Array.from(value).length;8和64有效,7和65无效。204 No Content,响应体必须为空。Cache-Control: no-store。错误结构固定为error.code、安全的error.message和error.requestId,不得包含密码、账号明细、存储细节、堆栈或完整请求。
| HTTP | 稳定错误码 | UI唯一语义 |
|---|---|---|
| 400 | INVALID_REQUEST |
固定“请求无效”,不得展示原始响应 |
| 401 | AUTHENTICATION_REQUIRED |
清空表单和认证,返回登录页 |
| 403 | ACCOUNT_DISABLED |
清空表单和认证,返回登录页并提示账号不可用 |
| 422 | CURRENT_PASSWORD_INCORRECT |
只清空并聚焦当前密码 |
| 422 | PASSWORD_LENGTH_INVALID |
聚焦新密码,提示8至64个Unicode码点 |
| 422 | NEW_PASSWORD_SAME_AS_CURRENT |
聚焦新密码,提示不能与当前密码相同 |
| 409 | PASSWORD_UPDATE_CONFLICT |
清空表单和认证,返回登录页并重新认证 |
| 503 | PASSWORD_CHANGE_UNAVAILABLE |
保持失败状态、解除忙碌,禁止本地回退和自动重试 |
| 500 | INTERNAL_ERROR |
固定通用错误,禁止展示原始响应或堆栈 |
确认密码不一致是前端字段错误,不存在服务端确认密码错误码。网络断开和格式未知响应分别作为前端本地状态处理,均不得显示成功。
POST /api/account/change-password废止。200及带成功标识响应废止。AUTH_REQUIRED、CURRENT_PASSWORD_INVALID、PASSWORD_UNCHANGED、PASSWORD_CHANGE_CONFLICT、PASSWORD_UPDATE_UNAVAILABLE等首轮备选命名废止。本节整合架构、UI、前后端、安全、测试和运维结论,是v0.4唯一接口契约的实现细则。前端、后端和测试已在原队列项完成复评,产品已汇总为整体PASS;若本节与首轮回执冲突,以本节及上方“Gate R v0.4唯一接口契约”为准。
| 项目 | 冻结结论 |
|---|---|
| 方法与路径 | POST /api/v1/me/password/change |
| 认证身份 | 仅使用现有受保护API的后端认证上下文;当前实现沿用认证头,禁止从URL、查询参数或请求体接收账号、用户ID、角色、状态或Token |
| 请求体 | 严格只允许currentPassword、newPassword两个字符串字段;confirmPassword只在前端校验,不发送后端;出现额外字段返回INVALID_REQUEST |
| 字符口径 | 新密码按Unicode码点计数,8和64均有效;不裁剪、不规范化两端空格;新旧密码按原始字符串比较 |
| 成功响应 | 204 No Content,设置禁止缓存语义;不返回账号、密码、新Token或其他凭据 |
| 账号状态 | 进入写入临界区后重新读取权威账号状态;未认证、认证失效和停用账号均不得写入 |
| 当前密码 | 后端必须基于临界区内最新状态验证;失败不得写入;当前密码不套用新密码长度规则 |
| 原子与并发 | 本人改密、主管重置和账号停用共享同一账号级凭据写入原语;当前单进程隔离环境采用账号锁加版本/CAS,重叠写入最多一个成功,其余返回冲突;多进程或多写入实例必须停止并另行评审共享事务/CAS |
| 失败语义 | 校验、临时写入或原子替换任一步失败,原密码和原数据保持不变;禁止自动重试密码写请求 |
| 成功退出 | 后端不签发新凭据;前端清空三字段、当前认证和当前业务态并返回登录页;旧密码失败、新密码成功;完整多设备会话撤销继续延期 |
| 主管兼容 | 保留主管原新建/重置业务语义和授权,接入同一凭据写入原语;本轮不得扩大主管权限或新增第二套直接写密码路径 |
| HTTP | 错误码 | 页面动作 |
|---|---|---|
| 400 | INVALID_REQUEST |
表单级安全提示;缺字段、类型错误或额外字段 |
| 401 | AUTHENTICATION_REQUIRED |
清空认证与表单,返回登录页并提示重新登录 |
| 403 | ACCOUNT_DISABLED |
清空认证与表单,返回登录页并提示账号不可用 |
| 422 | CURRENT_PASSWORD_INCORRECT |
仅清空并聚焦当前密码字段 |
| 422 | PASSWORD_LENGTH_INVALID |
聚焦新密码字段,提示8至64字符 |
| 422 | NEW_PASSWORD_SAME_AS_CURRENT |
聚焦新密码字段 |
| 409 | PASSWORD_UPDATE_CONFLICT |
清空认证与表单,返回登录页并要求重新认证确认状态 |
| 503 | PASSWORD_CHANGE_UNAVAILABLE |
留在对话框,解除忙碌,固定安全提示;禁止本地回退和自动重试 |
| 500 | INTERNAL_ERROR |
留在对话框并显示固定安全提示,不展示原始响应或堆栈 |
confirmPassword不进入后端,因此“两次输入不一致”是前端字段错误而不是服务端错误码。所有错误响应只允许稳定代码、安全提示和请求ID,不得包含密码、账号明细、存储状态、堆栈或完整请求内容。
204才视为成功;随后清空敏感内存和登录状态并返回登录页,显示一次性“密码已修改,请使用新密码重新登录”。| 项目 | 冻结结论 |
|---|---|
| 环境标识 | local-isolated-test,固定Windows本机、单后端进程、单写入实例和精确commit |
| 网络 | 只绑定127.0.0.1时可使用HTTP;任何非本机回环访问必须使用有效HTTPS,禁止忽略证书错误 |
| 配置与数据 | 配置、虚构账号模板和快照只放在已忽略的docs/local/测试环境/;不得引用生产地址、凭据或当前运行数据文件 |
| 虚构样本 | 启用员工A、启用员工B、主管、停用员工和匿名客户端;密码只在运行时注入,不进入文档、命令行、截图或Git |
| 备份与复位 | 每轮前生成脱敏快照编号和校验值;测试后优先恢复完整快照;复位或校验失败立即停止 |
| 计划自动化入口 | 实现阶段补齐npm run test:password:api、npm run test:password:web、npm run test:password:concurrency、npm run test:password:sensitive、npm run test:password:reset,并将结果映射到十项验收标准 |
| 证据 | 只记录commit、环境ID、运行ID、用例编号、HTTP状态、稳定错误码、并发生效次数、快照校验值和脱敏扫描结论;不保存原始日志、完整请求响应或敏感值 |
confirmPassword只在前端校验;后端新正式会话在原QUEUE-20260717-032确认两字段严格Schema可实施,结论见COLLAB-092。POST /api/v1/me/password/change和204 No Content;前端在原QUEUE-20260717-024复评PASS,结论见COLLAB-095。QUEUE-20260717-027复评PASS,结论见COLLAB-096。| 角色/汇总 | 最终结论 | 结果事件 |
|---|---|---|
| 架构与数据治理 | PASS | COLLAB-20260717-087 |
| UI与交互设计 | PASS | COLLAB-20260717-078 |
| 前端开发 | PASS | COLLAB-20260717-095 |
| 后端开发 | PASS | COLLAB-20260717-092 |
| 代码审核与安全 | PASS | COLLAB-20260717-081 |
| 测试与质量 | PASS | COLLAB-20260717-096 |
| 运维与发布 | PASS | COLLAB-20260717-083 |
| 产品整体汇总 | PASS | COLLAB-20260717-098 |
Gate R通过时只打开“另建精确实现任务”的前置条件,不等于自动授权实现。该时间点功能实现进度为0%,无可审核代码基线,未测试、未部署、不可上线;后续实现与验收结果以本文顶部状态和实现/验收记录为准。