EconomicHook实现——char_count接线(issue #108 Q7) #157

Closed
opened 2026-08-18 02:58:41 +00:00 by KumaAgent · 0 comments
Member

Parent

#108 Q7(issue #108 grill,2026-08-18 拍板:保留 port,把两种触发时机都写进 ADR);ADR 更新见 PR #150

What to build

新增 EconomicHook(host 侧经济动作钩子,可选),ArisePorts.economic_hook: EconomicHook | None
支持两个互不排斥的触发源:命令前置钩子(如清除上下文扣星)与生成中窗口内的资源消耗(如 TTS
char_count,见 #152)。

原文(docs/adr/0013-crash-recovery-and-side-effect-contract.md「更新(2026-08-18,issue #108
grill Q7)」节):

class EconomicHook(Protocol):
    async def charge(self, chat_id: str, *, reason: str, amount: int) -> None:
        """记一笔消耗。core 不关心具体计费单位/汇率,只透传"发生了什么、消耗了多少"。崩溃语义见
        本 ADR 副作用三层——不做补偿/回滚,接受半截效果(同层③已发消息的处理精神,不落回原设想的
        "可补偿"语义)。"""
        ...

②的正确处理不是变成"新的空集需要建补偿引擎",是澄清"②不需要真正的补偿语义,该按层③的精神
处理"
:TTS 合成产出 char_count 后若请求崩溃、音频从未送达,char_count 已消耗的这笔账
回滚
——跟已发射到平台的消息一样,视为"已发生的动作",接受半截效果。

Acceptance criteria

  • EconomicHook Protocol 按上述原文实现,ArisePorts 新增 economic_hook: EconomicHook | None = None(同 resource port,靠存在与否当信号,不新开 CapabilitySet 布尔位)
  • TTS synthesize(#152)产出的 char_count 接线到 economic_hook.charge
  • 不建通用补偿/saga 引擎——ADR-0013 这条既有决策不变,charge 调用崩溃后不做任何回滚/
    补偿尝试,语义上等同层③"已发射动作不可逆"
  • 命令前置钩子路径(如清除上下文扣星)若已有实现,接上同一个 economic_hook.charge;若尚无
    任何命令挂经济动作,本票只需保证 port 契约就位、不强求现在就有第一个命令消费方
  • economic_hookNone 时,char_count 产出但静默不消费(不报错,不阻塞 TTS 合成本身)

Not in scope

  • 不建补偿/saga 引擎(ADR-0013 决策不变)
  • 不实现具体的计费/汇率逻辑——那是 host 的事,core 只透传 charge 调用

Blocked by

  • #152(TTS synthesize 产出 char_count 是本票的第一个真实触发源)——若 #152 未落地,本票
    可以先把 port 契约建好,但没有真实调用点可以接线验证
## Parent #108 Q7(issue #108 grill,2026-08-18 拍板:保留 port,把两种触发时机都写进 ADR);ADR 更新见 PR #150 ## What to build 新增 `EconomicHook`(host 侧经济动作钩子,可选),`ArisePorts.economic_hook: EconomicHook | None`, 支持两个互不排斥的触发源:命令前置钩子(如清除上下文扣星)与生成中窗口内的资源消耗(如 TTS `char_count`,见 #152)。 原文(`docs/adr/0013-crash-recovery-and-side-effect-contract.md`「更新(2026-08-18,issue #108 grill Q7)」节): > ```python > class EconomicHook(Protocol): > async def charge(self, chat_id: str, *, reason: str, amount: int) -> None: > """记一笔消耗。core 不关心具体计费单位/汇率,只透传"发生了什么、消耗了多少"。崩溃语义见 > 本 ADR 副作用三层——不做补偿/回滚,接受半截效果(同层③已发消息的处理精神,不落回原设想的 > "可补偿"语义)。""" > ... > ``` > **②的正确处理不是变成"新的空集需要建补偿引擎",是澄清"②不需要真正的补偿语义,该按层③的精神 > 处理"**:TTS 合成产出 `char_count` 后若请求崩溃、音频从未送达,`char_count` 已消耗的这笔账**不 > 回滚**——跟已发射到平台的消息一样,视为"已发生的动作",接受半截效果。 ## Acceptance criteria - [ ] `EconomicHook` Protocol 按上述原文实现,`ArisePorts` 新增 `economic_hook: EconomicHook | None = None`(同 `resource` port,靠存在与否当信号,不新开 `CapabilitySet` 布尔位) - [ ] TTS `synthesize`(#152)产出的 `char_count` 接线到 `economic_hook.charge` - [ ] **不建通用补偿/saga 引擎**——ADR-0013 这条既有决策不变,`charge` 调用崩溃后不做任何回滚/ 补偿尝试,语义上等同层③"已发射动作不可逆" - [ ] 命令前置钩子路径(如清除上下文扣星)若已有实现,接上同一个 `economic_hook.charge`;若尚无 任何命令挂经济动作,本票只需保证 port 契约就位、不强求现在就有第一个命令消费方 - [ ] `economic_hook` 为 `None` 时,`char_count` 产出但静默不消费(不报错,不阻塞 TTS 合成本身) ## Not in scope - 不建补偿/saga 引擎(ADR-0013 决策不变) - 不实现具体的计费/汇率逻辑——那是 host 的事,core 只透传 `charge` 调用 ## Blocked by - #152(TTS `synthesize` 产出 `char_count` 是本票的第一个真实触发源)——若 #152 未落地,本票 可以先把 port 契约建好,但没有真实调用点可以接线验证
Yushu closed this issue 2026-08-19 06:50:26 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
ProjectKuma/arise#157
No description provided.