chore(audit): 补追 96 份未入仓审计孤本 — 覆盖 2026-02-26 ~ 2026-04-08

这些审计记录原本堆积在 docs/audit/changes/changes/ 嵌套误产物目录下(由开发机迁移
79d3c2e 前后的不明批量操作产生)。由于同期 .gitignore 屏蔽了 docs/audit/ 全目录,
它们从未入过 git 任何分支 history。删除即永久丢失。

按 docs/specs/audit-gap-recovery/tasks.md 阶段 1 执行,将全部 96 份 D 类孤本
(主目录无同名、git history 亦无记录)复制到 docs/audit/changes/ 主目录入仓。

涵盖主题: P1-P18 全栈集成 / 多模块累积变更 / ETL bug 修复 / 业务日切 /
   召回与任务引擎改造 / 租户管理与审批 / 董事会财务 / 客户与助教详情 /
   DDL 基线合并 / Kiro 到 Claude Code 迁移

阶段 2(B 类内容漂移 1 份)和阶段 4(嵌套目录删除)独立推进。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Neo
2026-04-20 06:35:42 +08:00
parent 80bda9b991
commit 14a12342b5
96 changed files with 9521 additions and 0 deletions

View File

@@ -0,0 +1,55 @@
# 变更审计记录coach_service 绩效档位硬编码修复
| 字段 | 值 |
|------|-----|
| 日期 | 2026-03-19 16:45:10 |
| Prompt-ID | P20260319-163903 |
| Session-ID | 4782a6d3 |
| Session 路径 | docs/audit/session_logs/2026-03/19/43_4782a6d3_162502 |
## 操作摘要
RNS1 全系列 SPEC 审计发现 `coach_service.py``DEFAULT_TIER_NODES` 硬编码 `[0, 100, 130, 160, 190, 220]` 违反 feiqiu-data-rules 规则 6绩效档位禁止硬编码。配置表 `cfg_performance_tier` 实际有效值为 `[0, 120, 150, 180, 210]`,两者完全不一致。本次修复删除硬编码常量,改为从配置表动态读取,并修复 `perf_target` 推算逻辑。
## 本次对话文件变更
### 新增文件
- `docs/audit/prompt_logs/prompt_log_20260319_163903.md`
- `docs/audit/session_logs/2026-03/19/43_4782a6d3_162502/main_01_bab93fd1.md`
### 删除文件
- `docs/audit/session_logs/2026-03/19/43_4782a6d3_162502/main_01_48b374db.md`
## 风险评估
- **风险等级**:低
- `_FALLBACK_TIER_NODES` 作为降级保底,配置表查询失败不会导致崩溃
- `perf_target` 推算逻辑简单:找到第一个大于当前工时的 tier 节点
- 影响范围仅限 `coach_service.get_coach_detail()` 接口返回的 `tierNodes``perf_target` 字段
## 合规检查
| 检查项 | 状态 |
|--------|------|
| 新增迁移 SQL | 无 |
| DDL 基线更新 | 不适用 |
| OpenAPI spec 同步 | 不适用(`api_changed: false` |
| BD 手册更新 | 不适用(无 DB schema 变更,仅读取已有配置表) |
| 文档同步 | `code_without_docs` 为空,无缺失 |
## 改动注解
### `apps/backend/app/services/coach_service.py`
- 变更类型:修改
- 原始原因:`DEFAULT_TIER_NODES` 硬编码 `[0, 100, 130, 160, 190, 220]` 违反 feiqiu-data-rules 规则 6且与配置表实际值 `[0, 120, 150, 180, 210]` 完全不一致,导致前端展示的绩效档位与实际业务规则脱节
- 思路分析:
1. 删除 `DEFAULT_TIER_NODES` 硬编码常量,替换为 `_FALLBACK_TIER_NODES`(值更新为与配置表一致的 `[0, 120, 150, 180, 210]`),仅在配置表查询失败时作为降级使用
2. `_build_tier_nodes()` 签名从 `(salary_data: dict)` 改为 `(conn, site_id)`,内部调用 `fdw_queries.get_performance_tiers()``app.v_cfg_performance_tier` 视图读取当前有效档位
3. `get_coach_detail()``perf_target``salary_this.get("next_tier_hours", 0.0)`(总是返回 0改为根据 `tier_nodes` 和当前工时动态推算下一档目标
- 修改结果:绩效档位数据源从硬编码切换为配置表驱动,符合 feiqiu-data-rules 规则 6`perf_target` 能正确反映下一档目标工时;降级机制确保配置表不可用时不崩溃
### `apps/backend/app/services/fdw_queries.py`
- 变更类型:修改
- 原始原因:配合 `coach_service.py` 的档位读取改造,需要更新 `get_salary_calc()` 中关于 `tier_nodes` 的注释说明
- 思路分析:`get_salary_calc()` 返回的 `tier_nodes` 字段改为空数组,注释明确说明"由 `coach_service._build_tier_nodes()``cfg_performance_tier` 读取",职责分离清晰
- 修改结果:`fdw_queries` 不再承担档位数据的传递职责,`get_performance_tiers()` 函数(上一个 session 已创建)作为独立查询入口供 `coach_service` 调用