1实现原理 · 为什么它能做到
纯 prompt 编排:整份 skill 是给模型的一套拆解纪律 + 两个输出模板,无脚本、无模板文件、无运行时代码。产出物不是文件而是「一组带阻断边的工单」。
Break a plan, spec, or conversation into a set of **tickets**: tracer-bullet vertical slices, each declaring the tickets that **block** it.
名称沿革:队列 slug `to-issues` 在 pin HEAD 已被删除——v1.1 把 to-plan 与 to-issues 合并为 to-tickets,to-issues 整体消失(其能力被吸收进新 skill)。
**`to-plan` and `to-issues` are merged into one `to-tickets` skill, and `to-issues` is deleted.**
核心机制是 tracer bullet 垂直切片 + 阻断边:每张工单必须切穿所有层(schema/API/UI/测试)且能独立演示,尺寸限定在一个新鲜上下文窗口内,并显式声明「被谁阻塞」;无阻塞者即为可立即开工的 frontier。
- Each slice cuts a narrow but COMPLETE path through every layer (schema, API, UI, tests): vertical, NOT a horizontal slice of one layer
宽重构是垂直切片的显式例外,改按 expand–contract 排程:先加新形态、再按爆炸半径分批迁移、最后删旧形态;连分批都难保绿时,允许共用集成分支并让全部批次阻塞一张最终联调票。
**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**.
发布前必过用户 quiz:把拆解结果按编号列出(标题/被谁阻塞/交付什么行为),逐条问粒度、阻断边是否正确、是否该合并或拆分,直到用户批准才写入 tracker。
Are the blocking edges correct: does each ticket only depend on tickets that genuinely gate it?
输出形态随 tracker 切换而阻断边表达不同:本地模式一票一文件、编号即在依赖序(blockers first),明令禁止合并成单文件;真 tracker 模式按依赖序建 issue,优先用平台原生阻塞/子任务关系,并打 ready-for-agent 标签。
- **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.
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| cli | gh(GitHub CLI)——条件依赖,真 tracker 模式下的发布与原生依赖关系操作 |
| cli | glab(GitLab CLI)——条件依赖 |
| network | GitHub Issues + 原生 issue dependencies API(经 gh 批量建票、加阻断边、打标签) |
| network | 用户以参数传入的任意 URL:skill 指示 fetch 该引用并读全文与评论(取数面由参数决定,未见主机白名单) |
| package | skills CLI / Claude Code 插件(分发渠道) |
4风险提醒 风险提醒:黄色 · 留意使用
- 过度拆分是最高频摩擦:三行改动也可能产出十几张票 — docs 页自述跨实践者一致(模型默认原子化、丢失分组),并给出解法只有 quiz 阶段要求合并;根本没有下限保护,小改动本就不该用该 skill。
- GitHub 原生关系常写不进去,退化成正文文本 — docs 页记录子任务未建(issue #554)与 blocked-by 写进正文(issue #513,agent 甚至声称 GitHub 无原生阻塞关系),需人工用 gh 命令补;这意味着 frontier 的自动判断在真 tracker 上可能不可靠。
- 验收标准可能天然为真,无法证伪 — docs 页列出三种形态(基准提交即满足、需别的票才能满足、只是复述需求),模板本身对此无强制检查,只能人工逐条问「什么观察能证明它是假的」。
- 参数化 fetch 无白名单/无去指令化,是外部内容进入上下文的正规入口 — skill 明令 fetch 引用的全文与评论;若参数为任意 URL,页面文本即进入指令上下文,而 skill 无 untrusted 声明、无防注入条款。
- 只出工件不派发,且下游不负责收尾 — docs 明说无 auto-dispatch,且 implement 不保证关票/勾选,票的状态更新落在人身上——不做这一步,frontier 会失真。
5第二遍独立确认
- [discrepancy] 队列 slug `to-issues` 在 pin commit 是否作为目录存在 — 不存在。HEAD 树内无 skills/engineering/to-issues(也无 to-tickets 之外的 to-plan);CHANGELOG 明写 '`to-plan` and `to-issues` are merged into one `to-tickets` skill, and `to-issues` is deleted.'。本 JSON 以 HEAD 实名 to-tickets 记录,页面 slug 与文件名沿用任务书的 to-issues。
- [ok] 『to-issues 的功能确已并入 to-tickets』是否属实(而非删掉即失去) — CHANGELOG PR #469 记 to-issues 曾获得 wide-refactor(expand–contract)与 Co-located reference blocks;现行 to-tickets/SKILL.md line 40 完整保留该段(expand/migrate/contract 与集成分支兜底),说明能力是迁移而非丢失。
- [ok] 阻断边的落点是否真由 tracker 文档决定(而非 skill 硬编码路径) — to-tickets 正文只给形态要求('Use the platform's native blocking / sub-issue relationship where it has one')与本地路径约定;具体命令(gh api …/dependencies/blocked_by、gh issue edit --add-assignee 等)与 frontier 查询定义全在 setup-matt-pocock-skills/issue-tracker-github.md 内,两处措辞一致。
- [ok] 『无网络外发』类声明是否成立 — skill 文件 token 扫描无 http/curl/fetch 关键字;网络行为全部经 tracker 文档定义的 gh/glab 间接发生,已按条件性记入 network_calls。
- [discrepancy] 取参 fetch 是否有限制(主机白名单/大小/去指令化) — 定位不到任何限制:SKILL.md 只写 'fetch it and read its full body and comments',无主机白名单、无大小上限、无 untrusted/防注入条款;对超长 spec 的截断问题反倒在 docs 页被当作环境问题(建议同窗口不要 clear/compact)来描述,说明 skill 层面无防护。此点按「定位不到不硬写」只记事实,不升级档位。
- [ok] installs / stars 口径 — installs=353800 来自 skills.sh 注册表的旧 slug 记录(queue-100.json 的 to-issues 条目),仓库内无此数值;stars=262519 为 2026-09-15 gh api 实测。口径不同,页面并列时需标注来源。
6结论
0a4d30fcc2a2ce67…3cca18b368