docs(25): 更正我自己的上一条判断——behavior_score 是上游数据前提,不是本项目缺陷

上一轮我把"behavior_score 初始值为 0"记为**真缺陷**,并说"修复点在画像创建侧"。
继续查后发现前提不成立:**本项目不创建 fin_customer_profile 行**。

证据:全仓搜索 FundCustomerProfile( 只命中类定义(app/model/fund.py:296)与测试文件;
没有任何 INSERT;grep in_customer_profile 在 app/ 下只有类定义与一处注释;
profile_assembly_service 走的是 ORM 读取 + 属性更新,行不存在时返回
profile_row_not_opened(说明它也不创建行)。所以画像行由**本项目之外的流程**写入,
是它把 behavior_score 设成了 0。

本项目的扣分逻辑本身是对的:min(满分, before) - deduction 再 max(0, ...) —— 给定 0,
任何扣分都只能得 0,这是算术必然,不是判断错误。

因此改为"上游数据前提缺失",并给出处置建议:① 上游创建画像时按满分初始化;
② 若上游改不了,则需要一个能区分"未初始化"与"扣光了"的标记(例如新增列),
但仅为这个目的加列的成本收益需要权衡。

**在拿到上游口径之前,本项目不做任何"见 0 就补 20"的处理** —— 0 同样是合法的扣分结果,
那样会把真正扣到 0 的客户错误地抬回满分。
This commit is contained in:
2026-09-11 13:54:27 +08:00
parent 9005bd9a46
commit ccf353901a
+19 -1
View File
@@ -204,7 +204,25 @@ Asia/Shanghai 展示。北京 08:00 前生成时,统计窗口是"前一日 08:
没有任何地方把它初始化成 20。
影响:行为分是"预警结案 → 客户行为评分下降"这条链路的落点,现在这条链路**产出为零**。
修复点在**画像创建侧**(把初始值设为满分),不在风控的扣分逻辑里。
**补充复核(同日):这不是本项目的代码缺陷,而是上游数据前提缺失。**
全仓搜索后确认,**本项目不创建 `fin_customer_profile` 行**:`FundCustomerProfile(` 只出现在
类定义与测试里,没有任何 INSERT;`profile_assembly_service` 走的是 ORM 读取 + 属性更新,
行不存在时返回 `profile_row_not_opened`。也就是说画像行由**本项目之外的流程**写入,
而它写入时把 `behavior_score` 设成了 0。
本项目的扣分逻辑本身是对的:`min(满分, before) - deduction` 再 `max(0, ...)` —— 给定 0,
任何扣分都只能得 0,这是算术必然,不是判断错误。
**处置建议**(不由技术侧单方面决定):
1. 上游创建画像时按满分初始化 `behavior_score`(需上游确认该字段的语义与取值范围);
2. 若上游无法改,则需要一个**能区分"未初始化"与"扣光了"**的标记(例如新增一列),
本项目才能在重建画像时补初值 —— 但仅为了这个目的加列,成本收益需要权衡。
在拿到上游口径之前,本项目**不做**任何"见 0 就补 20"的处理:0 同样是合法的扣分结果,
那样会把真正扣到 0 的客户错误地抬回满分。
---