一个模糊的想法已经出现,它过于庞大以至于单个 Agent 会话无法承载,并且笼罩在迷雾之中:从此处到目的地的路径尚不可见。Wayfinding 就是关于找到这条路径,而不是奔向目的地。本技能将路径绘制为仓库问题追踪器上的一张共享地图,然后逐一处理其决策工单(这些问题解决的是一个决策,而不是构建的执行片段),直到路径清晰为止。
每项工作的目的地各不相同,给其命名是绘制地图的首要行动:它会塑造每个工单。它可能是一项需要移交并迭代的规范、一个在规划开始前需要锁定的决策、或者一个就地完成的变更(如数据结构迁移)。该地图无视领域(Domain-Agnostic):无论是工程工作、课程内容,还是其他任何符合此形式的工作,均可适用。
计划,而非执行
Wayfinder 默认是规划性质的:每个工单解决一个决策,当地图上的路径清晰、在有人去执行具体工作之前没有需要决定的事项时,地图即完成。那种想要直接去“做”工作的冲动,通常意味着你已经到达了地图的边缘,该将其移交出去了。一项工作可以在其**笔记(Notes)**中覆盖此默认行为,将执行阶段的工作也纳入地图本身;但如果没有特别说明,请产出决策,而非交付物。
引用名称
每个地图和工单都是一个 Issue,因此它有一个名称:它的标题。在人类阅读的所有内容(叙事、地图的“已决定事项”部分)中,请通过这个名称来引用它,永远不要只使用裸 ID、编号或短标识符。一串 #42, #43, #44 是难以阅读的;而名称则一目了然。ID 和 URL 并没有消失;一个名称包裹着它的链接,但它们应该在名称的内部,而不是代替名称。
地图
地图是此仓库问题追踪器上的一个 Issue,标记为 wayfinder:map,是规范性的制品(Canonical Artifact)。它的所有工单都是地图的子 Issue。
地图是一个索引,而非存储仓库。它列出已做出的决策,并指向包含其细节的工单;一个决策只存在于一个地方,即它的工单中,因此地图绝不重复陈述它,只给出要点和链接。
**地图、其子工单、阻塞关系以及前线查询的物理位置取决于追踪器类型。**问题追踪器应该已经提供给了你。如果没有,请告知用户运行 /setup-matt-pocock-skills。请查阅追踪器文档中的“Wayfinding 操作”部分,了解此仓库如何表达这些内容。如果未提供任何追踪器,则默认使用本地 Markdown 追踪器。
地图正文
整个地图的低分辨率视图(Low Resolution),每次会话加载一次。开放的工单不会被列出:它们是通过查询找到的开放子 Issue。
## 目的地
<到达此地图终点时的情景:此工作要找到通往的规范、决策或变更。一两行;每次会话在开始选择工单前都会参考此信息。>
## 笔记
<领域;每次会话都应查阅的技能;此工作的固定偏好>
## 已决定事项
<!-- 索引:每个已关闭工单一行,足以判断其相关性,然后通过链接查看该工单的细节 -->
- [<已关闭工单标题>](链接): <答案的一句话要点>
## 尚未明确
<!-- 参见“战争迷雾”:范围内的迷雾,尚无法创建工单;随着前线推进而渐次明确 -->
## 超出范围
<!-- 参见“超出范围”:被判定为超出此工作目的地的任务;已关闭,不再渐次明确 -->
工单
每个工单都是地图的一个子 Issue;追踪器的 Issue ID 是其标识。其正文是问题本身,大小限制为一次 100K token 的 Agent 会话能处理的程度:
## 问题
<此工单要解决的决策或调查>
每个工单都带有一个 wayfinder:<type> 标签,类型为 research、prototype、grilling 或 task(参见工单类型)。
一个会话通过认领一个工单来开始解决它:在任何工作之前,先将工单分配给驱动地图的开发者,这样并发的会话就会跳过它。这个被分配的人就是认领者:一个开放的、未分配的工单就是未被认领的。
阻塞关系使用追踪器原生的依赖关系:这一点至关重要,因为它会在视觉上于追踪器自己的 UI 中呈现前线,让人无需打开地图就能看到哪些工单是可供领取的。只有当追踪器缺少原生阻塞功能时,才会退回到使用正文中的约定格式。当一个工单的所有阻塞工单都已关闭时,该工单便是未被阻塞的;前线就是那些开放的、未被阻塞的、未被认领的子工单,即已知领域的边缘。
答案不是工单正文的一部分;它在关闭工单时被记录(参见执行地图)。在解决工单过程中创建的资产,通过链接从 Issue 中引用,而不是粘贴到 Issue 中。
工单类型
每个工单要么是 HITL(Human In The Loop,与能为自己代言的人类一起工作),要么是 AFK(Away From Keyboard,由 Agent 独立驱动)。一个 HITL 工单只能通过这种实时的交流来解决;Agent 永远不能代表人类的那一方(一个自己回答自己问题的审问型工单就破坏了此规则)。
- 研究型 (AFK):阅读文档、第三方 API 或本地资源(如知识库)来揭示某个决策所依赖的事实。由调用“research”技能的次级 Agent(Subagent)解决。当需要当前工作目录之外的知识时使用。
- 原型型 (HITL):通过制作廉价、粗略、具体的制品(如大纲、草稿、代码桩或 UI/逻辑代码)来提高讨论的保真度,方法是调用“prototype”技能。将原型作为资产链接。当“它应该看起来什么样”或“它应该表现成什么样”是关键问题时使用。
- 审问型 (HITL):对话。默认类型。始终调用“grilling”和“domain-modeling”技能两次。
- 任务型 (HITL 或 AFK):在做出决策之前必须执行的体力工作:无需决定、原型或调研,但讨论被其阻塞直至完成。例如:注册一个服务以便评估其 API、配置访问权限、移动数据以便查看其结构。这是唯一一个执行而非决策的类型,它通过解除决策的阻塞来获得其在地图上的位置,而不是通过交付最终目的地。Agent 在其能力范围内独立驱动(AFK);否则,它会交给人类一个精确的检查清单(HITL)。当工作完成时,工单被解决;答案记录所完成的工作以及后续工单所依赖的任何结果事实(如凭据位置、新 URL、行数)。
战争迷雾
地图是故意不完整的:不要绘制你还看不到的东西。在活跃的工单之外是战争迷雾:你能判断出即将到来但尚无法确定具体内容的决策和调查,因为它们取决于尚未解决的问题。解决一个工单会清除其前方的迷雾,将现在可以明确化的内容逐条转化为新的工单,直到通往目的地的道路清晰,且没有剩余工单为止。
地图的尚未明确部分就是用来记录这种模糊视图的:提出的问题、以后需要再回头看的区域。它是朝向目的地的未被发现的前线:这里的一切都处于范围内,只是还不够清晰到可以创建工单。根据你能看到的程度,写得松散或详细均可;它同时也是为协作者提供的路标,让他们了解工作的方向。
战争迷雾还是工单? 判断标准是你现在是否能精确陈述该问题,而不是你现在是否能回答它。
- 创建工单的条件: 问题已经清晰,即使它被阻塞,暂时无法采取行动。
- 放入“尚未明确”的条件: 你暂时还无法如此精确地表述它。不要预先将迷雾切成工单大小的碎片:它比工单更粗略,一旦前线触及它,一片迷雾可能渐次明确为几个工单,也可能一个都没有。
“尚未明确” 排除了那些已经决定的内容(已决定事项)、已经是活跃工单的内容以及超出范围的内容(下一节)。
超出范围
迷雾只会朝向目的地聚集。目的地确定了范围,因此超出目的地的任务属于超出范围:它不是迷雾,也不属于尚未明确。它在地图上拥有自己的超出范围部分:你有意识地判断出不属于此工作的任务。将其归入此处的是范围,而非清晰度。
超出范围的任务永远不会渐次明确(前线止步于目的地),因此它们只有在目的地被重新绘制时才会回来,并且是作为一项新工作,而非恢复。
将某些任务判定为超出范围是一个划定范围的行为,而不是路径上的一步。当一个已存在的工单恰好位于目的地之外时(在绘制地图时错误地划入范围内,或因解决一个工单而暴露出来),请关闭它(一个已关闭的工单明确地不在前线上),并在超出范围部分留下一行文字:要点以及它超出范围的原因,并链接该已关闭的工单。不要将其放在已决定事项中,因为后者记录的是实际走过的路径;范围边界不是路径上的一步。
调用方式
两种模式。无论如何,每次会话最多只能解决一个工单,研究型工单除外。
绘制地图
用户带着一个模糊想法进行调用。
- 为目的地命名。 调用“grilling”和“domain-modeling”技能两次,以确定此地图要通往的目标:规范、决策或变更。目的地确定了范围,因此要首先确定下来。
- 绘制前线。 再次进行审问,这次是广度优先:在整个空间上展开,而不是深入任何一个线程,以发现开放的决策和当前可以采取的第一步行动。如果这没有发现任何迷雾(通往目的地的道路已经清晰,整个旅程小到足以在单个会话内完成),那么你不需要地图。停下来询问用户希望如何继续。
- 创建地图(标签
wayfinder:map):填写好目的地和笔记,已决定事项为空,将迷雾的轮廓写入尚未明确。 - 创建你现在可以明确的工单,作为地图的子 Issue,然后在第二轮中建立阻塞关系(Issue 需要先有 ID,才能互相引用)。建立阻塞关系能将工单排序为前线和被阻塞两类;现在还不能明确的一切都留在迷雾中:即尚未明确部分。
- 触发研究型次级 Agent。 对于你刚刚创建的每个
research工单,启动一个调用“research”技能的次级 Agent 来并行解决它,将其发现捕获在一个临时的research/<name>分支上,并从工单附加一个上下文指针。 - 停止:绘制地图是一次会话的工作;它不会手动解决任何问题。
执行地图
用户通过提供地图(URL 或编号)进行调用。一个工单是可选的:如果没有指定,你会选择下一个决策,而不是用户。
- 加载地图:低分辨率视图,而非每个工单的正文。
- 选择工单。 如果用户指定了一个,则使用它。否则,按顺序选择第一个前线工单。认领它:在进行任何工作之前,先将它分配给自己。
- 解决它。 按需深入查看(Zoom):按需获取任何相关或已关闭工单的完整正文;为
## 笔记块中命名的任何技能调用对应技能。如果有疑问,调用“grilling”和“domain-modeling”技能两次。 - 记录解决方案: 将答案作为解决方案评论发布,关闭该 Issue,并在地图的已决定事项中添加一个上下文指针。
- 新增浮现的工单(先创建后建立连接);将答案使其明确化的任何迷雾从尚未明确中移除并转为新的工单,移动时,要将每个已明确化的迷雾补丁从尚未明确部分中清除,使其只作为新工单存在。如果答案揭示某个工单(本工单或其他工单)位于目的地之外,则将其判定为超出范围,而不是将其作为路径的一部分来解决。如果该决定使地图的其他部分无效,则更新或删除这些工单。
用户可以并行执行未被阻塞的工单,因此要预期其他会话同时在编辑追踪器。