← 技能图谱
nameto-tickets
descriptionBreak a plan, spec, or the current conversation into a set of tracer-bullet tickets, each declaring its blocking edges, published to the configured tracker — edges as text in one file per ticket locally, or native blocking links on a real tracker.
触发词将计划、规格说明或当前会话拆分为一组曳光弹 ticket,每张声明其阻塞边,发布到已配置的跟踪器——以每个 ticket 一个本地文件中的文本形式呈现边,或在真实跟踪器上使用原生阻塞链接。
disable-model-invocationtrue

to-tickets

Break a plan, spec, or the current conversation into a set of tracer-bullet tickets, each declaring its blocking edges, published to the configured tracker — edges as text in one file per ticket locally, or native blocking links on a real tracker.

Break a plan, spec, or conversation into a set of tickets — tracer-bullet vertical slices, each declaring the tickets that block it.

将计划、规格说明或对话拆分为一组ticket——曳光弹垂直切片,每张声明阻塞它的 ticket。

The issue tracker and triage label vocabulary should have been provided to you — run /setup-matt-pocock-skills if not.

你应该已配备 Issue 跟踪器和分诊标签词汇表——如果没有,运行 /setup-matt-pocock-skills

Process

流程

1. Gather context

1. 收集上下文

Work from whatever is already in the conversation context. If the user passes a reference (a spec path, an issue number or URL) as an argument, fetch it and read its full body and comments.

基于会话上下文中已有的任何信息开展工作。如果用户传递了一个引用(规格说明路径、issue 编号或 URL)作为参数,获取它并读取其完整正文和评论。

2. Explore the codebase (optional)

2. 探索代码库(可选)

If you have not already explored the codebase, do so to understand the current state of the code. Ticket titles and descriptions should use the project's domain glossary vocabulary, and respect ADRs in the area you're touching.

如果你尚未探索代码库,请先了解代码的当前状态。Ticket 标题和描述应使用项目的领域术语词汇表,并尊重你所涉及区域的 ADR。

Look for opportunities to prefactor the code to make the implementation easier. “Make the change easy, then make the easy change.”

寻找预重构代码的机会,使实现更容易。“先让改动变容易,再做容易的改动。”

3. Draft vertical slices

3. 起草垂直切片

Break the work into tracer bullet tickets.

将工作拆分为曳光弹 ticket。

  • Each slice cuts a narrow but COMPLETE path through every layer (schema, API, UI, tests) — vertical, NOT a horizontal slice of one layer
  • A completed slice is demoable or verifiable on its own
  • Each slice is sized to fit in a single fresh context window
  • Any prefactoring should be done first
  • 每个切片贯穿每一层(schema、API、UI、测试)但保持狭窄且完整——是垂直的,而不是一个层的水平切片
  • 完成后的切片可独立演示或验证
  • 每个切片的大小适合单个新的上下文窗口
  • 任何预重构应首先完成

Give each ticket its blocking edges — the other tickets that must complete before it can start. A ticket with no blockers can start immediately.

给每个 ticket 设置其阻塞边——在它可以开始之前必须完成的其它 ticket。没有阻塞的 ticket 可以立即开始。

Wide refactors are the exception to vertical slicing. A wide refactor is one mechanical change — rename a column, retype a shared symbol — whose blast radius fans across the whole codebase, so a single edit breaks thousands of call sites at once and no vertical slice can land green. Don't force it into a tracer bullet; sequence it as expand–contract. First expand: add the new form beside the old so nothing breaks. Then migrate the call sites over in batches sized by blast radius (per package, per directory), each batch its own ticket blocked by the expand, keeping CI green batch to batch because the old form still exists. Finally contract: delete the old form once no caller remains, in a ticket blocked by every migrate batch. When even the batches can't stay green alone, keep the sequence but let them share an integration branch that all block a final integrate-and-verify ticket — green is promised only there.

大范围重构是垂直切片的例外。 大范围重构是一种机械性变更——重命名列、重打共享符号——其影响半径散布到整个代码库,因此单个编辑会同时破坏数千个调用点,没有任何垂直切片能保持通过。不要强行将其塞入曳光弹;按扩展-收缩序列进行。首先扩展:在旧形式旁边添加新形式,这样不会破坏任何东西。然后按影响半径分批迁移调用点(按包、按目录),每批作为自己的 ticket,被扩展阻塞,批与批之间保持 CI 通过,因为旧形式仍然存在。最后收缩:在没有调用者后删除旧形式,此 ticket 被所有迁移批次阻塞。即使批次本身无法独立保持通过,也要保持序列,但让它们共享一个集成分支,所有分支都阻塞一个最终的集成并验证的 ticket——仅在那里保证通过。

4. Quiz the user

4. 追问用户

Present the proposed breakdown as a numbered list. For each ticket, show:

将提议的拆解呈现为编号列表。对于每个 ticket,展示:

  • Title: short descriptive name
  • Blocked by: which other tickets (if any) must complete first
  • What it delivers: the end-to-end behaviour this ticket makes work
  • 标题: 简短描述性名称
  • 阻塞于: 哪些其他 ticket(如有)必须先完成
  • 交付内容: 此 ticket 实现的端到端行为

Ask the user:

问用户:

  • Does the granularity feel right? (too coarse / too fine)
  • Are the blocking edges correct — does each ticket only depend on tickets that genuinely gate it?
  • Should any tickets be merged or split further?
  • 粒度是否合适?(太粗 / 太细)
  • 阻塞边是否正确——每个 ticket 是否只依赖那些真正限制它的 ticket?
  • 是否有 ticket 需要合并或进一步拆分?

Iterate until the user approves the breakdown.

迭代直到用户批准该拆解。

5. Publish the tickets to the configured tracker

5. 将 ticket 发布到已配置的跟踪器

Publish the approved tickets. How depends on the tracker /setup-matt-pocock-skills configured — the tickets are the same either way, only the shape of the blocking edges changes:

发布已批准的 ticket。如何发布取决于 /setup-matt-pocock-skills 配置的跟踪器——ticket 无论哪种方式都一样,只有阻塞边的形式不同:

  • Local files → write one file per ticket under .scratch/<feature-slug>/issues/<NN>-<slug>.md, numbered from 01 in dependency order (blockers first). Each file's “Blocked by” lists the numbers/titles it depends on. Use the per-ticket file template below — one ticket per file, never a single combined file.
  • A real issue tracker (GitHub, Linear, …) → publish one issue per ticket in dependency order (blockers first) so each ticket's blocking edges can reference real identifiers. Use the platform's native blocking / sub-issue relationship where it has one; otherwise set each ticket's “Blocked by” to the blocking issues. Apply the ready-for-agent triage label unless instructed otherwise — the tickets are agent-grabbable by construction.
  • 本地文件 → 在 .scratch/<feature-slug>/issues/<NN>-<slug>.md 下每个 ticket 写一个文件,从 01 起按依赖顺序编号(阻塞者优先)。每个文件的「阻塞于」列出其依赖的编号/标题。使用下面的每票文件模板——一个文件一张票,绝不要合并成单一文件。
  • 真实的 Issue 跟踪器(GitHub、Linear、…) → 按依赖顺序(阻塞者优先)每个 ticket 发布为一个 issue,以便每个 ticket 的阻塞边可以引用真实标识符。在平台支持的地方使用原生的阻塞/子 issue 关系;否则将每个 ticket 的「阻塞于」设为阻塞它的 issue。除非另有指示,应用 ready-for-agent 分诊标签——ticket 本身的设计就是可被 agent 认领的。

Work the frontier: any ticket whose blockers are all done. For a purely linear chain that means top to bottom.

前沿开始工作:所有阻塞者都已完成的 ticket。对于纯线性的链,即自上而下。

Do NOT close or modify any parent issue.

不要关闭或修改任何父 issue。

# <NN> — <Ticket title>

What to build: the end-to-end behaviour this ticket makes work, from the user's perspective — not a layer-by-layer implementation list.

Blocked by: the numbers/titles of the tickets that gate this one, or “None — can start immediately”.

Status: ready-for-agent

- [ ] Acceptance criterion 1
- [ ] Acceptance criterion 2
# <NN> — <Ticket 标题>

要构建什么:此 ticket 实现的端到端行为,从用户视角出发——不是逐层实现列表。

阻塞于:限制本 ticket 的编号/标题列表,或「无——可立即开始」。

状态: ready-for-agent

- [ ] 验收标准 1
- [ ] 验收标准 2
## Parent

A reference to the parent issue on the tracker (if the source was an existing issue, otherwise omit this section).

## What to build

The end-to-end behaviour this ticket makes work, from the user's perspective — not layer-by-layer implementation.

## Acceptance criteria

- [ ] Criterion 1
- [ ] Criterion 2

## Blocked by

- A reference to each blocking ticket, or “None — can start immediately”.
## 父 Issue

跟踪器上父 issue 的引用(如果源是已有 issue;否则省略本部分)。

## 要构建什么

此 ticket 实现的端到端行为,从用户视角出发——不是逐层实现。

## 验收标准

- [ ] 标准 1
- [ ] 标准 2

## 阻塞于

- 每个阻塞 ticket 的引用,或「无——可立即开始」。

In either form, avoid specific file paths or code snippets — they go stale fast. Exception: if a prototype produced a snippet that encodes a decision more precisely than prose can (state machine, reducer, schema, type shape), inline it and note briefly that it came from a prototype. Trim to the decision-rich parts — not a working demo, just the important bits.

无论哪种形式,避免具体的文件路径或代码片段——它们很快过时。例外:如果原型产出的代码片段能比文字更精确地编码一项决策(状态机、reducer、schema、类型形态),将其内联并简要注明来自原型。精简到富含决策的部分——不是一个可工作演示,只是重要的要点。

Work the frontier one ticket at a time with /implement, clearing context between tickets.

使用 /implement 一次处理一个前沿 ticket,清除 ticket 之间的上下文。