Files
Neo-ZQYY/docs/audit/changes/2026-03-25__baseline-task-independent-connection-fix.md
Neo 14a12342b5 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>
2026-04-20 06:35:42 +08:00

66 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 变更审计记录:保底任务生成独立连接修复
| 字段 | 值 |
|------|-----|
| 日期 | 2026-03-25 02:41:32 |
| Prompt-ID | P20260325-022806 |
| Session-ID | 0365745f |
| Session 路径 | docs/audit/session_logs/2026-03/25/12_a42c1bea_021513 |
## 操作摘要
修复 `_generate_baseline_relationship_tasks` 与四级漏斗共享数据库连接导致保底任务静默失败的 bug。将该函数从 `_run_for_site()` 提升到 `run()` 主循环 Step 3使用独立业务库连接避免事务污染。同时修正 `ON CONFLICT` 子句匹配实际索引。
## 问题背景
`_generate_baseline_relationship_tasks` 原先在 `_run_for_site()` 内部调用,共享同一个数据库连接 `conn`。当四级漏斗处理过程中事务状态异常时,保底函数的异常被静默捕获,导致:
- 只有 35 个 MAIN/COMANAGE 归属对被处理(四级漏斗)
- 149 个全量服务对中剩余 114 个无任务的对未生成保底 relationship_building 任务
- 小燕assistant_id: 2964673443302213与葛先生member_id: 2799207363643141RS=10.00 超出漏斗 rs_max=6.0,被四级漏斗跳过,保底又静默失败
## 修复内容
1.`_generate_baseline_relationship_tasks``_run_for_site()` 提升到 `run()` 主循环的 Step 3
2. 函数签名从 `(conn, site_id, stats)` 改为 `(site_id, stats)`,内部使用独立 `biz_conn = _get_connection()` + `try/finally: biz_conn.close()`
3. 每个 (assistant, member) 对独立 commit/rollback单条失败不影响其他
4. `ON CONFLICT` 子句修正为匹配实际索引 `idx_coach_tasks_site_assistant_member_type``(site_id, assistant_id, member_id, task_type) WHERE status = 'active'`
5. 更新 `_run_for_site` docstring移除已删除的 Step 3b 描述
## 本次对话文件变更
### 新增文件
- `docs/audit/prompt_logs/prompt_log_20260325_022806.md`
- `docs/audit/session_logs/2026-03/25/12_a42c1bea_021513/main_01_0365745f.md`
- `docs/audit/session_logs/2026-03/25/12_a42c1bea_021513/sub_01_0365745f.md`
- `docs/audit/session_logs/2026-03/25/12_a42c1bea_021513/sub_02_0365745f.md`
## 验证
- 清空测试库任务后重新生成149 条2 high_priority_recall + 1 priority_recall + 146 relationship_building
- 小燕×葛先生任务已生成relationship_building, RS=10.00
## 影响范围
- `task_generator.py``run()``_run_for_site()``_generate_baseline_relationship_tasks()` 三个函数
- 无数据库 schema 变更、无 API 接口变更、前端无需改动
## DDL/迁移检查
- 无新增迁移 SQL
## 改动注解
### `apps/backend/app/services/task_generator.py`
- 变更类型:修改
- 原始原因:用户发现保底 relationship_building 任务生成在四级漏斗事务异常时被静默吞掉149 个全量服务对中 114 个未生成保底任务。根因是 `_generate_baseline_relationship_tasks``_run_for_site` 共享同一个 `conn`,四级漏斗 rollback 后连接状态不确定,后续操作静默失败。
- 思路分析:将保底函数从 `_run_for_site()` 内部提升到 `run()` 主循环,作为独立的 Step 3 在所有门店的四级漏斗Step 2完成后执行。函数内部自行创建和管理独立的 `biz_conn`,彻底隔离事务状态。同时修正 `ON CONFLICT` 子句从错误的索引名改为匹配实际的 `idx_coach_tasks_site_assistant_member_type` partial unique index 的列定义。
- 修改结果:保底任务生成不再受四级漏斗事务状态影响,每个 (assistant, member) 对独立 commit/rollback。RS > 6.0 的客户(如小燕×葛先生 RS=10.00)现在能正确生成 relationship_building 保底任务。
### `apps/backend/tests/unit/test_trigger_jobs_patch.py`
- 变更类型:修改(非高风险,简要注解)
- 测试文件同步更新,适配 `_generate_baseline_relationship_tasks` 签名变更。
## 回滚
恢复 `_generate_baseline_relationship_tasks` 的旧签名 `(conn, site_id, stats)` 并移回 `_run_for_site()` 内部调用即可。