8 条待决策者拍板的产品取舍(grill 票,等前三批落完再开) #108

Closed
opened 2026-08-03 02:25:26 +00:00 by KumaAgent · 1 comment
Member

这是一张 grill 票,不是实现票。状态:待评估——8 条都是产品取舍,不是技术判断,必须由维护者逐条拍板后才能拆片。

来源:2026-07-29 全 ADR 查漏 77 条落差里判为「待人类拍板」的部分(原 9 条,其中「ADR-0008 注入分档」已于 2026-08-03 单独拍板——恢复分档 + 新建 lookup_relation 工具,因为它影响 #103 的拆片,见 #103 正文——故本票剩 8 条)。

为什么单独一票

#103(第四批清单)原本把这些写进 AC,但正文又写着「不在本票范围」——自相矛盾,且会让 31 条的拆片被一轮尚未安排的 grill 挟持。已拆开:#103 只管 31 条实现类,本票只管这 8 条产品取舍。

按「标成已知必须写归宿」的规则,它们不能只被枚举在 #101 的附录里而无人拥有——本票就是那个归宿。

时机

已决定推迟到前三批(#95 / #97 / #101 / #102)落完后再开这一轮。 这是时间安排,不是技术阻塞——8 条都不改代码,也不阻塞任何在途票。

唯一已知的耦合:其中 2 条(资源 port / 经济 hook)动的是 ADR-0001 的 port 枚举,而 #101 也要改一批 ADR。若 #101 先落地,这 2 条的结论将来要再追加一次更新节。本仓惯例本就是追加不改写,代价可接受;#101 已加防悬空措辞,不会写下会失效的引用。

复核状态(重要)

这 8 条的裁决已过一轮对抗性复核(2026-08-03,拿原文逐条引证):

  • 4 条判「裁决成立」:ADR-0013 单一 DB 事务 / ADR-0014 环境遥测 / CONTEXT.md 技能三级披露(另一条 ADR-0008 已单独拍板出池)。skeptic 二次重查,推翻 0 条。
  • 4 条判「部分成立」:方向不变(仍需人拍板),但裁决理由有误读,grill 时不要照抄——以原文为准。

复核查出的两种误读模式,grill 时也请自己防着:(A) 机制归属被读错(把注入侧/声明性/被动读成触发侧/决策式/主动,抓手是原文的否定式措辞);(B) 声称的前置里有环节是原文自己已答过的。

Acceptance criteria

本票不产出代码

  • 8 条逐条与维护者 grill,各有明确结论(实现 / 作废 / 留痕)。
  • 判「实现」的拆成 slice ticket 或并进 #103 的分组。
  • 判「作废 / 留痕」的按本仓惯例追加 ## 更新,不就地改写既有「决策」。
  • 本票关闭时 8 条全部有归宿,不留「其余」。

8 条清单

1. ADR-0013 决策节(副作用三层的第 ① 层)

断言:core 内部持久写包进单一 DB 事务,崩溃=从未 commit=自动回滚

为何需要人拍板:这是本批里唯一的架构级分叉,不是漏实现。证据是 storage.py:714 那句注释「独立提交(ADR-0013)」——实现者读了同一份 ADR 却得出相反结论,说明 ADR 原文的表述本身就没能把「请求级事务」这个边界钉住。两条路各有代价:走请求级事务要把 session 沿 StoragePort 全协议往下传(38 处 commit + 4 个 APScheduler 作业 + port 契约变形),是本表最大改动面,而且它会改 port 契约、属于免费窗口内该做的事;维持独立提交则要在 ADR 追加更新节明确「半截状态可见是接受的行为」,并说明为什么这与 fail-closed 不矛盾。前者贵、后者可能推翻 ADR-0013 的立论基础,都不该由实现方单方面定。

2. ADR-0011 决策 6(TTS:引擎无关 port 契约)

断言:资源 port 的 TTS 契约 synthesize(text, voice_id) → (audio_ref, char_count?)

为何需要人拍板:与 48 是同一个决定,必须一起裁。当前形状(core 只传 host 不透明的 voice_ref,host 全包合成)确实更简单,但有个真实后果:模型无法把任意文本说成语音,只能引用「已经存在的」语音资源,而它又拿不到任何资源清单(tools.py:40 只告诉它「填一个引用标识」),等于 content_type="voice" 在实践中不可用。三条路——(a) 补资源 port(core 拿目录、拿合成契约,char_count 喂经济 hook);(b) 正式作废,把语音收窄为「host 在 persona/lore 里自陈可用语音清单」的纯提示词方案;(c) 让 host 把静态语音/贴纸灌进 learned_sticker 库统一走 search_stickers。这是产品取舍(智能体到底会不会说话)不是技术判断。且它改 port 契约,属于免费窗口内必须定的事。

3. ADR-0014 环境感知「更新(2026-07-11 第三轮)」节

断言:新增 per-user 环境遥测独立信号类别,与 EnvironmentSignal 区分

为何需要人拍板:实现是反着做的,而且代码文档坦白了:遥测「复用同一个 EnvironmentSignal 契约(不新增字段/类型)」,识别靠插件名白名单。两边都有道理——实现侧的复用是 YAGNI 正确的,ADR 侧担心的「稀释 EnvironmentSignal 定义」也确实发生了(它的类文档仍写「同群其它插件产出的旁观事件」,现在却同时承载私人摄像头/设备感知流),而「per-user 而非 per-chat_id」这个语义差被 host「挑一个会话当呈现载体」的 hack 掩盖着。这是 port 契约层的取舍,落在免费窗口内必须定。若维持复用,ADR-0014 与 CONTEXT.md:308/design.md:387 三处都要改口。

4. ADR-0001 —「决策」节七类 port 枚举(资源 port)

断言:资源 port:贴纸/表情/反应图/TTS 目录,目录化无硬编码

为何需要人拍板:与 28 是同一个决定。功能空洞是真的:模型被告知 content_type 可以填 sticker/voice,却拿不到任何 ID→含义→文件 的目录,search_stickers 只覆盖习得贴纸,一个有策划贴纸包的 host(dxkuma 的迪拉熊表情正是这种)无从暴露它。但也确实有零 core 改动的替代路径(host 把目录写进 persona/lore 文本,或把静态贴纸灌进习得库统一走 search_stickers)。ADR-0024 在 07-09 还写「与资源 port 的静态贴纸目录并存不合并」,说明作者当时仍要它——所以这不是「没人需要」,是「需要方式没定」。改 ArisePorts 字段,免费窗口内必须定。

5. CONTEXT.md「技能(Skill)」条 + design.md 能动性层「技能」条 + mermaid othertool 节点

断言:三级渐进披露(列表/全文/文件);inject_skills 按需检索注入;冷启动从向量 metadata 重建

为何需要人拍板:ADR-0006 已在 07-24 更新节明确认领并延期(写得很好,理由是 YAGNI),所以文档侧只欠 CONTEXT.md:426 与 design.md:418 回填——但我把它升级为拍板,因为有一笔正在流血的成本没人算:写入侧仍在每个反思周期跑(reflection.py:320 写技能 + embedding 调用),落进一个零读取方的 Qdrant collection。技能库要么补检索侧让这笔钱有回报,要么把写入侧一并停掉、连同 collection 删除。持续为无人消费的数据付 embedding 费,是 ponytail 传统下最该被问的那种事。

6. CONTEXT.md「慢中断」条 + design.md 决策基线/真人感层/上线路线第 4 阶段

断言:慢中断/linger:被交互后高活跃窗口,非@消息按衰减概率接话

为何需要人拍板:这条背后是本仓最大的一个未做的产品决定:arise 至今完全不接收群内非 @ 消息(唯一入口 on_message(rule=to_me())),而且 Drive Tick 显式跳过所有群聊(init.py:1740),所以「群里冷场了主动说话」「群里聊到有意思的话题接一句」在实现里整体不存在——主动开口三件套实际只在私聊生效。gating.py:26 老实写了「接入这类消息是新增消息接收面/成本面的独立决定」。这不是补一个 boost 接线的事:要定的是 arise 到底看不看全量群消息(成本、隐私、消息量),定了之后 linger、沉默窗口(60)、群聊 drive tick 才有共同地基。建议单独立一份 PRD 而不是塞进查漏 ticket。

7. ADR-0001 —「决策」节七类 port 枚举末项(经济 hook)

断言:经济 hook(可选,如扣星)

为何需要人拍板:「作废」的整条立论建立在两个被原文推翻的事实上:唯一挂载场景(错——TTS char_count 是第二个,且在 core 内),以及 core 无需要 hook 的时间点(错,同上;ADR-0013 那句只管时间窗、不管组件归属)。再加上「(可选)」四处明标、ADR-0010 07-08 还在往这个 port 上挂遥测指标,按「作废用更严尺度、有疑义往不成立判」的要求,这条不能撤。建议改判 待人类拍板:需要作者本人裁决 ADR-0011 §6(char_count 喂经济 hook,落在生成窗口内)与 ADR-0013 / design.md:245(扣星是命令前置钩子)之间的真实矛盾,且它触及 ArisePorts 表面(与下标 9 同一形状,免费窗口内应定)。若人类只想记录不想动,留痕 是可接受的下限,但必须把 char_count 那条接线一并写进留痕内容。

8. design.md 存储与记忆工程「归档」bullet + 决策基线表第 7 行 + CONTEXT.md「三因子召回」条 + ADR-0009 决策节

断言:归档:episodic 与 checkpoint archive 拆两 collection;archive blob 分条化

为何需要人拍板:这是作废类,按更严尺度看站不住。第一,文档在弃 LangGraph 之后仍有三处把「归档」当活的三因子语义召回路径枚举(ADR-0009:45、ADR-0015:39、CONTEXT.md:441),而裁决的整改范围只覆盖 design.md:322 / 决策基线表第 7 行 / CONTEXT.md:375——若真作废,这三处也必须处理;漏掉它们本身说明「归档」被当成了残留名词而非承重概念。第二,「载体随弃 LangGraph 消失」在原文里找不到依据:ADR-0013:5 只写「弃了它的 checkpointer」,ADR-0013:11 把 checkpoint 界定为会话状态,ADR-0010:11/CONTEXT.md:526 里 checkpoint 就是「短期记忆(会话上下文)」,这东西自研 loop 照样有;而 ADR-0002:7 早已自陈旧痛点「部分是迁就框架…的产物」,ADR-0009 是在知情下仍立决策,姐妹项 delta 真增量还落地了——用一个当时已知情的事实回头撤销,是把原文已权衡过的判断重开成撤销理由。第三,「blob 分条化的病不存在」这半把约束对象从 archive 换成了 episodic:原文限定的是 archive blob,episodic 逐事件写入只能说明归档层未建,不能说明该约束失效。处置建议:至少降到 留痕(记「归档层在

> **这是一张 grill 票,不是实现票。** 标 `状态:待评估`——8 条都是**产品取舍**,不是技术判断,必须由维护者逐条拍板后才能拆片。 > > 来源:2026-07-29 全 ADR 查漏 77 条落差里判为「待人类拍板」的部分(原 9 条,其中「ADR-0008 注入分档」已于 2026-08-03 单独拍板——**恢复分档 + 新建 `lookup_relation` 工具**,因为它影响 #103 的拆片,见 #103 正文——故本票剩 8 条)。 ## 为什么单独一票 #103(第四批清单)原本把这些写进 AC,但正文又写着「不在本票范围」——**自相矛盾**,且会让 31 条的拆片被一轮尚未安排的 grill 挟持。已拆开:#103 只管 31 条实现类,本票只管这 8 条产品取舍。 按「**标成已知必须写归宿**」的规则,它们不能只被枚举在 #101 的附录里而无人拥有——本票就是那个归宿。 ## 时机 **已决定推迟到前三批(#95 / #97 / #101 / #102)落完后再开这一轮。** 这是**时间安排,不是技术阻塞**——8 条都不改代码,也不阻塞任何在途票。 唯一已知的耦合:其中 2 条(资源 port / 经济 hook)动的是 **ADR-0001 的 port 枚举**,而 #101 也要改一批 ADR。若 #101 先落地,这 2 条的结论将来要再追加一次更新节。本仓惯例本就是追加不改写,代价可接受;#101 已加防悬空措辞,不会写下会失效的引用。 ## 复核状态(重要) 这 8 条的裁决**已过一轮对抗性复核**(2026-08-03,拿原文逐条引证): - **4 条判「裁决成立」**:ADR-0013 单一 DB 事务 / ADR-0014 环境遥测 / CONTEXT.md 技能三级披露(另一条 ADR-0008 已单独拍板出池)。skeptic 二次重查,推翻 0 条。 - **4 条判「部分成立」**:方向不变(仍需人拍板),但**裁决理由有误读,grill 时不要照抄**——以原文为准。 复核查出的两种误读模式,grill 时也请自己防着:**(A)** 机制归属被读错(把注入侧/声明性/被动读成触发侧/决策式/主动,抓手是原文的否定式措辞);**(B)** 声称的前置里有环节是原文自己已答过的。 ## Acceptance criteria 本票**不产出代码**: - [ ] 8 条逐条与维护者 grill,各有明确结论(实现 / 作废 / 留痕)。 - [ ] 判「实现」的拆成 slice ticket 或并进 #103 的分组。 - [ ] 判「作废 / 留痕」的按本仓惯例**追加 `## 更新` 节**,不就地改写既有「决策」。 - [ ] 本票关闭时 8 条全部有归宿,不留「其余」。 --- # 8 条清单 ### 1. ADR-0013 决策节(副作用三层的第 ① 层) **断言**:core 内部持久写包进单一 DB 事务,崩溃=从未 commit=自动回滚 **为何需要人拍板**:这是本批里唯一的架构级分叉,不是漏实现。证据是 storage.py:714 那句注释「独立提交(ADR-0013)」——实现者读了同一份 ADR 却得出相反结论,说明 ADR 原文的表述本身就没能把「请求级事务」这个边界钉住。两条路各有代价:走请求级事务要把 session 沿 StoragePort 全协议往下传(38 处 commit + 4 个 APScheduler 作业 + port 契约变形),是本表最大改动面,而且它会改 port 契约、属于免费窗口内该做的事;维持独立提交则要在 ADR 追加更新节明确「半截状态可见是接受的行为」,并说明为什么这与 fail-closed 不矛盾。前者贵、后者可能推翻 ADR-0013 的立论基础,都不该由实现方单方面定。 ### 2. ADR-0011 决策 6(TTS:引擎无关 port 契约) **断言**:资源 port 的 TTS 契约 synthesize(text, voice_id) → (audio_ref, char_count?) **为何需要人拍板**:与 48 是同一个决定,必须一起裁。当前形状(core 只传 host 不透明的 voice_ref,host 全包合成)确实更简单,但有个真实后果:模型无法把任意文本说成语音,只能引用「已经存在的」语音资源,而它又拿不到任何资源清单(tools.py:40 只告诉它「填一个引用标识」),等于 content_type="voice" 在实践中不可用。三条路——(a) 补资源 port(core 拿目录、拿合成契约,char_count 喂经济 hook);(b) 正式作废,把语音收窄为「host 在 persona/lore 里自陈可用语音清单」的纯提示词方案;(c) 让 host 把静态语音/贴纸灌进 learned_sticker 库统一走 search_stickers。这是产品取舍(智能体到底会不会说话)不是技术判断。且它改 port 契约,属于免费窗口内必须定的事。 ### 3. ADR-0014 环境感知「更新(2026-07-11 第三轮)」节 **断言**:新增 per-user 环境遥测独立信号类别,与 EnvironmentSignal 区分 **为何需要人拍板**:实现是反着做的,而且代码文档坦白了:遥测「复用同一个 EnvironmentSignal 契约(不新增字段/类型)」,识别靠插件名白名单。两边都有道理——实现侧的复用是 YAGNI 正确的,ADR 侧担心的「稀释 EnvironmentSignal 定义」也确实发生了(它的类文档仍写「同群其它插件产出的旁观事件」,现在却同时承载私人摄像头/设备感知流),而「per-user 而非 per-chat_id」这个语义差被 host「挑一个会话当呈现载体」的 hack 掩盖着。这是 port 契约层的取舍,落在免费窗口内必须定。若维持复用,ADR-0014 与 CONTEXT.md:308/design.md:387 三处都要改口。 ### 4. ADR-0001 —「决策」节七类 port 枚举(资源 port) **断言**:资源 port:贴纸/表情/反应图/TTS 目录,目录化无硬编码 **为何需要人拍板**:与 28 是同一个决定。功能空洞是真的:模型被告知 content_type 可以填 sticker/voice,却拿不到任何 ID→含义→文件 的目录,search_stickers 只覆盖**习得**贴纸,一个有策划贴纸包的 host(dxkuma 的迪拉熊表情正是这种)无从暴露它。但也确实有零 core 改动的替代路径(host 把目录写进 persona/lore 文本,或把静态贴纸灌进习得库统一走 search_stickers)。ADR-0024 在 07-09 还写「与资源 port 的静态贴纸目录并存不合并」,说明作者当时仍要它——所以这不是「没人需要」,是「需要方式没定」。改 ArisePorts 字段,免费窗口内必须定。 ### 5. CONTEXT.md「技能(Skill)」条 + design.md 能动性层「技能」条 + mermaid othertool 节点 **断言**:三级渐进披露(列表/全文/文件);inject_skills 按需检索注入;冷启动从向量 metadata 重建 **为何需要人拍板**:ADR-0006 已在 07-24 更新节明确认领并延期(写得很好,理由是 YAGNI),所以文档侧只欠 CONTEXT.md:426 与 design.md:418 回填——但我把它升级为拍板,因为有一笔正在流血的成本没人算:写入侧仍在每个反思周期跑(reflection.py:320 写技能 + embedding 调用),落进一个零读取方的 Qdrant collection。技能库要么补检索侧让这笔钱有回报,要么把写入侧一并停掉、连同 collection 删除。持续为无人消费的数据付 embedding 费,是 ponytail 传统下最该被问的那种事。 ### 6. CONTEXT.md「慢中断」条 + design.md 决策基线/真人感层/上线路线第 4 阶段 **断言**:慢中断/linger:被交互后高活跃窗口,非@消息按衰减概率接话 **为何需要人拍板**:这条背后是本仓最大的一个未做的产品决定:arise 至今完全不接收群内非 @ 消息(唯一入口 on_message(rule=to_me())),而且 Drive Tick 显式跳过所有群聊(__init__.py:1740),所以「群里冷场了主动说话」「群里聊到有意思的话题接一句」在实现里整体不存在——主动开口三件套实际只在私聊生效。gating.py:26 老实写了「接入这类消息是新增消息接收面/成本面的独立决定」。这不是补一个 boost 接线的事:要定的是 arise 到底看不看全量群消息(成本、隐私、消息量),定了之后 linger、沉默窗口(60)、群聊 drive tick 才有共同地基。建议单独立一份 PRD 而不是塞进查漏 ticket。 ### 7. ADR-0001 —「决策」节七类 port 枚举末项(经济 hook) **断言**:经济 hook(可选,如扣星) **为何需要人拍板**:「作废」的整条立论建立在两个被原文推翻的事实上:唯一挂载场景(错——TTS char_count 是第二个,且在 core 内),以及 core 无需要 hook 的时间点(错,同上;ADR-0013 那句只管时间窗、不管组件归属)。再加上「(可选)」四处明标、ADR-0010 07-08 还在往这个 port 上挂遥测指标,按「作废用更严尺度、有疑义往不成立判」的要求,这条不能撤。建议改判 `待人类拍板`:需要作者本人裁决 ADR-0011 §6(char_count 喂经济 hook,落在生成窗口内)与 ADR-0013 / design.md:245(扣星是命令前置钩子)之间的真实矛盾,且它触及 ArisePorts 表面(与下标 9 同一形状,免费窗口内应定)。若人类只想记录不想动,`留痕` 是可接受的下限,但必须把 char_count 那条接线一并写进留痕内容。 ### 8. design.md 存储与记忆工程「归档」bullet + 决策基线表第 7 行 + CONTEXT.md「三因子召回」条 + ADR-0009 决策节 **断言**:归档:episodic 与 checkpoint archive 拆两 collection;archive blob 分条化 **为何需要人拍板**:这是作废类,按更严尺度看站不住。第一,文档在弃 LangGraph 之后仍有三处把「归档」当活的三因子语义召回路径枚举(ADR-0009:45、ADR-0015:39、CONTEXT.md:441),而裁决的整改范围只覆盖 design.md:322 / 决策基线表第 7 行 / CONTEXT.md:375——若真作废,这三处也必须处理;漏掉它们本身说明「归档」被当成了残留名词而非承重概念。第二,「载体随弃 LangGraph 消失」在原文里找不到依据:ADR-0013:5 只写「弃了它的 checkpointer」,ADR-0013:11 把 checkpoint 界定为会话状态,ADR-0010:11/CONTEXT.md:526 里 checkpoint 就是「短期记忆(会话上下文)」,这东西自研 loop 照样有;而 ADR-0002:7 早已自陈旧痛点「**部分**是迁就框架…的产物」,ADR-0009 是在知情下仍立决策,姐妹项 delta 真增量还落地了——用一个当时已知情的事实回头撤销,是把原文已权衡过的判断重开成撤销理由。第三,「blob 分条化的病不存在」这半把约束对象从 archive 换成了 episodic:原文限定的是 archive blob,episodic 逐事件写入只能说明归档层未建,不能说明该约束失效。处置建议:至少降到 留痕(记「归档层在
Author
Member

2026-08-18(评估侧):8条全部有归宿,grill 完毕,关闭。

ADR 设计先落 PR #150(资源port/经济hook/环境遥测三处更新节+ADR-0006撤销技能检索延期),再据此开出 6 张实现票 + 1 张追踪票:

  • Q1 ADR-0013单一事务边界 → #151(现在做真正的请求级事务)
  • Q2 资源port → #152(真建,host声明目录+TTS合成契约)
  • Q3 ADR-0014环境遥测 → #153(建独立类型,堵住已核实的真实隐私泄漏,不是纯措辞问题)
  • Q4 Skill三级披露 → #154(撤销YAGNI延期,补检索侧)
  • Q5 群聊非@消息 → #155(追踪票,不是实现票,待评估侧后续单独走完整PRD)
  • Q6 ADR-0009归档拆分 → #156(现在实现,此前误判'作废'已在#101/#103那轮纠正)
  • Q7 经济hook → #157(保留port,两种触发时机写进ADR;blocked by #152)

8条原始清单里7条走向实现或至少落ADR接线,没有一条判'作废'或'纯留痕'——这个走向比原始查漏预判更激进,本轮 grill 过程中沉淀了两条新原则(详见评估侧记忆):不要用'没出问题'给保守选项背书;不要因为需求来源'非常规'(没有正式声明)就用YAGNI抹掉。

2026-08-18(评估侧):8条全部有归宿,grill 完毕,关闭。 ADR 设计先落 PR #150(资源port/经济hook/环境遥测三处更新节+ADR-0006撤销技能检索延期),再据此开出 6 张实现票 + 1 张追踪票: - Q1 ADR-0013单一事务边界 → #151(现在做真正的请求级事务) - Q2 资源port → #152(真建,host声明目录+TTS合成契约) - Q3 ADR-0014环境遥测 → #153(建独立类型,堵住已核实的真实隐私泄漏,不是纯措辞问题) - Q4 Skill三级披露 → #154(撤销YAGNI延期,补检索侧) - Q5 群聊非@消息 → #155(追踪票,不是实现票,待评估侧后续单独走完整PRD) - Q6 ADR-0009归档拆分 → #156(现在实现,此前误判'作废'已在#101/#103那轮纠正) - Q7 经济hook → #157(保留port,两种触发时机写进ADR;blocked by #152) 8条原始清单里7条走向实现或至少落ADR接线,没有一条判'作废'或'纯留痕'——这个走向比原始查漏预判更激进,本轮 grill 过程中沉淀了两条新原则(详见评估侧记忆):不要用'没出问题'给保守选项背书;不要因为需求来源'非常规'(没有正式声明)就用YAGNI抹掉。
Yushu changed title from 8 条待人类拍板的产品取舍(grill 票,等前三批落完再开) to 8 条待负责人拍板的产品取舍(grill 票,等前三批落完再开) 2026-08-19 02:36:44 +00:00
Yushu changed title from 8 条待负责人拍板的产品取舍(grill 票,等前三批落完再开) to 8 条待决策者拍板的产品取舍(grill 票,等前三批落完再开) 2026-08-19 02:36:55 +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#108
No description provided.