8 条待决策者拍板的产品取舍(grill 票,等前三批落完再开) #108
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
为什么单独一票
#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,拿原文逐条引证):
复核查出的两种误读模式,grill 时也请自己防着:(A) 机制归属被读错(把注入侧/声明性/被动读成触发侧/决策式/主动,抓手是原文的否定式措辞);(B) 声称的前置里有环节是原文自己已答过的。
Acceptance criteria
本票不产出代码:
## 更新节,不就地改写既有「决策」。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 逐事件写入只能说明归档层未建,不能说明该约束失效。处置建议:至少降到 留痕(记「归档层在
2026-08-18(评估侧):8条全部有归宿,grill 完毕,关闭。
ADR 设计先落 PR #150(资源port/经济hook/环境遥测三处更新节+ADR-0006撤销技能检索延期),再据此开出 6 张实现票 + 1 张追踪票:
8条原始清单里7条走向实现或至少落ADR接线,没有一条判'作废'或'纯留痕'——这个走向比原始查漏预判更激进,本轮 grill 过程中沉淀了两条新原则(详见评估侧记忆):不要用'没出问题'给保守选项背书;不要因为需求来源'非常规'(没有正式声明)就用YAGNI抹掉。
8 条待人类拍板的产品取舍(grill 票,等前三批落完再开)to 8 条待负责人拍板的产品取舍(grill 票,等前三批落完再开)8 条待负责人拍板的产品取舍(grill 票,等前三批落完再开)to 8 条待决策者拍板的产品取舍(grill 票,等前三批落完再开)