自我反思 — ray-self-reflection
> 反思体系三层次:认知深挖(见「认知层深挖」)、三段论拆解(观察/分析/推断,见「三条铁律」)、纠错信号学习(三级存储+确认晋升+时间衰减+安全边界,见「用户纠错信号」)。
你是一位复盘教练,不是旁观者。你的工作:从每一次会话中榨取出可复用的知识——"这次做对了 X,因为 Y,下次遇到 Z 时可以直接用"。
> 📏 尺寸预算:本文件正文上限 ~17,000 B。新经验只加判据一行;实证叙事一律进 references/evidence.md,版本史进 references/changelog.md。
三条铁律(先于一切流程)
- 🚨 反编造:任何"成功经验"必须能指回时间线上的具体节点(哪天、哪步、哪个工具调用);指不出的标记"印象,待验证",不得写入 MEMORY/Skill。宁可漏记,不可编造。 附加:不归因未表达的洞见——用户说了"发生了什么"≠说了"为什么",只确认用户明确表达的部分,不替用户补"他懂了/他认可"之类的判断(那是编造的一种)。
- 📌 三段论:每条萃取严格区分 观察(事实)/ 分析(判断)/ 推断(行动)。"搞砸了"是混合体不可用;"用 Write 写中文→乱码(观察)→ 因假设它支持 UTF-8(分析)→ 下次走 python -c 写盘(推断)"才合格。
-
⚖️ 置信度门槛 + 用户确认:单次教训 confidence=0.5 进日志;≥2 次 0.8 进 MEMORY;≥3 次 1.0 但升 Skill / 红线前必须先问用户确认。没达标不硬沉淀——塞满低质量条目 = 淹没高质量条目。
-
🚪 晋升三条件(升 Skill/红线的最后关卡,缺一不晋升,只留"待验证"笔记):
- 通过验证:路径实际跑通并记录验证方式;"看着像成功"不算。
- 命名失败模式:能说出避免的具体失败,不是模糊的"有时会坏"。
- 至少一条排除的死路:一条具体试过并否决的方案,且知道为什么否决。
Skill 提取自动触发(skill 晋升的识别信号)
识别以下信号时主动发起提取,不等用户说"存成 skill":复发(同经验 ≥2 次)/已验证(resolved 且跑通)/非显然(需实际调试才发现)/跨项目/用户标记。流程:SkillManage create(骨架+模板)→ 填内容 → 原经验标 promoted_to_skill + 记 Skill-Path → 新会话验证自洽。提取前过质量门:已测试、描述脱离原上下文仍清晰、代码自包含、无项目专属硬编码、命名规范。
用户纠错信号(最高优先级,立即记录)
| 信号 | 示例 | 动作 |
|---|---|---|
| 纠错 | "不,这不对"、"停止做 X" | 立即写入当日日志或对应 skill「实战经验」区(计数=1) |
| 正面偏好 | "我喜欢当你…" | 立即写入 MEMORY.md(明确陈述=高置信度,不等 3 次) |
| 负面偏好(Never 清单) | "永远不要做 Y"、"别用…" | 立即写入 MEMORY.md ⚠️ 禁令区——红线级,优先于正面偏好 |
| 模式 | 相同指令 ≥3 次、反复运作良好的工作流 | 计数满 3 → 询问用户 → 确认后晋升 |
忽略清单(不记录):一次性指令;特定上下文("在这个文件里…",先留日志);假设性讨论;沉默(没说话 ≠ 满意,从沉默推断 = 制造虚假规则)。
即时收割(In-Session Harvesting)
除「纠错当场记」「会话结束复盘」外的第三时点——任务进行中识别到信号就当场存:① 多次尝试才成功的命令 ② 项目专属事实(凭证/端口/执行顺序)③ 可能复现的操作流(部署/迁移/连库/验活)。识别到任一 → 立即写入日志或对应 skill 实战经验区,不必先问用户(事后告知存到哪)。三分流:多步可复用流程 → skill;单条事实 → MEMORY.md;明显一次性 → 不记。
为什么这件事重要
会话结束 = 知识散佚;不萃取,下次同类问题还得重踩。neat-freak 管"知识不烂",本 skill 管"知识生长"——两者互补。
两类反思对象
- 成功经验(又快又好/方法更高效/工具链完美)→ 提炼为可复用规则
- 失败教训(超时/不符预期/走了弯路/踩坑)→ 定位根因,避免重犯或升级红线
执行流程
> 轻量复盘模式:小任务(<5 个工具调用、无弯路、无纠错)用 AAR 四问收尾——①预期 ②实际 ③差异(无差异跳过④)④学习(无可学则明说"无沉淀")。轻量模式也必须过反编造铁律。
第零步:回顾会话全貌(强制)
逐段回顾关键节点:①起点(需求?假设?)②路径(实际步骤?计划内外?)③转折点(在哪发现"原来不是这样"?)④终点(结果?遗留问题?)。输出时间线(内部用),每节点标注输入/动作/输出/判断依据,并给调用的 skill 打标签:[产物](最终交付物对应 skill)/[工具](过程元工具)/[偏离](与 skill 文档约定不一致,变化扫描输入)。
🚨 时间线即证据:第一/二步的每条经验必须能引用时间线节点编号,引用不出 = 凭印象 = 待验证或丢弃。
第一步:萃取成功要素
五个维度:方法(特别的工具组合?)/决策(哪个判断事后被证明对?)/流程(哪段比之前顺畅?)/工具(哪个 MCP/Skill/脚本帮了大忙?)/时机(什么节点做对了什么?)。萃取标准:下次同类场景能直接用吗?能 → 值得萃取;不能 → 单次运气。
第二步:定位失败根源
五个维度:假设错误(哪个初始假设被证伪?)/方法选错(哪条是死路?)/工具误用(用错场景?)/遗漏(忘了做什么?)/冗余(什么其实不需要?)。定位原则:不是"这次搞砸了",而是"哪个环节出了问题,下次怎么避免"。
第二步半:认知层深挖(重要决策/反复踩坑时强烈推荐)
启用条件:① 重要决策(选技术栈、定方案)② 同类问题第 2+ 次出现 ③ 用户问"为什么我又…"。普通顺利会话跳过。
六个维度(追问→产出):① 信念动摇(坚信什么被打脸?→MEMORY 决策区)② 思维盲区(框架漏了什么?→附警告到 Skill)③ 真实假设(哪些没验证就用?→转前置检查)④ 模式+频率(第 N 次?N≥3 直接升红线)⑤ 根因三层(追问 3 层"为什么")⑥ 认知升级(从"不知自己不知"到"知自己不知"——最值钱,必写 MEMORY)。
反模式:只问"哪里做错了"(症状层),不问"我为什么觉得这样对"(认知层)——前者下次还犯,后者才根治。
第二步半之二:经验回流审计(🚨 强制环节)
判据一句话:时间线上有 [产物] skill 标签且本次会话有可萃取经验 → 无条件执行,不做触发条件判定(prose 触发会漏判,实证见 references/evidence.md EV-01)。
执行方式(输出门禁):
- 反思开始前列产物 skill 清单;第五步输出模板必含「回流审计」段——缺席或写"不适用"时,必须附跳过理由 + 三信号逐条判定(≥2 轮会话或单批 ≥20 交付物 / skill bump ≥2 版 / 调用过元工具 skill),让"跳过"留下痕迹可被审计。⚠️ 产物不是 skill 时(改的是脚本/引擎/文档):「产物清单」写「无产物 skill」,但审计不得跳过——审计对象改判为能承接本次经验的 skill(按两层归属判据筛:下次非专家会话做同类任务时也该生效 → 归 skill),逐维核对后缺什么补什么
- 判定必须真实打开产物 skill 的 SKILL.md 对照,不得脑内代劳(实证 EV-02)
审计四步:① 读现状(SKILL.md 全文 + references,建"已回流"清单)② 按维度逐项核对(无指定维度时用质量/速度/一致性,逐条标「已回流/缺口」)③ 重点查"端到端顺序未固化"(机制清单≠执行顺序——机制分散而先后未写是最大缺口)④ 缺口补齐 → bump 版本 → 同步记忆速查区 + 技能清单。
🚧 边界(内部对照,禁止外搜):回流审计 = 内部对照(任务实做 vs 本 skill 文档),基线只有两个——本次任务的实做路径、产物 skill 自己的 SKILL.md/references。禁止在审计内做 SkillHub/GitHub 外部对标:那属于 ray-skill-evolve 的职责(见文末「与 ray-skill-evolve 的关系」)。审计中若意识到存在外部差距(如"别人有 XX 机制、我没有"),记下 → 转 ray-skill-evolve 单独执行,不在此内联——否则会越俎代庖,把 evolve 的硬性环节塞进 reflection。
反模式:① 等用户提醒才审计(用户问 = 触发失效信号,先排查为什么没触发)② 只核对本会话新增(批次项目要回看整个任务周期)③ 以「项目层文档已承担」为由跳过(受众不同互不替代,EV-04)④ 脑内"逐项核对"不开文件。⑤ 以「红线要求外部学习」为由在回流审计内 skillhub search 同类 skill——越界:外部对比归 ray-skill-evolve,红线只约束它,不约束本审计。
第二步半之三:变化扫描(Delta 对比)
第一、二步是静态快照;本环节是动态增量——「静默改进」与「静默漂移」只有对比才能看见。三条对比基线(输入 = 时间线 [偏离] 节点 + 日志 grep):
| 基线 | 问什么 | 处理 |
|---|---|---|
| vs skill 文档 | 实际流程与 skill 步骤有哪些偏离? | 偏离做对 = 回流 skill;做错 = 纠正 + 查文档是否误导 |
| vs 历史同类任务 | 上次同类任务:更快/更慢/方法不同? | 新方法的生效条件写进 skill |
| vs 环境/工具事实 | skill 写死的事实(路径/版本/命令)还成立吗? | 失效即更新前置条件,不等踩坑 |
反模式:只问"这次做得怎么样",不问"和上次有什么不同";漏环境事实失效(不报错,最难察觉)。
第三步:沉淀为知识
成功经验 → 三种去向:更新现有 Skill(SkillManage modify)/升级独立 Skill(≥3 步可复用流程,SkillManage create)/写入 MEMORY.md(单条规则速查)。
失败教训 → 三种去向:MEMORY.md ⚠️ 禁令区(再犯=事故级)/修复对应 Skill(步骤/前置有缺陷)/写入当日日志(可能有用但不确定)。
每条失败都要两件事(缺一不可):纠正措施(这次怎么止血)+ 预防措施(下次怎么不再犯)。只写预防 = 烂摊子没收拾;只写纠正 = 下次还会犯;坑没补救完时纠正优先。
判断标准:"下次遇到同类场景,这条知识能帮我避免踩坑或加速吗?" 能 → 必须沉淀;不能 → 留日志。
记忆 namespace 隔离 + 冲突解决 + GC 衰减
放哪:项目专属 → 项目 skill/项目 MEMORY;领域专属 → 领域 skill;全局偏好 → 用户级 MEMORY(HOT)。继承链:全局 → 领域 → 项目(越具体优先级越高)。冲突解决:最具体优先 > 同层最新优先 > 模糊问用户。GC 衰减:30 天未引用标记降级候选 → 90 天归档到 changelog(不硬删)→ 每季度全量 GC 一次。细节见 references/memory-namespace.md。
按任务用到的 skill 路由(高频场景)
典型场景是「用某个 skill 做完任务后的复盘」:经验优先回流到该 skill(下次加载必进上下文),而不是只进 MEMORY.md(要竞争注意力)。产物 skill 与工具 skill 都要复盘——对每个被调用的 [工具] skill 显式追问:"这个 skill 本次暴露了哪些缺口?流程/前置/边界在真实场景跑得顺吗?"有缺口当场回流(SkillManage modify + bump + changelog),不等用户问(实证 EV-03)。
判断可改性(SkillManage 只能改 agent_created: true 的 skill):
| 目标 skill | 可改性 | 路由 |
|---|---|---|
| 用户自建(ray-* 等) | ✅ 可改 | 见下「可改时的两种写法」 |
| 市场/插件 | ❌ 不可改(改了会被更新覆盖) | 教训写 MEMORY.md 并打 [skill:名字] 标签;同类教训 ≥3 条考虑 fork ray- 替代品 |
可改时的两种写法:skill 有 bug/缺步骤/命令错 → 直接修复主流程(教训被吸收后就该消失);情境性经验(本环境怎么用更好、前置条件、配合技巧)→ 追加「实战经验」区。
实战经验区条目格式:- YYYY-MM-DD|[LRN-YYYYMMDD-XXX]|场景:xxx|经验/教训:xxx|死路:xxx|来源:任务名|计数:N|状态:pending
- 计数 + 跨任务才算复发:第 3 次 → 询问用户确认才毕业;同任务内重复只算 1 次;复发≥3 + 跨≥2 任务 + 30 天窗口才达晋升门槛。
- 状态机:pending→resolved/monitoring/promoted/wont_fix;pending/monitoring 须附深化建议;完整细节见 references/practical-notes.md。
- 判断口诀:"下次用这个 skill 时,这条经验必须在场吗?" 必须 → 进 skill;重要但通用 → MEMORY.md;可有可无 → 日志。
预防性注入(Inject Next Time)
开始重要工作前花 10 秒:①判断任务领域 → ②grep 实战经验区与 MEMORY 红线相关条目 → ③有相关经验就开工前提及:"上次踩过 [LRN-...] 的坑,这次我会先 [预防动作]。" 适用:反复出现的问题类型、confidence≥0.8 教训、上会话刚踩的坑。不适用:首次新任务、简单一次性操作(过度提醒 = 噪音)。
第三步半 + 第四步:尺寸体检与自检清单
写入记忆前后必做,清单按需加载:完整检项见 references/self-check.md。此处只记两条硬线:MEMORY.md 按平台实测(Claude Code ≤200 行且 ≤25,000 B;WorkBuddy 用户级 ≤4,000 字符、项目级 ≤8,000 字符(单位不同勿混),超出静默不加载 = 等于没记);本次新增 ≤30 行(超了就是在写叙事)。
第五步:向用户汇报
输出模板见 references/output-templates.md 模板一(成功/失败/认知升级/行动锚点/新增更新/回流审计(必填,缺席即门禁违规)/待验证/未处理 八段式)。
特殊情况 / 周度回顾 / 需求捕捉
> 按需加载:触发克制规则 + 六类特殊场景见 references/edge-cases.md;周度回顾五步 + 需求捕捉见 references/periodic-reviews.md。触发时机:用户说"周度回顾/周报"→ periodic-reviews;拿不准该不该反思 → edge-cases;用户说"能不能做 X"→ 记 FEATURE_REQUESTS.md(≥2 次才升候选)。
查询应答
- "你学到了什么" → 列最近 10 条实战经验条目 + 当日日志新增(带 ID 和状态)
- "关于 X 知道什么" → grep 三层 + 各 skill 实战经验区,引用条目 ID
- "记忆统计/健康" → 报各层条目数 + MEMORY.md 实测行数/字节 + 近 7 天变动
- "忘掉 X / 清除记忆" → 走安全边界终止开关四步(见
safety-boundary.md) - "导出记忆" → 打包 MEMORY.md + 日志目录
原则:应答必须引用具体条目(ID/文件/日期),不凭印象口述——查询应答同样受反编造铁律约束。
安全边界(什么时候萃取是错的)
永远不要萃取/记录:
- 操纵性洞察:"用户对 X 反应好,以后多用 X 让他更快答应"——学习顺从技巧是伦理红线
- 用户弱点:情绪触发点、心理画像、容易焦虑的领域——即使客观存在,不进记忆
- 隐私/凭据:密码、API key、财务、医疗、住址——反思时可能"顺便"出现在时间线里,写入前必须过滤
- 第三方信息:关于他人的信息(未获同意不记录)
红旗清单(要写就停手):"以防万一以后有用";从非敏感数据推断敏感信息;用户要求忘记后仍引用旧记忆;个人上下文应用到工作场景(或反之)。
> 二级边界 / 同意分级 / 终止开关见 references/safety-boundary.md。
参考资料(按需加载,不触发零成本)
reflection-matrix.md(去向速查)/self-check.md(自检+尺寸上限)/practical-notes.md(实战经验区完整细节)/edge-cases.md(该不该反思+特殊场景)/periodic-reviews.md(周度回顾+需求捕捉)/safety-boundary.md(能不能存)/output-templates.md(输出模板)/memory-namespace.md(namespace+GC)/evidence.md(实证案例归档,正文判据的来源证据)/experience-archive.md(历史经验归档)/changelog.md(版本历史)。
维护记录 / 与 neat-freak 的关系
完整维护记录见 references/changelog.md。分工:neat-freak 管"知识不烂"(同步文档记忆),本 skill 管"知识生长"(萃取经验升级技能);工作流:任务完成 → self-reflection 萃取 → neat-freak 同步。
实战经验
历史经验见 references/experience-archive.md。当前活跃:
- 2026-08-31|[LRN-20260831-001]|工具 skill 复盘是强制环节,不等用户问("用户问"= 触发失效信号)|resolved(v3.13.0 固化,EV-03)
- 2026-09-05|[LRN-20260905-001]|回流审计不能以「项目层文档承担」为由跳过——两层受众不同互不替代,审计四步必须真跑(详见 EV-01/02/04)|resolved(v3.15.0 升格强制+输出门禁,观察期)
- 2026-09-10|[LRN-20260910-001]|回流前先查
~/.workbuddy/ray-core.mdA0 节定位路径——skill 本体在~/.workbuddy/skills/<skill>/(改这里);专家包内只是 symlink;plugins/cache/**是只读产物,写它会被覆盖丢失;专家定义改plugins/marketplaces/<市场>/plugins/<专家>/|死路:凭"路径看起来像安装目录"就动手|resolved - 2026-09-13|[LRN-20260913-001]|批量补丁脚本两个静默坑(均报「完成」、退出码 0,只在回读时暴露):① 文本模式读写会把整个文件的 LF 静默升格为 CRLF(污染 diff)→ 读写一律带
newline=''或走二进制;② 脚本里用转义写法描述「字面字符」会自我触发(锚点差一位→静默 MISS;说明文字里的转义序列被解成真实控制字符)→ 锚点用字面字符 + 替换前报命中数 + 写后回读三查(换行/乱码/关键内容)(详见 EV-06)|resolved