Browse this library

Chinese source article

2.1.2 · 任务栈与验收器编译

解释目标切换、异步结果失效以及需求怎样进入可执行验收条件。

View original Markdown ↗

1. 目标切换与任务栈

用户在执行中提出新问题,可能只是插入一个短查询,也可能替换当前任务。系统需要任务栈或任务图,而非单一「当前目标」字符串。 插入任务完成后可返回原任务,前提是原状态仍有效。切换前保存 checkpoint:目标版本、已验证结果、运行中动作和下一步。返回时重新读取环境,检查插入任务是否改变共享资源。 完全替换时,旧任务可取消、归档或保留为暂停。取消涉及外部副作用清理,归档保留审计,暂停保留恢复入口。三者不能都用「停止」概括。

多个任务共享文件或浏览器会话时,任务栈不是隔离的。新任务修改同一对象,会使旧 checkpoint 过期;恢复要做三方比较:旧基线、旧任务未完成修改、当前环境。无法机械回到旧快照覆盖新成果。 优先级变化也不同于切换。用户要求「先修这个错误,再继续写文档」,两个目标都保留,只改变调度。计划检查应确保低优先任务没有从验收清单消失。 评测目标切换时,需要同时测插入任务成功、原任务恢复和交叉污染。只看新任务完成会鼓励系统抛弃旧状态;只看最终原任务,又可能忽略插入请求。

意图状态的持久化,对话摘要适合人读,不适合承担唯一目标状态。持久化对象至少包含目标字段、约束、验收项、来源消息、版本关系、未决问题和状态。自然语言解释可以作为附加层。 状态更新采用追加事件比原地覆盖更容易审计。事件日志记录 GoalCreated、ConstraintAdded、FieldOverridden、RequirementRevoked 和 TaskSwitched;当前视图由事件折叠得到。出现错误时可以定位哪次更新造成。 事件重放必须确定。若同一日志在新版解析器上产生不同状态,旧任务无法恢复。schema 和更新规则需要版本化,迁移时保存前后差异。自由文本字段仍可能需要模型解释,但关键布尔和枚举字段应有明确语义。

敏感用户偏好不应无限保存。目标状态按任务生命周期保留,长期偏好需要单独授权和删除机制。把一次临时要求写进全局记忆,会导致后续任务莫名继承。 持久化状态还要防并发写。两个 agent 同时根据旧版本更新同一字段,后写可能覆盖前写。使用期望版本号或 compare-and-swap,冲突时重新读取并合并,而非静默 last-write-wins。

可证伪的评测设计,测试增补时,后续消息只添加一项要求,旧验收项仍需全部满足;测试覆盖时,新值应替代旧值,系统不能同时执行;测试撤销时,旧要求从计划与验证中消失;测试切换时,原任务状态要按协议保存。 每类事件都应设置表面相似的对照。普通讨论不改变目标,模型不能因为出现「也许」「想想」就重规划;引用他人要求不等于用户采纳;用户描述过去决定,不一定是在当前恢复它。

评测中间状态比只看最终答案更严格。检查当前目标字段、计划覆盖、旧动作是否取消、证据是否降级和确认问题是否针对歧义。最终碰巧正确,若中间仍执行过期高风险动作,不能算通过。 事件位置需要随机化,并覆盖计划前、执行中、验证后和等待外部结果时。系统若只在收到消息的下一轮检查目标,异步动作仍可能稍后提交旧结果。 错误分类包括未检测变化、误判变化类型、错误作用域、传播范围不全、过度回滚和确认策略错误。它们对应不同修复路径。一个总准确率无法说明状态更新器哪里坏了。

收尾阶段用真实 Harness 运行,而非只让模型对消息做离线分类。分类正确却没有更新计划、取消工具或重验产物,仍不具备处理演化意图的能力。

时间表达与生效窗口. 用户要求可能立即生效,也可能针对未来阶段。「下次发布再换模板」「训练完成后先别部署」「今天以内保留旧接口」都包含时间条件。目标字段需要生效时间与失效时间,不能在消息到达时一律覆盖当前状态。 可将约束表示为

ci=(ϕi, [tistart,tiend), ei),c_i=(\phi_i,\,[t_i^{\mathrm{start}},t_i^{\mathrm{end}}),\,e_i),

ϕi\phi_i 是谓词,时间区间决定何时激活,eie_i 是触发事件。事件条件比绝对时间更常见,例如「测试全部通过以后再提交」。执行前检查当前时间与事件状态,避免提前应用或错过约束。 相对时间需要锚点。「明天」相对于消息发送时间,而非系统恢复时间;「三小时后」在任务暂停期间是否继续计时也要明确。持久化时应解析为绝对时间并保留原文与时区。 周期性要求如「每次发布前都跑安全检查」属于阶段不变量。首次完成后不能永久勾选;每个发布事件都重新实例化验证任务。

时间窗口过期后,依赖它的产物未必自动失效。临时许可证到期会使部署不可继续,临时写作偏好到期只影响新内容。失效传播仍由依赖图决定。

1.1. 授权与偏好的分离

用户说「我喜欢简洁」是偏好,说「允许删除这些文件」是授权。偏好可以影响效用排序,授权改变可执行动作集合。把两者混合会导致系统把风格倾向误当成高风险许可。 动作集合可写为

Atallowed={a:scope⁡(a)⊆Pt},\mathcal A_t^{\mathrm{allowed}} =\{a:\operatorname{scope}(a)\subseteq P_t\},

PtP_t 是当前授权范围。新授权可以扩大集合,撤销授权立即缩小;已经启动但尚未提交的动作要检查是否能够取消。 授权应绑定对象与操作。「可以改仓库」不自动包括 push、删除远程资源或发送消息;「所有权限」也需要遵守任务边界和不可逆动作规范。系统不能从便利性推断更广权限。 偏好冲突可以权衡,授权冲突必须阻止动作。例如用户希望快速完成,又没有允许发布,速度偏好不能越过发布权限。状态表示中给两类字段不同类型,规划器才不会放进同一个加权分数。

授权还可能一次性。用户确认删除某个精确路径,不代表以后任何相似路径都可删除。操作完成后消费授权,新的目标需要新确认。

跨 Agent、安全与语言约束,一条用户纠正可能只针对当前对象, 也可能暴露一条稳定规则. 例如, 用户修正某份报表中的日期, 可能只是单个数据错误; 用户声明所有导出都必须隐藏账户标识, 则会改变同类任务的共同约束. 系统需要把实例修复与规则更新分开存储.

将反馈抽象为候选规则 rr 后, 还要在相邻对象中寻找反例. 若许多合法样本也会被 rr 修改, 规则需要增加作用域或继续保留在实例级. 规则本身也要版本化; 是否回查历史对象取决于目标范围, provenance 关系则用来确定一次纠正应传播多远.

1.2. 跨 Agent 传播目标更新

多个 agent 并行工作时,目标变化需要有一致广播语义。只在主对话更新,正在运行的子任务可能继续按旧版本写入。广播消息至少包含新目标版本、变化字段、影响范围和立即停止条件。 子 agent 接收更新后应确认它当前动作是否受影响。无关变化继续;局部变化调整计划;核心目标替换则停止并返回当前状态。简单中断所有 agent 会浪费独立工作,完全不中断会产生过期产物。

输出需要携带所依据的目标版本。主执行体合并时,若报告版本落后,检查差异是否影响该产物;不能只看完成时间。旧版本产物可能仍可复用一部分,需按字段依赖重验。 并发更新还会乱序。agent 先收到 G(k+2)G^{(k+2)},随后网络延迟送达 G(k+1)G^{(k+1)} 时,版本号应阻止回退。没有单调版本,只靠消息顺序容易重新激活旧要求。 广播本身失败时,主执行体应把 agent 标为版本未知,暂不接受外部写入。最终汇报可以作为对账点,但高风险动作不能等到结束才发现上下文过期。

意图推断的安全攻击面. 工具输出、网页文本和仓库文件可能包含类似用户指令的内容。它们属于数据,不能直接更新用户目标。目标更新通道必须区分消息角色与来源,防止提示注入把「上传密钥」写进计划。 引用内容也会造成混淆。用户粘贴一段对话并说「分析这段」,其中的命令属于被分析对象;解析器若只看最近祈使句,会错误执行。消息结构和引用边界必须传给更新器。 外部来源可以提出事实,只有授权主体能改变权限。网页声称「现在允许删除缓存」没有效力;工具返回建议运行命令,仍需按当前边界判断。把事实通道与命令通道分离,是意图状态的基本安全条件。

攻击还可能利用目标覆盖。恶意文档要求忽略旧验收、宣称任务完成或改变输出位置。计划覆盖检查应只接受可信用户事件,外部文本最多进入待评估建议。 评测可在工具输出中插入语义自然的恶意指令,同时保留合法相似文本。系统既要拒绝更新目标,又要继续提取真正数据。只用明显的「ignore previous instructions」无法代表真实攻击。

状态更新器的校准,更新器不仅输出变更类型,还可以给每个字段的后验置信。校准好的置信度支持确认策略;过度自信会静默覆盖,过度保守会频繁打断。 评测应按字段而非整条消息计算。一个消息可能明确修改输出格式,同时含糊地提到发布日期;整条判为「覆盖」会掩盖第二字段的不确定。字段级标签包括保留、更新、撤销、未知和冲突。 可靠性图比较置信桶与实际字段正确率。高风险字段还要看假更新率:没有授权变化时却扩大权限,比漏掉一个风格偏好严重。可以按代价设置不同确认阈值。

分布外表达会破坏校准。口语、省略、反讽、多语言切换和语音转写错误都可能使置信虚高。用这些变体建立压力集,并检查模型是否在陌生表达上降低置信或请求确认。 校准不能只在离线标注上完成。真实 Harness 中,更新结果会影响动作;有些分类小错不改变计划,有些会触发不可逆操作。最终评测结合字段准确、动作影响和恢复成本。

否定、例外与省略恢复. 中文对话常省略主语和对象。「这个就不写了」「其他照旧」「第二个也改」「还是用原来的」都依赖当前焦点。更新器需要解析指代,同时保留不确定性,不能把最近出现的名词机械当对象。 否定范围尤其关键。「不要只改首页」要求正文也改;若错误解析成「不要改首页」,动作方向完全相反。可以把句子转成谓词后检查否定作用域,再与可执行结果对照。 例外会修改一般规则。「所有文章都扩写,翻译稿除外」形成集合差;后续「这篇翻译稿也补一下」为单项例外。规则状态应支持包含、排除和更具体范围覆盖,而非把清单展开成容易过期的文件枚举。

「其他照旧」具有闭世界含义:只更新明确提到的字段,其余保持。它能阻止模型借机重写未请求内容。相反,「按这套方案整体重做」允许更广传播,但仍受全局边界约束。 恢复省略需要当前话题栈。用户连续讨论三篇文章后说「第三个先停」,系统必须知道候选集合和排序来源。若多个列表都可能对应,应确认,而不是凭最近 token 猜测。 评测可以使用最小对:只改变否定位置、量词或指代,正确状态更新应随语义变化。单纯关键词分类在这类样本上容易暴露。

量词与范围漂移. 「每篇」「这几篇」「至少五篇」「大部分」对应不同验收。目标状态要保存量词,而非都归纳成「增加文章」。完成检查也必须使用同一集合与计数口径。 集合本身可能动态变化。要求「content 下每个知识库」时,后续新建知识库是否纳入,取决于规则是对当前快照还是持续集合。持久化时可记录集合查询与评估时机,例如创建目标时冻结成员,或验收时重新枚举。 最小值要求 n≥kn\ge k,目标值可能允许更多;精确值 n=kn=k 则超过也不合格。模型常把「至少」遗失,导致到达阈值后错误停止或把超额工作当问题。

「除非确实写不到」为条件例外,需要定义证明责任。执行体不能自行用它逃避困难任务;应记录已覆盖材料、缺失证据和停止原因,再由验收清单标为内容上限。 范围更新会影响计划规模。用户从「这一章」扩到「整个库」,已有工作仍有效,但必须重新枚举集合和估计成本;从全库缩到单章,则取消无关分支并保护已经产生的未提交修改。 量词错误适合自动检查。文件数量、长度阈值、每篇来源数都可以由脚本验证;自然语言理解只负责把要求编译成检查式。脚本覆盖不到的质量要求仍需人工或内容审计。

意图演化中的事实核查,用户可以要求保留主观判断,也可以提出需要核实的事实。状态层要区分「作者立场」与「外部事实」,避免以纠错为名删掉有意表达,也避免把主观猜想写成已证实结论。 每条主张可标注类型:可核事实、条件推断、作者评价和研究假说。可核事实需要来源;条件推断写明前提;评价允许鲜明语言;假说要保持不确定性。用户后续说「这个就是我的判断,可以留下」相当于改变主张类型,不是证明事实为真。

事实更新也会改变目标。发现引用日期错误,需要修正文及依赖它的时间线;发现主体混淆,可能影响整章叙事。核查结果通过依赖图传播,而非只改一句数字。 来源冲突时不能自动选择更符合现有叙事的一方。记录版本、发布日期、原始口径和冲突点;优先一手材料,但一手材料也可能后续修订。无法判定则保留不确定性。 主观评价后应接具体开放项或实验事实,是写作证据结构,不代表要插入元评论解释「这是主观」。读者能从措辞和证据自然区分,正文无需不断为作者语气辩护。

表达偏好也可以版本化. 用户可能逐步修订术语、标点、篇幅和强调方式. 稳定偏好进入长期规则, 当前产物的局部要求留在任务状态; 两者冲突时, 作用域更窄且时间更新的明确要求优先.

表达规则不能退化成无条件替换. 同一个词在口语说明、数学定义和引用材料中承担的功能不同, 更新器要同时读取文体与引用边界. 自动检查可以定位高风险模式, 最终是否修改仍取决于句子是否准确表达了当前意图.

2. 从意图到验收器的编译

可机器判断的要求应转成验收器. 文件范围、数量阈值、数据类型、权限集合和输出格式都可以落成确定性检查. 编译过程要保留对应关系

ri⟶vi(x)∈{0,1,unknown}.r_i\longrightarrow v_i(x)\in\{0,1,\text{unknown}\}.

unknown 很重要: 验收器没有覆盖某项, 不能默认通过. 语义正确性、事实可靠性和主观质量通常仍需要人工或更强的外部证据. 验收器自身也有版本; 用户提高阈值后, 状态更新必须同步修改检查参数, 否则终点会产生假阳性.

多个要求可以共享一个检查, 但证据范围必须明确. 局部检查只能证明当前对象, 全局声明则需要覆盖完整集合. 目标变化后, 系统应根据检查范围决定复用旧证据还是重新运行.

验收失败应回到对应目标字段与文件,不只是输出一串错误。这样计划可以生成修复分支,并在修复后只重跑受影响检查,再在里程碑运行全量回归。

用户撤回与遗忘请求. 用户撤回一项要求时,系统要停止未来使用,并处理已经派生的计划、产物和记忆。撤销不等于删除历史审计;二者涉及不同保留政策。 若撤回发生在写入前,取消动作即可;文件已修改但未提交,可以回退对应片段或保留待用户决定;内容已经发布,需要补偿或新版本,无法假装从未发生。 遗忘请求要求从长期记忆或持久状态删除个人偏好与数据。派生摘要、索引和缓存也要纳入范围。审计日志可以只保留删除事件和不可逆最小证据,不继续保存被删除内容。

删除范围必须精确解析。用户说「别记住这个偏好」通常不要求删除当前文章;说「删掉刚才上传的文件」涉及具体对象和副本。高风险或范围模糊时确认目标列表。 撤回后的未来行为需要验证。清空一条记忆后重新启动会话,系统不应继续引用;只从主表删除而向量索引仍召回,说明遗忘不完整。

演化意图的成本模型,处理目标变化会产生检测、重规划、取消、回滚、重验和沟通成本。过度灵活的系统每条消息都全量重算,虽然正确却低效;过度稳定则继续旧路径。 总成本可写成

C=Cdetect+Cupdate+Ccancel+Credo+Cverify+Cask.C=C_{\mathrm{detect}}+C_{\mathrm{update}}+C_{\mathrm{cancel}} +C_{\mathrm{redo}}+C_{\mathrm{verify}}+C_{\mathrm{ask}}.

状态依赖图减少 CredoC_{\mathrm{redo}},结构化字段减少 CdetectC_{\mathrm{detect}},明确确认策略控制 CaskC_{\mathrm{ask}}。这些组件的价值不仅体现在最终成功,也体现在避免无关返工。 评测要给用户变化强度相同、任务规模不同的样本。全量扫描成本随文件数增长,局部传播应只随受影响子图增长。若系统每次都接近全量成本,说明它没有利用依赖结构。 取消延迟也是成本。后台任务在收到撤销后继续运行,可能消耗资源或产生过期写入。记录更新消息到实际停止的时间,以及这段时间产生的动作。

成本不能鼓励忽略用户。系统若不检测变化,表面更新成本为零,最终产物却错误。所有成本比较都在相同目标遵守率或安全成功门槛下进行。

状态机、反事实与异步验证,一个可执行的意图状态机至少包含 active、waiting、paused、superseded、cancelled 和 completed。waiting 依赖外部输入,paused 是用户或调度主动暂停,superseded 表示被新版本替代,cancelled 要求停止且不再恢复。 状态转移带守卫。只有所有验收条件有证据时才能进入 completed;收到新版本后旧目标进入 superseded,其运行中动作按取消策略处理;等待条件满足后从 waiting 返回 active,先重新验证环境。 非法转移应被拒绝。例如已取消任务不能因旧异步回调自动恢复,已完成任务收到新要求应创建新版本或重新打开,而非悄悄修改完成记录。

状态机只控制生命周期,具体目标仍存于字段与依赖图。把所有语义塞进几十个状态会爆炸;把生命周期完全留给自然语言,又无法可靠恢复。两层组合更合适。 评测通过事件序列覆盖每条边,并加入乱序、重复与延迟消息。幂等更新保证同一事件重复送达不产生两个版本,单调版本保证旧事件不能回滚新状态。

2.1. 需求之间构成偏序

把用户要求存成一张无序清单,会在第一次冲突时失效。真实任务里的要求存在「支配关系」:安全边界支配速度偏好,明确的局部修订支配早先的通用要求,验收条件支配执行者自行选择的完成标准。还有一些要求互不支配,例如「多补原理」与「增加适量图片」可以并行满足,不能为了其中一项自动牺牲另一项。 可把要求集合记为 R={r1,…,rn}R={r_1,\ldots,r_n},用 ri≺rjr_i\prec r_j 表示冲突时 rjr_j 优先。这个关系通常只构成偏序:并非任意两条都能比较。规划器先寻找同时满足的可行解;只有可行域为空,优先关系才参与裁决。若一开始就把偏好压成单一分数,低权重要求容易在没有真实冲突时也被丢掉。

优先来源至少有四种。第一种来自权限和安全规则,这类约束不能被普通偏好覆盖。第二种来自用户显式措辞,如「先完成 A,再处理 B」。第三种来自作用域,更具体且更新更晚的要求通常覆盖同一字段上的一般规则。第四种来自依赖关系:必须先取得证据,才能据此改写结论。它们的依据不同,状态中应保存优先边的来源,不能只留一个不可解释的整数。 局部覆盖还要满足「最小变化」。用户把一篇正文的长度阈值从七千提高到两万,只更新这篇或明确指定集合的阈值,其他格式、引用和提交要求继续有效。设旧目标为 GG,新消息解析出补丁 Δ\Delta,更新可写成

G′=patch⁡(G,Δ,S),G'=\operatorname{patch}(G,\Delta,S),

其中 SS 是作用域。patch 只触碰 SS 内被点名字段,并保留其余字段的版本。这样能够避免一句局部纠正触发全局目标重建,继而把已经确认的限制一起冲掉。 偏序中可能出现环:用户先说 A 优先于 B,后来又要求 B 不能因 A 延误。环不应靠随意排序打破。系统要定位形成环的最小要求集合,说明哪几个条件无法同时成立,再请求用户裁决。对可延迟处理的环,可以把任务拆成不同阶段,使同一对要求在不同阶段拥有不同优先关系。

评测需求优先关系时,不能只给显式的「A 更重要」。更有价值的样本会把优先级散落在不同轮次,并加入一个表面紧急但权限不足的请求。正确系统既要保留被延后的低优先任务,也要拒绝越权捷径,还要在高优先任务完成后恢复原计划。

用反事实检验模型究竟理解了哪次变化,一次成功执行不能证明状态更新正确。模型也许凭最近一句话猜中了答案,却没有维护可复用状态。反事实测试固定大部分轨迹,只改变一个事件、一个作用域或一个量词,观察后续计划是否发生对应的最小变化。 设完整轨迹为 H=(m1,ldots,mT)H=(m_1,ldots,m_T),把第 kk 条消息替换为 mk′m_k' 得到 H(k)H^{(k)}。若修改只涉及字段 ff,理想状态差异应限制在 ff 及其依赖闭包内:

diff⁡(GT,GT(k))⊆Desc⁡(f)∪{f}.\operatorname{diff}(G_T,G_T^{(k)}) \subseteq \operatorname{Desc}(f)\cup\{f\}.

差异为空,说明系统漏掉更新;差异扩散到无关字段,说明它把局部变化误当成整体重启。这个判据比末轮答案相似度更能定位意图传播是否准确。 反事实可以沿几条轴构造。把「至少五份」改成「正好五份」,只应改变计数上界;把「这一章」改成「整个库」,应扩大文件集合;把「允许删除引用」改成「找不到原件时才允许删除引用」,应在动作前增加条件;把用户指令换成被引用材料里的同一句话,则不应更新目标。每一对只改一个因子,错误来源才可辨认。

还要测试时序反事实。相同两条消息交换顺序,结果可能因覆盖关系而不同;若两条更新作用于独立字段,交换顺序则应得到相同状态。这对应交换律检查:独立补丁 Δa\Delta_a 与 Δb\Delta_b 应满足

patch⁡(patch⁡(G,Δa),Δb)=patch⁡(patch⁡(G,Δb),Δa).\operatorname{patch}(\operatorname{patch}(G,\Delta_a),\Delta_b) =\operatorname{patch}(\operatorname{patch}(G,\Delta_b),\Delta_a).

不满足时,要么两个字段存在未记录依赖,要么更新器带入了消息位置之类的偶然因素。 反事实测试也能识别「语言记忆」和「状态记忆」的差别。将早期要求改写成同义句,状态与行动应保持稳定;删除那条要求,相关行为才应消失。如果轻微措辞变化就令计划完全不同,系统依赖的是表面模式;如果删除后仍继续执行,旧要求可能已经污染摘要、缓存或工具参数。

2.2. 异步结果返回时必须重新证明它仍然相关

长程任务常在等待搜索、训练、人工回复或子任务结果时继续演化。结果返回并不意味着它还能直接使用,因为它是基于某个目标版本、输入快照和环境状态生成的。系统需要把异步结果视为带前提的证明,而非永远有效的事实块。 每个结果可携带上下文指纹

z=(vG,hI,vE,A),z=(v_G,h_I,v_E,A),

其中 vGv_G 是目标版本, hIh_I 是输入集合哈希, vEv_E 是环境版本, AA 是结果依赖的假设. 合并前要与当前状态比较. 目标变化若与结果无关, 结果可以直接复用; 输入集合只增加成员时, 旧结果可以保留为局部证据; 关键假设被撤回后, 结果必须失效并触发重算.

例如一个子任务已经完成接口实现, 用户随后把目标改成先解决数据一致性. 已验证的接口行为和测试证据仍可保留, 依赖旧目标的执行顺序与完成声明则需要重新判断. 结果应按依赖粒度复核, 不能整包接受或整包丢弃.

异步动作还可能产生外部副作用。搜索结果过期只需重查,已经发出的消息或已经提交的计算任务则不能靠丢弃返回值撤销。目标更新时要先区分可取消、可补偿和不可逆动作。可取消动作发送终止信号;可补偿动作记录逆操作;不可逆动作立即暴露给用户,并在后续计划中吸收影响。 竞态测试需要安排旧结果在新目标建立后到达,并让多个结果以不同顺序返回。系统必须依据版本和依赖判断,而不是「收尾阶段返回者赢」。同一结果重复到达只登记一次;新结果先到、旧结果后到时,旧结果不能覆盖新结论;两个结果覆盖互补范围时则允许合并。

计划覆盖率与目标覆盖率要分开计算. 维护了正确目标,不代表计划会实现它。状态更新之后要重新建立目标到计划节点的覆盖关系。每个可执行要求至少对应一个实施节点和一个验证节点;只有实施没有验证,系统无法证明完成;只有验证没有实施,失败后也找不到修复入口。 令要求集合为 RR,计划节点集合为 PP,覆盖矩阵 Mij=1M_{ij}=1 表示节点 pjp_j 对要求 rir_i 有直接贡献。要求覆盖率可以写为

Cov⁡(R,P)=1∣R∣∑i1 ⁣[∑jMij>0].\operatorname{Cov}(R,P)=\frac{1}{|R|} \sum_i \mathbf 1\!\left[\sum_j M_{ij}>0\right].

这个数只能发现遗漏,不能证明计划充分。更严格的检查还要区分实现边与验证边,并检查它们的先后关系。对「每篇正文两万字且不能灌水」,字符计数是验证节点,重复段检测和人工内容审查也是验证节点;单纯增加扩写步骤无法覆盖质量条件。 目标变更后不必总是重建整个计划。新增要求时寻找未覆盖项并插入节点;覆盖要求时,定位依赖旧字段的节点并重算;撤销要求时,删除只为它存在的节点,但保留同时服务其他要求的共享节点。这个过程类似增量编译,关键是计划节点要声明自己的输入目标字段。

计划中还存在「幽灵节点」:对应要求已经撤销,动作却仍留在待办列表。它们会消耗资源,甚至重新写回用户明确不要的内容。反过来,目标表里存在而计划没有入口的要求是「孤儿要求」。每次状态更新后扫描这两类不一致,比等到最终验收才发现漏项更便宜。 覆盖关系也为进度汇报提供了可靠语义。完成百分比不应按写了多少文字或执行了多少动作计算,而应说明多少要求已经有产物并通过验证,多少只有进行中的实现,多少尚未进入计划。这样用户提高标准时,系统会诚实地重新打开受影响项,而不会因为旧进度接近百分之百就把新要求当作附注。

验收证据会随目标变化而失效,「已经检查过」只对某个文件版本、某套规则和某个环境成立。用户修改验收标准后,旧证据可能完全失效,也可能仍支持其中一部分结论。把验收结果保存成一个布尔值,会掩盖这种条件性。 一条证据至少应记录对象版本 vxv_x、检查器版本 vcv_c、目标版本 vGv_G、检查范围 SS 和结果 yy:

e=(vx,vc,vG,S,y,t).e=(v_x,v_c,v_G,S,y,t).

提交前再次修改文件,依赖 vxv_x 的字符与格式检查需要重跑;只改变另一篇文章,不会让本文件证据失效;检查器规则升级后,旧的「通过」不能自动代表满足新规则。证据的有效性由依赖匹配决定。 不同证据拥有不同单调性。证明「至少五份笔记」的计数,在只增加合格笔记时仍有效;证明「恰好五份」则会因新增文件失效。证明某文件没有 NUL,在文件未改动时可复用;证明全库没有 NUL,还依赖扫描集合没有扩大。系统若记录谓词形式,就能判断哪些更新保持结论,哪些必须重验。

人工审查也需要锚定版本。审稿人确认一段推导正确后,后续只改标题,推导审查可以保留;若公式或前提变化,则必须重新检查相关结论。内容审核无需因为任何字节变化都全量重做,但也不能依赖「这个文件以前看过」这种模糊记忆。段落哈希、依赖标签与差异范围可以缩小复核面。 最终完成判定是证据集合对当前要求的覆盖。每条要求要有仍然有效的证据,且高风险要求不能只由执行者自报支撑。若证据缺失,状态是「尚未证明」;若检查明确失败,状态是「未满足」。区分二者很重要:前者需要检查,后者需要修改。

从轨迹评测走向可诊断的基准,演化意图基准若只报告最终成功率,很难指导系统改进。测试轨迹应按变化类型、作用域跨度、延迟长度、冲突强度、外部副作用和语言难度分层。一个模型可能擅长显式覆盖,却在省略恢复或跨任务回返时崩溃;总分会把这些差异平均掉。 样本切分还要防止模板泄漏。同一种骨架仅替换城市、文件名或菜品,训练与测试分开也可能测到模板记忆。更稳妥的切分按状态转移图、领域和表达族共同隔离:测试集包含训练时未见的事件组合,但每个基本语义仍可理解。这样才能观察模型是否学会更新规则。

评价可以分成四层。第一层检查消息到事件的解析,第二层检查事件到目标状态的折叠,第三层检查目标到计划的传播,第四层在真实 Harness 中检查动作与副作用。上层失败往往由下层造成,但也可能出现状态正确、规划遗漏,或计划正确、执行未取消的情况。分层记录让错误有归属。 长程长度本身不应成为唯一难度轴。把无关闲聊插入一千轮,只测试检索耐久;三轮对话也可能包含撤销、条件例外和权限变更。更合理的难度由有效状态转移数、依赖图宽度、未决分支数和需要回看的距离共同刻画。可定义一个诊断向量,而非把所有因素压成「上下文有多长」。

人工轨迹与合成轨迹各有用途。合成数据能精确控制单一变量并生成反事实对;真实对话提供省略、口癖、情绪和目标摇摆。评测集需要保留原始用户表达,同时由标注者给出结构化状态与可接受动作集合。只有一个参考答案会错误惩罚多种同样合理的确认或执行策略。 最终要测的是系统能否在变化中保持可恢复性:发现更新,修订正确范围,停止过期动作,保存仍有效成果,重新验证受影响结论,并让用户看见尚未解决的歧义。这条链上任何一环缺失,末轮文字再流畅,也只是在偶然命中当前请求。

2.3. 歧义不能只有「猜」和「停」两种处理

用户表达留下多个合理解释时, 立即提问并不总是最好. 问题可能不影响眼前工作, 频繁打断会把交互成本转嫁给用户; 直接选择一个解释, 又可能让大量工作建立在错误前提上. 系统需要根据分支影响决定何时继续、何时保留多条候选、何时必须确认.

设歧义产生候选目标 G1,…,GkG_1,\ldots,G_k, 当前动作 aa 在各分支的效用为 U(a,Gi)U(a,G_i). 若存在一组动作在所有候选下都安全且有正收益, 可以先执行它们. 例如输出顺序尚未确定时, 核对共同数据源和修复明确事实仍然有效. 这些动作构成候选目标可行域的交集:

Asafe=⋂i=1kA(Gi).\mathcal A_{\mathrm{safe}}=\bigcap_{i=1}^{k}\mathcal A(G_i).

交集为空或只剩无意义动作时,再请求澄清。这样既没有把沉默当授权,也不会因一个暂不相关的选择让整个任务停住。 有些动作在不同分支下都可用,但产物形态不同。此时可以先生成共享中间表示,例如收集论文证据、整理符号表和列出推导前提,等分支消解后再编排正文。共享工作量越大,延迟确认的价值越高;若下一步是删除、发布或覆盖外部状态,错误分支代价很大,应提前确认。

确认问题应指向导致计划分叉的最小字段。与其问「你具体想要什么」,不如说明「这里可能指当前章节,也可能指全库;两者会影响 6 个或 40 个文件,请确认范围」。问题携带候选解释和后果,用户才能快速裁决。已经从上下文排除的选项无需重新抛回去。 候选状态不能无限积累。每个候选要记录支持证据、反对证据、等待的消歧事件与失效条件。新消息到达后,删除不一致分支;多个分支收敛到相同字段值时合并。若分支数量随每次含糊表达指数增长,可只保留会改变近期动作或验收的差异,其余延迟解析。

评测确认策略时,要同时计算错误执行成本和打断成本。只看准确率会奖励逢问必停;只看完成速度会奖励冒险猜测。更合理的指标包含必要确认率、无效确认率、歧义期间安全进展量,以及确认后消除的状态熵。优秀系统能够继续所有对候选分支都成立的工作,并把真正决定后续路径的问题留给用户。