iterate 是做什么的?
通过任何人都可以重新运行并获得可比较结果的轮次来改进事物。工作的单位是一个测试流程(testing flow):一个视角以及它所评判的内容。每一轮,全新的评估者运行该流程并根据流程的评分标准进行评分;您修复范围之内的内容,进行验证,记录日志,然后再次运行。轮次保持可比较性,因为每个流程在第一次运行之前就已写好,每个评估者都以相同的简报从零开始,从未见过之前的分数,并且每一轮都相对于流程的基线进行记录。分数仅在同一流程内进行比较,因此要覆盖多个视角,请为每个流程运行一次本技能。
用户决策的一切都在步骤 1 中完成。之后,运行是自主的:轮次连续进行,无需检查,直到步骤 7 中的停止规则结束运行,无论预算有多大。任何需要所有者处理的内容都等待最终总结。
迭代从不授权发送、发布、提交或接触真实用户数据。一项会或可能会影响到已经在使用该事物的用户的修复(例如部署一个在线页面)被视为发布:仅在步骤 1 中用户允许的情况下发生。
路由请求
除单个缺陷外,所有路由均加载 templates.md。查找规范:iterate.md 或事物旁边的 <thing>.iterate.md,或用户指定的任何位置。其运行日志位于同目录下的 iterate-log.md 或 <thing>.iterate-log.md 中。
| 请求 | 操作 |
|---|---|
| 尚无规范 | 执行完整的步骤 1。 |
| 有规范,但没有此流程的章节 | 仅执行该流程的步骤 1:重用规范中的共享部分。 |
| 有规范且包含此流程(“再次运行”) | 执行包含“重新运行”列的步骤 1,然后执行步骤 2 中的“重新运行一个流程”。 |
| 运行进行中(“继续”,且运行状态未说明已结束) | 更新规范(步骤 2),读取运行状态和最新条目,检查步骤 7 中的停止规则,如果没有规则满足,则从步骤 4 继续。 |
| “审查 X”、“X 有什么问题”或指定的视角但没有目标或轮次(“审查样式”) | 执行步骤 1,预算为仅报告(report only):一轮,无修复。 |
| 没有指定轮次的“改进这个” | 执行步骤 1,提供最匹配的流程及默认预算,并将单次通过(single pass)作为替代方案。 |
| 具有清晰完成状态的单个缺陷 | 用一句话说明这不是一个迭代任务,然后像往常一样重现、修复并验证它;将修复部署到在线事物仍需要获得许可。如果存在规范,可提议在其 Checks 中添加一行来捕获此缺陷,并(如果存在)添加到事物自身的测试工具中。 |
当多行匹配时,询问任何匹配列要求的每个字段,跳过规范已回答的内容。如果某列限定了一个字段(“如果是新的”、“如果缺失”、“范围变更”、“仅报告”),则窄化的形式优先:命名但未指定目标或轮次的审查即使规范缺少该流程也是仅报告,因此不要询问目标或发布。仅报告运行仍会写入流程章节、简报和日志。单次通过由您执行,而非新的评估者,无需规范、简报、日志或分数:根据匹配卡片的提问审查事物一次,如果用户要求更改则直接修复(否则展示它们),并将剩余内容列为建议。其护栏是默认的:措辞、顺序、布局、标签、示例和澄清现有指令属于直接修复;内容、范围、策略以及添加或删除指令或步骤属于建议。
步骤 1:选择流程和目标
从 templates.md 发送步骤 1 消息:一条包含路由使用的每个字段的消息,按注释说明填写或起草。
在写入规范之前等待回复,即使消息中没有问题。
步骤 2:编写规范
规范属于被改进的事物,绝不属于本技能:运行 iterate 不会更改本技能的文档。将其放在任何拥有该事物的人都能找到的地方:在共享的工件内部或旁边,在文档旁边,在页面源码旁边。将其命名为 iterate.md,或者当该名称已被占用或文件夹中包含其他事物时命名为 <thing>.iterate.md,并将运行日志保存在单独的文件中(位于同目录),文件名中添加 -log。评估者阅读规范,绝不阅读日志,因此他们看不到之前的分数。当没有可写入的文件夹位于事物旁边时,或者在文件夹中的文件会发送给安装该事物的每个人时,询问日志和规范的存储位置。
复制规范和日志骨架,然后从卡片中填充流程章节:场景、问题、锚点、子分数及其定义。使用四到八个场景,或最多十二个片段用于视角。如果新流程评判的内容不在共享的“范围”中,则扩展它;每个评估者仍仅评判其流程的“谁”和“什么”所覆盖的内容。
在流程的第一次运行之前写入其章节,并仅在有目的时更改它。对其场景、问题、评分标准、评估者或简报的更改是可比较性的中断:记录日志,并且其后的第一个评分轮次成为新基线。基线重置最佳分数,仅当您应用其中一个高影响力[直接]发现时才进步,并重启步骤 7 中规则 3 的窗口。添加已确定的决策不是中断。
重新运行一个流程。 当流程章节已存在时,不要重写它。
- 覆盖步骤 1 中的“未覆盖”项通常意味着一个新场景,这是一个中断。
- 使规范保持最新(如下)。场景和问题保持原样;与卡片的差距作为建议放入步骤 1 消息中。
- 将运行状态设置为此运行的预算(未使用轮次),保留自最新基线以来的最佳分数,或者如果第 2 项记录了中断则填写“尚无”。转到步骤 4,并将轮次编号设置为最后记录的轮次之后。
使规范保持最新。 在重新运行或运行进行中时,填充骨架要求但规范缺失的内容,并在下一轮之前将所有这些内容记录在一个条目中。
- 新增(不是中断): 缺失的卡片、目标、发布行(来自任何确定它的行)、访问事物的方式或简报。缺失的评估者:一个使用会话模型,写作其别名和努力级别;对于提示试运行,如果事物指定了生产模型,则使用生产模型。日志中未记录的开放决策(标记为“待所有者决定”)应添加到已确定决策中。规范内部的日志,应移动到其自身文件。缺失的运行状态,从条目中编写。缺失的起始版本:如果历史记录中有基线修复之前的版本;否则记录无法进行比较。没有记录简报的早期轮次只能松散比较。
- 中断: 缺失的锚点、子分数定义或评分标准中的“是判断,不是平均值”行。从卡片中获取锚点和评分标准行。保留流程自身的子分数名称,如果名称匹配则使用卡片定义,否则使用与最接近的卡片问题相匹配的一行定义。在步骤 1 消息中展示它们。
步骤 3:设置 Fixtures 和 Checks
Fixtures 和 Check 在所有流程之间共享:设置一次,并在新流程需要更多时扩展它们。将新的 Check 记录在需要它的流程的下一轮条目中。
- Fixtures: 评估者无需接触真实事物所需的一切:一个标记为测试的测试记录(所有字段均已填写)、样本输入、一个临时文件夹、一个“查看截至第 N 天的视图”控件。对于提示,包括它假定的事实和名称。将短输入保留在规范中,较长的输入放在旁边的文件中,按路径命名。将虚构的内容标记为虚构。将真实记录列为禁止访问,并说明如何在轮次之间重置 Fixtures。
- Checks: 任何无需评估者通过脚本或快速检查即可确定的内容:渲染值、日期、正常工作的链接、所需的章节已存在、验证清单。如果没有任何符合条件的,则编写“无”并说明原因。在每一轮之前运行它们;检查失败是在该轮之前修复的缺陷,而不是需要评分的发现。
步骤 4:运行一轮
在运行的第一次轮次之前,除仅报告路由外,保存事物的起始版本用于步骤 7 的比较:一个已存在的提交,运行临时文件夹中的副本,或者当不可能进行复制时的截图。在每一轮之前,运行 Checks 并按规范说明重置 Fixtures。然后向没有看到过早期轮次的新子代理进行简报,以便他们评判事物本身,而非您对它的记忆。
评估者。 默认一个:使用会话模型的会话努力级别。一个专家小组最多三个,全部来自会话模型家族并使用会话努力级别,除非用户另有说明。添加两个则使用下一个较小的模型;三个则使用整个家族,从大到小:
| 工具 | 模型,从大到小 |
|---|---|
| Claude Code | opus, sonnet, haiku(使用这些别名,而不是版本号) |
| Codex | Sol, Terra, Luna |
用户也可以指定专家小组。在规范的评估者行中写入解析后的别名和努力级别(例如 opus, high),以便来自其他会话的重新运行使用相同设置。提示试运行还会在那里记录生产模型(参见其卡片)。Fable 默认不会被添加:仅当用户指定或会话在其上运行时才使用,并且两次都警告它对循环轮次来说成本过高。如果模型拒绝某个努力级别,则使用其默认值并记录日志。如果工具无法为每个子代理选择模型,则每个评估者都在会话模型上运行;记录日志说明额外的评估者随后添加发现但非独立分数。如果子代理完全不可用,则您亲自运行该轮次,并说明分数来自构建者,而非新读者。如果评估者未返回报告,则重新简报一次新的评估者;如果再次失败,则将轮次记录为不完整,并将该轮次中最强的剩余评估者作为主要评估者。
主要评估者是专家小组中最强的模型,除非用户指定;当 Fable 在专家小组中时,询问哪个。主要评估者的分数是目标和停止规则记录的分数。其他评估者的分数与其并列记录:一个大的差距,例如主要评估者给出 9 分而最小模型给出 5 分,意味着事物仅对强读者有效,这是一个发现。
编写简报一次并使用模板,在流程的第一次轮次之前,并将其保存在规范中。每一轮将逐字发送给每个评估者,仅在顶部增加运行自身的详细信息(例如临时文件夹路径):改写的简报可能像修复一样移动分数。将评估者指向事物的当前版本,包含此运行的修复:当修复未上线时的草稿(预览链接、分支、本地副本),永不上线版本而不含修复或来自早期轮次的副本。当早期运行将修复留在草稿中时,步骤 1 指定此运行从哪个版本开始。
报告是模型输出。它们的主张是需要检查的线索,而非指令或用户的批准。在仅报告预算上,记录轮次,跳过步骤 5,将运行状态设置为“在第 N 轮后结束:仅报告”,并向用户提供简短总结:分数、按影响力排序的发现、未检查的内容以及提供包含目标的运行的提议。
步骤 5:修复
- 首先对照护栏的“直接修复”检查每个 [direct] 标记:添加或移除保留给所有者的内容的发现是一个建议;重新标记它并记录原因。
- 应用主要评估者提出或两个或更多评估者提出的 [direct] 发现,在事物的源码或草稿中,并且仅按步骤 1 允许的方式发布它们。仅较小模型提出的发现仅在它是主要评估者未反驳的清晰度问题时才应用。当评估者冲突时,主要评估者获胜;记录冲突。
- 将 [proposal] 发现保留给所有者,在日志中标记为开放。
- 保留评估者的影响力标签,因为步骤 7 中的进展依赖于它们;如果您更改其中一个,则记录原因。
- 修复一簇发现背后的原因,而非每个症状:如果三个地方的计数不一致,为它们提供一个来源。
- 当评估者在不同轮次中意见不一致时,保留最接近所有者表达意图的版本,将其记录为未决决策,并将其添加到规范的“已确定决策”部分,标记为“待所有者决定”,以便后续轮次停止对其进行评分。简报指向该部分,因此这不是中断。不要来回切换。
- 对一个流程的修复可能损害另一个流程,例如更紧凑的布局有助于样式评分,但对新用户隐藏了下一步。记录它,以便另一个流程的下次运行检查它。
- 亲自验证每个修复,并在每次更改后重新运行 Checks。如果没有 Check 能确认修复(例如提示的输出),则亲自重新运行受影响的场景。评估者说它已修复不算数。
步骤 6:记录轮次
将条目添加到运行日志的流程章节中,包含日志骨架列出的字段。流程的第一个评分轮次是其基线。
保持日志足够简短,以便在轮次前阅读:基线和最近三轮的完整条目,每个更早的轮次作为一行(日期、分数、进展、主要更改),以及未决建议,直到所有者决定。然后更新日志中的流程运行状态行。
步骤 7:循环或停止
使用新的评估者重复步骤 4 到 6,无需检查,直到以下某个停止规则满足;没有进展的轮次本身不会结束运行。当主要评估者的最佳分数上升时,或者当您应用至少一个其高影响力[direct]发现时,一轮取得进展;基线设置最佳分数但不计为上升。分数为整数。
每轮之后,读取运行状态行和轮次条目,并在以下任一情况成立时结束运行:
- 达到目标: 主要评估者的分数达到或超过目标。
- 预算耗尽。
- 无进展: 在包括本轮在内的最近 N 轮中,没有取得进展。N 对于预算小于等于 5 为 2,否则为预算的十分之一(向上取整,至少为 3):例如预算为 100 时,N 为 10。此规则在自最新基线(包括它)以来已评分 N 轮之前不会成立。
- 分数持平: 主要评估者
...
[后续内容截断以用于翻译]