把「一个 agent 会话装不下」的努力画成工单系统上的共享决策地图,一次解决一张票直到路清。 完整教学见 Lesson 0016; 原文见 SKILL.md、 三份 tracker 模板( GitHub · GitLab · 本地)、 aihero.dev/skills-wayfinder。
任务大到、雾到一个会话装不下时:建一个 wayfinder:map 父 issue + 一排决策票子 issue,
一次会话解决一张(研究票除外),产出决策不是交付物;雾散后进 /to-spec。
只能人启动(disable-model-invocation: true + allow_implicit_invocation: false)。
to-spec;模糊但一个会话装得下 → grill-with-docs;计划懂了要切片 → to-tickets。triage;有东西坏了 → diagnosing-bugs;拿不准 → ask-matt。docs/agents/issue-tracker.md 有 Wayfinding operations 一节);没有 tracker 配置 → 退回本地 markdown 约定。wayfinder:map 标签的单个 issue,唯一权威工件。索引不是仓库:决策只住在票里,地图只写一行摘要加链接。wayfinder:<type> 标签,按一个 100K token 会话的体量切。## Destination 终点,一两行;每个会话开工前先对齐
## Notes 领域 + 每会话该查的 skill + 长期偏好;唯一能推翻 Plan-don't-do 的入口
## Decisions so far 已关票一行一条:名字包链接 + 一行 gist,绝不复述
## Not yet specified 雾:在范围内但还不锋利的疑似问题
## Out of scope 判出这次努力的活:关闭票 + 一行理由,永不毕业
Refer by name:人读的叙述里票用标题指代、名字包住链接;不许裸 #42, #43 墙。
| 票型 | HITL/AFK | 解决器 | 选它的时机 |
|---|---|---|---|
research | AFK | /research 子代理,发现落一次性 research/<name> 分支 | 需要当前目录之外的事实(文档、API、知识库) |
prototype | HITL | /prototype 或大纲/粗稿/stub | 关键问题是「该长什么样、该怎么表现」 |
grilling | HITL | /grilling + /domain-modeling,一次一个问题 | 默认票型,拿不准就是它 |
task | HITL 或 AFK | 手动劳动;agent 能做就独自做,否则给人精确清单 | 没的可决定/原型/研究,但讨论被一件体力活挡着(注册服务、开权限、搬数据) |
Plan, don't do:task 是唯一「做」的票型,资格是「解锁一个决策,不是交付目的地」; 整纪律只能被这次努力的 Notes 一节推翻。
画图(带松散想法 /wayfinder):
1 命名目的地(grilling + domain-modeling)
2 广度优先再 grill 一轮 → 没翻出雾 = 不需要地图,停下问用户
3 建 wayfinder:map issue(Destination/Notes 填好,雾进 Not yet specified)
4 开能写清的票 → 第二遍再接阻塞边(先要有 id)
5 每张 research 票派一个并行子代理
6 停——画图就是一个会话的全部,不亲手解决任何票
走票(带地图 URL/编号 /wayfinder,票可不带):
1 载地图低分辨率视图
2 选票(用户点名 > 前线第一张)→ 先认领再开工
3 解决:按需 zoom 拉票正文;调 Notes 点名的 skill;拿不准就 grilling + domain-modeling
4 记录:解决评论 → 关票 → 地图 Decisions so far 追加指针
5 维护:新票先建后接;雾毕业并划掉;越界票关掉留行进 Out of scope;被推翻的票更新或删
铁律:一个会话最多解决一张票——research 票是唯一例外。
并发是常态:认领必须是会话的第一笔写入。
.out-of-scope/ 目录混:一个是地图正文小节,一个是分拣归档目录。| 动作 | 写哪 |
|---|---|
| 画图 | 1 个 wayfinder:map issue + N 个子 issue + 阻塞边(本地:.scratch/<effort>/map.md + issues/NN-*.md) |
| 研究子代理 | 一次性 research/<name> 分支 + 票上上下文指针 |
| 认领 | 票的 assignee(本地:Status: claimed)——第一笔写入 |
| 解决 | 解决评论 + 关票 + Decisions so far 指针 + 划雾 + 新票接线(本地:## Answer + Status: resolved) |
| grilling 过程中 | CONTEXT.md / ADR 可能被 domain-modeling 更新——不是 wayfinder 自己写 |
| 业务代码 | 默认什么都不写(Plan, don't do;Notes 可推翻) |
/to-spec——把地图链着的决策折叠成可建计划 → /to-tickets → /implement。/implement;否则跳过折叠 = 扔掉链着的细节(ask-matt 明令警告)。| 症状 | 先查 |
|---|---|
| 一会话解决多张票 / 画图当天顺手解决票 | SKILL.md Invocation 开头铁律 + Chart 第 6 步 |
| grilling 票上 agent 自问自答 | SKILL.md Ticket Types 开头 HITL 段(别改 grilling skill) |
| 雾被预切成小票 | Fog of war 的「Fog or ticket?」判定 |
| 越界票留在前线 / 进了 Decisions so far | Out of scope 一节:关掉 + 留行 + 不进已决清单 |
裸编号墙 #42, #43 | Refer by name 一节 |
| 认领/阻塞/前线查询的物理操作不对 | 该仓库 docs/agents/issue-tracker.md 的 Wayfinding operations;模板源在 setup skill 的三份 issue-tracker-*.md(别改 wayfinder/SKILL.md——它只写语义) |
| 答案回填进票正文 / 资产全文粘贴 | The Map / Tickets:答案不进正文,资产用链接 |
| 想让 AI 自动启用它 | 设计如此;要改得同时翻 frontmatter 的 disable-model-invocation 与 openai.yaml 的 allow_implicit_invocation |
GitHub:gh issue create --label wayfinder:map;子票 = sub-issue(退化:Part of #<map> + 任务清单);
阻塞 = 原生依赖 blocked_by(用数据库 .id 不是 #number);认领 gh issue edit --add-assignee @me
GitLab:glab issue create --label wayfinder:map;子票顶部 Part of #<map>;阻塞 = /blocked_by note
(Premium 功能,免费档退化 Blocked by 行);认领 glab issue update --assignee @me;
注意 close 不带评论,先 note 后 close
本地: map.md + issues/NN-*.md;Blocked by: NN 行;Status: claimed/resolved;答案进 ## Answer