Commit e679ec2e by luoqi

fix(friday): 患者关系边方向反了 —— enum_mapping 去掉多余的逆映射

patient_relation.yaml 的注释断言「码 = 本人(customer)是对方(referee)的 X」(依据
RecommendRelationshipEnum.reverseValue() 源码 + 早期年龄差推断),于是 enum_mapping
整体取逆:码2 爸爸→child、码3 子女→father/mother、码5 爷爷→grandchild……
数据把这个假设推翻了:码本来就是「对方是本人的 X」,与 PAC 契约同向,不该反转。

【证据一:PAC 侧方向矛盾率】按「关系人比本人年长/年轻是否合理」判定,只算两边都建档
且都有生日的边:
  friday   1187/1255 = 94.6%   ← 系统性反转
  jvs-dw    432/10842 =  4.0%   ← 人工零星录错的正常水平(其 yaml 是对的,不动)
互反对更硬:motherchild 326 对里只有 8 对方向正确(2.5%);fatherchild 231 对里 9 对。
实样:秦佳(47) --mother--> 韩秦瑜(21),同时 韩秦瑜(21) --child--> 秦佳(47)
—— 两条边互相自洽但都与年龄矛盾,去掉逆映射两条就都对了。

【证据二:源库独立复核(不经 PAC 摄入)】join customer_basic_info 两侧 birthday:
  码10 妈妈  关系人年长 419/430(97%),平均大 27.4 岁
  码 3 子女  本人年长   643/675(95%),平均小 26.8 岁
  码 2 爸爸  关系人年长 252/277(91%),平均大 26.1 岁
  码15 外公  关系人年长  20/22 (91%)  |  码11 奶奶 17/19(89%)  |  码16 外婆 15/17(88%)
  码17 外孙  本人年长    31/36 (86%)  |  码 6 孙辈 32/46(70%)
方法学对照:对称码(1配偶 348/354、4兄弟 56/55、7朋友 265/264)全是 50/50,说明这个
年龄判据本身干净,有方向码上的强烈偏斜不是判据偏差。
剩余 3–5% 符合逆读法的边判为源侧人工录错(与 jvs-dw 的 4% 同量级),不为它们反转全局。

顺手修掉一个静默 bug:旧版码3 只配了 "3|1"/"3|2",没有 "3|" —— 对方性别缺失的边
(源库 15 条)会掉进 _default: other。本版每个码的 |1 / |2 / | 三个变体都列全。

同向映射后性别不再参与判定(码2 自带 father、码10 自带 mother、码3→child 不分性别),
transforms 里的 _referee_with_sex + push_fallback 成了死配置 —— 留待单独一次清理,
不跟方向修正混在一起改。

回归闸 tests/friday-relation-direction.spec.ts:不比对字符串字面量,而是用源库实测的
辈分方向锁语义(长辈码不得映射成晚辈词,反之亦然)。已验证该闸对旧 yaml 报 21 项失败。

️ 未含数据修复:patient_relations 唯一键是 (patient_id, related_external_id,
relationship),relationship 变了就是新行而非更新 —— 重摄只会在错边旁边新增对边。
必须先删 friday 存量关系边再重摄。该步骤待部署后单独执行。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
parent f23bfefe
Pipeline #3493 failed in 0 seconds