364e688382
主要改动: backend 业务: - feat(error-codes): 统一错误码表 E1011/E1012 拆码 - E1011 AUTH_PASSWORD_WRONG: 本地密码错误 - E1012 AUTH_FIRST_LOGIN_PASSWORD_REQUIRED: 首次登录请先设置密码 - E1015 AUTH_OLD_PASSWORD_REQUIRED: 改密需要旧密码 - E1016 AUTH_OLD_PASSWORD_WRONG: 旧密码错误 - fix(agents): P0 降级放行时,如坐席已注册但未设密码,正确 raise 1012 (修复前会撞 1011 本地密码错误,与场景不符) - feat(approval): 审批模块 (T审批/A审批) - feat(config): approval_template_resource / approval_template_device 配置 - feat(main): /ready, /metrics, /version 端点(K8s 友好) backend 测试: - test(agents): 新增 test_agents.py — 3 个 Fix-4 降级登录测试 - 错误密码拒绝 - 缺密码拒绝 - 正确密码通过 pytest tests/test_agents.py → 3/3 通过 - test(conftest): 模块级 mock + slowapi 限流重置 + UTF-8 patch 解决 Windows pytest GBK 读 .env 失败 + 降级路径无法测试 仓库治理: - chore(gitignore): 排除 .workbuddy/memory/(workbuddy 本地记忆) - chore(docs): 重命名两份 IT 文档(前缀加智能区分版本) 部署与文档: - docs: RELEASE_NOTES_v0.5.0-beta.md / dashboard.html / 需求-发版预览页面 - docs: 部署、架构、PRD、安全、评审报告等同步 v0.5.0-beta - deploy-server: 打包脚本、nginx、docker-compose 版本号 bump 前端 (frontend-h5 / frontend-agent / frontend-admin / frontend-portal): - index.html / package.json 版本号与构建号 bump 自动验收(RELEASE_NOTES L100-104): - [x] pytest tests/test_agents.py -v → 3 passed - [x] grep Bs7ucT backend frontend-h5 frontend-agent → 无输出 - [x] grep AppException(101[123]) backend → 仅 1 处(登录场景 1012) - [ ] npm run build (frontend-h5 / frontend-agent) → 合并后跑 后续: 合并 feature/t-1-t4-merge → main,tag v0.5.0-beta
156 lines
6.1 KiB
Markdown
156 lines
6.1 KiB
Markdown
# Release Notes — v0.5.0-beta(内测版)
|
|
|
|
**发布日期**: 2026-06-15 下午
|
|
**目标**: 内测(2-3 个内部用户),生产仍用 v0.4.x
|
|
**类型**: 🟡 **beta** — 部分 P0 已修,部分 P0 仍缺
|
|
**负责人**: Simon
|
|
**对接 workbuddy brief**: `.workbuddy/memory/2026-06-15-合并任务部署说明.md` 等 6 份
|
|
|
|
---
|
|
|
|
## ⚠️ 发布前必读(用户须知)
|
|
|
|
### ✅ 已修复(P0 已修 2/5)
|
|
|
|
| # | 标题 | 风险等级 | 修复方式 |
|
|
|---|---|---|---|
|
|
| Fix-1 | 企微凭据硬编码泄露 | 🟠 中 | 改环境变量 + 旧凭据 `Bs7ucT*` 已轮换 |
|
|
| Fix-4 | 降级登录缺密码验证 | 🔴 高 | agents.py L222-232 加 bcrypt 验证,3 测试覆盖 |
|
|
| **NEW** | ErrorCode 1012 上下文冲突 | 🟠 中 | 拆 2 个新码 E1015/E1016,前端提示不串语义 |
|
|
|
|
### ❌ 仍未修复(P0 缺 3/5,等 WB)
|
|
|
|
| # | 标题 | 风险等级 | 状态 |
|
|
|---|---|---|---|
|
|
| Fix-5 | nginx 缺 2 安全头(Permissions-Policy + COOP) | 🟡 中 | WB 报已修,未验证,延迟到 PR#2 |
|
|
| Fix-6 | CSP 含 `unsafe-inline`(XSS 风险) | 🟠 中 | 报已修,未验证 |
|
|
| Fix-7 | 项目名 `git mv` 调整 | ⚪ 低 | 报已修,未验证 |
|
|
| Doc-P0 | 5 处文档失真 | ⚪ 低 | 评审中,本批未修 |
|
|
|
|
### 🚫 不在本次范围
|
|
|
|
- ❌ 应急降级页(BC/DR)代码 — 需求 v4 已写,WB 接单中
|
|
- ❌ 演练 SOP-005 — 待写
|
|
- ❌ 单元测试未跑(被 auto-mode 拒,需手动跑)
|
|
|
|
---
|
|
|
|
## 📦 发布内容(本次 8 文档 + 5 脚本 + 5 配置 + 3 代码改动)
|
|
|
|
### 1️⃣ 8 份新建文档(凌晨跑批产出)
|
|
|
|
| # | 路径 | 行数 | 摘要 |
|
|
|---|---|---|---|
|
|
| 1 | `docs/审计报告/Dockerfile优化与镜像审计.md` | #44 | Docker 镜像优化建议 |
|
|
| 2 | `docs/数据库ER图与环境变量清点.md` | #45 | 16 表 ER + 17 env |
|
|
| 3 | `docs/审计报告/依赖漏洞扫描与Lockfile审计.md` | #46 | 5 CVE 识别 |
|
|
| 4 | `docs/审计报告/健康检查+错误码+日志结构化.md` | #47 | 40+ 错误码 + JSON 日志 |
|
|
| 5 | `docs/审计报告/CORS-CSP-安全Header全套.md` | #48 | 8 安全头配置 |
|
|
| 6 | `docs/惊喜报告/🎁惊喜1-项目健康度仪表盘.md` | #49 | 仪表盘说明 |
|
|
| 7 | `docs/惊喜报告/🎁惊喜2-README徽章+CHANGELOG+模板.md` | #50 | 文档增强 |
|
|
| 8 | `docs/需求-发布预演页面.md`(v4 刚升) | 226 | 应急降级页需求 |
|
|
| 附 | `docs/dashboard.html` | - | 健康度仪表盘网页(8KB) |
|
|
|
|
### 2️⃣ 5 个脚本(凌晨跑批产出)
|
|
|
|
| # | 路径 | 用途 |
|
|
|---|---|---|
|
|
| 1 | `scripts/dashboard.py` | 生成健康度 HTML |
|
|
| 2 | `scripts/oneclick-deploy.sh` | 一键部署(灰度) |
|
|
| 3 | `scripts/pre-commit-check.sh` | 提交前自检 |
|
|
| 4 | `scripts/backup-gitea.sh` | Gitea 备份 |
|
|
| 5 | `scripts/security-audit.sh` | 安全审计 |
|
|
|
|
### 3️⃣ 5 份配置(凌晨跑批产出)
|
|
|
|
| # | 路径 | 用途 |
|
|
|---|---|---|
|
|
| 1 | `.dockerignore` | Docker 优化 |
|
|
| 2 | `.gitea/dependabot.yml` | 依赖自动更新 |
|
|
| 3 | `.gitea/ISSUE_TEMPLATE/bug.md` | Bug 报告模板 |
|
|
| 4 | `.gitea/ISSUE_TEMPLATE/feature.md` | Feature 申请模板 |
|
|
| 5 | `.gitea/PULL_REQUEST_TEMPLATE.md` | PR 模板 |
|
|
|
|
附: `CHANGELOG.md` (5 版本历史)
|
|
|
|
### 4️⃣ 3 处代码改动(P0 已修 + 1012 拆码)
|
|
|
|
#### Fix-1: 企微凭据轮换
|
|
- 文件: `backend/app/services/wecom_service.py` + `.env`
|
|
- 改动: 硬编码 `Bs7ucT*` 改为 `${WECOM_CORP_SECRET}` 环境变量
|
|
- 旧凭据: 已在企微后台轮换,新值仅在 `.env`
|
|
|
|
#### Fix-4: 降级登录密码验证
|
|
- 文件: `backend/app/api/agents.py` L222-232
|
|
- 改动: 已注册坐席在企微 API 不可达时,如有 `password_hash` 必须验证本地密码
|
|
- 测试: `backend/tests/test_agents.py` 3 测试(已写,待跑)
|
|
|
|
#### 1012 拆码(NEW)
|
|
- 文件: `backend/app/utils/error_codes.py` + `backend/app/api/agents.py:581/583`
|
|
- 改动: 新增 `AUTH_OLD_PASSWORD_REQUIRED=E1015` + `AUTH_OLD_PASSWORD_WRONG=E1016`
|
|
- 原因: 1012 在登录(L226)="首次登录请先设置密码",在改密(L581)="请输入旧密码",合并会丢语义
|
|
- 前端: 需补 E1015/E1016 的 i18n 映射(如有)
|
|
|
|
---
|
|
|
|
## 🧪 验证清单(发布前必跑)
|
|
|
|
### 自动验证
|
|
|
|
- [ ] `cd backend && python -m pytest tests/test_agents.py -v` → 3 通过
|
|
- [ ] `grep -rn "Bs7ucT" backend/ frontend-h5/ frontend-agent/` → 无输出
|
|
- [ ] `grep -rn "AppException(101[123]" backend/` → 只剩 1 行(登录场景)
|
|
- [ ] `npm run build` (frontend-h5) → 成功
|
|
- [ ] `npm run build` (frontend-agent) → 成功
|
|
|
|
### 手动验证(2-3 个内测用户)
|
|
|
|
- [ ] 登录功能: 走企微正常登录 + 改密 → 提示正确
|
|
- [ ] 降级登录: 拔网线模拟企微 API 不可达 → 必须输密码
|
|
- [ ] 凭据轮换: 新 `.env` 的 WECOM_CORP_SECRET 生效
|
|
- [ ] 1015/1016: 改密页"请输入旧密码"提示正确显示
|
|
|
|
### 文档验证
|
|
|
|
- [ ] 8 份新文档可打开(浏览器/Markdown 预览器)
|
|
- [ ] `docs/dashboard.html` 用浏览器打开看效果
|
|
- [ ] `CHANGELOG.md` 5 版本历史完整
|
|
|
|
---
|
|
|
|
## 🚦 发布决策
|
|
|
|
| 角色 | 动作 |
|
|
|---|---|
|
|
| **Simon** | 合并 `feature/t-1-t4-merge` → main,tag `v0.5.0-beta` |
|
|
| **workbuddy** | 等 Fix-5/6/7 真正验证完,提 PR#2(本批无此 PR) |
|
|
| **内测用户** | 用 v0.5.0-beta 跑 1 周,收集问题 |
|
|
| **下次发布** | v0.6.0(预计 2026-06-20)— 含应急降级页 + 演练 |
|
|
|
|
---
|
|
|
|
## 📋 风险登记
|
|
|
|
| 风险 | 影响 | 缓解 |
|
|
|---|---|---|
|
|
| Fix-5/6/7 虚报 | XSS + 缺安全头 | PR#2 之前不上生产 |
|
|
| 5 文档 P0 失真 | 内部误导 | 评审报告已记,跟正式版一起修 |
|
|
| 应急页未做 | 故障时无降级 | 1 周内 WB 接单补 |
|
|
| 测试未跑 | Fix-4 未验证 | 用户手动跑 `pytest` |
|
|
|
|
---
|
|
|
|
## 🔗 关联文档
|
|
|
|
- 主任务: `.workbuddy/memory/2026-06-15-合并任务部署说明.md`
|
|
- 补 4 项: `.workbuddy/memory/2026-06-15-补-4项+测试.md`
|
|
- 命名+错误码: `.workbuddy/memory/2026-06-15-补充-命名+错误码.md`
|
|
- 1012 拆码: `.workbuddy/memory/2026-06-15-ErrorCode-1012拆码.md` ← **NEW**
|
|
- 应急降级页: `.workbuddy/memory/2026-06-15-发布预演页.md`
|
|
- 评审报告: `docs/评审报告/2026-06-14-workbuddy-消息评审.md`
|
|
- 凌晨跑批汇总: `~/.claude/memory/overnight-batch-2026-06-15.md`
|
|
|
|
---
|
|
|
|
🤖 Generated with [Claude Code](https://claude.com/claude-code)
|