文档批:全 ADR 查漏的 10 条作废 + 21 条留痕 + 结掉 design.md 七层线头 #96

Closed
opened 2026-07-29 08:25:21 +00:00 by KumaAgent · 3 comments
Member

来源:2026-07-29 全 ADR 查漏(31 份 ADR + CONTEXT.md + design.md 对照 origin/main @ 649673c,24 个 agent,78 条候选 → 77 条经对抗性复核确认)。本票是第二批纯文档、零代码改动,全部落在 docs 分支。

为什么单独一票

这批与代码无关,可以和第一批(bug 修复)并行推进而互不干扰。它要关掉的是本项目反复出现的一类问题:「文档说有、代码没有」——历史上已至少四次(issue #61 的「灰度可一键关」、MediaKind.file、ADR-0030 整份未落地、以及本轮查出的这批)。前两次都是撞见的、不是查出来的,说明"留痕"这个手段一直没在防住它们。

硬性格式要求(本仓惯例,不得违反)

一律只追加 ## 更新(2026-07-xx,issue #N) 节,绝不就地改写既有「决策」/「拒绝了」节。

三条实证先例:

  • ADR-0004 的「决策」节至今保留已被 ADR-0030 宣布移除的 poke 位;
  • ADR-0010 用「上一条更新(issue #41)记的『尚未实现』已过时」推翻前文而不删前文;
  • ADR-0001 的 #80 更新同形。

CONTEXT.md / design.md 不适用「更新节」体例,就地修订即可,但改动要能被 git log 追溯到本票

任务一:10 条判为「作废」

这些断言不该继续有效——需求变了 / 被更好的方案取代 / 当初就是投机。逐条在对应 ADR 追加更新节明确作废并写明理由

注意:作废不是"删掉断言",是"追加一节说明它为何不再适用"。读者仍应能读到原文与推翻它的理由。本项目 ponytail/YAGNI 传统认为「文档写了但一直没人需要」本身就是它可能不该存在的证据——但理由必须写出来,不能只标一个"作废"。

任务二:21 条判为「留痕」

这些暂不实现,但必须在文档里如实标注「尚未实现」,防止后来者把它当既成事实援引。

本项目已经因此栽过:PRD 引用过一个 grep 不到的 API,因为 ADR 拍过板但从未落地(见 feedback_adr-decided-but-unimplemented-is-not-a-typo)。

措辞纪律(ADR-0010 issue #83 节定过):写清「当下未实现」比写一个听起来合理但错误的理由重要。不确定为什么没实现就只写事实,不要编一个理由。

任务三:结掉 design.md 的七层线头

docs/design.md「作废/取代」节里有一句:

旧 ADR-0003「收拢为 dxkuma 内部包 arise/」——作废(独立仓天然独立),分层思路留作 core 内部结构参考

这条从未被执行。2026-07-29 的结构实测已经给出了结论,结掉它、不执行,并补上实测依据:

  • 55 个模块没有自然簇(标签传播跑出 53+3;摘掉七个最大模块后,剩 49 个里仍有 33 个粘成一坨);
  • 照架构图七层装桶会整个塌成一个 SCC,最小反向边集 26/170 跨层边;加一个 shared 契约桶才降到 5 条,再调三个模块归属到 2 条;
  • 架构图缺 1~2 个桶:一个 shared/contracts,以及 judge_persona_drift(4 个调用方跨 Memory/Agency)、recency_decay(3 个跨 Memory/Presence)这类横切原语的归属;
  • Routing 层已被 ADR-0028/ADR-0020 搁置,今天无对应代码。

层名保留为叙述词汇(CONTEXT.md 就是按这些分节的),只是不再作为分包依据。

Acceptance criteria

  • 10 条作废各有一条更新节,含为何不再适用的理由。
  • 21 条留痕各有「尚未实现」标注,措辞不编造理由。
  • design.md 七层线头结掉,附实测结论。
  • 所有改动只在 docs 分支,按既定规则永不推送
  • 不改任何代码、不碰 src/、不碰 tests/

Not in scope

  • 39 条判为「实现」的落差——属第四批,需先开一轮 grill 再拆 PRD。
  • 7 条判为「待人类拍板」的落差——同上。里面有真东西(资源 port 整个没建、技能检索/注入侧未交付、慢中断/linger 从没建过),值得单独一轮。
  • 本票不做任何代码实现,即使某条留痕项「顺手就能实现」也不要在本票做。

附录 A:10 条「作废」清单

1. ADR-0010 更新(2026-07-08 第三方项目对照 grill)「系统自检信号层」条

  • 断言: 新增不自动修复、只产信号的健康度探针(importance 池积压、drive/关系轴零支撑、tentative 堆积比例)
  • 理由: 典型的「读别人项目读出来的想法直接写进决策节」。三个探针目标里两个是别的落差的症状而非需要观测的量:tentative 堆积应该由修好晋升通道(本表 21)根除,某轴长期零支撑应该由接上信号源(本表 29/30)根除——建探针去观测一个已知必然发生的病,是把修复换成了监控。第三个(importance 池积压)在零部署的项目里没有观测对象。ADR 追加更新节作废,理由写清「症状归因已明确,改为直接修因」。

2. ADR-0005「决策」节 + 「更新(2026-07-06)/ 双时间尺度」节(资源态推 energy 保留不变)

  • 断言: energy += … + 资源态推送 + …
  • 理由: 就本条的残留项「资源态推送」作废(f(互动极性) 归 9、昼夜节律归 13、群传染已实现,不在此重复计)。理由三条:其一,core 里根本不存在「资源态」——经济 hook port 从未建(见 49),成本池是运维概念不是人格概念;其二,这一项是从 dxkuma ADR-0006 惯性继承来的,ADR 自己的措辞「曾在本轮草稿中被无意漏抄,已订正补回」说明它是靠订正存活而非靠有人要;其三,把预算压力喂进人格情绪,与 ADR-0010「前台回复优先保」的降级哲学是两套逻辑,接起来反而要处理「熔断了所以它心情不好所以更不想说话」这种双重抑制。ADR 追加更新节删掉这一项即可。

3. ADR-0006「决策」节「自发目标并入单一出口」条

  • 断言: core 本地启发式触发候选(熟人久未联系/话题新进展/冒出不懂的梗)
  • 理由: 作废的是「三类候选都由 core 本地启发式产出」这个形状,不是能力本身。实现期把其中两类换成了模型工具 note_pending_intent(tools.py:370 的描述逐字对应 ADR 那三个场景),这是更好的方案:不懂的梗、话题有后续,本来就是模型判断优于关键词启发式的事,写 core 启发式属于用规则去猜 LLM 已经知道的东西。spontaneous_goal.py:9 自称已与用户核实过这个范围划分,只是从没回到 ADR。做法:ADR-0006 追加更新节追认产出方迁移,保留 familiar_reconnect_hint 那一类(确定性时间判断,模型看不到时间戳,该 core 做)。

4. ADR-0009 记忆工程 —「决策」节

  • 断言: episodic 与 checkpoint archive 拆两 collection;archive blob 分条化
  • 理由: 两半都已失去前提。checkpoint archive 的载体随 ADR-0002 弃 LangGraph 一并消失(ADR-0013 背景节自己点了这件事),arise 从没有过 checkpointer 产出的归档 blob;「blob 分条化」要治的是旧 dxkuma ~60 条拼单整块召回,而 arise 的 episodic 从第一天就是逐事件写入、逐事件召回,这个病在本仓从未存在过。config.py:113 那个零引用的 collection 名字是唯一残留,一并删掉。ADR-0009 与 design.md:322、决策基线表第 7 行同步追加作废说明。与 64 同一件事。

5. ADR-0011 更新(2026-07-08):同维度换模型的增量重嵌入

  • 断言: 每条记录旁存 embed_model,按上限滚动重嵌入,服务不停机
  • 理由: 零部署项目的运维迁移故事,是本批最纯粹的投机性条目:它优化的是「已经在线上跑着、不能停机、且换了同维度模型」这个三重条件同时成立的场景,而这个场景连第一重都还没发生。代价却不小:payload 加字段 + 迁移脚本 + 一个新的 APScheduler 滚动作业 + 上限旋钮。现有的诚实答案(storage.py:1948 docstring「换模型要评估维度,变了要全量 re-index,本函数不处理迁移」)对零部署阶段完全够用,真到有部署那天,全量 re-index 也是可接受的一次性运维动作。ADR-0011 追加更新节作废。

6. ADR-0015「更新(2026-07-10 第二轮)」节

  • 断言: 触发引擎新增第二种模式——日期临近(条目带可选 date,装配时检查临近即注入)
  • 理由: 这不是一条被漏实现的决策,是一个被写进决策节的功能想法。它需要:条目 date 字段 + 日期抽取(谁来填?又回到 23 的相对时间解析)+ 临近判定 + 与主动开口门控的交互(「生日快到了」要不要主动说,是主动开口不是触发注入)。整条链上没有一环存在,且来源同样是第三方项目对照。ADR-0015 追加更新节作废,措辞建议:「日期临近触发从本 ADR 撤出;若需要,应作为独立特性走 PRD,而非触发注入的第二种模式」。与 66 同一件事。

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

  • 断言: 经济 hook(可选,如扣星)
  • 理由: 这个槽位从设计上就不该在 core:ADR-0010 自己写「core 无经济概念」,ADR-0013 把「host 侧可补偿副作用(扣星等)」判定为空集、理由是「扣星是命令前置钩子,不落在生成中窗口」。也就是说 core 里根本没有一个需要 hook 的时间点——host 在自己的命令入口前后扣星即可,不需要 arise 给回调。它唯一被提及的挂载场景是「忘记我」收费,而那同样是 host 命令层的事。ADR-0001 追加更新节,把八类 port 收敛为实际的七类(含工具 port),design.md 架构图删掉 econ 方框。资源 port 那格等 48 的结论。

8. ADR-0003 回复协议与渲染归属 —「决策」节(并被 2026-07-04 更新节重申)

  • 断言: host 注册文本格式化器(mai~ 口癖、【】/()表达语义)
  • 理由: 真实需求已被两个更好的机制吃掉:inline 标签 registry(ADR-0003 issue #28 的 tag_renderers,管 host 特有的可执行渲染)+ persona.speech_patterns(管口癖,纯提示词,模型自己就会 mai~,不需要 core 事后做字符串变换)。ADR 举的 mai→mai1 那个例子本身是 TTS 发音 override,ADR-0011 已经明确划归 host、不进通用 port。再加一层「host 可注入的整段文本变换钩子」会让输出侧同时存在三种改写机制,且最难调试的那种。ADR-0003 追加更新节作废,CONTEXT.md:23/58 与 design.md:211/218 同步。

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

  • 断言: 归档:episodic 与 checkpoint archive 拆两 collection;archive blob 分条化
  • 理由: 与第 19 条同一件事,文档三处(design.md:322、决策基线表第 7 行、CONTEXT.md:375)随 ADR 作废一起改。顺带删掉 config.py:113 那个零引用的 arise_archive_collection——留一个「只声明名字、机制留待后续 phase」的配置项,正是本仓反复产生「文档说有、代码没有」的微观来源:它给读者一个「已经开了工」的假象。

10. CONTEXT.md「触发注入(Triggered Injection)」条 + design.md 存储与记忆工程「Knowledge」bullet

  • 断言: 触发模式两种:关键词命中 + 日期临近
  • 理由: 与第 40 条同一件事。文档侧要改的措辞是「触发模式现有两种」——这是全表里最容易骗到人的表述之一,它用「现有」把一个从未存在的模式写成了既成事实,一个来做需求的人会以为只需要给条目填 date。改成「关键词命中是唯一触发模式;日期临近曾于 2026-07-10 采纳,现撤回」。

附录 B:21 条「留痕」清单

1. ADR-0010 更新(2026-07-08 第三方项目对照 grill)「Prompt Cache 命中率遥测」条

  • 断言: 归一化各 provider usage 为 {input_tokens, cached_tokens, savings_ratio},统计真实缓存命中率
  • 理由: 不作废:它验证的是「冻结快照+可变尾部」这个约束了整个 prompt 装配架构的设计假设,是高杠杆信息,llm.py:87 的 _usage_of 多读一层 prompt_tokens_details.cached_tokens 也就十几行。但它需要真实流量才有意义,而现在零部署——现在写等于写一个永远输出 0 的指标。留痕,在 ADR 里标「待首个 host 接入产生真实流量后补」,同时把它挂到 host 接入 checklist 上,别让它跟本批其它条目一样沉底。

2. ADR-0005「更新(2026-07-10 第三方项目对照 grill 第二轮)」节第三条

  • 断言: 新增输入源:未获回应升级(重要性门槛 + 阶梯式时长门槛影响 valence/energy)
  • 理由: 不实现也不作废。不实现的理由:它是叠在一个恒 0 的轴上的精化项,在第 9 条落地前做没有任何可观察效果;且现有 cold→fell-flat→dominance 通路已经覆盖了「发出去没人理」这个现象的主要行为面,再加一套重要性门槛+阶梯时长是三方项目对照带来的复杂度,不是真实需求。不作废的理由:ADR 给了具体来源(Drivesoid checkUnansweredMilestones)与明确的靶子区分(valence/energy 而非 dominance),且这个仓的用户确实为拟人感付复杂度,B 批落地后它会重新变成一个合理候选。留痕:在 ADR-0005 该条下标「尚未实现,依赖 valence 输入源先落地」。

3. ADR-0006「决策」节「Drive Tick」条,同 CONTEXT.md:223 与 design.md:407

  • 断言: 决定沉默输出静默令牌
  • 理由: 能力已由 ADR-0010 的决策快照换名承接并落地(GateVerdict 的 silent_level1/silent_budget + proceed&sends=0 两态,explain.py 还翻成了人话),「静默令牌」是旧词,三处文档按词检索会扑空。文档动作:CONTEXT.md:223 与 design.md:42/407 改写为决策快照措辞,或在术语表加一条别名指向。顺带修一处代码文档不实:gating.py:144 声称调用方会补 silent_level2/silent_silence_window,但两者全仓零命中、Literal 也只有三个取值,模型自主沉默实际靠 proceed+sends=0 表达——这句注释会让下一个人去找不存在的取值。

4. ADR-0009 —「更新(2026-07-10 MemPalace 对照 grill):occurred_at」节

  • 断言: events 新增可选 occurred_at(缺省=created_at),recency_decay 优先读它
  • 理由: 字段本身很便宜,但它与相对时间解析器(23)是一个功能的两半——只加字段没有产出方等于加一列恒为默认值的死列,本仓已经有太多这种东西了(affinity/tension/DriftVerdict.reason)。而 ADR 举的唯一动机场景(跨平台拉取写事件记忆)压根不存在:cross_platform_pull 只产 ProfileCandidate,一条事件都不写。所以当下无危害面。留痕:在 ADR-0009 与 design.md:324 标「未实现,且其动机场景尚未存在」,等首个 host 报出「机器人把时间搞错了」再一起做两半。与 65 同一件事。

5. ADR-0009 —「更新(2026-07-11 第三轮)」节 ADOPTED 第 2 条

  • 断言: Delta 压缩新增确定性正则+日期运算后处理,解析「上周三」写入 occurred_at
  • 理由: 与 20 是同一功能的两半,判定必须一致,否则会出现「加了字段没人写」或「写了没地方存」。留痕而非实现的理由:中文相对时间表达式解析是一个有真实边界面的子系统(跨年、农历、「下周三」相对于说话日还是相对于事件日、时区),ADR 说「零 token 比蹭 LLM 更省」在成本上对,但在维护成本上把账算漏了;且需求来自第三方项目对照,不是任何真实场景反馈。留痕位置:ADR-0009 该条与 design.md:324-325 一并标「未实现,与 occurred_at 字段同批待定」。

6. ADR-0009 —「更新(2026-07-08):晋升通道 + 检索评测 + 压缩容错」节(检索评测)

  • 断言: 建立 hit@k / MRR / 负控用例集,按关键词谓词标注,每次回归写趋势
  • 理由: 前置条件(排序逻辑单一纯函数入口 score_events)确实已满足,断言已到期,所以不能当没这回事。但它是为「调权重」服务的基础设施,而权重标定按 ADR-0011 明确推迟到真实 QQ 数据——评测集没有语料就只能拿人造语料自证,价值接近零,还要养一套趋势产物。1436 条测试已覆盖纯函数正确性,缺的只是排序质量回归网,而排序权重现在是静态 config、不会自己漂。留痕:标「前置已满足、待真实语料后建」,并挂到 host 接入 checklist(同 5)。

7. ADR-0020 —「备注(实现期跟进)」节第 2 条

  • 断言: delegate 池预算推迟标定;六池成本治理本次范围排除,仅 tracing 层归因
  • 理由: 纯文档回填。破折号后的范围描述已被 issue #81/#82 推翻(delegate 池有真计量包装、真熔断闸、真落库、真 e2e 测试),但破折号前的「具体预算数字推迟标定」至今仍成立(arise_pool_budgets 默认空表,core 不内置数字)——所以是改写不是删除,别把整条划掉。事实在 ADR-0010 有完整记录,误导只发生在单读 ADR-0020 时,价值确实低。与 70 同一件事,并入文档回填批。

8. ADR-0012「决策 → 6. 治理」节

  • 断言: 每次 self_recall/edit 记决策快照(接 /why)
  • 理由: 这条是 ADR-0012 治理四件套里唯一可以缓的:它是可观测性而非护栏,缺了不产生错误行为,只是 /why 答不出「它刚才为什么把那条撤了」。而 /why 刚在 issue #83 落地、还没有任何真实用户问过这个问题。改动面也不小(现有 DecisionSnapshot 是按「一轮触发」建模的,撤/改是轮内动作,塞进去要动数据形状或另开一张表)。留痕:在 ADR-0012 §6 标「未实现」,别让后来者按「/why 已覆盖自撤回」去援引。若 35/36/37 那批做完仍有观测需求,再单独评估。

9. ADR-0014 环境感知「决策」节 tier-2 条目(并被 2026-07-09 更新节复述)

  • 断言: tier-2 显著者作群 tick 的 event-driven 触发源(事件入 drive-tick 的 light ctx)
  • 理由: 代码是对的(ADR-0029 明确改成事件触发用全量上下文),落差纯在文档,且根因是两份 ADR 互不指向:ADR-0014 全文零处提及 0029,ADR-0029 的取代关系节只列了 0017/0006/0007/0023、漏了 0014。文档动作:给 ADR-0014 补一个更新节指向 ADR-0029,并在 ADR-0029 的取代关系节补上 0014。这条本身价值低,但它暴露的机制问题(取代关系是单向登记、被取代方不一定知道)值得在 overall 里单说。

10. ADR-0004 —「决策」节(并被 2026-07-04 更新节以 probe() 复述)

  • 断言: host 经 probe() → {typing, poke, recall, at_all, sticker, voice, ...} 声明能力
  • 理由: 实质已完整落地(host 声明 + core 拥降级,降级阶梯八处可逐条指认),CONTEXT.md:133 的术语定义本身用的就是「声明」,ADR-0020 更晚的更新节还把 capabilities 当静态值正面引用。残留问题只是 probe() 这个可调用方法的措辞至今出现在五处(ADR-0004:11/34、ADR-0012:59、ADR-0030:36、design.md:229、CONTEXT.md:350),而 capabilities.py:6 反过来明写「不做运行时探测」——读者会去找一个不存在的 host 侧方法。文档回填批处理,改成「host 在加载时声明的静态能力集」。

11. ADR-0025 决策节第 1 条群聊分支

  • 断言: 群聊复用 drive-tick,成为下一次 drive-tick 评估的事件驱动触发源,不新开输出出口
  • 理由: 采纳复核方的降级:「不新开输出出口」按本仓自己的先例(ADR-0014 tier-2 落地成 run_environment_signal,同样是 RuntimeLoop 新入口、同样独立挂钩点)不成立,「输出出口」在本仓语境里指绕过门控的发送通道,追问没绕。「复用 drive-tick」这半事实不符(群聊压根不在扫描范围内),但 ADR-0010 的两个更新节已经把正确形状写清了(「私聊的即刻追问复用扫描器」+ 即刻追问是独立 TriggerPath)。所以只需回填 ADR-0025 决策节措辞。真危害在第 55 条,不在这里重复计。

12. CONTEXT.md「Outbox」条

  • 断言: Outbox:持久化的待处理累积消息队列,进程重启不丢
  • 理由: 纯文档,但我把紧迫度调到中:这不是「说了没做」,是说反了——recover() 在启动时无条件 delete 全表、ADR-0013 决策节第一条就是「崩溃后丢弃在途请求,不重放」,而 CONTEXT.md 里「崩溃/重启/在途」的全文唯一命中就是这句写反的话。一个照着术语表实现或复核的人会得出相反的正确性判断。更值得记的是 ADR-0013 的取代关系节自己写了「明确 CONTEXT 中 Outbox/句柄/Sent Log 的崩溃语义」——它点名要回填 CONTEXT,回填从没发生。文档回填批里优先级最高的一条。

13. design.md「occurred_at 相对时间解析」bullet + CONTEXT.md「事件记忆」条 + ADR-0009 两个更新节

  • 断言: 确定性正则+日期运算解析相对时间写入 occurred_at;recency_decay 优先读它
  • 理由: 与 20+23 同一件事(字段与解析器两半必须同判),文档三处一并标注「未实现」。这条是全表证据最干净的一条(occurred_at 在 src+tests 零字符),所以留痕的措辞可以最直白:「本条自 2026-07-10/07-11 采纳以来未实现,且其原始动机场景(跨平台拉取写事件记忆)尚未存在」。

14. CONTEXT.md「Port」条(共八类)+ design.md 架构 mermaid(resource/econ 方框)+ Port 契约节两条 bullet

  • 断言: 资源 port(贴纸/TTS 目录)+ 经济 hook port(可选)
  • 理由: 拆两半:经济 hook 那半随第 49 条作废(mermaid 删 econ 方框、八类改七类);资源 port 那半等 48/28 的人类结论再动,在此之前应在 CONTEXT.md 与 design.md 明确标「未实现、待定」。不能现在就照现状改写成「core 无资源 port」——那会把一个待决问题写成既定事实,正是本次查漏要治的病。文档回填批里唯一需要等前置结论的一条。

15. design.md「冷启动与渐进解锁(ADR-0007)」节

  • 断言: 解锁顺序:反应式 → 主动开口 → 三因子召回 → 关系网注入 → 自发目标
  • 理由: 代码与 ADR/CONTEXT 都已按 ADR-0029 的新四级顺序走,只有 design.md 停在旧五级。但根因比这一处大得多,紧迫度按根因给:design.md 全文一次都没提到 ADR-0029、也一次都没提到 ADR-0030——两份最晚、推翻面最大的 ADR 完全没有传播到 design.md,直接造成本表 68/75/77 三处误导。文档回填批里应该把「扫一遍 design.md 对 0029/0030 的全部影响面」当成一个整体动作,而不是逐条改这三处。

16. CONTEXT.md「回调(Callback)」条 + design.md 能动性层「深挖任务委托」条

  • 断言: register_callback 本身仍未实现,只是地基已通用
  • 理由: 反向陈旧:实现跑在文档前面(register_callback.py 存在、两个工具已注册进 schema 并接线、模块文档自称是 Callback 抽象的第二个真实生产者)。危害很低但很典型——三处文档(CONTEXT.md:171/:496、design.md:433)都在主动声明一个已经存在的东西「尚未实现」,说明留痕本身也会过期。文档回填批里一并改,顺手在 overall 里当作「留痕不是免维护」的证据。

17. CONTEXT.md「深挖任务委托(Deep Task Delegation)」条

  • 断言: 独立 delegate 成本池;但六池预算/熔断全仓尚未实现,仅 tracing 层标注
  • 理由: 与第 26 条同源,且是局部陈旧——同一份 CONTEXT.md 的成本治理条目(:532)已经是新表述,只有深挖任务委托条里那个括号停在旧世界。改一个括号即可。这条的价值在于它示范了一种最难发现的陈旧:不是整条没更新,是一条更新了、另一条复述它的没更新,全文检索同一个概念会得到互相矛盾的两句话。

18. design.md 架构 mermaid 的 routing 方框 + 决策基线「低争议、直接采纳」列表「必修 bug 批」

  • 断言: Routing:模型池/按模型熔断/限流/per-能力预算
  • 理由: 三件里没有一件是真落差:模型池有窄实现(arise_fallback_multimodal_models 按 kind 排序兜底,ADR-0028 自己把它归到 Routing 层);按模型熔断是被推翻的(cost.py 顶部「定价表按池声明、不按模型——这不是取舍,是架构逼出来的」,ADR-0010 决策节即按能力分池);限流是被硬预算+熔断取代的(ADR-0010 背景节把「仅软限流不硬停」列为旧系统病症)。真问题是 design.md 内部自相矛盾(第 36 行 per-能力预算 vs 第 44 行按模型熔断),且第 44 行那句是从 2026-07-02 的旧 dxkuma 缺口分析原样搬来的遗留债目。文档回填批:删掉「熔断按模型」「限流」,mermaid 方框改成「模型池/per-能力预算」。

19. docs/design.md:451 冷启动节 + :376 真人感层 + :87 同一措辞

  • 断言: 已读延迟窗 scope_ceiling 收紧 + 选择性回应禁止归零
  • 理由: 取代链完整(ADR-0017 与 ADR-0007 两个更新节都写了 floor=1 适用范围从「选择性回应整批归零」扩到「共享预算本身」,CONTEXT.md 两处已同步),只有 design.md 三处停在旧世界。采纳复核方补的两点:落点是三处不是两处(还有 :87),且 :376 同一句里还有第二处陈旧断言「不共享沉默预算」——那条也被明确推翻了(沉默预算现覆盖全部触发源)。根因同 68:design.md 零处提及 ADR-0029。并入「扫一遍 design.md 对 0029/0030 的影响面」这个整体动作。

20. CONTEXT.md:133-134「能力探测」条 + design.md:229-230 能力 port bullet(另 ADR-0004:11、ADR-0019:12)

  • 断言: probe() → {…, at_all, …}
  • 理由: at_all 能力位是被 ADR-0003 的 issue #28 更新节显式移除的(「能力门控收敛为单一信源,不新增 CapabilitySet 布尔位,at_all 也一并移除」),代码是正确的一方。落差窄而真:只有 at_all 一项,落点是 CONTEXT.md:134、design.md:229、ADR-0004:11、ADR-0019:12 四处。注意 CONTEXT.md 那条不是整条没更新——它已经跟进了 ADR-0030(写了四个交互位已移除),唯独漏了更早的 ADR-0003。这个「跟进了新的、漏了旧的」模式值得记:文档回填时按 ADR 时间倒序追,容易漏掉早于当前注意力窗口的那次移除。

21. docs/design.md:195-197 前处理 port bullet + :229-233 能力 port bullet

  • 断言: ConversationInput.interaction 封闭形状 {kind: "poke"|"reaction", …} + 四个交互能力位
  • 理由: design.md 全文零处提及 ADR-0030、零处 interaction_renderers,四处仍完整保留 ADR-0023 的封闭设计并解释得头头是道。这条单列的价值在于纠正一个会误导排期的印象:CONTEXT.md 已经跟进了 ADR-0030(:142 写四位已移除),只看 CONTEXT 会以为「文档已改、只剩代码没跟」,实际文档也只改了一半。文档动作应与已知种子(ADR-0030 整份未落地)的实现 ticket 绑在一起——ADR-0030 落地时四处 design.md 一并改,否则又是一次「代码改了、design.md 没跟」。
> 来源:2026-07-29 全 ADR 查漏(31 份 ADR + CONTEXT.md + design.md 对照 `origin/main` @ 649673c,24 个 agent,78 条候选 → 77 条经对抗性复核确认)。本票是**第二批**,**纯文档、零代码改动**,全部落在 `docs` 分支。 ## 为什么单独一票 这批与代码无关,可以和第一批(bug 修复)并行推进而互不干扰。它要关掉的是本项目反复出现的一类问题:**「文档说有、代码没有」**——历史上已至少四次(issue #61 的「灰度可一键关」、`MediaKind.file`、ADR-0030 整份未落地、以及本轮查出的这批)。前两次都是**撞见**的、不是查出来的,说明"留痕"这个手段一直没在防住它们。 ## 硬性格式要求(本仓惯例,不得违反) **一律只追加 `## 更新(2026-07-xx,issue #N)` 节,绝不就地改写既有「决策」/「拒绝了」节。** 三条实证先例: - ADR-0004 的「决策」节至今保留已被 ADR-0030 宣布移除的 `poke` 位; - ADR-0010 用「上一条更新(issue #41)记的『尚未实现』已过时」推翻前文而不删前文; - ADR-0001 的 #80 更新同形。 CONTEXT.md / design.md 不适用「更新节」体例,就地修订即可,但**改动要能被 `git log` 追溯到本票**。 ## 任务一:10 条判为「作废」 这些断言**不该继续有效**——需求变了 / 被更好的方案取代 / 当初就是投机。逐条在对应 ADR 追加更新节**明确作废并写明理由**。 **注意**:作废不是"删掉断言",是"追加一节说明它为何不再适用"。读者仍应能读到原文与推翻它的理由。本项目 ponytail/YAGNI 传统认为「文档写了但一直没人需要」本身就是它可能不该存在的证据——但理由必须写出来,不能只标一个"作废"。 ## 任务二:21 条判为「留痕」 这些暂不实现,但**必须在文档里如实标注「尚未实现」**,防止后来者把它当既成事实援引。 本项目已经因此栽过:PRD 引用过一个 grep 不到的 API,因为 ADR 拍过板但从未落地(见 `feedback_adr-decided-but-unimplemented-is-not-a-typo`)。 **措辞纪律**(ADR-0010 issue #83 节定过):**写清「当下未实现」比写一个听起来合理但错误的理由重要**。不确定为什么没实现就只写事实,不要编一个理由。 ## 任务三:结掉 design.md 的七层线头 `docs/design.md`「作废/取代」节里有一句: > 旧 ADR-0003「收拢为 dxkuma 内部包 arise/」——**作废**(独立仓天然独立),**分层思路留作 core 内部结构参考**。 这条从未被执行。2026-07-29 的结构实测已经给出了结论,**结掉它、不执行**,并补上实测依据: - 55 个模块**没有自然簇**(标签传播跑出 53+3;摘掉七个最大模块后,剩 49 个里仍有 33 个粘成一坨); - **照架构图七层装桶会整个塌成一个 SCC**,最小反向边集 26/170 跨层边;加一个 `shared` 契约桶才降到 5 条,再调三个模块归属到 2 条; - 架构图缺 1~2 个桶:一个 `shared`/contracts,以及 `judge_persona_drift`(4 个调用方跨 Memory/Agency)、`recency_decay`(3 个跨 Memory/Presence)这类**横切原语**的归属; - Routing 层已被 ADR-0028/ADR-0020 搁置,今天无对应代码。 **层名保留为叙述词汇**(CONTEXT.md 就是按这些分节的),只是不再作为分包依据。 ## Acceptance criteria - [ ] 10 条作废各有一条更新节,含**为何不再适用**的理由。 - [ ] 21 条留痕各有「尚未实现」标注,措辞不编造理由。 - [ ] design.md 七层线头结掉,附实测结论。 - [ ] 所有改动只在 `docs` 分支,**按既定规则永不推送**。 - [ ] 不改任何代码、不碰 `src/`、不碰 `tests/`。 ## Not in scope - **39 条判为「实现」的落差**——属第四批,需先开一轮 grill 再拆 PRD。 - **7 条判为「待人类拍板」的落差**——同上。里面有真东西(资源 port 整个没建、技能检索/注入侧未交付、慢中断/linger 从没建过),值得单独一轮。 - 本票不做任何代码实现,即使某条留痕项「顺手就能实现」也不要在本票做。 --- # 附录 A:10 条「作废」清单 ### 1. ADR-0010 更新(2026-07-08 第三方项目对照 grill)「系统自检信号层」条 - **断言**: 新增不自动修复、只产信号的健康度探针(importance 池积压、drive/关系轴零支撑、tentative 堆积比例) - **理由**: 典型的「读别人项目读出来的想法直接写进决策节」。三个探针目标里两个是别的落差的症状而非需要观测的量:tentative 堆积应该由修好晋升通道(本表 21)根除,某轴长期零支撑应该由接上信号源(本表 29/30)根除——建探针去观测一个已知必然发生的病,是把修复换成了监控。第三个(importance 池积压)在零部署的项目里没有观测对象。ADR 追加更新节作废,理由写清「症状归因已明确,改为直接修因」。 ### 2. ADR-0005「决策」节 + 「更新(2026-07-06)/ 双时间尺度」节(资源态推 energy 保留不变) - **断言**: energy += … + 资源态推送 + … - **理由**: 就本条的残留项「资源态推送」作废(f(互动极性) 归 9、昼夜节律归 13、群传染已实现,不在此重复计)。理由三条:其一,core 里根本不存在「资源态」——经济 hook port 从未建(见 49),成本池是运维概念不是人格概念;其二,这一项是从 dxkuma ADR-0006 惯性继承来的,ADR 自己的措辞「曾在本轮草稿中被无意漏抄,已订正补回」说明它是靠订正存活而非靠有人要;其三,把预算压力喂进人格情绪,与 ADR-0010「前台回复优先保」的降级哲学是两套逻辑,接起来反而要处理「熔断了所以它心情不好所以更不想说话」这种双重抑制。ADR 追加更新节删掉这一项即可。 ### 3. ADR-0006「决策」节「自发目标并入单一出口」条 - **断言**: core 本地启发式触发候选(熟人久未联系/话题新进展/冒出不懂的梗) - **理由**: 作废的是「三类候选都由 core 本地启发式产出」这个形状,不是能力本身。实现期把其中两类换成了模型工具 note_pending_intent(tools.py:370 的描述逐字对应 ADR 那三个场景),这是更好的方案:不懂的梗、话题有后续,本来就是模型判断优于关键词启发式的事,写 core 启发式属于用规则去猜 LLM 已经知道的东西。spontaneous_goal.py:9 自称已与用户核实过这个范围划分,只是从没回到 ADR。做法:ADR-0006 追加更新节追认产出方迁移,保留 familiar_reconnect_hint 那一类(确定性时间判断,模型看不到时间戳,该 core 做)。 ### 4. ADR-0009 记忆工程 —「决策」节 - **断言**: episodic 与 checkpoint archive 拆两 collection;archive blob 分条化 - **理由**: 两半都已失去前提。checkpoint archive 的载体随 ADR-0002 弃 LangGraph 一并消失(ADR-0013 背景节自己点了这件事),arise 从没有过 checkpointer 产出的归档 blob;「blob 分条化」要治的是旧 dxkuma ~60 条拼单整块召回,而 arise 的 episodic 从第一天就是逐事件写入、逐事件召回,这个病在本仓从未存在过。config.py:113 那个零引用的 collection 名字是唯一残留,一并删掉。ADR-0009 与 design.md:322、决策基线表第 7 行同步追加作废说明。与 64 同一件事。 ### 5. ADR-0011 更新(2026-07-08):同维度换模型的增量重嵌入 - **断言**: 每条记录旁存 embed_model,按上限滚动重嵌入,服务不停机 - **理由**: 零部署项目的运维迁移故事,是本批最纯粹的投机性条目:它优化的是「已经在线上跑着、不能停机、且换了同维度模型」这个三重条件同时成立的场景,而这个场景连第一重都还没发生。代价却不小:payload 加字段 + 迁移脚本 + 一个新的 APScheduler 滚动作业 + 上限旋钮。现有的诚实答案(storage.py:1948 docstring「换模型要评估维度,变了要全量 re-index,本函数不处理迁移」)对零部署阶段完全够用,真到有部署那天,全量 re-index 也是可接受的一次性运维动作。ADR-0011 追加更新节作废。 ### 6. ADR-0015「更新(2026-07-10 第二轮)」节 - **断言**: 触发引擎新增第二种模式——日期临近(条目带可选 date,装配时检查临近即注入) - **理由**: 这不是一条被漏实现的决策,是一个被写进决策节的功能想法。它需要:条目 date 字段 + 日期抽取(谁来填?又回到 23 的相对时间解析)+ 临近判定 + 与主动开口门控的交互(「生日快到了」要不要主动说,是主动开口不是触发注入)。整条链上没有一环存在,且来源同样是第三方项目对照。ADR-0015 追加更新节作废,措辞建议:「日期临近触发从本 ADR 撤出;若需要,应作为独立特性走 PRD,而非触发注入的第二种模式」。与 66 同一件事。 ### 7. ADR-0001 —「决策」节七类 port 枚举末项(经济 hook) - **断言**: 经济 hook(可选,如扣星) - **理由**: 这个槽位从设计上就不该在 core:ADR-0010 自己写「core 无经济概念」,ADR-0013 把「host 侧可补偿副作用(扣星等)」判定为空集、理由是「扣星是命令前置钩子,不落在生成中窗口」。也就是说 core 里根本没有一个需要 hook 的时间点——host 在自己的命令入口前后扣星即可,不需要 arise 给回调。它唯一被提及的挂载场景是「忘记我」收费,而那同样是 host 命令层的事。ADR-0001 追加更新节,把八类 port 收敛为实际的七类(含工具 port),design.md 架构图删掉 econ 方框。资源 port 那格等 48 的结论。 ### 8. ADR-0003 回复协议与渲染归属 —「决策」节(并被 2026-07-04 更新节重申) - **断言**: host 注册文本格式化器(mai~ 口癖、【】/()表达语义) - **理由**: 真实需求已被两个更好的机制吃掉:inline 标签 registry(ADR-0003 issue #28 的 tag_renderers,管 host 特有的可执行渲染)+ persona.speech_patterns(管口癖,纯提示词,模型自己就会 mai~,不需要 core 事后做字符串变换)。ADR 举的 mai→mai1 那个例子本身是 TTS 发音 override,ADR-0011 已经明确划归 host、不进通用 port。再加一层「host 可注入的整段文本变换钩子」会让输出侧同时存在三种改写机制,且最难调试的那种。ADR-0003 追加更新节作废,CONTEXT.md:23/58 与 design.md:211/218 同步。 ### 9. design.md 存储与记忆工程「归档」bullet + 决策基线表第 7 行 + CONTEXT.md「三因子召回」条 + ADR-0009 决策节 - **断言**: 归档:episodic 与 checkpoint archive 拆两 collection;archive blob 分条化 - **理由**: 与第 19 条同一件事,文档三处(design.md:322、决策基线表第 7 行、CONTEXT.md:375)随 ADR 作废一起改。顺带删掉 config.py:113 那个零引用的 arise_archive_collection——留一个「只声明名字、机制留待后续 phase」的配置项,正是本仓反复产生「文档说有、代码没有」的微观来源:它给读者一个「已经开了工」的假象。 ### 10. CONTEXT.md「触发注入(Triggered Injection)」条 + design.md 存储与记忆工程「Knowledge」bullet - **断言**: 触发模式两种:关键词命中 + 日期临近 - **理由**: 与第 40 条同一件事。文档侧要改的措辞是「触发模式现有两种」——这是全表里最容易骗到人的表述之一,它用「现有」把一个从未存在的模式写成了既成事实,一个来做需求的人会以为只需要给条目填 date。改成「关键词命中是唯一触发模式;日期临近曾于 2026-07-10 采纳,现撤回」。 --- # 附录 B:21 条「留痕」清单 ### 1. ADR-0010 更新(2026-07-08 第三方项目对照 grill)「Prompt Cache 命中率遥测」条 - **断言**: 归一化各 provider usage 为 {input_tokens, cached_tokens, savings_ratio},统计真实缓存命中率 - **理由**: 不作废:它验证的是「冻结快照+可变尾部」这个约束了整个 prompt 装配架构的设计假设,是高杠杆信息,llm.py:87 的 _usage_of 多读一层 prompt_tokens_details.cached_tokens 也就十几行。但它需要真实流量才有意义,而现在零部署——现在写等于写一个永远输出 0 的指标。留痕,在 ADR 里标「待首个 host 接入产生真实流量后补」,同时把它挂到 host 接入 checklist 上,别让它跟本批其它条目一样沉底。 ### 2. ADR-0005「更新(2026-07-10 第三方项目对照 grill 第二轮)」节第三条 - **断言**: 新增输入源:未获回应升级(重要性门槛 + 阶梯式时长门槛影响 valence/energy) - **理由**: 不实现也不作废。不实现的理由:它是叠在一个恒 0 的轴上的精化项,在第 9 条落地前做没有任何可观察效果;且现有 cold→fell-flat→dominance 通路已经覆盖了「发出去没人理」这个现象的主要行为面,再加一套重要性门槛+阶梯时长是三方项目对照带来的复杂度,不是真实需求。不作废的理由:ADR 给了具体来源(Drivesoid checkUnansweredMilestones)与明确的靶子区分(valence/energy 而非 dominance),且这个仓的用户确实为拟人感付复杂度,B 批落地后它会重新变成一个合理候选。留痕:在 ADR-0005 该条下标「尚未实现,依赖 valence 输入源先落地」。 ### 3. ADR-0006「决策」节「Drive Tick」条,同 CONTEXT.md:223 与 design.md:407 - **断言**: 决定沉默输出静默令牌 - **理由**: 能力已由 ADR-0010 的决策快照换名承接并落地(GateVerdict 的 silent_level1/silent_budget + proceed&sends=0 两态,explain.py 还翻成了人话),「静默令牌」是旧词,三处文档按词检索会扑空。文档动作:CONTEXT.md:223 与 design.md:42/407 改写为决策快照措辞,或在术语表加一条别名指向。顺带修一处代码文档不实:gating.py:144 声称调用方会补 silent_level2/silent_silence_window,但两者全仓零命中、Literal 也只有三个取值,模型自主沉默实际靠 proceed+sends=0 表达——这句注释会让下一个人去找不存在的取值。 ### 4. ADR-0009 —「更新(2026-07-10 MemPalace 对照 grill):occurred_at」节 - **断言**: events 新增可选 occurred_at(缺省=created_at),recency_decay 优先读它 - **理由**: 字段本身很便宜,但它与相对时间解析器(23)是一个功能的两半——只加字段没有产出方等于加一列恒为默认值的死列,本仓已经有太多这种东西了(affinity/tension/DriftVerdict.reason)。而 ADR 举的唯一动机场景(跨平台拉取写事件记忆)压根不存在:cross_platform_pull 只产 ProfileCandidate,一条事件都不写。所以当下无危害面。留痕:在 ADR-0009 与 design.md:324 标「未实现,且其动机场景尚未存在」,等首个 host 报出「机器人把时间搞错了」再一起做两半。与 65 同一件事。 ### 5. ADR-0009 —「更新(2026-07-11 第三轮)」节 ADOPTED 第 2 条 - **断言**: Delta 压缩新增确定性正则+日期运算后处理,解析「上周三」写入 occurred_at - **理由**: 与 20 是同一功能的两半,判定必须一致,否则会出现「加了字段没人写」或「写了没地方存」。留痕而非实现的理由:中文相对时间表达式解析是一个有真实边界面的子系统(跨年、农历、「下周三」相对于说话日还是相对于事件日、时区),ADR 说「零 token 比蹭 LLM 更省」在成本上对,但在维护成本上把账算漏了;且需求来自第三方项目对照,不是任何真实场景反馈。留痕位置:ADR-0009 该条与 design.md:324-325 一并标「未实现,与 occurred_at 字段同批待定」。 ### 6. ADR-0009 —「更新(2026-07-08):晋升通道 + 检索评测 + 压缩容错」节(检索评测) - **断言**: 建立 hit@k / MRR / 负控用例集,按关键词谓词标注,每次回归写趋势 - **理由**: 前置条件(排序逻辑单一纯函数入口 score_events)确实已满足,断言已到期,所以不能当没这回事。但它是为「调权重」服务的基础设施,而权重标定按 ADR-0011 明确推迟到真实 QQ 数据——评测集没有语料就只能拿人造语料自证,价值接近零,还要养一套趋势产物。1436 条测试已覆盖纯函数正确性,缺的只是排序质量回归网,而排序权重现在是静态 config、不会自己漂。留痕:标「前置已满足、待真实语料后建」,并挂到 host 接入 checklist(同 5)。 ### 7. ADR-0020 —「备注(实现期跟进)」节第 2 条 - **断言**: delegate 池预算推迟标定;六池成本治理本次范围排除,仅 tracing 层归因 - **理由**: 纯文档回填。破折号后的范围描述已被 issue #81/#82 推翻(delegate 池有真计量包装、真熔断闸、真落库、真 e2e 测试),但破折号前的「具体预算数字推迟标定」至今仍成立(arise_pool_budgets 默认空表,core 不内置数字)——所以是改写不是删除,别把整条划掉。事实在 ADR-0010 有完整记录,误导只发生在单读 ADR-0020 时,价值确实低。与 70 同一件事,并入文档回填批。 ### 8. ADR-0012「决策 → 6. 治理」节 - **断言**: 每次 self_recall/edit 记决策快照(接 /why) - **理由**: 这条是 ADR-0012 治理四件套里唯一可以缓的:它是可观测性而非护栏,缺了不产生错误行为,只是 /why 答不出「它刚才为什么把那条撤了」。而 /why 刚在 issue #83 落地、还没有任何真实用户问过这个问题。改动面也不小(现有 DecisionSnapshot 是按「一轮触发」建模的,撤/改是轮内动作,塞进去要动数据形状或另开一张表)。留痕:在 ADR-0012 §6 标「未实现」,别让后来者按「/why 已覆盖自撤回」去援引。若 35/36/37 那批做完仍有观测需求,再单独评估。 ### 9. ADR-0014 环境感知「决策」节 tier-2 条目(并被 2026-07-09 更新节复述) - **断言**: tier-2 显著者作群 tick 的 event-driven 触发源(事件入 drive-tick 的 light ctx) - **理由**: 代码是对的(ADR-0029 明确改成事件触发用全量上下文),落差纯在文档,且根因是两份 ADR 互不指向:ADR-0014 全文零处提及 0029,ADR-0029 的取代关系节只列了 0017/0006/0007/0023、漏了 0014。文档动作:给 ADR-0014 补一个更新节指向 ADR-0029,并在 ADR-0029 的取代关系节补上 0014。这条本身价值低,但它暴露的机制问题(取代关系是单向登记、被取代方不一定知道)值得在 overall 里单说。 ### 10. ADR-0004 —「决策」节(并被 2026-07-04 更新节以 probe() 复述) - **断言**: host 经 probe() → {typing, poke, recall, at_all, sticker, voice, ...} 声明能力 - **理由**: 实质已完整落地(host 声明 + core 拥降级,降级阶梯八处可逐条指认),CONTEXT.md:133 的术语定义本身用的就是「声明」,ADR-0020 更晚的更新节还把 capabilities 当静态值正面引用。残留问题只是 probe() 这个可调用方法的措辞至今出现在五处(ADR-0004:11/34、ADR-0012:59、ADR-0030:36、design.md:229、CONTEXT.md:350),而 capabilities.py:6 反过来明写「不做运行时探测」——读者会去找一个不存在的 host 侧方法。文档回填批处理,改成「host 在加载时声明的静态能力集」。 ### 11. ADR-0025 决策节第 1 条群聊分支 - **断言**: 群聊复用 drive-tick,成为下一次 drive-tick 评估的事件驱动触发源,不新开输出出口 - **理由**: 采纳复核方的降级:「不新开输出出口」按本仓自己的先例(ADR-0014 tier-2 落地成 run_environment_signal,同样是 RuntimeLoop 新入口、同样独立挂钩点)不成立,「输出出口」在本仓语境里指绕过门控的发送通道,追问没绕。「复用 drive-tick」这半事实不符(群聊压根不在扫描范围内),但 ADR-0010 的两个更新节已经把正确形状写清了(「私聊的即刻追问复用扫描器」+ 即刻追问是独立 TriggerPath)。所以只需回填 ADR-0025 决策节措辞。真危害在第 55 条,不在这里重复计。 ### 12. CONTEXT.md「Outbox」条 - **断言**: Outbox:持久化的待处理累积消息队列,进程重启不丢 - **理由**: 纯文档,但我把紧迫度调到中:这不是「说了没做」,是**说反了**——recover() 在启动时无条件 delete 全表、ADR-0013 决策节第一条就是「崩溃后丢弃在途请求,不重放」,而 CONTEXT.md 里「崩溃/重启/在途」的全文唯一命中就是这句写反的话。一个照着术语表实现或复核的人会得出相反的正确性判断。更值得记的是 ADR-0013 的取代关系节自己写了「明确 CONTEXT 中 Outbox/句柄/Sent Log 的崩溃语义」——它点名要回填 CONTEXT,回填从没发生。文档回填批里优先级最高的一条。 ### 13. design.md「occurred_at 相对时间解析」bullet + CONTEXT.md「事件记忆」条 + ADR-0009 两个更新节 - **断言**: 确定性正则+日期运算解析相对时间写入 occurred_at;recency_decay 优先读它 - **理由**: 与 20+23 同一件事(字段与解析器两半必须同判),文档三处一并标注「未实现」。这条是全表证据最干净的一条(occurred_at 在 src+tests 零字符),所以留痕的措辞可以最直白:「本条自 2026-07-10/07-11 采纳以来未实现,且其原始动机场景(跨平台拉取写事件记忆)尚未存在」。 ### 14. CONTEXT.md「Port」条(共八类)+ design.md 架构 mermaid(resource/econ 方框)+ Port 契约节两条 bullet - **断言**: 资源 port(贴纸/TTS 目录)+ 经济 hook port(可选) - **理由**: 拆两半:经济 hook 那半随第 49 条作废(mermaid 删 econ 方框、八类改七类);资源 port 那半等 48/28 的人类结论再动,在此之前应在 CONTEXT.md 与 design.md 明确标「未实现、待定」。不能现在就照现状改写成「core 无资源 port」——那会把一个待决问题写成既定事实,正是本次查漏要治的病。文档回填批里唯一需要等前置结论的一条。 ### 15. design.md「冷启动与渐进解锁(ADR-0007)」节 - **断言**: 解锁顺序:反应式 → 主动开口 → 三因子召回 → 关系网注入 → 自发目标 - **理由**: 代码与 ADR/CONTEXT 都已按 ADR-0029 的新四级顺序走,只有 design.md 停在旧五级。但根因比这一处大得多,紧迫度按根因给:design.md 全文一次都没提到 ADR-0029、也一次都没提到 ADR-0030——两份最晚、推翻面最大的 ADR 完全没有传播到 design.md,直接造成本表 68/75/77 三处误导。文档回填批里应该把「扫一遍 design.md 对 0029/0030 的全部影响面」当成一个整体动作,而不是逐条改这三处。 ### 16. CONTEXT.md「回调(Callback)」条 + design.md 能动性层「深挖任务委托」条 - **断言**: register_callback 本身仍未实现,只是地基已通用 - **理由**: 反向陈旧:实现跑在文档前面(register_callback.py 存在、两个工具已注册进 schema 并接线、模块文档自称是 Callback 抽象的第二个真实生产者)。危害很低但很典型——三处文档(CONTEXT.md:171/:496、design.md:433)都在主动声明一个已经存在的东西「尚未实现」,说明留痕本身也会过期。文档回填批里一并改,顺手在 overall 里当作「留痕不是免维护」的证据。 ### 17. CONTEXT.md「深挖任务委托(Deep Task Delegation)」条 - **断言**: 独立 delegate 成本池;但六池预算/熔断全仓尚未实现,仅 tracing 层标注 - **理由**: 与第 26 条同源,且是局部陈旧——同一份 CONTEXT.md 的成本治理条目(:532)已经是新表述,只有深挖任务委托条里那个括号停在旧世界。改一个括号即可。这条的价值在于它示范了一种最难发现的陈旧:不是整条没更新,是一条更新了、另一条复述它的没更新,全文检索同一个概念会得到互相矛盾的两句话。 ### 18. design.md 架构 mermaid 的 routing 方框 + 决策基线「低争议、直接采纳」列表「必修 bug 批」 - **断言**: Routing:模型池/按模型熔断/限流/per-能力预算 - **理由**: 三件里没有一件是真落差:模型池有窄实现(arise_fallback_multimodal_models 按 kind 排序兜底,ADR-0028 自己把它归到 Routing 层);按模型熔断是被**推翻**的(cost.py 顶部「定价表按池声明、不按模型——这不是取舍,是架构逼出来的」,ADR-0010 决策节即按能力分池);限流是被硬预算+熔断取代的(ADR-0010 背景节把「仅软限流不硬停」列为旧系统病症)。真问题是 design.md 内部自相矛盾(第 36 行 per-能力预算 vs 第 44 行按模型熔断),且第 44 行那句是从 2026-07-02 的旧 dxkuma 缺口分析原样搬来的遗留债目。文档回填批:删掉「熔断按模型」「限流」,mermaid 方框改成「模型池/per-能力预算」。 ### 19. docs/design.md:451 冷启动节 + :376 真人感层 + :87 同一措辞 - **断言**: 已读延迟窗 scope_ceiling 收紧 + 选择性回应禁止归零 - **理由**: 取代链完整(ADR-0017 与 ADR-0007 两个更新节都写了 floor=1 适用范围从「选择性回应整批归零」扩到「共享预算本身」,CONTEXT.md 两处已同步),只有 design.md 三处停在旧世界。采纳复核方补的两点:落点是三处不是两处(还有 :87),且 :376 同一句里还有第二处陈旧断言「不共享沉默预算」——那条也被明确推翻了(沉默预算现覆盖全部触发源)。根因同 68:design.md 零处提及 ADR-0029。并入「扫一遍 design.md 对 0029/0030 的影响面」这个整体动作。 ### 20. CONTEXT.md:133-134「能力探测」条 + design.md:229-230 能力 port bullet(另 ADR-0004:11、ADR-0019:12) - **断言**: probe() → {…, at_all, …} - **理由**: at_all 能力位是被 ADR-0003 的 issue #28 更新节**显式移除**的(「能力门控收敛为单一信源,不新增 CapabilitySet 布尔位,at_all 也一并移除」),代码是正确的一方。落差窄而真:只有 at_all 一项,落点是 CONTEXT.md:134、design.md:229、ADR-0004:11、ADR-0019:12 四处。注意 CONTEXT.md 那条不是整条没更新——它已经跟进了 ADR-0030(写了四个交互位已移除),唯独漏了更早的 ADR-0003。这个「跟进了新的、漏了旧的」模式值得记:文档回填时按 ADR 时间倒序追,容易漏掉早于当前注意力窗口的那次移除。 ### 21. docs/design.md:195-197 前处理 port bullet + :229-233 能力 port bullet - **断言**: ConversationInput.interaction 封闭形状 {kind: "poke"|"reaction", …} + 四个交互能力位 - **理由**: design.md 全文零处提及 ADR-0030、零处 interaction_renderers,四处仍完整保留 ADR-0023 的封闭设计并解释得头头是道。这条单列的价值在于纠正一个会误导排期的印象:CONTEXT.md 已经跟进了 ADR-0030(:142 写四位已移除),只看 CONTEXT 会以为「文档已改、只剩代码没跟」,实际文档也只改了一半。文档动作应与已知种子(ADR-0030 整份未落地)的实现 ticket 绑在一起——ADR-0030 落地时四处 design.md 一并改,否则又是一次「代码改了、design.md 没跟」。
Author
Member

补充:附录 A 第 6 / 第 10 条(日期临近触发)的作废措辞,请务必带上架构指针

这两条是同一件事的两侧(第 6 条 = ADR-0015 决策节,第 10 条 = CONTEXT.md「触发注入」条 + design.md Knowledge bullet)。裁决不变,仍是作废,但措辞需要比原清单里写的多一句。

已确认:不重新归为「留痕」

评审时问过这条要不要改判留痕,结论是不改,而且留痕在这里比作废更糟——

留痕的措辞是「尚未实现」,而这条的问题不在于"没实现",在于它被写成了「触发注入的第二种模式」,这个归属本身是错的。标成「尚未实现」会把错的框架原样保住,下一个来做需求的人照着它实现,就会去给 Knowledge 条目加 date 字段——正是第 10 条自己点出的那个陷阱:

「触发模式现有两种」……用「现有」把一个从未存在的模式写成了既成事实,一个来做需求的人会以为只需要给条目填 date。

也确认:现在不开独立 PRD

原清单建议「若需要,应作为独立特性走 PRD」。现在不开,三条理由:

  1. 前置链一环都不存在——date 字段 + 日期抽取(**谁来填?**这绕回相对时间解析,那条本身也未实现)+ 临近判定 + 与主动开口门控的交互。现在开 PRD 等于同时开四个未定问题。
  2. 来源是第三方项目对照,不是需求。本仓反复以 YAGNI 否掉同源条目(ADR-0011 否本地 bge / 打包默认 TTS、ADR-0019 否 manifest+沙箱、issue #88 否迁移 alconna)。
  3. 批次上它比第四批(39 条实现 + 7 条待拍板)还靠后。在有需求证据之前先写决策,正是造出这 77 条落差的那个模式。

因此作废节里必须留下这句(原清单漏了)

日期临近若将来要做,属于「主动开口」路径(两级门控 / Drive Tick),不属于「触发注入」区块。

理由:触发注入是关键词命中时装配进去的被动背景软参考;而「生日快到了要不要主动说」是一次主动开口裁决,该由两级门控决定,跟沉默预算、渐进解锁那一套护栏在同一条链上。

这句是这两条里唯一有长期价值的东西——丢了它,等于把这次分析白做:将来想做「生日提醒」的人会去翻 ADR-0015 找注入引擎,而正确的入口是 ADR-0006。

建议的最终措辞

  • ADR-0015 更新节:「日期临近触发从本 ADR 撤出。它不是被漏实现的决策,而是一个写进决策节的功能想法,整条前置链(date 字段 / 日期抽取 / 临近判定 / 与主动开口门控的交互)无一存在。若将来要做,属于主动开口路径(ADR-0006 两级门控 / Drive Tick),不是触发注入的第二种模式,应作为独立特性单独走 PRD。」
  • CONTEXT.md:把「触发模式现有两种」改成「关键词命中是唯一触发模式;日期临近曾于 2026-07-10 采纳,现撤回,见 ADR-0015 更新节」。
  • design.md:Knowledge bullet 同步,措辞对齐上面两处。

本票其余 29 条不受影响。

## 补充:附录 A 第 6 / 第 10 条(日期临近触发)的作废措辞,请务必带上架构指针 这两条是同一件事的两侧(第 6 条 = ADR-0015 决策节,第 10 条 = CONTEXT.md「触发注入」条 + design.md Knowledge bullet)。**裁决不变,仍是作废**,但措辞需要比原清单里写的多一句。 ### 已确认:不重新归为「留痕」 评审时问过这条要不要改判留痕,结论是**不改,而且留痕在这里比作废更糟**—— 留痕的措辞是「尚未实现」,而这条的问题不在于"没实现",在于**它被写成了「触发注入的第二种模式」,这个归属本身是错的**。标成「尚未实现」会把错的框架原样保住,下一个来做需求的人照着它实现,就会去给 Knowledge 条目加 `date` 字段——正是第 10 条自己点出的那个陷阱: > 「触发模式**现有**两种」……用「现有」把一个从未存在的模式写成了既成事实,一个来做需求的人会以为只需要给条目填 date。 ### 也确认:现在不开独立 PRD 原清单建议「若需要,应作为独立特性走 PRD」。**现在不开**,三条理由: 1. 前置链一环都不存在——date 字段 + 日期抽取(**谁来填?**这绕回相对时间解析,那条本身也未实现)+ 临近判定 + 与主动开口门控的交互。现在开 PRD 等于同时开四个未定问题。 2. 来源是第三方项目对照,不是需求。本仓反复以 YAGNI 否掉同源条目(ADR-0011 否本地 bge / 打包默认 TTS、ADR-0019 否 manifest+沙箱、issue #88 否迁移 alconna)。 3. 批次上它比第四批(39 条实现 + 7 条待拍板)还靠后。在有需求证据之前先写决策,正是造出这 77 条落差的那个模式。 ### 因此作废节里必须留下这句(原清单漏了) > **日期临近若将来要做,属于「主动开口」路径(两级门控 / Drive Tick),不属于「触发注入」区块。** 理由:触发注入是关键词命中时装配进去的**被动背景软参考**;而「生日快到了要不要主动说」是一次**主动开口裁决**,该由两级门控决定,跟沉默预算、渐进解锁那一套护栏在同一条链上。 这句是这两条里唯一有长期价值的东西——**丢了它,等于把这次分析白做**:将来想做「生日提醒」的人会去翻 ADR-0015 找注入引擎,而正确的入口是 ADR-0006。 ### 建议的最终措辞 - **ADR-0015 更新节**:「日期临近触发从本 ADR 撤出。它不是被漏实现的决策,而是一个写进决策节的功能想法,整条前置链(date 字段 / 日期抽取 / 临近判定 / 与主动开口门控的交互)无一存在。**若将来要做,属于主动开口路径(ADR-0006 两级门控 / Drive Tick),不是触发注入的第二种模式**,应作为独立特性单独走 PRD。」 - **CONTEXT.md**:把「触发模式现有两种」改成「**关键词命中是唯一触发模式**;日期临近曾于 2026-07-10 采纳,现撤回,见 ADR-0015 更新节」。 - **design.md**:Knowledge bullet 同步,措辞对齐上面两处。 本票其余 29 条不受影响。
Author
Member

更正:撤回上一条评论,日期临近改判「留痕」(不是作废)

上一条评论里那句「日期临近若将来要做,属于主动开口路径(两级门控 / Drive Tick),不属于触发注入区块」是错的,请勿采纳。 它误读了设计,且我把这个误读称作"唯一有长期价值的东西",需要整条撤回。

以本条为准。

设计原文:它从一开始就是注入侧的

CONTEXT.md「触发注入(Triggered Injection)」条:

日期临近(新增,2026-07-10 更新)——条目可选带 date 属性,装配 context 时检查是否有条目日期临近(如用户生日/之前提过的重要事项日期快到了)即触发注入,同为声明性文本、不驱动情感态数值方程(呼应 ADR-0018「距上次交互」声明性-only 的既定边界哲学)。日期数据来自 host(非 core 自算),不新开 port,只加一种触发条件到本引擎。

要点:

  • 注入侧机制,效果类比召回——刻意对标的是 距上次交互(同样是"挂进上下文的声明性事实、不驱动任何方程");
  • 主动开口优先度不变。注入只让模型知道这件事;说不说、什么时候说仍由既有那条链(两级门控 / 沉默预算 / 渐进解锁)决定,日期临近不抬优先级、不新增触发源
  • date 由 host 提供,core 不自算。

原清单(含我上一条评论)把"注入一条声明性事实"当成了"触发一次主动开口",整个反对论证建立在这个误读上。

审计列的「四环前置链」有两环是虚的

原清单称的前置 实际
条目 date 字段 确实没有 ✓
日期抽取("谁来填?又回到相对时间解析") ADR 已答:date 来自 host,core 不自算——不存在这一环
临近判定 确实没有 ✓
与主动开口门控的交互 按设计不存在这个交互——不存在这一环

真实工作量是:条目形状加一个可选 date + 触发匹配器加一个临近判定 + 照既有区块注入。trigger_injection.py 全模块 41 行,量级与既有关键词匹配器相当——远不是"整条链无一存在"

裁决改判

第 6 条(ADR-0015 决策节)与第 10 条(CONTEXT.md「触发注入」条 + design.md Knowledge bullet)从「作废」移到「留痕」。

于是本票的计数变为:附录 A 作废 8 条,附录 B 留痕 23 条(总数 31 条不变)。

改判理由:作废的前提是"这条断言不该继续有效",而它其实是一条归属正确、量级不大、只是没实现的决策;不实现的唯一真实理由是目前零 host 在填 date,做完也暂时不产出效果——但那是"等 host",不是"设计错了",与 arise 一贯的 core 出契约 / host 来填同形。

留痕措辞(必须保住正确归属)

  • ADR-0015:追加更新节,写明「日期临近触发尚未实现(截至 2026-07-29)。设计归属不变:它是触发注入区块的第二种触发条件,产出声明性文本、不驱动情感态方程、不抬主动开口优先度date 由 host 提供,core 不自算。未实现的现状原因是目前没有 host 提供 date。」
  • CONTEXT.md:不要改成"关键词命中是唯一触发模式"(那是作废口径)。改成 「触发模式设计为两种:① 关键词命中(已实现);② 日期临近(尚未实现,见 ADR-0015 更新节)」——保住设计、只标状态。
  • design.md:Knowledge bullet 同步同一口径。

注意别把"现有"原样留着——原文「触发模式现有两种」用"现有"把未实现的写成既成事实,这是原清单第 10 条抓到的真问题,改判留痕后这条依然要修,只是修法从"撤回"变成"标状态"。

措辞纪律

按 ADR-0010 issue #83 节既定:写清「当下未实现」比写一个听起来合理但错误的理由重要。本条的正确理由是"等 host 提供 date",不要写成"与主动开口门控的交互未定"之类——那是上一条评论的错误说法。

本票其余 29 条不受影响。

## 更正:撤回上一条评论,日期临近改判「留痕」(不是作废) **上一条评论里那句「日期临近若将来要做,属于主动开口路径(两级门控 / Drive Tick),不属于触发注入区块」是错的,请勿采纳。** 它误读了设计,且我把这个误读称作"唯一有长期价值的东西",需要整条撤回。 以本条为准。 ### 设计原文:它从一开始就是注入侧的 CONTEXT.md「触发注入(Triggered Injection)」条: > ② **日期临近**(新增,2026-07-10 更新)——条目可选带 `date` 属性,装配 context 时检查是否有条目日期临近(如用户生日/之前提过的重要事项日期快到了)即触发注入,**同为声明性文本、不驱动情感态数值方程**(呼应 ADR-0018「距上次交互」声明性-only 的既定边界哲学)。**日期数据来自 host(非 core 自算),不新开 port,只加一种触发条件到本引擎。** 要点: - **注入侧机制,效果类比召回**——刻意对标的是 `距上次交互`(同样是"挂进上下文的声明性事实、不驱动任何方程"); - **主动开口优先度不变**。注入只让模型**知道**这件事;说不说、什么时候说仍由既有那条链(两级门控 / 沉默预算 / 渐进解锁)决定,日期临近**不抬优先级、不新增触发源**; - `date` **由 host 提供**,core 不自算。 原清单(含我上一条评论)把"注入一条声明性事实"当成了"触发一次主动开口",整个反对论证建立在这个误读上。 ### 审计列的「四环前置链」有两环是虚的 | 原清单称的前置 | 实际 | |---|---| | 条目 `date` 字段 | 确实没有 ✓ | | 日期抽取("谁来填?又回到相对时间解析") | **ADR 已答:`date` 来自 host,core 不自算**——不存在这一环 | | 临近判定 | 确实没有 ✓ | | 与主动开口门控的交互 | **按设计不存在这个交互**——不存在这一环 | 真实工作量是:条目形状加一个可选 `date` + 触发匹配器加一个临近判定 + 照既有区块注入。`trigger_injection.py` 全模块 41 行,量级与既有关键词匹配器相当——**远不是"整条链无一存在"**。 ### 裁决改判 **第 6 条(ADR-0015 决策节)与第 10 条(CONTEXT.md「触发注入」条 + design.md Knowledge bullet)从「作废」移到「留痕」。** 于是本票的计数变为:**附录 A 作废 8 条,附录 B 留痕 23 条**(总数 31 条不变)。 改判理由:作废的前提是"这条断言不该继续有效",而它其实是一条**归属正确、量级不大、只是没实现**的决策;不实现的唯一真实理由是**目前零 host 在填 `date`**,做完也暂时不产出效果——但那是"等 host",不是"设计错了",与 arise 一贯的 core 出契约 / host 来填同形。 ### 留痕措辞(必须保住正确归属) - **ADR-0015**:追加更新节,写明「日期临近触发**尚未实现**(截至 2026-07-29)。设计归属不变:它是**触发注入区块的第二种触发条件**,产出声明性文本、不驱动情感态方程、**不抬主动开口优先度**;`date` 由 host 提供,core 不自算。未实现的现状原因是目前没有 host 提供 `date`。」 - **CONTEXT.md**:不要改成"关键词命中是唯一触发模式"(那是作废口径)。改成 **「触发模式设计为两种:① 关键词命中(已实现);② 日期临近(**尚未实现**,见 ADR-0015 更新节)」**——保住设计、只标状态。 - **design.md**:Knowledge bullet 同步同一口径。 **注意别把"现有"原样留着**——原文「触发模式**现有**两种」用"现有"把未实现的写成既成事实,这是原清单第 10 条抓到的真问题,改判留痕后这条依然要修,只是修法从"撤回"变成"标状态"。 ### 措辞纪律 按 ADR-0010 issue #83 节既定:**写清「当下未实现」比写一个听起来合理但错误的理由重要**。本条的正确理由是"等 host 提供 date",不要写成"与主动开口门控的交互未定"之类——那是上一条评论的错误说法。 本票其余 29 条不受影响。
Author
Member

作废,由 #101 取代。原因:本票附录 A 的 10 条「作废」裁决从未被复核过——查漏流水线是「扫描→对抗复核→裁决」,对抗复核跑在裁决之前,结构上只能验证「这条落差是不是真的」(事实层,且验对了),验不到「该怎么处理它」。事后补跑裁决复核:8 条作废裁决送审,0 条站住(1 条方向保留但理由要重写、5 条改判留痕、2 条改判待人类拍板)。失效模式集中在两点:把「注入侧/声明性/被动」的机制读成「触发侧/决策式/主动」;把原文已指定责任方的前置(「由 host 提供」「core 不自算」「不新开 port」)当成缺失环节。修正版见 #101,正文与两条评论保留作认知轨迹留档。

作废,由 #101 取代。原因:本票附录 A 的 10 条「作废」裁决从未被复核过——查漏流水线是「扫描→对抗复核→裁决」,对抗复核跑在裁决之前,结构上只能验证「这条落差是不是真的」(事实层,且验对了),验不到「该怎么处理它」。事后补跑裁决复核:8 条作废裁决送审,0 条站住(1 条方向保留但理由要重写、5 条改判留痕、2 条改判待人类拍板)。失效模式集中在两点:把「注入侧/声明性/被动」的机制读成「触发侧/决策式/主动」;把原文已指定责任方的前置(「由 host 提供」「core 不自算」「不新开 port」)当成缺失环节。修正版见 #101,正文与两条评论保留作认知轨迹留档。
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#96
No description provided.