# 变更审计记录：保底任务生成独立连接修复

| 字段 | 值 |
|------|-----|
| 日期 | 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: 2799207363643141）RS=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()` 内部调用即可。
