issue #126: 关系网tension/affinity双轴驱动+文档对齐 #131
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/126-relationship-tension-affinity"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #126
实现
一、affinity(改动面比原估计小——信号已在库里)
speaker_polarity(issue #94 已产出的逐发言人互动极性)就是 affinity 需要的信号,与慢层 per-user valence 共用同一份原始信号。relationship.py::record_affinity_interaction(仿record_trust_disclosure的"读现值→算新值→写回"三段式,纯函数换成apply_affinity_delta的有符号 delta 制),接入delta.py::_compress_one_chat——与慢层 valence 更新相邻但独立的一段循环,不依赖valence是否接线(speaker_polarity是否为空是唯一门槛)。RelationshipAxesModel.affinity列)、独立累积(无衰减)。arise_affinity_polarity_scale(默认 0.05,刻意远小于 valence 的 0.3——affinity 没有衰减机制,是长期累积量)。arise_affinity_bound已在 issue #36 落地,不重复新增。test_the_sort_key_actually_reorders_with_real_nonzero_affinity覆盖整条从 LLM 抽取到落库到渲染的管线,用真实非零、彼此不同的 affinity 值确认排序真的换序——不是"渲染函数本身能排序"这条早已过关的断言。二、tension(本组唯一真需要新 LLM schema 字段的)
speaker_conflict(逐发言人,[0,1]),与既有interaction_polarity/speaker_polarity明确区分语义——不复用极性信号驱动 tension。relationship.py::record_tension_conflict,写回时把tension_updated_at戳成调用时刻的now——decayed_axes的"为None则跳过衰减"短路意味着不写这个字段,自然衰减永远走不到。arise_tension_conflict_gain(默认 0.3)。arise_tension_cap/arise_tension_half_life_seconds已在 issue #36 落地,不重复新增。RelationshipAxesModel已有tension/tension_updated_at两列。三、文档核对:回读 CONTEXT.md/design.md/ADR-0008"决策"节,确认"4 轴封顶"字面均为轴值上限语境,与 issue #114"独立封顶"(注入行数上限)是两件不同的事,无需改动。订正 ADR-0008"issue #36 实现反馈"节一处失实描述:
record_trust_disclosure的两个生产调用点实际都在delta.py::_compress_one_chat,不在runtime_loop.py。两轴 review 发现与修正(2 项,全部确认)
record_tension_conflict最初实现无条件把tension_updated_at戳成now,即便delta为 0(speaker_conflict给了conflict=0,模型明确判断"这批没有冲突迹象")。复核用具体数值复现:tension=0.8 在真实冲突后 3 小时被判定一次conflict=0,若无条件推锚点,6 小时后(一个半衰期)只衰减到 ≈0.566 而不是正确的 0.4——一次"确认无冲突"的评估反而让紧张状态多保留了约 40% 的相对幅度,与"自然衰减防记仇"的立意相反。已修正为delta == 0.0时锚点原样保留,新增回归测试用同一组数值钉住。测试
TestRecordAffinityInteraction(4 个用例)+TestAffinityIsBumpedFromSpeakerPolarity(5 个用例,含非空转排序端到端测试)。TestRecordTensionConflict(6 个用例,含两轴review修正的零delta锚点测试)+TestTensionIsBumpedFromSpeakerConflict(5 个用例,含"极性不推动tension"负向测试 + 变异测试发现的"缺 conflict 键需整条跳过"回归测试)。ty check对本片改动文件全绿。Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com