#DiAgent

Diffusion / Diff / Distributed Agent。

##Motivation

扩散式,或者从一个 stable 的文本出发,完善它。以 写下来的文本 为中心,而非对话历史。
本质上交付的成果应该是无历史的,开发历史只是面向开发者的。

##Core

实现复杂功能的核心能力:构造原子对话历史。

在完成一次 change 时,这个 change 记录为一个原子对话历史。

##Key

关键的行为:通过组合原子对话伪造历史对话记录。

谁掌握过去,谁就掌握未来;谁掌握现在,谁就掌握过去。

##Abilities

基于 jujutsu 来管理。

##以 jj 为模型

把对话和仓库当作同一种对象。

概念 对应
对话历史 提交图
一条消息 一次提交,或一个 diff 文件
工作区 jj workspace
暂存区 无对应
人类输入 人类在某个 workspace 中产生的一次提交
subagent 通信 共享提交与 bookmark
上下文 当前 workspace 文件树 + @ 与父提交的 diff

每次调用模型只给系统提示、当前任务、上一步 diff、文件树、冲突列表、最近提交摘要。模型需要看文件时自己取(jj file show)。放弃 KV 缓存命中,换取确定性和低 token 占用。

##确定性中间层

组装上下文这件事不应该由模型来做。中间层是一条确定性 pipeline:它和 jujutsu 交互取得修改,再按固定模板拼出被模型看到的 prompt。

三条输入路径:

职责链条:取 jj 状态 → 收集三类输入 → 按模板组装上下文并控制 token 预算 → 调用模型 → 验证并应用输出 → 把结果回写到 legacy chat。

为什么必须确定性:模型可能选择性忽略冲突、编造不存在的提交、跳过验证。中间层保证冲突列表总在、查询结果真实可复现、验证是硬管道不可绕过、相同状态生成相同 prompt。

legacy chat 可以读 jj 状态、和模型讨论,但不能写文件、不能 commit、不能 apply。

##promptc:prompt 编译器

一个非 AI 的工具,组装模型看到的全量多轮对话历史,用虚假历史来引导模型。输入是文件系统和 jj 状态,输出是模型 API 格式的对话历史。

##固化与去噪

变更被接受(固化,solidified)后,上下文里不再呈现 diff,只呈现文件内容。迭代越往后,越多的 diff 被去噪成固定的文本。这既是压缩上下文的手段,也是对「交付物无历史」的落实。

文本的三种状态,判定是确定性的:

固化可以由规则触发:bookmark 推进;rebase 到 trunk 且无冲突;人类显式接受。

##扩散式 agent

把去噪过程对应到提交图上:

扩散 jj
噪声 初始 session + 代码状态
时间步 提交轮次
去噪 jj edit 回到早期提交重新生成
条件 trunk 文件内容 + 重要 session 轮次
多轨迹 多个 workspace
轨迹聚合 jj rebase / jj squash
收敛 roots(trunk..) 为空且 conflicts() 为空
重采样 jj op restore

减少上下文的核心机制也来自这里:固化后移除 diff,squash 多轮对话只留关键决策,jj edit 删掉不重要的轮次,用 human_edit 标记重点,用 revset 选择重要轮次。

##对话历史是版本控制对象

对话即文件,轮次即提交。某一 commit 下的文件集合,就是那一刻的完整对话历史。

由此解锁的能力:多轨迹采样、轨迹聚合、重采样、决策可视化。切一个 commit,就切了一次对话上下文。

##分布式 subagent

每个 agent 一个 jj workspace,各有自己的 @,共享同一个对象数据库和提交图。没有主 workspace,没有中央协调器。

##jj-native 协作

少用 git 的隐喻,多用 jj 的机制:

##pros vs cons

目前是猜测的。

###pros

###cons

##形态

开发上按 plumbing over porcelain 走:diagent-lib 直接依赖 jj-lib,负责与仓库的全部低层交互;diagent-cli 依赖前者,提供命令、agent 编排和 promptc。

六种实现层面,不是互斥,而是同一套核心逻辑在不同集成位置的投影:独立工具、nvim 插件、pi 插件、在 pi 外面篡改 session 文件、dsh 插件、以及直接用 skill 让主 agent 派活给 subagent。

Roadmap:先用 DiAgent-Skill 做概念验证。

##相关