wayfinder
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinese一个松散想法出现了:它太大,单个 agent session 装不下,而且前路仍在 fog 中。这个 skill 会把它绘制成 repo issue tracker 上的 shared map,然后一次处理一个 ticket。Map 与领域无关:工程工作、课程内容,或任何符合这个形状的事项都可以。
A loose idea emerges: it's too big to fit into a single agent session, and the path ahead is still in the fog. This skill will map it into a shared map on the repo issue tracker, then handle one ticket at a time. The Map is domain-agnostic: it works for engineering work, course content, or anything that fits this shape.
Refer by name
Refer by name
每张 map 和每个 ticket 都是 issue,因此都有一个 name:它的 title。在所有给人看的内容里,包括叙述和 map 的 Decisions-so-far,都用 name 引用它,不要只写裸 id、number 或 slug。一堵 很难读;name 一眼就能看懂。Id 和 URL 不会消失,它们被包在 name 的 link 里面,但不单独替代 name。
#42, #43, #44Each map and each ticket is an issue, so it has a name: its title. In all human-facing content, including narratives and the map's Decisions-so-far, refer to it by name, not just by bare id, number, or slug. A wall of is hard to read; a name is instantly understandable. Ids and URLs don't disappear—they're wrapped in the name's link—but don't replace the name alone.
#42, #43, #44The Map
The Map
Map 是这个 repo issue tracker 上一个带 label 的单独 issue,是 canonical artifact。它的 tickets 是 map 的 child issues。
wayfinder:mapMap 是 index,不是 store。它列出已经做出的 decisions,并指向保存细节的 tickets;一个 decision 只存在一个地方,也就是它的 ticket。因此 map 不复述细节,只给 gist 和 link。
Map、child tickets、blocking 和 frontier queries 的物理表达方式取决于 tracker。 查阅 的 "Wayfinding operations" section,了解这个 repo 如何表达它们。如果没有该 doc,默认使用 local-markdown tracker。
docs/agents/issue-tracker.mdThe Map is a single issue on this repo's issue tracker with the label, serving as the canonical artifact. Its tickets are child issues of the map.
wayfinder:mapThe Map is an index, not a store. It lists decisions that have been made and points to the tickets where details are saved; a decision exists in only one place, which is its ticket. Therefore, the Map doesn't repeat details, only provides a gist and a link.
The physical expression of Map, child tickets, blocking, and frontier queries depends on the tracker. Consult the "Wayfinding operations" section of to learn how this repo expresses them. If that doc doesn't exist, use the local-markdown tracker by default.
docs/agents/issue-tracker.mdThe map body
The map body
Map 是低分辨率的全局视图,每个 session 加载一次。Open tickets 不列在里面;它们是 open child issues,通过 query 找到。
markdown
undefinedThe Map is a low-resolution global view, loaded once per session. Open tickets are not listed in it; they are open child issues found via query.
markdown
undefinedNotes
Notes
<domain; skills every session should consult; standing preferences for this effort>
<domain; skills every session should consult; standing preferences for this effort>
Decisions so far
Decisions so far
<!-- the index — one line per closed ticket: enough to judge relevance, then zoom the link for the detail the ticket holds -->
- <closed ticket title> — <one-line gist of the answer>
<!-- the index — one line per closed ticket: enough to judge relevance, then zoom the link for the detail the ticket holds -->
- <closed ticket title> — <one-line gist of the answer>
Fog
Fog
<!-- see "Fog of war" for what belongs here -->
undefined<!-- see "Fog of war" for what belongs here -->
undefinedTickets
Tickets
每个 ticket 都是 map 的 child issue;tracker 的 issue id 是它的 identity。Body 是一个问题,大小控制在一个 100K token agent session 内:
markdown
undefinedEach ticket is a child issue of the map; the tracker's issue id is its identity. The body is a question, sized to fit within a 100K token agent session:
markdown
undefinedQuestion
Question
<the decision or investigation this ticket resolves>
```
Session claim ticket 的方式,是在任何工作开始前先把 ticket assign 给 driving map 的 dev。这个 assignee 就是 claim:open 且 unassigned 的 ticket 才是 unclaimed。
Blocking 使用 tracker 的 native dependency relationship;这很重要,因为 tracker UI 会可视化 frontier,人类不用打开 map 也能看到哪些 ticket 可拿。只有 tracker 没有 native blocking 时,才退回 body convention。一个 ticket 的所有 blockers 都关闭后,它就是 unblocked;frontier 是 open、unblocked、unclaimed 的 children,也就是已知世界的边缘。
答案不写进 body,而是在 resolution 时记录(见 Work through the map)。解决 ticket 时产生的 assets 从 issue 链接出去,不粘贴进 body。
<the decision or investigation this ticket resolves>
```
Each ticket has a label, with values including , , , (see Ticket Types).
wayfinder:<type>researchprototypegrillingtaskA session claims a ticket by assigning it to the dev driving the map before any work begins. This assignee is the claim: only open and unassigned tickets are unclaimed.
Blocking uses the tracker's native dependency relationship; this is important because the tracker UI visualizes the frontier, allowing humans to see which tickets are available without opening the map. Only if the tracker has no native blocking feature should we fall back to body conventions. A ticket becomes unblocked once all its blockers are closed; the frontier refers to open, unblocked, unclaimed child issues—the edge of the known world.
Answers are not written into the body, but recorded upon resolution (see Work through the map). Assets generated when resolving a ticket are linked from the issue, not pasted into the body.
Ticket Types
Ticket Types
- Research:阅读 documentation、third-party APIs,或 knowledge bases 等 local resources。创建 markdown summary 作为 linked asset。当需要当前 working directory 外的知识时使用。
- Prototype:通过 cheap、rough、concrete artifact 提高讨论 fidelity,例如 outline、rough take、stub,或通过 /prototype skill 写 UI/logic code。Prototype 作为 asset 链接。当核心问题是 "how should it look" 或 "how should it behave" 时使用。
- Grilling:与 agent 对话。使用 /grilling 和 /domain-modeling skills。一次问一个问题。默认类型。
- Task:讨论推进前必须完成的 literal manual work;没有要决定、prototype 或 research 的内容。例如搬数据、注册服务、配置访问权限。Agent 能自动化就自动化,否则给人类精确 checklist。完成后即 resolved;答案记录做了什么,以及后续 tickets 依赖的事实(credentials location、new URLs、row counts 等)。
- Research: Read documentation, third-party APIs, or local resources like knowledge bases. Create a markdown summary as a linked asset. Use this when knowledge outside the current working directory is needed.
- Prototype: Increase discussion fidelity through cheap, rough, concrete artifacts, such as outlines, rough drafts, stubs, or writing UI/logic code via the /prototype skill. The prototype is linked as an asset. Use this when the core question is "how should it look" or "how should it behave".
- Grilling: Converse with an agent. Use the /grilling and /domain-modeling skills. Ask one question at a time. This is the default type.
- Task: Literal manual work that must be completed before discussion can proceed; there is nothing to decide, prototype, or research. Examples include moving data, registering services, configuring access permissions. The agent automates it if possible; otherwise, provides a precise checklist for humans. Resolve it once completed; record what was done and facts that subsequent tickets depend on (credentials location, new URLs, row counts, etc.).
Fog of war
Fog of war
Map 是 有意 不完整的:不要描绘你还看不见的东西。Tickets 之外是 fog:那些你能感觉到以后会来的 decisions 和 investigations,但它们悬在仍未解决的问题之上,暂时还无法钉住。解决一个 ticket 会清掉它前方的一片 fog,把现在已经能说明的问题升级成新的 tickets;一次一个,直到通向目标的路清楚且没有 tickets 剩下。
Map 的 Fog section 用来记录这种朦胧视野:怀疑中的问题、之后要回访的区域、暂时推迟的风险。可以按视野允许的粗细来写;它也是协作者阅读这个 effort 走向时的路标。
Fog or ticket? 测试标准是你现在能不能把问题说清楚,而不是现在能不能回答它。
- Ticket when 问题已经清晰,即使它被 blocked、现在不能处理。
- Fog when 你还不能把它说得那么清楚。不要把 fog 预先切成 ticket-sized pieces:fog 比 ticket 粗,frontier 到达后,一片 fog 可能升级成多个 tickets,也可能一个都没有。
Fog 只排除已经决定的内容(Decisions so far)和已经是 ticket 的内容。
The Map is intentionally incomplete: don't depict what you can't yet see. Beyond tickets lies the fog: decisions and investigations you sense will come later, but they hang over unresolved questions and can't be pinned down for now. Resolving a ticket clears a patch of fog ahead, elevating questions that can now be defined into new tickets; do this one at a time until the path to the goal is clear and no tickets remain.
The Fog section of the Map is used to record this hazy vision: suspected questions, areas to revisit later, risks that are temporarily postponed. It can be written at whatever granularity your vision allows; it also serves as a signpost for collaborators to understand the direction of this effort.
Fog or ticket? The test is whether you can clearly state the question now, not whether you can answer it now.
- Ticket when the question is clear, even if it's blocked and can't be addressed now.
- Fog when you can't state it that clearly yet. Don't pre-cut fog into ticket-sized pieces: fog is coarser than tickets, and when the frontier reaches it, a patch of fog may elevate into multiple tickets, or none at all.
Fog excludes only content that has already been decided (Decisions so far) and content that is already a ticket.
Invocation
Invocation
两种模式。无论哪种,每个 session 绝不要 resolve 超过一个 ticket。
Two modes. Regardless of which mode, never resolve more than one ticket per session.
Chart the map
Chart the map
用户带着松散想法调用。
- 运行 和
/grillingsession,浮现 open decisions。/domain-modeling - Create the map(label ):填好 Notes,Decisions-so-far 为空,Fog 初步勾勒。
wayfinder:map - Create the tickets you can specify now 作为 map 的 child issues,然后第二遍再 wire blocking edges(issues 需要 ids 后才能互相引用)。Wiring 会把它们分成 frontier 和 blocked;现在还说不清的都留在 Fog。
- 停止。Charting the map 是一个 session 的工作;不要同时 resolve tickets。
The user invokes with a loose idea.
- Run and
/grillingsessions to surface open decisions./domain-modeling - Create the map (label ): fill in Notes, leave Decisions-so-far empty, and outline the initial Fog.
wayfinder:map - Create the tickets you can specify now as child issues of the map, then wire the blocking edges in a second pass (issues need ids before they can reference each other). Wiring will divide them into frontier and blocked tickets; leave anything you can't yet define clearly in Fog.
- Stop. Charting the map is one session's work; do not resolve tickets at the same time.
Work through the map
Work through the map
用户用 map(URL 或 number)调用。Ticket 是 optional;没有 ticket 时,你选择下一个 decision,而不是用户选择。
- 加载 map:低分辨率视图,而不是每个 ticket body。
- 选择 ticket。用户点名就用它;否则按顺序拿第一个 frontier ticket。Claim it:任何工作开始前先 assign 给自己。
- Resolve it:按需 zoom,只在需要时获取相关或已关闭 ticket 的完整 body;调用 block 提到的 skills。不确定时用
## Notes和/grilling。/domain-modeling - 记录 resolution:把答案作为 resolution comment 发布,close issue,并向 map 的 Decisions-so-far 追加 context pointer。
- 添加新浮现的 tickets(create-then-wire);把答案已经澄清的 fog 升级,并从 Fog 中清掉每个已升级 patch,让它只作为新 ticket 存在。如果这个 decision 使 map 其他部分失效,更新或删除那些 tickets。
用户可能并行运行 unblocked tickets,所以要预期其他 sessions 同时编辑 tracker。
The user invokes with a map (URL or number). A ticket is optional; if no ticket is provided, you choose the next decision instead of the user.
- Load the map: use the low-resolution view, not the full body of each ticket.
- Select a ticket. Use the one the user names; otherwise, take the first frontier ticket in order. Claim it: assign it to yourself before any work begins.
- Resolve it: zoom as needed, only fetching the full body of relevant or closed tickets when required; invoke the skills mentioned in the block. Use
## Notesand/grillingif unsure./domain-modeling - Record the resolution: post the answer as a resolution comment, close the issue, and append a context pointer to the map's Decisions-so-far.
- Add newly emerged tickets (create-then-wire); elevate fog that has been clarified by the answer, and clear each elevated patch from the Fog so it exists only as a new ticket. If this decision invalidates other parts of the map, update or delete those tickets.
Users may run unblocked tickets in parallel, so expect other sessions to edit the tracker simultaneously.