EconomicHook实现:TTS char_count接线 #167
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/157-economic-hook"
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 #157
实现内容
ADR-0013 issue #108 grill Q7(2026-08-18 拍板"保留 port,把两种触发时机都写进 ADR"):
EconomicHookProtocol(ports.py,紧邻ResourcePort):async def charge(self, chat_id: str, *, reason: str, amount: int) -> None,与 ADR-0013 原文逐字一致ArisePorts.economic_hook: EconomicHook | None = None——同resourceport 的"存在与否即信号"模式,不新开CapabilitySet布尔位synthesize(#152)产出的char_count接线到economic_hook.charge——_send_pending里原本有一条声称"issue #157 范围,AC 明文排除"的过时注释,实际 AC 明确要求这条接线,已改正为真正调用economic_hook.charge(chat_id, reason="tts_synthesize", amount=char_count)economic_hook为None或char_count为None(host 未声明该统计)时静默不记账,不报错、不阻塞语音本身发出charge调用崩溃后不做任何回滚/补偿尝试,语义上等同 ADR-0013 副作用三层"已发射动作不可逆"那一层两轴 review 修复
CONTEXT.md更新 port 状态说明("经济 hook port 已实现")时,与同文件里依赖该 port 状态的"资源态推送"(快情感态 energy 输入源)段落产生了自相矛盾——charge()是单向调用(core→host 上报消耗),没有任何通道能让 host 把资源余量推回 core,即便 port 已实现,这项输入依然恒为零。已澄清"port 已建成"与"资源态能推送进 energy 轴"是两个方向相反、互不满足的需求。char_count=0是"host 声明了这项统计、这次合成确实 0 字符"的有效值,跟"host 没声明这项统计"(None)是两种不同情况——guard 用is not None而非真值判断,但缺少对应回归测试。补了一条测试,并用 mutation testing 确认它能捕获"guard 被误改成if economic_hook and char_count"这类把 0 当 falsy 处理的退化写法。测试
全部 1952 个测试通过(含 4 条新增的语音合成经济记账测试);
ruff check/lint-imports/ty check干净。新增逻辑(economic_hook 为 None、char_count 为 None、char_count=0 三种边界)均做过 mutation testing 确认能被现有测试捕获。