• ## 定时:每日一次,挂在 DISABLE_BACKGROUND_AGENTS 早退之后
    
    dreamSweep 串行扫所有本体,**不并发**:每轮可能起两次 LLM 调用,
    几十个本体并发 = 同时拉起几十个 claude 子进程 —— 这个代价本仓库付过
    (2h43m 漏出 82 个进程 / 17.5 GB,28-followups §五 第五条)。慢一点没有代价。
    
    空转保护在 dreamOnce 里,所以「76 个本体全扫一遍」的实际成本是 76 次目录读。
    定时器 unref —— 少了它,短命进程会被 24 小时的 timer 吊住不退出。
    只挂定时**不立刻跑一轮**:启动那刻跑没有额外收益,反而让每次重启都烧一遍。
    
    一个本体抛异常不拖垮整轮,但**必须留下是谁抛的**,否则现场只看到「今天没沉淀」,
    查不出是没原料还是一直在抛。
    
    ## 定义文件:受管区块 + 三道闸门
    
    形状是一对 `<!-- dream:begin/end -->` 之间的**受管区块**,区块外一个字节不碰。
    自由追加会让「哪些是人写的、哪些是 dream 写的」几轮之后再也分不开,
    而分不开就没法分别回滚。区块整体重写还顺带**幂等** —— 同一批经验重复跑不会越写越长。
    
    三道闸门,缺一不写:
    ① definition-write-gate:当前内容必须已在 git 历史里(你定的前置条件);
    ② **agent.md 的前 2000 字符必须仍然自足** —— 规划 agent 只看这一段
       (graph-engine.js:915 的「角色定义摘录」),改了等于悄悄换掉它读到的画像;
    ③ 写完复核毕业闸门,不过就**立刻还原** —— agent.md 写坏会让本体雇不进任何公司。
    
    任何一道不过:不写,并把原因逐个文件返回(`definitions[]`)。**不写不该是静默的。**
    
    ## 测试上又纠了自己一次
    
    三条新用例第一版是「在测试里比对形状」而不是真调 —— 和上一轮同一个毛病。
    改成对**真被 git 跟踪且干净**的本体(dream-screener)走真路径:
    真写、验区块外字节不变 / 幂等 / 毕业闸门仍过,finally 还原并断言还原干净。
    agent.md 那条同理真调,验「不写 + 理由点名前 2000 字符 + 一个字节都没动」。
    
    dreamSweep 加 agents 参数,让错误隔离那条能真调而不是真扫 76 个本体。
    
    全量:144 文件 / 1330 测试全绿,仓库干净。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse File »
  • ## 两个本体(都过得了毕业闸门)
    
    · dream-distiller —— 把一批原始记录提炼成可复用经验,交 ```json 数组
      {title, body, sources};没有值得留的就交 []。
    · dream-screener —— 逐条判「这条能不能给别家公司看」,交 {shareable, reason}。
    
    **决策 A 的独立性写在两处,缺一不可**:
    · 代码层:判定**一条一次调用**,提示词里只放 title + body,**不放原料**;
    · 本体层:dream-screener/agent.md 明写「你看不到原料,也看不到是哪家公司
      —— 这是故意的」。守卫里有一条专门断言这句话在 —— 否则下一个人会顺手把原料
      塞进提示词「让它判得更准」,而那恰好把独立性拆掉了。
    
    soul.md 也承担判据的一半:screener 的人格写的是「你是一道闸门,不是审稿人。
    审稿人的本能是帮它改好,闸门的本能是不确定就不放」。
    
    ## 两处失效方向都是硬的
    
    · 提炼取不出 JSON → **抛**,不是静默返回空。「产出格式坏了」和「没提炼出东西」
      是两件事,混为一谈会让前者以后者的形式永远藏下去 ——
      每天显示「今天没经验可沉淀」,而真相是解析一直在失败。
    · 判定解析不了 / shareable 不是布尔(比如给了字符串 "true")→ 判否,
      并把原文片段带进 reason,让人看得出是「判否」还是「判炸」。
    
    ## 纠了自己两次
    
    ① 测试第一版把解析与失效分支**在测试里重抄了一遍**再断言 —— 那是在验一份复制品,
       代码改了它照样绿。改成加一条 setDreamAgentCaller 缝,只换掉「真起 CLI」那一层,
       解析、判空、失效方向全走真代码。
    ② agent.md 的相对引用按 **cwd 深度 3**({aid}/{cid}/{taskId}/)解析,不是按文件
       自身位置 —— 仓库根是 ../../../../../。我按文件位置写了 ../../../,
       agent-md-refs.test.js 当场判红。**守卫替我抓的,不是我自己发现的。**
    
    ## 还没做的,写进文档 §5.4(别当成 dream 上线了)
    
    · 定时挂载没做(决策 C 说每日一次):现在只有 dreamOnce(agentId) 这个可调用单元,
      没挂调度、没 REST 入口。
    · 还没写定义文件:只写本体根的 memory/experience.md(纯经验积累,删掉无副作用)。
      三个 git 跟踪的定义留给下一步,闸门与 definitionWritability() 已就位,
      缺的是「往里写什么、写成什么形状」那半边设计。
    · **没有一次真 CLI 验收**:CI 里换掉的是 callDreamAgent 那一层,验的是解析与失效方向,
      不是模型写得好不好。两个本体的提示词**至今没有被任何模型读过** ——
      这正是 P3B W4 记过的形态(mock 从不读提示词)。
    · 决策 D(提炼质量怎么评)仍未定;可追溯是它的便宜起步,不是替代品。
    
    全量:144 文件 / 1323 测试全绿。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse File »
  • ## 步骤 2:「有哪些公司」只认 company_agents 表
    
    system/agents/{aid}/{cid}/ 是**约定不是校验**。实查 96 个二级目录里混着
    train/ workspace/ 和带时间戳的测试残留(tmp-w7-*-1786986291739-*)。
    拿目录枚举公司 = 把测试夹具当经验原料喂给提炼 agent。
    
    改成查表,另补保留段 _global(全局 agent 的运行态落点,没人「雇」它所以不在表里)。
    **目录从此只用来定位文件,不用来枚举公司。**
    守卫里真造了 train/ 和 tmp-w7-* 两个目录,断言它们不进原料。
    
    ## 空转保护:水位线按「条数」不按 mtime
    
    实查 75 份 memory.md 只有 7 份有非模板内容 —— 每日跑起来绝大多数 agent 没有新原料。
    不拦的话每天几十次「读完发现没东西」的 LLM 调用在烧钱。
    
    **判据用条数而不是 mtime**:mtime 会被任何一次无关写入推动(例如别处重写整份
    memory.md),条数只在真的多出记录时增长。用 mtime 的话,空转保护会在
    「文件被碰过但内容没变」时失效。
    
    ## 决策 A 的失效方向写进代码
    
    去敏判定 agent **抛异常也算拒绝**,并把「为什么」写进 rejected[]。
    否则现场只看到「少了一条」,查不出是判否还是判炸。
    「少沉淀一条经验」与「泄漏一次机密」代价不对称,判据必须偏向贵的那一侧。
    
    ## 步骤 5:可追溯
    
    每条原料带 source({公司}:memory.md#{行号}),提炼产物落盘时把 sources
    写进 experience.md 的引用行。没有它,dream 的产出无法验证对错 ——
    与 FDE 那边「LLM 自己汇报分数」是同一个问题。
    
    ## 步骤 3 还差什么(写在文档 §5.3,别当成做完了)
    
    编排 / 空转 / 闸门 / 落盘 / 可追溯都跑通了(6 例守卫),
    **缺两次真 agent 调用的默认实现**:提炼 agent 与去敏判定 agent 的本体还不存在。
    默认实现现在是一句显式 throw(「尚未接线」)而**不是静默返回空** ——
    静默返回空会让调用方以为「跑了但没提炼出东西」,那是本仓库反复出现的失效形态。
    
    也还没写定义文件:writeDistilled 目前只写本体根的 memory/experience.md
    (纯经验积累,删掉无副作用)。三个 git 跟踪的定义留给下一步,
    definitionWritability() 已能报出「现在能不能写、不能写是为什么」。
    
    全量:144 文件 / 1316 测试全绿。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse File »