给智能体留出工作空间,同时保住你的草稿
本文目录
有未完成改动的工作树,仍可能容得下一项小范围智能体编辑。有用的边界,是你授权智能体修改的部分,以及它必须保留的现有字节。“先清理工作树”并不能确立这个边界。
第一次编辑之前,给智能体一份当前清单、你实际掌握的人工归属说明,以及本次范围内精确的函数或段落。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、
删除未跟踪草稿、提交,或把创建其他检出目录当成顺手工作。
任何被要求进行的快照或转移,都需要明确限定其自身范围并验证。
不要假定隔离基线包含尚未提交的人工工作。
本教学任务只使用新的本地示例文件和内存副本。
不要操作真实项目。区分拟议变更、实际示例运行,
以及尚未验证的应用与并发行为。
现在,智能体既有足够空间做一项有用的变更,也有足够细节识别授权的终点。一个小方案可以保留尚未完成的草稿,而不声称自己已经理解或修复了草稿本身。