再学 AI
第 39 课 / to-issues
历史对照阅读 → 对照 → 问答 → 场景

历史对照:纵向切片早期入口

历史文件把计划拆成可领取工单,强调端到端行为和真实依赖。当前学习重点可对照 to-tickets。

历史文件,不在当前目录

本课使用下方注明的历史提交原文,帮助理解旧文章和旧提示词。请勿据此认定当前版本仍能直接调用该名称。

还不清楚 Skill、Agent、安装和调用?先读 从零开始的6节入门课

在关系图中查看 to-issues 与其他技能的关联 →

先把必要的概念讲清楚

这是把计划拆成 issue 的历史版本。它保留了纵向切片方法,并专门讨论不能按普通小功能拆开的广泛机械重构。

下面是老师补充的入门说明;原作者的要求保留在中英对照正文中。所有例子均为帮助理解而构造的教学情境。

issue / ticket|问题或任务工单

跟踪一项需求、缺陷、调查或实施任务的记录,通常有标题、正文、状态和引用。issue 和 ticket 在这些文档里经常都指工单,具体含义由上下文决定。工单写着“已完成”只是状态声明,还需要相应证据支持。

vertical slice / tracer bullet|端到端的小切片

选择一个很窄、却能穿过所需各层的可验证行为。例如只支持收藏一节课,但页面、接口、保存与测试都连通。tracer bullet 借用曳光弹比喻,用一次小而真实的贯通验证整条路径,发现的问题影响下一片。不是先把所有页面做完再写全部后端。

acceptance criteria|验收条件

明确规定结果满足什么才算完成,应尽量可观察、可检验。例如“收藏后刷新页面仍可见,重复点击只保留一条”。“体验很好”“代码完善”没有明确边界,难以判断。验收条件关注结果,不是把实现步骤换个标题列出来。

refactoring|重构

在保持约定外部行为的前提下改善内部结构,例如合并重复逻辑、调整职责归属。用户仍能完成同样操作,但代码更容易理解和修改。重构不等于顺便加新需求;测试帮助证明外部行为未被意外改变。

CI|持续集成检查

把修改提交到共享流程时,自动运行测试、类型检查等约定检查,尽早发现集成问题。绿灯表示配置的检查通过,不代表所有需求都正确;红灯也可能由环境故障导致,应看具体证据。需要先检查“配置了什么”,才能解释绿灯的意义。

读原文,理解每一步为什么这样做

左右内容按小节对应;窄屏先中文、后英文。两种语言均完整展示,对应讲解紧接在小节之后。译文传达原文要求;老师讲解补充概念、原因、例子与适用边界。

中文译文English · 英文原文
中文译文
name: to-issues
description: "使用曳光弹式纵向切片,把计划、规格或 PRD 拆成项目 issue 跟踪器中可独立领取的 issue。"
disable-model-invocation: true
English · 英文原文
name: to-issues
description: Break a plan, spec, or PRD into independently-grabbable issues on the project issue tracker using tracer-bullet vertical slices.
disable-model-invocation: true
中文译文

把计划拆成可独立领取的工单

按纵向切分方式,把计划拆成多张曳光弹式工单。每项工作都小而完整,符合条件的执行者可以独立领取。

应已经提供工单系统和分诊标签说明;没有就运行 /setup-matt-pocock-skills

English · 英文原文

To Issues

Break a plan into independently-grabbable issues using vertical slices (tracer bullets).

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

中文译文

工作过程

English · 英文原文

Process

中文译文
1. 收集背景

使用当前对话已有信息。用户提供工单编号、网址或路径时,获取该工单,完整阅读正文和评论。

English · 英文原文
1. Gather context

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

老师讲解 · 对应上方原文 · 含教学举例

先读原始需求,再决定任务边界

计划、规格或 PRD 是拆分依据;若用户给 issue 引用,就读正文和评论。新澄清可能已经改变旧计划,不能只按标题切任务。

例如需求已经明确“直接网页学习、不要求下载”,拆分应围绕完整显示、对照阅读和教学内容,而不是继续安排下载打包。任务数量再多,也不能弥补方向错误。

必要预重构优先,是为让本次需求更容易实现。例如先集中相同学习状态判断,再加入新状态;它必须与当前改变有关。

中文译文
2. 查看代码现状(可选)

尚未探索代码库时,先查看当前状态。标题和描述采用项目业务词汇,遵循相关架构决策记录。

考虑先做必要的准备性重构,使后续实现更容易:先让改动容易,再完成改动。

English · 英文原文
2. Explore the codebase (optional)

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

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

中文译文
3. 拟定工单

按后面的纵向切分规则拟定曳光弹式工单。影响全库的大范围重构是例外,改用扩展—迁移—收缩安排,见相关说明。

English · 英文原文
3. Draft the issues

Break the plan into tracer bullet issues, following the Vertical slice rules. A wide refactor is the exception to that rule — slice it by expand–contract instead (see Wide refactors).

中文译文
4. 与用户核对

用带编号的列表展示准备怎样拆分。每一项都要说明:

  • 标题:用简短而明确的名字描述这张工单。
  • 前置依赖:哪些其他工单必须先完成;没有依赖也应说清楚。
  • 覆盖的用户故事:如果原始材料包含用户故事,指出这一项解决了其中哪些故事。

然后请用户逐项判断:

  • 每张工单的范围是否合适?有没有拆得太大或太小?
  • 工单之间的前置依赖是否准确?
  • 哪些工单需要合并,哪些还需要进一步拆分?

根据回答继续调整,直到用户认可这份拆分结果。

English · 英文原文
4. Quiz the user

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

  • Title: short descriptive name
  • Blocked by: which other slices (if any) must complete first
  • User stories covered: which user stories this addresses (if the source material has them)

Ask the user:

  • Does the granularity feel right? (too coarse / too fine)
  • Are the dependency relationships correct?
  • Should any slices be merged or split further?

Iterate until the user approves the breakdown.

中文译文
5. 发布到工单系统

使用下面的正文模板,为每项获认可工作创建新 issue。这些工单应达到交给无人值守 Agent 执行的程度,除非另有要求,添加相应分诊标签。

按前置工单在先的顺序创建,便于引用真实编号。平台支持时,将它们作为父任务的原生子工单,并建立原生阻塞关系;具体见项目的工单系统说明。否则使用正文中的 ## Parent## Blocked by 记录。

不要关闭或修改父工单。

English · 英文原文
5. Publish the issues to the issue tracker

For each approved slice, publish a new issue to the issue tracker using the Issue body template. These issues are considered ready for AFK agents, so publish them with the correct triage label unless instructed otherwise.

Publish issues in dependency order (blockers first) so you can reference real issue identifiers. Where the tracker supports it, link each slice to its parent as a native sub-issue and wire each blocker as a native blocking edge (mechanics in the issue-tracker doc); the ## Parent and ## Blocked by body sections are the fallback otherwise.

Do NOT close or modify any parent issue.

中文译文

参考规则

English · 英文原文

Reference

中文译文
纵向切分

每张工单应沿一条很窄的功能路径贯穿所需集成层次,而不是只完成某一层。

  • 覆盖这条路径需要的数据结构、接口、页面和测试,范围小但完整。
  • 单项完成可以独立演示或验证。
  • 必要的准备性重构先做。
English · 英文原文
Vertical slice rules

Each issue is a thin vertical slice that cuts through ALL integration layers end-to-end, NOT a horizontal slice of one layer.

  • Each slice delivers a narrow but COMPLETE path through every layer (schema, API, UI, tests)
  • A completed slice is demoable or verifiable on its own
  • Any prefactoring should be done first
老师讲解 · 对应上方原文 · 含教学举例

什么才是能独立验证的一片

收藏第一片贯通用户操作、保存与读取,第二片增加取消和对应验证,是纵向思路。先写全部数据库表、再写全部 UI,是横向思路,结果常要到最后才能看见。

每片可独立展示,不代表完全没有前置依赖。第二片可能等第一片的公开接口;应明确真实阻塞,而不是假装独立。

切片完成后应有一条可执行的行为路径。测试和验收围绕这个结果,而不是只统计改了多少文件。

独立领取不等于没有依赖

一张工单可以依赖登录能力,同时仍能被新 Agent 独立理解。独立指它带有足够背景和引用,让执行者知道目标、前提和完成条件,不需要猜“昨天聊了什么”。

例如“保存当前用户的收藏”应引用登录工单和收藏规格,并写出刷新后保留、重复点击不重复保存等验收行为。登录尚未完成时它不能开工;完成之后,新的会话即可凭这些材料接手。

父工单表示所属的大目标,前置工单表示开工必须依赖的结果,两者不是同一种关系。

本篇是历史版本:它要求引用原型代码的位置。当前 to-tickets 允许直接放入裁剪后的关键片段。应保留版本差异,不把两者混成一条互相矛盾的规则。

中文译文
大范围重构

给公共数据库列改名,或改变共享符号类型,可能一次破坏大量调用方。这类机械变化的影响遍布全库,不能强求某个纵向切片单独通过检查。

这种情况下,采用“扩展—迁移—收缩”的顺序:

先做扩展。在旧形式旁边增加新形式,旧形式仍然保留,使原有使用者暂时不受影响。

再做迁移。按照改动影响的范围,把调用位置分成多个批次,例如按软件包或目录划分。每个批次对应一张工单,并把扩展工单列为必须先完成的前置任务。由于旧形式仍然存在,在一批迁完、下一批尚未迁完时,也应让持续集成检查保持通过。

最后做收缩。确认已经没有调用者继续使用旧形式,再用一张工单删除旧形式。这张删除工单必须依赖所有迁移批次完成。

如果连这些迁移批次也无法各自独立通过检查,就保留上述顺序,但让它们共同使用一个集成分支。再安排一张最终汇总并验证的工单,要求它等待所有批次完成。此时,只承诺最终集成验证的结果能够通过检查,不要声称每个中间批次都能单独通过。

English · 英文原文
Wide refactors

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 issue 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 an issue 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 issue — green is promised only there.

老师讲解 · 对应上方原文 · 含教学举例

扩展—迁移—收缩:避免一次改名让所有调用全坏

假设共享字段 lessonId 要改成 contentId,许多调用者同时依赖旧形式。直接改名可能让全部调用失败,无法让每一小批保持可工作。

先扩展:新旧形式暂时并存;再按包或目录分批迁移调用者,每批单独验证;最后确认没有旧调用,再删除旧形式。这就是 expand–contract,按变化过程安排兼容性。

若连分批也无法各自绿灯,可以共享集成分支,最后集中验证。但应明确仅在最终集成承诺通过,不能把中途红灯任务谎称已独立可交付。

中文译文
工单正文模板

<issue-template>

English · 英文原文
Issue body template

<issue-template>

老师讲解 · 对应上方原文 · 含教学举例

验收条件描述结果,阻塞关系表达真实依赖

正文描述构建什么、如何验收、父需求在哪里、等待哪些工单。引用原型时指向承载决定的代码,不复制一堆很快过期的实现细节。

例如验收“重复收藏仍只有一条,刷新后存在”,比“完成收藏开发”可检查。按依赖顺序发布,先创建阻塞者,后续才能引用真实 ID。

本 skill 不应关闭或修改父 issue。拆出子任务,只表示实施安排形成,父需求是否完成还要等整体交付与验收。

中文译文

父工单

引用来源父工单;来源并非已有工单时省略。

English · 英文原文

Parent

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

中文译文

要实现什么

描述这一条完整的外部行为,不要按层罗列实现。

避免具体代码路径或片段,因为容易过时。若 /prototype 的代码比文字更准确表达状态机、数据结构或类型等决定,提供指向其位置的引用,不直接复制代码。

English · 英文原文

What to build

A concise description of this vertical slice. Describe the end-to-end behavior, not layer-by-layer implementation.

Avoid specific file paths or code snippets — they go stale fast. Exception: if the /prototype skill produced code that encodes a decision more precisely than prose can (state machine, reducer, schema, type shape), add a context pointer to where that prototype code lives rather than inlining it.

中文译文

验收条件

  • [ ] 条件 1
  • [ ] 条件 2
  • [ ] 条件 3
English · 英文原文

Acceptance criteria

  • [ ] Criterion 1
  • [ ] Criterion 2
  • [ ] Criterion 3
中文译文

前置依赖

  • 引用必须先完成的工单。

没有依赖时写“无,可以立即开始”。

</issue-template>

English · 英文原文

Blocked by

  • A reference to the blocking ticket (if any)

Or "None - can start immediately" if no blockers. </issue-template>

原作者:Matt Pocock · 中文翻译为非官方译本

来源:skills/engineering/to-issues/SKILL.md ↗

固定版本:f219e663795dd06357bfb1e1ce5b0afb4fd7d94f

先作答,再看参考思路

Q1 · 理解

用自己的话说明:它解决什么问题,完成后会留下什么?

请各用一句话回答。若它只做规划或解释,不要把“已开发”“已部署”写成产物。

Q2 · 判断

to-issues 与 to-tickets 都出现时,要先后运行吗?

我已思考,查看参考思路

通常不需要。它们承担相近职责,应按固定版本和既有产物选择;迁移时先查是否已有有效任务。

Q3 · 追问

原文中哪条要求在你的环境下可能不成立?

说出具体一句及其前提,例如工具不可用、资料缺失、已有项目约定冲突,或它只是作者偏好。把你的答案带回课堂,我们据此继续讨论。

课堂回传格式:第 39 课 / 我的理解 / Q2 回答 / 仍不理解的原句。这里是阅读教材;实时问答在我们的对话中进行。

把方法放进一个具体情境

教学案例:旧系统已有 to-issues 创建的任务,换新版本后再次运行 to-tickets 可能重复建单。先核对既有任务与规格覆盖,再决定是否补充。

边界与容易误读的地方

同一规格不要为凑流程重复拆两遍。工单拆分是结构变化,有维护和同步成本。

讨论后再实践:先判断上述情境是否适用,再选择真实任务。现在无需安装、运行命令或修改现有项目。

关联阅读