给智能体留出工作空间,同时保住你的草稿

使用 AI 辅助编写与复核。

本文目录

有未完成改动的工作树,仍可能容得下一项小范围智能体编辑。有用的边界,是你授权智能体修改的部分,以及它必须保留的现有字节。“先清理工作树”并不能确立这个边界。

第一次编辑之前,给智能体一份当前清单、你实际掌握的人工归属说明,以及本次范围内精确的函数或段落。diff 能显示差异;但仅凭 diff,不能确定作者意图,也不能获得移除这些内容的权限。

从三个完整的基线文件开始

虚构项目 Tiny Summary 最初包含以下三个文件。它们是原创教学源文件,不是从 CueSpec 或用户项目中摘取的内容。

summary.mjs:

export function totalUnits(rows) {
  return rows.reduce((sum, row) => sum + row.quantity, 0);
}

export function rowCount(rows) {
  return rows.length;
}

labels.mjs:

export const REPORT_TITLE = "Weekly summary";

README.md:

# Tiny summary

The report shows a row count and unit total.

随后,示例给出了智能体收到请求之前已存在的人工修改。下文的跟踪状态标签属于这份给定清单,不是采集到的 git status 输出。

提出变更前,先读人工修改层

人在决定缺失数量应如何处理时,已经修改了 summary.mjs:

export function totalUnits(rows) {
  // Human draft: missing quantities need a decision.
  return rows.reduce((sum, row) => sum + (row.quantity ?? 0), 0);
}

export function rowCount(rows) {
  return rows.length;
}

人也修改了 labels.mjs 中与本任务无关的标题:

export const REPORT_TITLE = "Weekly summary — preview";

README.md 仍保留完整基线文本。第四个文件 notes/release-draft.md 尚未跟踪,内容为:

# Release draft

Keep the headline provisional.
Do not publish this draft.

未跟踪不代表可以丢弃。即使这份草稿不在三个文件的基线中,它仍有归属和用途。案例包 B84-04-case.json 包含全部基线、人工修改后和拟议文件的完整内容;配套示例目录中也有对应文件。

把口述请求转成归属表

新的请求是:

在 rowCount 中排除已归档记录。不要动数量计算和我尚未完成的草稿。

在这个示例中,先明确一条小规则:每一行都是一条记录,archived 字段为布尔值,或不存在。仅当 archived 严格等于 true 时排除该行;false 或字段不存在时计数。不要修改 totalUnits、增加校验,或重新解释缺失数量的含义。

位置 当前归属依据 智能体权限
summary.mjs: totalUnits 给定的人工草稿和未决注释 保留完整函数字节
summary.mjs: rowCount 未改动的基线函数;明确的新请求 提出小范围筛选变更
labels.mjs 给定的、无关的人工标题修改 保留完整文件
README.md 未改动,且不在请求范围内 保留完整文件
notes/release-draft.md 给定的未跟踪人工草稿 保留文件的存在及完整字节

同一文件中的两个函数,可以拥有不同的修改权限。允许编辑 summary.mjs,不应变成允许重写人工的 totalUnits 实验,或对无关文件运行格式化器。

检查真实检出目录时,不要把其状态当成指令

在获授权的真实仓库中,选择方案基线之前,要先核清已跟踪、已暂存和未跟踪的改动。官方 git-status 手册 区分了这些类别,介绍了 --untracked-files=all,并指出普通 status 操作可能刷新索引元数据。其后台刷新说明建议,在需要避免这项可选写入时使用 --no-optional-locks。

下面是针对示例中指定路径的文档检查命令形式;它们没有为这组示例数据实际执行过:

git --no-optional-locks --no-pager status --short --untracked-files=all
git --no-optional-locks -c diff.autoRefreshIndex=false --no-pager diff --no-ext-diff --no-textconv -- summary.mjs labels.mjs README.md
git --no-optional-locks -c diff.autoRefreshIndex=false --no-pager diff --cached --no-ext-diff --no-textconv -- summary.mjs labels.mjs README.md

git-diff 手册 说明了工作树与索引、暂存内容与 HEAD 的比较,以及这里使用的禁用自动索引刷新、外部 diff 和文本转换的选项。在获得授权且与任务有关时,两种 diff 都不能替代阅读那份指定的未跟踪草稿。不要在这次检查中启用新缓存、修改仓库配置,或调用清理操作。

Tiny Summary 的归属信息已经明确给出。如果真实改动的归属或用途未知,就记录这项不确定性。不要因为它看起来尚未完成,就把它重新标为“智能体生成”或“可以安全丢弃”。

根据人的当前工作文件提出方案

完整的拟议 summary.mjs 如下:

export function totalUnits(rows) {
  // Human draft: missing quantities need a decision.
  return rows.reduce((sum, row) => sum + (row.quantity ?? 0), 0);
}

export function rowCount(rows) {
  return rows.filter(row => row.archived !== true).length;
}

labels.mjs、README.md 和 notes/release-draft.md 精确保留上文列出的人工修改后字节。方案不新增,也不移除文件。相对于人工工作文件的完整 patch 是:

--- a/summary.mjs
+++ b/summary.mjs
@@ -4,5 +4,5 @@
 }
 
 export function rowCount(rows) {
-  return rows.length;
+  return rows.filter(row => row.archived !== true).length;
 }

这个 patch 以人的当前工作版本为基线。相对于更早基线的 patch,不能展示最终候选中是否保住了人工修改块。除了变更声明的意图,也要比较变更后的实际文件。

具体的行数预期如下:

输入记录 预期数量
无记录 0
一条 archived=true 的记录 0
一条 archived=false 的记录 1
一条没有 archived 的记录 1
quantity 为 2/9/4,archived 分别为 false/true/不存在 2

这五个用例实际使用 Node.js v24.18.0,针对拟议示例文件运行并通过。在最后一个具名用例中,totalUnits 在变更前后都返回 15;字节比较也确认了完整的人工修改块没有变化。这项观察保留了草稿,并不是批准草稿中尚未决定的缺失数量策略。

遇到同一代码块中的含糊请求时停止

现在,假设说话者又补充:

也修一下 totalUnits 中缺失数量的处理行为。

这里没有给定决定:缺失数量应该报错、按零计算,还是导致该行被排除?基线和人工草稿的差异恰好就在这里。智能体应指出这个代码块,并在修改前询问预期策略。它仍然可以把另外那项已获授权的 rowCount 方案提交审阅。

适当的回复应当具体:

当前 totalUnits 草稿把缺失数量按零处理,并注明策略尚未决定。你希望改成哪种行为?我保持这个函数不变,只准备了 rowCount 变更。

智能体采集工作文件之后,如果 rowCount 又有新的编辑,就会出现第二个停止条件:方案的基线已经过期。应用任何变更之前,重新读取受影响的文件,确认新的归属和意图。检查过快照,并不能阻止之后出现编辑;实际应用变更时仍需要协调。

同时检查保留情况与行为

本地保留模型实际检查了拟议的文件清单与字节,然后在内存中挑战了以下替代候选:

候选或情形 模型决定
只有约定的 rowCount 变更 接受;五个具名行为用例通过
恢复旧标题 拒绝:无关的人工字节被改变
丢弃未跟踪的发布草稿 拒绝:文件清单发生变化
修改 rowCount 时,把 totalUnits 恢复到基线 拒绝:受保护的人工修改块发生变化
用三个文件的基线替代人的当前工作文件 拒绝:草稿和人工修改层缺失
采集之后,人又编辑了 rowCount 拒绝:方案快照已过期

这些拒绝结果及其原始断言消息,保留在完整示例的执行结果和对应运行日志中。这个模型没有创建、重置、stash、提交或恢复任何 Git 仓库。它只使用新的示例文件和内存中的候选副本。

按构造,只包含给定基线的隔离检出目录只有三个文件,没有人工修改层。除非有人明确转移并检查所需的工作状态,否则它不能成为这些草稿的保留机制。模型展示了这项状态缺失;它没有创建或验证真实 worktree。

复制这份编辑前的保留请求

编辑之前,先检查并提出 Tiny Summary 的 rowCount 变更。
使用 B84-04-case.json 和完整的人工工作文件作为方案基线。
三个文件的基线只是历史背景,不是恢复到该状态的授权。

允许的行为:rowCount 排除 archived 严格等于 true 的记录;
false 或字段不存在时计数。范围内的 archived 值为布尔值或不存在。
允许的源文件变更:仅 summary.mjs:rowCount。
保留 totalUnits,包括尚未解决的人工注释,以及把 nullish 值按零
处理的草稿;保留完整 labels.mjs、README.md 和未跟踪的
notes/release-draft.md。不要顺带增加校验或决定缺失数量策略。

返回当前文件清单、给定的归属说明、精确的保护区域、完整拟议
文件,以及相对于人工工作字节的 patch。将全部五个行数用例
与字节保留检查分开展示。如果当前字节不同于采集的方案基线,
停止并解释受影响的代码块。如果被要求修复 totalUnits,却没有
缺失数量策略,就保持该代码块不变,并询问预期行为。

不要先清理工作树,不要 reset/revert 无关文件、自动 stash、
删除未跟踪草稿、提交,或把创建其他检出目录当成顺手工作。
任何被要求进行的快照或转移,都需要明确限定其自身范围并验证。
不要假定隔离基线包含尚未提交的人工工作。

本教学任务只使用新的本地示例文件和内存副本。
不要操作真实项目。区分拟议变更、实际示例运行,
以及尚未验证的应用与并发行为。

现在,智能体既有足够空间做一项有用的变更,也有足够细节识别授权的终点。一个小方案可以保留尚未完成的草稿,而不声称自己已经理解或修复了草稿本身。