个人理解 v2.0
这是一个本地、可追溯、原话优先、时间主干驱动的个人认知档案。它用于保存经历、关系、状态和规则,并让模型在需要时能够:
- 先从一件经历想起;
- 再沿着时间、人物、地点、学校、物品、作品、游戏、概念和生活环境发散;
- 回到用户当时的原话;
- 区分事实、感受、用户解释、模型推测和未解决问题;
- 检查待回访事项是否到期;
- 发现矛盾时带着证据和上下文提问。
旧版 memory/records/ 保留为兼容层。v2 的派生主干位于 memory/v2/,不可变会话原话位于 sources/conversation/。
两档调用闸门:full / skip
调用本 Skill 前,先判断本轮属于哪一档。两档共用同一个档案库,不建第二层存储。
第一档:完整档(full)——默认档。 任务包含个人经历、状态、感受、关系、偏好、决定等实质个人材料,或用户明确要求记住/归档,或个人背景会实质改变建议、取舍、风险提示或行动顺序时,走完整流程:preflight receipt → capture 原话 → survey/probe/deep 检索 → 派生记录 → finalize → session_check。抒发、闲聊、自我陈述类轮次同样属于本档:档案的价值是提供背景和参考,不以"必须给建议"为前提。
活动足迹轮次(并入完整档,2026-09-03 两档制改革): 游戏攻略、宿舍安置、在读在看、装备选型等"消息本身不含实质个人材料、但可沉淀一条活动足迹"的轮次(如"《只狼》怎么打弦一郎"→"2026-09 正在玩《只狼》"、"这本书好看吗"→"在读/考虑读某书"),与实质个人材料走同一条流程——capture、读取、闭环一项不可少,不存在免读取的快速建档。此类轮次额外遵守足迹纪律:
- 写入前定向查重(不可跳过,2026-09-03"已入学"误记的制度根源就是缺了这一步):按足迹关键词做定向 probe/routing 查询,核对两点——(a) 档案里是否已有覆盖同一足迹的 current 记录:已有则不新建,需要刷新就沿既有记录做版本链更新;(b) 待写内容是否与既有事实或既有边界相矛盾:档案内任何"不得把 A 写成 B"类状态告诫(如"已录取"不得写成"已入学")逐条核对;
- 恰好一条微型记录:通过查重后写
tier=light、salience0–1 的微型派生记录(带capture_id回链),不拆多条、不生成假设或待回访、不把单次咨询升级成决定; - 零新增可体面收场:查重确认既有记录已完全覆盖、无任何增量时,以
no-derivation-needed收尾,reason 必须写明命中的具体记录——这是合法闭环,禁止为闭环制造噪声记录; - 查重翻出档案内部矛盾时留证不断言;发现待写内容实际包含多条独立事实或需纠正既有记录时,按完整档正常语义拆分处理(不再是"升级换档",只是同一档位内的派生深度变化)。
第二档:跳过档(skip)——完全不碰档案。 明显无关、或记录后对未来对话质量增益为零的轮次:纯技术(代码、配置、排障、MCP、插件、仓库维护)、"今天吃什么"、"帮我看看买哪个"这类一次性购物决策、"这东西怎么样"这类无后效的评价请求。不做 survey,不捕获消息,不建派生记录,也不为了审计保存副本。判定标准与完整档的足迹轮次互补:一次纯咨询 FAQ 若查重后无增量,宁可 skip 或零新增收尾,不往档案里倒噪声。护栏:内容分类已经检出个人材料的轮次不得用 tier=skip 压制——那是完整档的轮次;压制行为会留痕在 receipt 的 reasons_suppressed 字段,事后审计可查。
轻量补记档(light)已废除(2026-09-03)。 preflight 的 tier=light 枚举仅为兼容保留,收到时一律按 full 处理;不再声明 light。废除理由:其"免读取"省下的少量 token 远低于引入的复杂度与事故率(盲写误记、light-tier-requires-derived-record 查重死锁、回答无法利用档案背景),活动足迹轮次并入完整档并受足迹纪律约束。记录层的 tier=light 微型标记(salience 0–1)保留,仅表示记录形态,不再表示档位。
维护本 Skill 的边界规则本身不属于个人材料;应直接修改 Skill 规则,不要把维护对话归档。全局聊天语气、编程语言偏好、工具偏好和方案拷问行为属于宿主客户端的指令文件,不属于个人档案。不得把这些客户端配置决定捕获或派生成个人事实。
最高优先级:原话保真
只要用户在任何形式、任何场景补充个人理解 Skill 的内容,必须先把用户完整原话一字不改保存,再做任何摘要、事件拆分、人物提取、关系判断或因果解释。
执行顺序固定为:
用户原话 / 原始附件
↓ 先保存,不可覆盖
verbatim fragment
↓
事件、实体、情境卡、状态、待回访、假设
↓
检索与回答
必须遵守:
- 文字输入保存完整用户消息,不只截取模型认为重要的句子;
- 图片、音频、文件保留原始附件;OCR、转写、摘要都是派生内容;
- 每份原话有
utf8_sha256、捕获时间、会话标识和来源路径; - 原话捕获一旦存在,不得静默覆盖;纠正只能新增捕获和关系;
- 任何模型摘要都不能冒充用户原话;旧版只有摘要的记录必须标成
summary_only; - 原话捕获失败时,必须报告失败,不得假装“已经存好了”;
- 先用
scripts/preflight_context.py <完整消息> --turn-id <turn-id>或 MCPpersonal_preflight_turn创建同一轮的 receipt;再使用scripts/capture_user_update.py --turn-id <turn-id>或 MCPpersonal_capture_user_turn完成捕获。文字 capture 的 SHA256 必须与 receipt 的完整消息一致; - 使用
personal_add_record写派生记录时,当前用户补充必须带capture_id或verbatim_refs,禁止继续用裸current-conversation冒充原文。
派生闭环:捕获成功不等于档案更新完成
capture 成功只代表原始材料没有丢失。它会在 memory/derivation-ledger.json 中进入 pending,仍然必须完成语义拆分、链接和关闭。
每次准备回答前,当前轮所有个人材料捕获必须满足以下一种状态:
- 已创建全部必要的事件、实体、状态、偏好、规则、情境或候选解释记录,并用
scripts/finalize_capture.py --disposition derived或 MCP 工具personal_finalize_capture关闭; - 经查重和语义检查后确实没有新增信息,用
no-derivation-needed关闭,并写清具体原因。
硬性约束:
- 禁止在仍有当前轮
pending捕获时声称“已经录入”“已经融入”或结束答复; derived至少要有一条可验证的 capture→record 双向链接;- 一条原话包含多个独立事件、人物、时间纠正、偏好或状态时,必须逐项判断并拆分,不能只建一张笼统摘要卡应付;
- 单独的确认、纠正和上下文补充可以与同一派生记录关联,但仍要逐条 finalize;
- 图片、音频和文件与文字遵守同一闭环;附件用
scripts/capture_attachment.py保留原件并登记哈希; - 精确重复附件可以复用已存原件,但本次 capture 仍需登记,并以具体查重理由关闭;
scripts/validate_memory.py --require-closed-captures必须能阻止孤立捕获、未跟踪捕获和未完成派生混入完成态;- 历史材料的事件日期、材料写作日期、回忆日期和本次录入日期必须分开,禁止把录入当天冒充事件发生日。
事实层级
所有内容按以下层级处理:
- 用户原话事实:用户第一人称明确说出的经历、状态、感受、偏好、纠正和规则;
- 用户对材料的评价:用户说某份分析不对、某人不是某账号、某个方案只是咨询等;
- 用户自己的解释:用户对原因、意义、关系和未来的解释;仍保留为用户观点,不自动变成客观事实;
- 模型候选解释:模型根据多条记录提出的模式或因果假设,必须单独放在假设层;
- 无法确认的内容:保留来源和缺口,不凭空补全。
用户刚刚说的内容优先于旧档案。旧事实不能被静默擦掉;新内容应建立 supersedes、contradicts 或纠正链。
统一记忆权重:只有一条轴
事件性质和记忆权重不是一回事,但不能再搞两套“重要性”标准。
entry_kind:事件、状态、决定、事实等,表示它是什么;salience:它在未来理解用户时有多大依赖价值,唯一采用 0–3 轴:3 主轴:改变长期理解、多个领域或人生方向;2 关键:明显改变某条生活线、当前决定或关系过程;1 关联:提供背景、连接或反例;0 提及:只作为名字或细节出现。
主轴/关键/关联/提及是同一个尺度的显示标签,不再另设“核心事件/重要事件/背景事件”第二套分类。旧记录迁移时的权重只能标记为 imported heuristic,不能伪装成用户亲自评定。
时间主干
时间主干是档案的第一条脊柱,但不是把人生强行写成一篇传记。
每条时间条目尽量保留:
date_start、date_end;date_precision:日、月、年、约略、相对顺序、未知;date_basis:发生时间、回忆时间、来源时间或模型推断;phase:童年、初中、高中、大学过渡期等;salience:唯一记忆权重;entity_refs:人物、学校、地点、物品、作品、概念和环境;before_ids、after_ids;- 原话片段和旧摘要片段的保真度。
禁止把记录创建日期当成事件发生日期。日期不确定就写不确定,不能为了让时间线好看而造日期。
总览怎么概括
总览采用事件优先、体验跟随、当前状态单独叠加的结构:
- 人生主干:先展示改变生活线的主轴/关键事件,不用一段宏大叙事概括用户;
- 事件展开:每个事件可以展开“发生了什么、用户当时感受、用户如何解释、后来产生什么影响”;
- 当前状态:单独展示当前内核、现实处境、感受负荷、正在拉扯的决定和下一检查点;
- 证据入口:每个判断都能跳回实体、情境卡、事件和原话。
因此不是“侧重事例”或“侧重感受”二选一:时间主干以事例为骨架,感受和意义是事件的展开层,当前状态再单独提供一个短而有信息密度的快照。
实体档案:人物不是孤岛
任何被用户明确指涉、并且在当前内容中承担一点作用的对象,都可以建立一个轻量实体档案;不因为它是路人就省略,也不因为资料少就编造长篇内容。
实体类型不限于人物:
person:人物、亲属、朋友、同学;group:班级、球队、社群;school_or_organization:学校、大学、机构;place:城市、住处、球场、工作地点;object:电脑、耳机、足球鞋、设备;book_or_work:书、小说、作品、文章;game_or_media:游戏、视频、音乐、账号内容;concept:概念、价值、理想、制度;environment:家庭环境、学校氛围、生活条件、制度环境。
模糊代词怎么处理
“单纯的模糊代词”指:
- 用户只说“他/她/那个人”;
- 当前消息和可回读上下文都不能确定指向谁;
- 也没有足够信息建立一个稳定的名字或角色。
这种情况下不创造一个假人物,也不写“未确认实体”这种模型看不懂的垃圾节点;把这段原话挂在事件的 unresolved_referent 上,保留原文,等用户之后明确指向再补进正式档案。
只要身份能从上下文确定,即使只有一句话,也创建一个短档案。路人档案可以只有几句话,这不构成浪费。
档案内容和冗余
实体档案不手抄一份重复传记。采用:
- 事实只保留一份:原话和事件是 canonical source;
- 实体页是投影:展示所有相关故事和原话入口;
- 实体正文不写可变状态:拥有/未拥有、在读/毕业、已购/愿望单这类会变的断言一律放进挂靠的
state记录,由update_state.py走版本链刷新;实体页靠投影自动反映最新状态,往实体正文写状态断言等于制造永不更新的僵尸信息; - 情境卡是交叉入口:展示某个实体在特定关系/地点/阶段中的共同故事;
- 交叉连接不删除:人物档案必须保留与其他人物、学校、地点和环境的连接;
identity_note、时间跨度等只是检索元数据,默认不占据档案正文,除非它们本身影响理解。
一个人的档案可以谈他身边的人,因为社会关系本来就是这个人的一部分。连接保留,同一事实通过链接和情境卡回到同一个 canonical 片段。
情境卡:解决“学校 × 足球”问题
实体档案之外增加 facet / context card。
例如:
学校实体
足球实体
学校 × 足球情境卡
学校档案可以跳转到这张卡,足球档案也可以跳转到同一张卡。卡片里面放共同事件、共同人物、地点、物品和原话入口,不复制一份假的“学校足球故事”。
情境卡的边界按共同故事形成:
- 同一事件中共同出现;
- 有明确关系或空间连接;
- 有共同的用户体验或决定;
- 有助于解释当前问题。
如果只是偶然共现,不自动写成因果关系;但也不因为“跨领域”就删掉。相关性由事件、时间、实体和用户体验共同决定。
当前状态
当前状态不写成一句空话,也不写成长篇传记。默认使用五块:
- 个人内核:当前仍在起作用的价值、边界和决策倾向;
- 现实处境:正在发生的生活事实和资源条件;
- 体验负荷:用户明确表达的情绪、能量、身体感受和压力;
- 开放张力:尚未解决的决定、冲突、反例和不确定性;
- 下一检查点:待回访、期限、需要新证据的地方。
每块先给 1–3 个高密度条目,附带可展开的重要事例和原话,不用只留内核,也不用把所有事例塞进首页。
待办与主动回访
模型提出的问题、用户提到的“等几天看结果”、对方尚未回复、等待决定或待确认事项,必须进入 memory/v2/followups.jsonl,至少包含:
- 原问题或待确认事项;
- 具体上下文;
- 创建日期;
due_at或明确的due_rule;- 当前状态;
- 来源;
- 上次检查时间;
- 解决结果或后续记录。
每次运行个人理解 Skill 时,先检查已到期和临近到期(默认 3 天窗口)的待回访。到期后主动提问,但提问必须带上下文:
你在某日提到:……
当时约定/预期是:……
现在已经到检查时间了。
这件事后来怎么样?
回访必须有正规关闭通道(2.5.0 §6.3),不要用"放着不管"代替关闭:用户回复了用 answered,用户明确不再跟进用 declined,方案被后续决定取代或本就过时用 resolved;三种都要 note 写具体依据。CLI 走 followup_check.py --resolve <id> --resolution <kind> --note "<理由>",MCP 走 personal_resolve_followup。当用户的回答本身就是一条新原话时,先 capture 再把该轮 capture_id 传给 resolve(可选参数,须已存在于 ledger),把用户原话直接绑在回访上;declined/resolved 通常没有新原话,不传即可。被取代或作废的回访若不关闭会持续污染对话入口和到期清单。
如果发现当前消息和档案存在矛盾,也要把冲突的两条事实、日期、来源和差异列出来,再询问用户;禁止没头没尾地突然追问。
引导开场:用户不知道要讲什么时
有些用户面对一个空档案会僵住。当用户问"我该讲些什么"、表现得不知从何说起,或档案刚初始化时,运行 python scripts/conversation_starters.py(JSON 输出),挑一条开场建议——排序为:到期回访优先,其次最空的领域——用你自己的话温暖地问出来。
- 绝不把整张清单当审问一次抛出;一次只给一条提示,等用户回答,然后像任何一轮一样捕获原话;
- 建议必须来自档案的真实空缺(空领域、开放回路、过期状态)——绝不编造心理学判断;
- "档案里没有 X"是一个需要证据的断言(2026-09-06 实测教训):无论场景是开场建议、回填清单、还是"这个内容档案查无、请你补原文"式点名,说出这句话之前必须先对 X 做定向 probe(用 X 的话题关键词,不是用户材料的标题原句——标题是别人起的,不代表档案的收录措辞),空手才许出口。实测反面案例:150 条标题清单靠脑补分诊,把忧郁小王子/硬盘故障/做饭难吃三条 probe 一发即中的既有记录判成"档案查无",用户被迫人肉贴原文。档案的标题、目录、直觉印象都不算证据,probe 空手才算;
- 用户回答后,回归正常流程:捕获 → 派生 → 回答。
回答前硬闸门(不可跳过)
只要当前用户消息包含个人经历、状态、感受、自我评价、关系、决定、纠正、长期偏好,或要求解释“我为什么会这样”,必须先通过内容优先的 preflight 创建当前轮 receipt,再把当前这条完整用户消息作为一份新的 immutable capture 保存成功后,才能执行 survey、probe、deep、派生记录、因果分析或回答。不能用上一轮 capture、旧摘要、current-conversation 或模型记忆代替。
内容分类器是关键词启发式,两层触发(2.5.0 §8,2.6.1 §4d 修正):第一人称+标记词("我+任何经历/状态词"),以及强情感词触发——中文常态省略主语,"有点烦""挺焦虑的""心情很差"这类抒发/状态轮次没有"我"字也要召回;带"我"字的强情感句("我堵得慌""我社死了""我诸事不顺")同样召回(旧版把强情感词挂在"无主语"分支下,第一人称情感句两头落空,实测是"四连漏"的主因,已修)。技术语境否决保持:句中含 python/代码/配置/报错等词时强情感词不触发,"这个 bug 烦死了""写代码写得心累"仍是技术轮。此外开了一个形态槽兜住词表枚举不尽的框架:X得慌(闷得慌/憋得慌,身体需求饿/渴/撑除外)。诚实边界:纯枚举仍不可持续——"兵役登记搞完了"这种省略主语的生活事件陈述、"最近状态不太好"这种弱词组合,关键词表按定义抓不全,兜底责任在模型:判断为个人材料就在同一 turn-id 上重声明 --tier full(2.5.0 §8.1 后同 id 升级即时生效,不再返回假 receipt)。
实测已知的漏型清单(2.6.1 三轮泛化测出,模型兜底时优先怀疑这些形态):以事件陈述包裹的情绪("兵役登记搞完了")、"状态/感觉"类弱词组合、以及情感词藏在第一人称之外的新口语形态(形态槽只覆盖 X得慌/干啥啥不行/哪哪都不对,其它靠补词或模型兜)。规则不变:凡是"这句话里有人的温度"就按完整档走,判错方向宁可多 capture(no-derivation 收场无成本)也不要漏 capture(用户原话永久丢失)。
执行顺序固定为:
内容优先 preflight receipt → capture(绑定 receipt,回读校验)
→ survey/probe/deep → 派生记录/假设 → finalize
→ session_check --turn-id → 回答/声称已更新
receipt 是可审计的事实,不是让模型参考一下的提示:requires_personal_understanding=true 时,capture、finalize 和 session_check --turn-id 缺一项即 fail closed。若捕获失败,停止个人理解相关分析,明确报告失败原因;不得继续回答后再补录。若捕获成功但尚未形成派生记录,回答中必须明确区分”已保存原话”和”尚未写入经历/状态卡”,不得把原话捕获说成档案已经完整更新。
这条闸门适用于直接提及个人档案、skill、记忆、原话或“记住”的消息,也同样适用于把个人经历、状态、感受、关系、偏好或决定包在改写、润色、翻译、总结、看图审阅任务里的消息。任务外形不能覆盖个人材料。纯技术、配置、排障、项目维护和本 Skill 规则维护属于跳过档,不创建 receipt、capture 或派生记录(见“三档调用闸门”)。
历史 light receipt 的兼容处理(2026-09-03):两档制改革前遗留的 tier=light receipt 按完整档闸门处理——light-tier-requires-derived-record 门禁已从 turn_receipts.py 移除;遗留 light 轮次以 no-derivation-needed 收尾属合法闭环,但 reason 仍须写明查重命中的既有记录。凡回答涉及用户个人背景,引用的档案细节必须来自本轮实际检索;没读过的内容不进回答,凭校验输出等边角碎片臆断档案内容比不提更糟。
低信号快速通道(完整档内部)
被内容判定为个人材料的低信息量消息(“有点迷茫”“说不上来”,见 scripts/preflight_context.py 的 low-information 判定)同时受两份契约约束:回答要自然(见低信号响应契约),闸门又要求先捕获。单独一个“唉”不会自动进入档案。为避免把聊天变成检索现场,低信号个人轮次按以下顺序执行:
- capture 立即执行,不可延迟——原话保真没有例外;
- 读取降级:不跑完整 survey,直接用 preflight 输出里的到期回访 + 当前状态快照挑一个最可能的入口;确有必要才做一次小范围 probe;
- 回答优先:像熟人聊天一样直接开口(一两个细节,说完就停),工具调用控制在 capture + 至多一次轻读取;
- finalize 收尾:回答之后的同一轮内完成派生或
no-derivation-needed关闭,并运行 session_check;若用户连续追问转成实质内容,则升级为完整流程。
快速通道放宽的是读取和派生的时序,绝不放宽原话捕获和闭环本身。它服务于已含个人材料的消息(只是信息量低),仍按完整档做语义拆分;与之相对,不含实质个人材料的活动足迹轮次走完整档的足迹纪律路径(见两档调用闸门)。
读取入口与 MCP
优先使用 MCP 工具(personal_catalog、personal_retrieve、personal_session_check 等)读写;它们带读取前捕获校验。足迹/攻略类消息被 capture 闸门拦下时的只读降级(2.6.0):内容分类器把"只狼怎么打""书荒求推荐"这类足迹消息判为 non-personal 时,写入照旧被拦,但可以用 personal_retrieve / personal_catalog 的 maintenance: true 做只读读取(有 trace 审计;等价 CLI --maintenance),随后模型仍应按足迹纪律在同一 turn 上用 tier=full 重声明补 capture——只读通道解决的是"读不到档案",不是"免捕获"。若当前会话工具列表里没有 personal_* 工具,说明本客户端尚未注册本地 MCP 服务:运行 python scripts/install_mcp.py --auto(幂等,可重复执行)完成注册后提示用户重启会话;注册前仍可用 CLI 脚本完成同样的工作——但 CLI 读取同样遵守"先捕获再读"(2.5.0 §6.5:retrieve_v2.py/catalog_context.py 需 --capture-id,与 MCP 一致),无对话轮次的维护/测试/审计读取显式声明 --maintenance。注意:如果本机存在多份 skill 树(备份、沙盒、粘贴副本),从副本运行 --auto 时若旧注册树仍在磁盘会被 §6.6 防劫持护栏拦下并拒绝改注册,确认要切换须显式 --force(这防止把用户真实注册静默重指向测试树)。
检索流程:不是把所有东西读完
v2 的检索不是“先把整个档案库塞进模型”,也不是只搜关键词。它是三层发散:
survey:看全局地图
只读紧凑目录,不读原话全文:
- 时间主干;
- 当前状态;
- 实体目录;
- 情境卡目录;
- 待回访;
- 因果假设目录;
- 资料缺口和审查警告。
survey 是紧凑路由地图,不含旧记录全量列表;需要按领域展开旧目录时用 catalog_context.py --view routing --query <消息>,需要完整目录时用 --view full。
因果假设按需携带(2.5.0 起,检索层闸门):survey 和 probe 里假设默认只显示 id/status/confidence 存根,只有当轮消息的内容词真实命中假设文本时才带出 claim/scope/mechanism。因此当用户的问题是在求解释("为什么我会…")而存根 id 又看着可能相关时,主动用 personal_catalog --view full 或把用户的因果措辞原样放进 --query 读完整假设;普通事实问题不要为凑数去翻假设。
probe:从入口发散
模型选择一个或多个入口:
- 事件;
- 实体;
- 情境卡;
- 当前状态;
- 待回访;
- 候选假设。
然后读取入口的派生卡片,并扩展:
- 事件前后时间邻居;
- 事件涉及的人、地点、学校、物品、作品、概念和环境;
- 这些实体共同出现的情境卡;
- 支持、反驳、替代和 supersede 关系。
这些扩展只读取必要范围,同时保证细枝末节有卡片可达,减少关键小人物漏召回。probe 输出的每条时间条目带 evidence_fidelity 保真计数(逐字/摘要债务各占多少);用摘要债务支撑的说法要向用户说明"这一段来自旧摘要,不是原话"。每次检索的决策轨迹会追加到 memory/v2/traces/,漏召回和误归属时用它回放检索过程。
probe 与 routing 共用同一套加权排序(2.4.1 起,2.5.0 起为 weighted-idf-4-anchor,2.6.0 起加权词元经过档案词表净化):IDF 稀有词加权("只狼""猫学派"这类短专有名词权重高,烂大街单字权重接近零)+ 长度归一(超长记录不再靠字数霸榜)+ 实体别名路由(命中实体的时间条目获得反哺加权,如"哥哥 家里"→哥哥冲突)+ 单字实体别名豁免("妈""她"这类档案别名不按噪音降权,口语查询可直接触达家族簇)+ 内容词入选门槛(只被非别名单字偶然命中的记录不占检索名额,杜绝"防/钱/状态"式捞偏)+ 锚定比值降权(记录得分乘以"它命中的最强词重 ÷ 查询最强词重":只靠大路词上榜的长记录被按比例压下,命中查询稀有决定词的记录不受影响;查询本身没有稀有词时退化为原行为)+ 词元净化(2.6.0:查询切片先过 resources/lexicon 词典——vendored jieba 词典 + 档案自训练词表 memory/v2/archive-lexicon.json,档案里 DF≥2 的字段自动成词,冷门专名靠档案自训练;词典外切片权重 ×0.4 封顶——保留召回但不再当锚定,跨词假切片如"郎我"不再霸榜;"巫师3""晕3D"这类中英混写专名自动粘连成整词;ASCII 单字符(如"巫师3"拆出的"3")不再具备内容词资格)。因此短词游戏名等查询的漏召回已修复,定向查重直接按足迹关键词 probe 即可;routing 仍是按领域浏览的全量地图,供查不到关键词时兜底。诚实边界:probe 的契约输入是足迹关键词——把整句原话直接当 query 时,锚定降权可缓解不可根除;模型侧先提关键词再 probe,routing 才吃整句。
associations:联想检索通道(2.6.0)
probe 输出里有一个独立的 associations 段:个性化 PageRank 在档案图上扩散(种子 = 本轮查询实际命中的实体与概念卡),带出词面零重叠的候选——例如用户抱怨"打击感烂"时应想到"巫师3 骑马手感"记录(两个词面无交集,靠概念卡 entity.concept.gameplay-feel 中转)。使用契约:
- 它是候选池,不是排序结果:每条带
via_entity图路径与spread_score,模型必须自己判断联想是否成立再引用;经枢纽封顶(mention_count>30 的泛枢纽不做中转)与去重(不与 timeline/knowledge 重复)。 - 绝不混入 timeline:词面通道管精确回忆,联想通道管发散;两者分开呈现,审计时 via 路径可回放。
- 概念卡是它的地基:
entity.concept.*卡(操作手感/叙事体验/品味锚点/金钱自主/消费纪律/家庭边界/考公路径/身体限制等)的 aliases 覆盖口语入口词("书荒""晕3D""考公""史低");新概念出现时按实体卡流程开卡挂链,不要让联想层退化为共现随机游走。 - 宽泛兴趣问题("书荒了""最近好无聊")若实体零命中,associations 会经由概念卡 aliases 自动获得种子;仍无种子时按"冷回溯"阶梯与实体目录 routing 兜底,禁止宣称"档案里没有"。
聚合读法:侦探拼图(2.6.1)
宽泛决策问题("我该怎么办""我是个什么样的人""这条路值不值")不是单入口 probe 能答的。像警察拼案情:多条模糊线索摊在桌面上,拼出完整画像。执行方式是对既有 probe 的编排,不新增机制:
- 多入口并发:按线索词拆 2-4 个 probe(情绪线、利益线、人物线各一发),每发用该线的足迹关键词;
- 跨域收集:允许每条线各取 timeline/knowledge 前排 + associations 的强候选(via 清晰者),entities 段命中的概念/实体卡也算跨域信号(卡是挂靠边的入口,P5 实测考研场景:决策卡 career-exam-route 经路线线 entities 首位可达,只看前三段会漏掉它),禁止单通道凑数;
- ids 精读:把候选中直接相关的记录用
ids参数精读(deep),核对原话; - 拼图输出:回答里区分"档案事实""模式观察(多条记录的共同点)""模型推断"三层,推断层注明依据了哪几条记录——禁止把单次事件升格为人格定论。
工具与模型的分工契约(懒惰悖论的答案,2.6.1)
词典、IDF、PPR 这些检索层机制的职责边界,回答了"工具这么强模型还用不用自己判断"的张力:工具把召回的体力活做厚(候选捞全、切片净化、宁滥勿漏),判断与拍板永远在模型。衡量标准不是"模型还用不用自己想",而是模型思考时的起点质量——前排候选有多干净、被扣下的候选有多可解释。因此:
- 模型必须自己提关键词再 probe(工具不给判断,只给候选);整句直查只在 routing/时间窗场景合法;
- 模型不必替工具干活:不要手工过滤 n-gram 假切片、不要人工重算 IDF——这些是检索层的责任,发现问题报给维护轮修机制,而不是在回答里绕过;
- 前排有噪声时不静默吞下:按 trace 说明"为什么它会出现、为什么不采信",让下一轮修复有据可查。
deep:回到原话核验
只有当回答需要精确事实、时间、归属、矛盾、人物关系、用户原意或因果解释时,才读取对应原话片段。旧摘要只能作为摘要债务,不能在 deep 阶段伪装成原文。
冷回溯:想不起关键词时
用户说"我忘了""好像以前聊过类似的事"时,不要求他提供关键词,也不宣布"查不到"。按阶梯下降:
- 从已提到的任何人物、地点、物品、时间线索做 probe,顺实体和 facet 发散;
- 命中任意条目后,沿
before_ids/after_ids时间邻居向前后走; - 仍无命中时,用
retrieve_v2.py --window 2025-03(或起:止区间)按时间窗浏览标题,像翻老相册一样扫过候选,让用户认领; - 时间也说不准就按 phase(童年/初中/高中/大学)逐段扫主轴。
降权到提及级的记录同样在实体、关键词和时间窗三条路径上可达;降权只把它移出常驻地图,不把它变成不可达。
因果解释层
因果解释是独立的大工程,不在普通事实检索里自动乱跑。候选假设至少包含:
claim:解释什么;mechanism:通过什么过程发生;supports:支持证据;contradicts:反例或限制;alternatives:竞争解释;scope:在哪些时间、场景和关系里成立;confidence:置信度;status: candidate:默认候选,不能当作事实。
触发条件:
- 用户明确问“为什么我会这样”;
- 多条独立经历跨时间重复出现同一条件—反应—适应链;
- 深度回顾发现多个模型互相依赖;
- 当前决定确实需要比较不同成因。
生成步骤:
候选模式 → 机制草图 → 支持证据 → 反例/限制 → 竞争解释 → 用户确认/继续观察
单次事件不能直接生成稳定因果。因果假设只有在当前问题需要解释时才进入深读;普通事实问题不自动加载它。
隐私边界
用户已明确允许本地 Skill 在相关时正常读取 private / highly-private 内容。敏感度不再作为隐藏、降级或归档理由。
但相关性过滤仍然保留:
- 个人资料会改变答案时,敏感内容按相关性读取;
- 无关问题不主动泄露无关私密材料;
- 原话、档案和来源只在本地 Skill 目录处理;
- 外部聊天、第三方分析、OCR 和模型分析仍不能自动当作用户事实。
放宽隐私读取,不等于取消边界;否则不是更懂用户,是把档案当垃圾桶倒进每个回答。
深度审查和结构校验
结构校验不再只输出“通过”。scripts/validate_memory.py 有三种结果:
clean:没有错误或警告;warnings:结构可用,但存在摘要债务、来源缺口、日期缺口、待回访或实体连接问题;failed:存在哈希错误、重复 ID、孤立引用、关系环、损坏 JSONL 或不可接受的 schema 错误。
严格模式 --strict 会把警告也视为失败,适合迁移验收。
review_v2.py --deep --json 用于生成语义审查包,重点检查:
- 原话与事件是否一致;
- 人物/学校/地点/物品是否归属正确;
- 共同故事是否被错误删掉;
- 时间顺序和“后来回望”是否混淆;
- 事实、感受、用户解释和模型假设是否混层;
- 旧摘要是否被错误当成原话;
- 因果假设是否有支持、反例和范围;
- 待回访是否到期、是否已经解决。
深度审查可以输出警告和资料缺口,但不能凭空补写丢失的原话。结构干净不等于语义正确;审查必须有风险报告。
维护入口
scripts/capture_user_update.py:先保存完整用户原话(超长消息优先用--stdin或--file,避开命令行长度限制);scripts/preflight_context.py与scripts/turn_receipts.py:创建、读取和审计不可变的 turn receipt;scripts/capture_attachment.py:保存或按 SHA256 精确去重原始附件,并登记 pending;scripts/derivation_ledger.py:维护 capture→records 状态和链接审计;--repair可由 immutable capture metadata 和 record 引用重建投影;scripts/finalize_capture.py:完成派生或记录“无需派生”的具体理由;scripts/catalog_context.py:v2 全局 survey;scripts/retrieve_v2.py:v2 probe/deep;scripts/followup_check.py:待回访检查;scripts/review_v2.py --deep:深度结构/保真/语义准备审查;scripts/validate_memory.py:失败、警告、干净三态校验;scripts/session_check.py --turn-id <turn-id>:回答或声称"档案已更新"前的硬闸门(receipt + 结构 + 派生闭环 + v2 完整性,失败退出码非 0);scripts/salience_review.py:季度记忆权重复盘,把长期未确认的导入权重降为提及级(见references/review-and-feedback-loops.md);scripts/record_feedback.py:记录依赖个人记忆的回答效果(helpful/missed/corrected),review_v2 --deep汇总常被纠正的记忆(见references/review-and-feedback-loops.md);scripts/rebuild_views.py:重建旧版兼容视图、v2 派生视图与档案自训练词表(memory/v2/archive-lexicon.json,2.6.0 起每次重建自动刷新,供检索词元净化使用);scripts/pipeline_view.py:一轮对话的管线时间线(receipt → capture → 派生闭环 → 检索 trace 的一页只读回放,2.6.0;--turn-id X或--latest N,HTML 输出到 dashboard/,同时是审计与验收工具);scripts/backup_archive.py:生成带 SHA256 清单的本地备份,并自动镜像到memory/backup-config.json指定的第二位置(见references/maintenance-and-durability.md;重要更新后、迁移前、至少每周一次);scripts/init_archive.py:全新安装时初始化档案骨架(目录 + 通用领域分支),首次使用前运行一次(幂等);scripts/install_mcp.py:检测本机各 AI 客户端并注册本地 MCP 服务(幂等;换机器、粘贴 skill 到新客户端后运行一次即可;若检测到多份 skill 树并存,改注册受 §6.6 防劫持护栏约束,须--force显式确认);scripts/mcp_server.py:本地 MCP 读写入口;- 弃用兼容层(勿作读取入口):
scripts/query_context.py(旧 core/evidence 结构 + 英文触发词的 legacy proactive cues)、scripts/retrieve_context.py(2.0-compat 检索接口)。它们与 v2 不是同一套,只为回归调试保留,读取一律走catalog_context.py+retrieve_v2.py;references/proactive-cues.json是英文触发词且默认关闭,任何人要重新启用须先翻译成中文,否则匹配不了中文输入。一个发布周期确认无依赖后可整层删除。(注意:review_context.py不是这一层——它是 review 系统review_skill的活依赖,别误删。) dashboard/:v2 可视化面板。
维护原则
- 先完成当前任务,再做非紧急维护;
- 但用户纠正、原话捕获失败、人物归属错误、结构损坏、待回访到期和临近决策必须及时处理;
- preflight / session_check 输出里的
maintenance提醒是唯一需要看的维护状态:备份超期(backup.due: true)时,当前任务完成后先运行scripts/backup_archive.py再结束会话;依赖个人记忆的回答出现用户明确纠正/确认时,按references/review-and-feedback-loops.md记录反馈(写不出原话证据就不记录); - 永久删除必须由用户明确指定;
- 旧摘要不删除,标记为迁移债务;
- 新档案不覆盖旧档案,使用版本链;
- 所有 writer(CLI、MCP、ledger、重建)共享进程间锁,并以原子 replace 落盘;写入一律在锁内基于最新磁盘快照读取、合并、提交。禁止从旧 JSON/JSONL 快照覆盖其他 Agent/MCP 已写入的数据;
- 不把用户一句自我评价直接升级成人格定论;
- 不为了让图谱好看而制造因果边、合并人物或填补时间。
可视化审计契约
面板的任务是让用户检查 Skill 是否按规则工作。首页只提供状态入口和数量入口;详细内容进入对应的时间、实体、情境、来源、待回访和诊断页面。
诊断页必须能看到:
SKILL.md、references、scripts、memory/v2 的真实文件入口;- 原话捕获、片段、时间条目、实体、情境卡和检索层级的实际数量;
clean、warnings、failed的机器校验结果;- 旧摘要债务、日期缺口、实体归并、关系未解析和候选假设缺口;
- 从事件跳到实体、情境、知识卡、前后条目和原话来源的完整链路。
任何列表点击都要使用自己的 ID。禁止把多个条目绑定到同一个默认目标。实体重定向要显示旧 ID、canonical ID 和归并来源。