展开 ROADMAP_v1.0.md §5 的 Reve 支柱。基线 v0.9.1。 Reve = 现有 Dreams 系统的正式更名(idle 反思 + 会话末反思 + heartbeat + soul 演化)。 本支柱最成熟,1.0 的工作是"硬化 / 可观测 / 有界 / 可度量",不是加新能力—— 这与 PRODUCT_REVIEW_v0.9.md 的结论一致,也直接喂论文。 上游设计见 AUTONOMY_ROADMAP.md(Phase 1–3 已落地)。
实现状态(branch
feat/reve-hardening,0.10):
- R1 reflect 质量门禁(坏 JSON 重试 +
<id>.error.json落盘 + underreflect 信号)✅- R2
src/autonomy/runs.ts统一AutonomyRun账本 + idle 成本断路器(agent loop 新增budgetTokens/budget_exceeded)+lisa autonomy摘要 ✅- R3
lisa soul summary人可读速览(src/soul/summary.ts)✅;锁铺全(R3b)已核对在 0.9.1 完成——appendJournal(store.ts:391)、applyEmotionDelta(store.ts:137) 均已withSoulLock,commitSoulChange走 withFileLock+串行队列。- R5
recentAgentRecap(src/orchestrator/recent-recap.ts)接进 reflect 用户消息 + heartbeat 系统提示 ✅- R6 Dreams→Reve 更名 ✅:公开文案 README/PITCH 英文 Dreams→Reve(中文「梦境」保留为本地化名);偶发用法(Seedream 品牌、birth「dreaming」文学化措辞、CSS
--dream色名、islanddreaming代码标识)保留;README 完整四支柱(Sense·Dispatch·Reve·Model)大改版留待 1.0 发布,避免半改名的不一致状态。 全部已测试(summary/recent-recap/autonomy/reflect/agent budget 用例;全套 455 测试绿)。仅 R4(desirepursuit:needs-user中间态)留到 0.11。
把已成熟的自演化闭环从"能跑"提升到可信:
- 反思质量门禁(R1):JSON 坏掉不再静默降级;检测"反思不足"。
- heartbeat / idle 可观测 + 有界(R2):任务成功度量;idle 成本断路器;收敛策略。
- 灵魂可观测(R3):给人看的 "Lisa 速览";并发锁铺全。
- desire 能力/野心错配(R4):加"想做但需帮忙"中间态。
- 把编排器 recap 接进反思(R5):让 Sense→Dispatch→Reve 闭环。
- Dreams→Reve 全代码/文档平滑更名。
- 不改 soul 的主权模型 / birth / 不引入 reset。
- 不给自主循环放开工具集(守 0.9.1 的
autonomousSubset边界)。 - 不做新的自主"能力"——只把现有闭环做实、做透、可度量。
| 子系统 | 现状 | 文件 |
|---|---|---|
| 空闲反思(dreams) | idle≥~1h 触发;跨进程 IDLE_RUN_LOCK;autonomousSubset 工具;输出 "while you were away";返回 {text, silent, iterations, inputTokens, outputTokens} |
src/idle/{watcher,runner}.ts |
| 会话末反思 | 产出 journal + 操作(memory_append/skill_create/skill_patch/feel/opinion_form/desire_add/patch_*);JSON 输出;progress 压缩 |
src/reflect.ts |
| heartbeat | cron/launchd;用户任务 + 自驱欲望 + 周度 examen;token 预算闸(budgetTokens 默认 500k,runner.ts:87/128);desire fallback |
src/heartbeat/{runner,config}.ts |
| 灵魂 | DesireEntry {actionable, heartbeatPrompt?};EmotionState(衰减 + 事件 ring,EMOTION_EVENTS_MAX=50);git 可追溯 |
src/soul/{store,tools,git,types}.ts |
| 编排 recap | 隐私安全的跨 agent 事件流 + recap(确定性、环形 400) | src/orchestrator/{journal,recap}.ts |
关键缺口:reflect 坏 JSON 静默降级;idle 无成本闸(measure 但不 cap);heartbeat 无成功度量;soul 只给 LLM 读;desire actionable 是 boolean 死结;recap 不回流反思。
reflect.ts 现在解析失败返回空 applied、静默。改:
// reflect.ts — 解析与质量
// 1. JSON 解析失败 → 重试一次(更严格的 prompt)→ 仍失败则 LOG 'reflect_malformed'
// 并落 ~/.lisa/reflections/<id>.error.json,不静默吞。
// 2. 操作计数直方图:一段实质会话(>N turns / 有工具调用)却产出 0 操作 →
// 记 'reflect_underreflect'(可观测信号,非强制改写)。
// 3. feel op 与 soul_feel 行为对齐:reflect 的 feel 先衰减再叠 delta
// (已核对:reflect.ts:184 已走 applyEmotionDelta 的 decay-first 路径,
// 与 soul_feel 一致 —— review §4.2 的不一致已不成立,仅需回归测试。)- 验收:
- 注入坏 JSON → 重试 + 告警 + error 落盘,不静默。
- 实质会话 0 操作 → underreflect 信号出现在可观测日志。
- feel 一致性测试通过。
// 统一 AutonomyRun 记录(NEW,写 ~/.lisa/autonomy/runs.jsonl)
interface AutonomyRun {
kind: "idle" | "heartbeat" | "examen" | "desire";
startedAt: string; durationMs: number;
inputTokens: number; outputTokens: number;
outcome: "done" | "no-update" | "blocked" | "error"; // 不再只有 silent 二元
note?: string; // 失败/阻塞原因
}- idle 成本断路器:idle/runner 接
budgetTokens(复用 heartbeat 的预算概念),超额停(现在 idle 只 measure 不 cap)。 - 收敛策略:idle 单窗口从"只做一件事"改为"有界做 K 件、命中 rest 即停",避免长窗口积压或空转。
- heartbeat 成功度量:用
outcome区分"真做完 / 无更新 / 阻塞 / 报错",不再把(no update)当成功。 - 验收:
- 每次 idle/heartbeat 落一条
AutonomyRun,token 与 outcome 准确。 - idle 超
budgetTokens时停并记blocked。 -
lisa autonomy子命令打印近 7 天 run 摘要(次数 / token / outcome 分布)。
- 每次 idle/heartbeat 落一条
lisa soul summary/ GUI 卡片:从SoulSummary渲染 "Lisa 今天:好奇 0.45 · 想做 [X,Y] · 相信 [A,B] · 近期情绪事件 N 条"。现在情绪/欲望/opinion/git 历史只有 LLM 自己读(review §4.2:营销权重 > 可感效用)。- 并发锁铺全(R3b)— 已核对在 0.9.1 完成:
appendJournal(store.ts:391)、applyEmotionDelta(store.ts:137)均已包withSoulLock,注释明确针对 review §4.2 的竞态;commitSoulChange走 withFileLock + 串行队列。仅余:对"git commit 被 swallow"做一次跨进程压力回归测试以确认彻底。 - 验收:
-
lisa soul summary输出人可读速览。 - 两进程并发写 journal / emotions / git → 无丢条、commit 齐全(压力测试)。
-
现在 DesireEntry.actionable 是 boolean:能跑(actionable)或不能。若一个欲望需要 shell 而自主循环(autonomousSubset)没 shell,就只能干瞪眼累积 frustration。加中间态:
// soul/types.ts — DesireEntry 扩展
interface DesireEntry {
// ...
actionable: boolean;
/** NEW: 'self' = 自主循环能独立推进;'needs-user' = 需用户帮忙跑(如 shell) */
pursuit?: "self" | "needs-user";
}needs-user的欲望:reflect/heartbeat 不反复空跑它,而是自动落一条提示("desire X 需要你帮忙跑 Y")到 while-you-were-away / island,等用户授权。- 验收:
- 需 shell 的欲望被标
needs-user,不进自主空跑循环。 - 用户侧出现"帮我跑一下"的可点提示。
- 需 shell 的欲望被标
orchestrator/recap.ts 现在单向(只记"agent 们做了什么"),Lisa 反思从不读它。让 heartbeat/reflect 读 recap:
// reflect/heartbeat 的系统提示注入一段 recap 摘要:
// "过去 N 小时:3 个项目活动,2 完成,1 报错(repo X)"
// → Lisa 可据此调整自己的欲望 / 关注("X 老报错,我想搞清楚为什么")。- 隐私:recap 已是结构化元数据(无 prompt/reply/file 内容),可安全注入。
- 验收:
- heartbeat 运行时系统提示含 recap 摘要。
- 给定"某 repo 反复报错"的 recap → Lisa 倾向产出相关 opinion/desire(行为测试,软指标)。
- 代码标识、文档、UI 文案统一 Dreams→Reve;保留
~/.lisa/*配置/格式不破坏(向后兼容,旧键继续读)。 - 验收:
- 全仓 grep 无残留"Dreams"对外文案(内部历史注释可留)。
- 旧配置文件无需迁移即可工作。
| 阶段 | 内容 | 里程碑 | 风险 | 状态 |
|---|---|---|---|---|
| R1 | 反思质量门禁 | 0.10 | 低 | ✅ |
| R2 | heartbeat/idle 可观测 + idle 断路器 + 收敛 | 0.10 | 低 | ✅(收敛 K 值策略待调) |
| R3 | 灵魂速览 + 锁铺全 | 0.10 | 低 | ✅(锁 0.9.1 已完成) |
| R5 | recap 接进反思 | 0.10 | 低 | ✅ |
| R4 | desire 中间态 | 0.11 | 低 | 待做 |
| R6 | Dreams→Reve 更名 | 0.10(随手) | 低 | ✅(公开文案;README 大改版留待 1.0) |
Reve 整体是 0.10 的"先打深"主轴——低风险、高可信、兑现承诺,给 1.0 打信任地基。
- reflect:坏 JSON / 空操作 / feel 一致性三条用例。
- autonomy:mock idle/heartbeat →
AutonomyRun字段准确;超预算停。 - soul 并发:多进程压力写 journal/emotions/git → 无丢条、commit 齐。
- recap 注入:给定 recap → 系统提示含摘要(快照测试)。
- 更名:旧配置兼容测试。
- 守
autonomousSubset边界:自主循环不得碰 shell/fs-mutation/dispatch(0.9.1 线)。 - recap 注入仅结构化元数据,无 prompt/reply/file 内容。
- soul 仍是 Lisa 主权;R3 的"给人看"只读不写,不引入用户侧改写口子。
- "反思不足"如何界定:turn 数 / 工具调用阈值需调,避免误报。
- idle 收敛 K 值:做几件才算"够"而不空转?经验调参。
- recap → 欲望是软行为,难硬验收:用行为测试 + 人工抽查。
- Reve 是 0.10"先打深"的核心,最先做。
- 对论文:R2 的成功度量 + R1 的反思质量 + soul git 历史 = 论文要的 drift / long-horizon coherence 指标;稳定性机制(
soul_object/ weekly examen / approval-gated skills)作为可开关 ablation。1.0 的 Reve 硬化与论文实验是同一批工作(ROADMAP §9,[记忆: paper plan])。