Преглед на файлове

docs(release): document s0 g09 freeze notes

YY968XX преди 1 месец
родител
ревизия
efb96d3c31
променени са 1 файла, в които са добавени 89 реда и са изтрити 0 реда
  1. 89 0
      doc/release/s0-g09-freeze-release-notes-20260426.md

+ 89 - 0
doc/release/s0-g09-freeze-release-notes-20260426.md

@@ -0,0 +1,89 @@
+# S0 / G-09 Phase 2 冻结批 — 发布说明
+
+- 发布 HEAD:`42a563bc`
+- 冻结时间:2026-04-26
+- 风险等级:**P2 / release_ready_with_notes**
+- 目标库:`aidopdev @ 123.60.180.165`(当前 AiDOPWarehouse 唯一目标实例)
+
+## 1. 发布范围(Included)
+
+| # | 范围 | 关键提交 |
+|---|---|---|
+| 1 | A2 Department / Location / Material / Supplier 引用删除保护 + UI 回归 | ddfbfada / b4cebf39 / 14555f59 / 56690005 |
+| 2 | SRM schema mismatch 修复(SuppMaster.SupplierNumber 真实列)| 50359ac3 |
+| 3 | B2-1 Material/Routing scope 校验 | 9cb551ca |
+| 4 | B2-2 LocationShelf.Location scope 校验 + 历史 0/0 降级 | 92f1f209(spec b031e135)|
+| 5 | B2-3 Employee.Department scope 校验 + 历史 0/0 降级 | 92f1f209(spec b031e135)|
+| 6 | BUG-S0-ORG-TYPE-001 前端 org id string 化(22 页面 + 默认值收敛)| b1c491f9 / 1d03994f |
+| 7 | G-09 Phase 2 small/mid(监控模块 module codes 配置化、watch 去重、AdoS8ExceptionType CodeFirst 注册等)| 5656a88d / a4ebd3fd / 034f31df / 89ab0ba9 / 57c7a8e9 / fcbaac35 / c70c3085 / f60d3b63 / 9b7e038d / 5a3c68e8 / 0c684a62 |
+| 8 | F-CLEAN-1 退役 ShowInSidebar SeedData 写路径(Entity/DB 列保留)| 1708f79c |
+| 9 | HEALTH-1 e2e dev 服务健康预热 fail-fast | 42a563bc |
+
+## 2. 不包含范围(Out of Scope)
+
+- **B2-4** WorkCenterCode scope —— 升级为字段建模任务,需业务签字;不按普通 scope guard 推进
+- **C2 / C3** —— 业务签字未完成,禁止落地
+- **S2-B** sidebar 方案 X —— 已弃案(前端 view-model 已正确建模,无需后端 cell 合并)
+- **S2-F** cell-data 多 metric 主链 —— 暂缓,无真实业务驱动
+- **dev 测试残留清理(B2-DEV-CLEAN-1 / DEV-CLEAN-G09-CELL/SCENE)** —— 不随发布自动执行;需独立 dev DELETE 授权
+- **历史数据迁移** —— 不在本冻结批;上线后按 [B2 Downgrade] 日志频次评估
+
+## 3. 目标环境口径
+
+- **AiDOPWarehouse 当前目标库 = `aidopdev @ 123.60.180.165`**(Database.json L15 唯一未注释行)
+- `aidopcore @ 106.14.73.46` 是 **AiDOPCore** 产品 schema(`ado_md_*` / `ado_s8_alert_*` / `ado_s8_incident_*` / `ado_s8_rule_*`),**不是本项目目标库**,不可作为本项目核验对象
+- 当前 AiDOPWarehouse 没有独立生产实例;如未来启用独立生产实例,必须重新执行 `TARGET-CLARIFY-N` 后再发布
+
+## 4. 测试证据(HEAD 42a563bc)
+
+| 测试 | 结果 | 备注 |
+|---|---|---|
+| `tests/e2e/smoke.spec.ts` | PASS 1/1 | HEALTH-1 gate stdout: `Web=200 API=301` |
+| `tests/e2e/s0/srm-fix-regression.spec.ts` | PASS 2/2 | Supplier 删除被 SRM 引用 → 409 / S01006;Material Routing 引用 → 409 |
+| `tests/e2e/s0/b2-shelf-scope.spec.ts` | PASS 4/4 | happy / NotFound→S01011 / ScopeMiss→S01012 / Update ScopeMiss reject |
+| `tests/e2e/s0/b2-employee-scope.spec.ts` | PASS 4/4 | 同上 |
+| `tests/e2e/s8/g01-watch-mapping.spec.ts` | PASS(前批已验证)| TEST_G09_ 自带 seed + cleanup |
+| HEALTH-1 正负路径 | PASS | 服务正常时 gate 通过;故意指向占空端口时 globalSetup throws + 修复提示 |
+| TEST_B2_ 残留 | 0 | shelf=0 / employee=0 |
+| TEST_G09_ 残留 | 0 | exceptions alive=0 / rules=0 |
+| `show_in_sidebar=1` 计数 | 0 | F-CLEAN-1 兼容性确认 |
+| `ado_s8_exception_type` schema | aligned | 与 Entity AdoS8ExceptionType 完全对齐(19 列 / PK / 1 UNIQUE / 1 普通索引 / utf8mb4_general_ci)|
+
+## 5. 发布步骤
+
+1. 拉取并部署到 HEAD `42a563bc`
+2. **重启 API 服务**(旧进程不感知新 scope 校验器)—— `bash /home/yy968/work/New9S/restart_aidop.sh` 或等价部署流程
+3. 启动 / 验证 Web 服务(默认 8888)
+4. 发布后 smoke:`pnpm -C Web exec playwright test tests/e2e/smoke.spec.ts --reporter=list`
+5. 建议复跑核心回归:
+   - `pnpm -C Web exec playwright test tests/e2e/s0/srm-fix-regression.spec.ts --reporter=list`
+   - `pnpm -C Web exec playwright test tests/e2e/s0/b2-shelf-scope.spec.ts --reporter=list`
+   - `pnpm -C Web exec playwright test tests/e2e/s0/b2-employee-scope.spec.ts --reporter=list`
+6. 观察 API 日志中 `[B2 Downgrade]` 警告频次
+
+## 6. 发布风险与观察项
+
+1. **B2 scope guard 上线后**,非 0/0 跨 scope 历史数据在 Update 时(即使不改 Department/Location 引用)会被 `S01012 InvalidReferenceScope` 拒绝。
+2. 当前 aidopdev 真实业务影响面 = **0**:跨 scope 行全部为历史测试 fixture(`SH_001_*` / `SH_ORPHAN_*` / `EMP_TEST_*`)。
+3. 历史 0/0 origin 的记录在 Update 时(且引用值未改)走降级路径,会产生 `[B2 Downgrade]` 结构化警告日志(INFO 级),不阻断业务。频次过高 → 评估数据迁移。
+4. **dev 测试残留仍是清理债**(B2-DEV-CLEAN-1 等),不随发布自动执行。
+5. `srm-fix-regression.spec.ts` 仍硬编码依赖样本 `Supp=10001875` + SRM refs=390;后续 HEALTH-2 可加 sample-integrity 前置 assert。
+6. 未来若启用独立生产库,必须重做 `TARGET-CLARIFY-N` 与 4 项目标环境只读核验后再发布。
+
+## 7. 回滚建议
+
+- 若 B2 scope guard 导致真实业务 Update **大面积失败**(`[B2 Downgrade]` 高频 / 用户连续报 S01012):
+  1. **优先**:暂停涉及 LocationShelf / Employee 的 Update 操作
+  2. **回滚 API** 至冻结批前的 commit(`1708f79c` 为 F-CLEAN-1 之后、B2-FIX-1 之前;或更早视部署窗口)
+  3. **不建议**直接改生产数据绕过 scope guard
+  4. 回滚后保留失败请求样本(含 dto.CompanyRefId / FactoryRefId / Department/Location 值),用于评估是否为历史数据迁移问题
+- 若仅观察到 `[B2 Downgrade]` 但无用户投诉:不需要回滚,按观察项 6 评估迁移即可
+
+## 8. 禁止事项
+
+- **不在发布过程中执行任何历史数据修复 SQL**(INSERT / UPDATE / DELETE / ALTER)
+- **不执行 dev 清理 SQL** —— 需 B2-DEV-CLEAN-1 单独授权
+- **不启用 B2-4 / C2 / C3** —— 暂缓项,需业务签字
+- **不把 aidopcore 当作本项目目标库** —— aidopcore 是 AiDOPCore 产品 schema
+- **不跳过 API 重启** —— 旧进程不感知新检查器,会导致部署后行为不一致
+- **不执行 CodeFirst / migration / seed** 在生产或目标库