关于 ticks
Ticks 是面向 AI Agent 的问题跟踪工具,使用 tk CLI 管理任务,并提供网页看板监控进度。该技能指导 Agent 将较大的工作拆解为可验证任务,并通过依赖关系、持久历史和适配器组织执行。
主要功能
- 01用 tk 管理任务与依赖
- 02通过网页看板监控进度
- 03将工作拆分为可验证任务
- 04按 Epic 和执行波次组织任务
- 05配置运行器与项目级规则
适用场景
- 01跨会话跟踪开发工作
- 02将大型需求拆分为 Epic 和任务
- 03设置人工交接或审批关卡
- 04在团队间通过 Git 同步任务记录
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ pengelbrecht/ ticks --skill ticks安装后在 Claude Code 中输入/ticks确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/agent-runner.mdbig-picture.mdclaude-runner.mdcode-smells.mdcodex-runner.mdgoal-design.mdherdr-kinds.mdherdr-runner.mdpi-runner.mdprime-runner.mdrunners-config.mdrunners-config.schema.jsontick-patterns.mdtk-commands.md详细介绍
Ticks 工作流
Ticks 是一款专为 AI Agent 设计的问题跟踪器。tk CLI 用于管理任务,tk board 提供用于监控的网页版看板;史诗由当前执行环境通过 references/agent-runner.md 中的共享协议及其 Claude、Codex、Pi 或 Prime Agent 适配器执行。
何时使用 Ticks,何时使用 TodoWrite
以下工作适合使用 Ticks(tk):
- 跨多个会话或对话
- 依赖其他任务
- 在其他工作期间发现,需要跟踪
- 需要人工交接或审批关卡
- 能从持久化历史记录和备注中获益
以下工作适合使用 TodoWrite:
- 简单的单会话任务
- 将在当前对话中完成的工作
- 跟踪当前工作的进展
不要过度创建 tick,把每件小事都记下来。请自行判断。
技能工作流
调用时,请遵循以下工作流:
步骤 0:检查前置条件
1. Git 仓库:
git status 2>/dev/null || git init
2. 已初始化 Ticks:
ls .tick/ 2>/dev/null || tk init
3. 已安装 tk:
which tk || echo "Install: curl -fsSL https://ticks.sh/install | sh"
当前版本的 tk 也可以直接安装或更新此技能:tk skills install ticks,但即使从未运行该命令,此技能也能正常使用。
4. Git 跟踪(重要):
.tick/ 目录应由 git 跟踪,而不是加入 git 忽略列表。Ticks 专为版本控制而设计,因此可通过常规 git 工作流在不同机器和团队成员之间同步。
如果你在项目的 .gitignore 中看到 .tick 或 .tick/,请将其移除。只有内部或本地文件应加入 git 忽略列表,这由 .tick/.gitignore 处理(忽略 .index.json 和 logs/)。
# Check if .tick is gitignored (should return nothing)
git check-ignore .tick/
# If it returns ".tick/", remove the entry from .gitignore
5. 项目级运行器配置(.tick/config.md):
项目可以在由 git 跟踪的 .tick/ 目录中放置 .tick/config.md 文件,为受调度的实现者提供可靠且针对项目的指导。可识别的操作部分包括:
- 测试 — 精确的测试命令,包括针对特定软件包的精准调用。这能消除最常见的重复失败:每个新 Agent 都要重新推导(或错误猜测)如何运行测试。
- 收尾证据命令 — 仅可在收尾阶段执行、由控制器管理的严格命令;不得在实现子任务、单个 tick 验证、波次后门禁或最终审查测试中执行。
- 验收证据 — 可选的、由控制器管理的收尾授权。使用
- A<n>: \exact command`` 将每项稳定的验收条目精确映射一次。命令必须原样存在于“测试”或“收尾证据命令”中,且具有唯一性;跟踪器或模型中的文本绝不授权执行 shell 命令。重复、含糊、未知、注入、缺失或跨条目的证据都会导致安全失败。 - 环境 — 编排器在启动第 1 波前运行一次的预检:CLI 工具是否存在、服务是否运行、环境变量是否已设置。请将其写成用于验证条件的命令,而不是要求 Agent 向用户询问的指令。先测试,不要询问。
- 规则 — 针对实现者的项目专属约束(命名约定、禁止的模式、必需的审查步骤等)。
在使用时重新读取 — 规则与 .tick/learnings.md 相同。编排器在运行开始时读取此文件;实现者则从其工作树中读取。两者都不得内联先前会话中的过时副本。
缺少文件时的回退行为: 当前行为——实现者自行查找测试命令。此文件仅用于补充配置。
为什么不用 AGENTS.md 或 CLAUDE.md? 这些文件用于指导各自运行环境中的交互式 Agent。.tick/config.md 是供受调度实现者使用、与运行器无关的约定,并由程序读取。项目可以交叉引用这些文件,但运行器配置不得依赖任何一家供应商的指令文件。
6. Pi 可执行扩展(在 Pi 中运行 epic 时):
检查 Pi 是否已注册 /ticks-plan、/ticks-run、/ticks-status 和 /ticks-dashboard(RPC 客户端可以检查 get_commands)。如果这些命令不存在,请说明该技能提供了操作说明,但无法激活扩展代码,并推荐安装此软件包:
pi install git:github.com/pengelbrecht/ticks
# Local checkout:
pi install /absolute/path/to/ticks
不要声称加载或调用此技能即可启用这些命令。通用技能安装器可能只安装了 skills/ticks/。用户可以安装此软件包,或选择 references/pi-runner.md 中的手动 Pi 适配器流程。
步骤 1:收集已有信息
创建 ticks 前,先收集已有的需求:
- 现有文档 — 规范、PRD、设计文档、README 章节或问题描述(检查仓库根目录和
docs/,但遵循仓库使用的约定) - 对话内容 — 用户已经告诉你的内容
阅读找到的内容。不要重复询问已经有答案的问题。
步骤 2:填补差距
判断你是否足够了解这项工作,可以将其拆解。你应该能够回答:
- 这解决了什么问题?面向哪些人?
- 哪些内容在范围内,哪些只是锦上添花?
- 有哪些技术限制或偏好?
- 怎样才算“完成”?
如果存在信息缺口,通过对话补齐:先让用户不受打断地描述完整想法,然后针对不清楚之处提出具体问题(AskUserQuestion 很适合快速做多选决策)。
按工作规模记录理解:
- 小型、明确的任务 — 在对话中简要重述范围即可;确认后继续
- 较大型的功能或史诗 — 将其记录下来(例如写入
SPEC.md或更新现有文档),以便各任务项有稳定的参考;如果已有文档,就补齐其中的缺漏,而不是从头开始 - 包含多个史诗的项目 — 执行目标设计流程(
references/goal-design.md):重新阐述、访谈、事实表、回写。它会在规划任何史诗之前,产出可验证的项目目标
能够回答上述问题后,继续创建任务项。
创建高质量任务
每项任务都应是一个原子化、可提交且包含测试的工作单元。
理想的任务应:
- 有明确、单一的交付成果
- 可通过运行测试进行验证
- 产出可演示的软件,并在前序工作基础上构建
- 可在 1-3 次 Agent 迭代内完成
好的任务:
tk create "Add email validation to registration" \
-d "Validate email format on blur, show error below input.
Test cases:
- [email protected] -> valid
- invalid@ -> invalid
- @nodomain.com -> invalid
Run: go test ./internal/validation/..." \
--acceptance "All validation tests pass" \
--parent <epic-id>
不好的任务:
tk create "Add email validation" -d "Make sure emails are valid"
# No test cases, no verification criteria - agent will guess
创建每项任务前,根据 references/tick-patterns.md 运行 就绪标准 检查清单;完整模式请参阅该文件。
步骤 3:根据需求创建任务项
在前沿层级进行规划调度。 拆解是史诗中杠杆效应最高的决策。始终在前沿层级进行综合,即使实施会使用成本更低的模型或较低的推理力度。只读探索支持时,使用并行方式。请参阅 references/agent-runner.md →“规划层级”以及当前启用的运行器适配器。
在安装了扩展包的 Pi 中,优先采用安全的自动化规划:
/ticks-plan <existing-childless-epic-id> # model-running dry-run
/ticks-plan --requirements "new epic requirements" # model-running dry-run
/ticks-plan <target> --apply # explicit tracker apply
规划试运行并非空操作:它会运行已配置的只读侦察器和前沿规划器,保存日志和报告,并报告模型用量与成本,同时保证不会对任务跟踪器进行任何更改。规划提示会将相关的 Testing、Closeout Evidence Commands、Acceptance Evidence 和 Rules 部分作为上下文,但模型无法添加或授权可执行命令。--apply 是单独的显式选项,要求控制器状态干净且当前分支不是默认分支;它会在 TUI 中再次询问,并且是唯一会创建或提交任务项的模式。侦察器数量和并发数的覆盖值均有限制(--scouts 3..6、--scout-cap 2..4)。扩展会在任何更改发生前验证严格的版本化 JSON、依赖无环性、纵向验收以及同波次文件安全;EPIC-SKELETON 由控制器而非模型添加。恢复和非 TUI 确认语义请参阅 references/pi-runner.md。
将收集到的需求转化为按史诗组织的任务项。
全局概览 — 路线图、项目和日期
可选的结构约定(梯级、容器就绪标准、周期/里程碑/计划):
references/big-picture.md
大多数工作都从这里开始:一份包含排序后的史诗和依赖关系、除此之外没有其他内容的扁平路线图。这就是**“直接交付”**默认模式,也是单一工作流所需的一切。以下功能——项目、分组、target_date——可在工作规模扩大到需要时叠加使用。
层级:tick → epic → project
Ticks 只有一种递归容器类型。角色由结构和显式的 epic 标记决定:
| 有子项? | 有 epic 标记? | 子项包含 | 角色 |
|---|---|---|---|
| 否 | 否 | — | tick — 原子工作 |
| 否 | 是 | — | 空 epic — 需要规划 |
| 是 | 是 | 任意 | epic — 编排单元(波次、收尾、复盘) |
| 是 | 否 | 全部为原子项 | bucket — 仅用于被动分组 |
| 是 | 否 | 包含容器 | project — 分组 + 人工检查点 |
核心原则:包含是免费的、被动的;编排则需显式选择。
- 任何含有子项的 tick 都是一个容器:它汇总进度并对后代项分组。不会产生执行成本。
-t epic标记会将容器变为编排单元:tk next会按波次运行其子项;它会获得 EPIC-SKELETON 流程 tick(最终审查 + 收尾/复盘——见下文),并成为路线图节点。无论 epic 为空还是已填充,该标记的含义都相同——绝不能仅从结构推断出来。将现有容器提升为 epic(tk update <id> -t epic)会立即触发 EPIC-SKELETON 检查——提升会绕过正常的规划流程,因此要在提升时,而不是之后,核实或创建这两个流程 tick。- 一个没有标记且只有原子子项的容器是 bucket——其子项会各自进入正常就绪队列,绝不会作为一个整体进行协调。当你想将一批无关任务分组以便查看,但不想像 epic 那样运行它们时,请使用 bucket。
- 一个没有标记且至少包含一个其他容器的容器是 project。project 用于分组并提供人工检查点(见下文的延续部分)。“initiative” 只是由多个 project 组成的 project——类型相同,惯例不同。
Epic 完成定义(强烈建议)
为每个 epic 明确指定完成定义:说明整个 epic 完成时从外部可观察到的、面向用户的条件——而不只是其子 tick 已关闭。将其存储为 epic 的 --acceptance:
tk create "Auth foundation" -t epic -d "<rough scope>" \
--acceptance "New user can sign up, log in, and see their profile end-to-end against a real DB. \`go test ./internal/auth/...\` and the e2e signup test pass. No auth route 5xxs on the happy path."
这是可选项,但强烈建议使用——它是唯一能让运行判断何时真正完成,而不只是没有剩余 tick 的内容。Epic-close 复盘会逐项根据此定义验证代码(references/agent-runner.md → 外部验证);如果没有此定义,复盘就会回过头来从 epic 的描述中重新推导范围。
确保目标兼容。 如果 Agent 无需人工介入即可确认已达成,则完成定义是目标兼容的:
- 可检查——每一项都是可运行的命令或可观察的行为,绝不能写成“运行良好”或“感觉精致”。
- 有界定——明确说明范围并设定终点;“以及用户想要的其他任何内容”不算完成定义。
- 从外部出发——描述用户可见的行为及证明该行为的命令,而不是内部实现细节。
目标兼容的完成定义能让 epic 安全地交接并放手(见目标就绪交接)。确实需要人工判断的事项(“看起来合适”“感觉很快”)可以写下来,但应将它们置于 --awaiting 门控之后,而不是指望自主运行来解决。
Project 目标(目标设计)
Project 在上一级也应采用同样的处理方式:在 project 的描述中写明目标陈述,并将事实表——以 [A<n>] 标记的、离散且可测试的结果陈述——作为 project 的 --acceptance。在规划子 epic 之前,先依据 references/goal-design.md 中的流程与人工共同设计目标(重新表述 → 访谈 → 事实表 → 写回)。这些事实会将 project 检查点从“暂停查看”转变为逐项目标验证,并使自主运行能够合理地跨越 project 边界——或在确有缺口时停止。确保容器间的 A<n> ID 唯一(epic 和其所属 project 不能同时使用 A1)。
路线图边
如果规格涵盖多个史诗,请用排序边将它们关联起来。有两种类型,正确选择是核心决策:
--blocked-by= 硬依赖(可行性)。 在阻塞项关闭之前,下游史诗永远不会就绪。仅在史诗确实需要其前置项时使用——包括为避免同一文件的合并冲突而选择的排序方式(这是真实约束,不是偏好)。--after= 软排序(偏好)。 它会排序,但绝不会阻止就绪。tk next会将软延后的候选项排在最后,但绝不会隐藏它们——当首选史诗不可行时,选择会自然跳到第一个可行的史诗。缺失或已关闭的--after目标会被忽略。
tk roadmap 根据两种边类型的并集将史诗分层为多个波次,并分别标注(← blocked by: 与较软的 ← after:);排队状态仅取决于硬边——唯一开放前置项为软依赖的史诗仍处于就绪/活跃状态。
只有最前面的史诗会有子任务 tick。下游史诗只作为父级 tick 存在——为每个史诗提供粗略的范围说明(一段文字加一份交付项列表),而非详细任务。这就是即时细化:未来的史诗可以低成本地重新排序或调整范围。
# Create the roadmap up front — only epic A gets child ticks now
tk create "Auth foundation" -t epic -d "<rough scope>" # A — flesh out now
tk create "Team workspaces" -t epic -d "<rough scope>" --blocked-by <A> # B — genuinely needs A's auth model
tk create "Billing" -t epic -d "<rough scope>" --after <B> # C — preferred order only, no real dependency
EPIC-SKELETON 不变量:每个可运行的史诗都以两个流程 tick 结尾——先是最终审查 tick,然后是收尾 tick。 在规划时创建这两个 tick;每当史诗获得子任务 tick 时,都应紧接在实现 tick 之后立即创建(现在为最前面的史诗;下游史诗则在其收尾细化时创建):
# 1. Final review — blocked by every last-wave implementation tick
tk create "Final review of <epic A> diff" \
--parent <A> --role review \
--blocked-by <last-wave-tick-1> --blocked-by <last-wave-tick-2> # every last-wave tick
# 2. Close-out — blocked by the final review, always the last child
tk create "Close out <epic A>: run epic retro, then flesh out the next feasible epic into ticks" \
--parent <A> --role closeout \
--blocked-by <final-review-tick>
--role review|closeout 标志使骨架具有结构性:tk graph <epic> --json 会根据此字段报告 missing_process_ticks(没有任何子项承担的角色),因此缺失或不完整的骨架可以通过机械方式检测,而非通过标题匹配来判断。如果史诗已有这些 tick 但没有角色,请用 tk update <id> --role review|closeout 修复。
最终审查 tick 的工作是审查史诗的完整差异,并在收尾解除阻塞之前解决或分派发现的问题(完整语义见 references/agent-runner.md → “Meta-work ticks”)。执行收尾意味着:运行史诗收尾回顾(参见 references/agent-runner.md),然后按软排序选择下一个可行史诗——跳过任何被硬阻塞或设有门控的史诗——阅读其粗略范围,将其拆分为子任务 tick,包括其自身的 EPIC-SKELETON 配对 tick,然后继续执行 tk graph <that-epic>。史诗边界通过结构处理——无需酌情交接,也无需人工重新提示。
tk 的规划触发信号。 三种 CLI 信号会告诉你某个史诗现在需要规划或修复:
tk next <roadmap-epic> --json会在下一个项目是未阻塞且没有子项的史诗时返回{"action":"plan",...}。人类可读的输出类似<id> P<n> epic <title> (needs planning — no child ticks)。action字段会出现在所有tk next --json结果中:就绪任务为implement,无法规划的史诗为plan,而--awaiting模式的结果为await——因此编排可以直接据此分支处理。tk graph <epic> --json会在该史诗当前可规划时(子项数量为零且未阻塞)返回{"needs_planning": true,...}。被阻塞且没有子项的史诗,以及其子项全部关闭的史诗,会返回false,并附带解释性的人类可读输出。tk graph <epic> --json会在史诗有子项但其 EPIC-SKELETON 不完整时返回missing_process_ticks(例如["review","closeout"])——没有任何子项承担相应的--role。解决方法是修复,而不是重新规划:创建缺失的流程 tick(使用上方的模板)。空数组表示骨架完整;对于没有子项的史诗,数组也为空,因为此时needs_planning才是信号,而且规划会创建骨架。
当任一信号触发时,应将史诗细化为子任务 tick(遵循上述路线图指南以及 references/tick-patterns.md 中的基础优先流程),然后继续执行 tk graph <epic>。
路线图级别的变更——添加、删除或重新排序史诗——必须由人类决定。 Agent 可以在复盘报告中提出此类变更,但不得擅自执行。
此规则也适用于分阶段的规格:重点只为当前阶段和下一阶段创建任务项。未来阶段属于路线图中的后续史诗——仅保留父级节点,范围粗略描述,暂不创建详细任务。
继续与停止
默认情况下,史诗会自动跨越史诗边界继续执行。项目边界会暂停执行,等待人工检查点——项目的最后一个子项默认带有 --awaiting checkpoint,因此运行会暂停,等待人类检查后再开始下一个项目。
# Auto-continue into epic B (default) — hard edge because B genuinely needs A
tk create "Team workspaces" -t epic -d "<rough scope>" --blocked-by <A>
# Force a human review before starting epic C — soft ordering plus a gate
tk create "Billing" -t epic -d "<rough scope>" --after <B> --awaiting checkpoint
若要在所有项目检查点都不暂停、全程自动执行,请向 tk next 传入 --autonomous,或在 .tick/config.json 中设置 policy.autonomous_mode: true。其他等待类型(work、approval、input,等等)在自主模式下仍会阻止执行——只有检查点边界会继续通过。
可交接的目标
当最前面的史诗有与目标兼容的完成定义(见上文)时,计划便可交接:运行可以细化计划、实施、审查、关闭该史诗,并沿着路线图继续推进,无需人工确认。规划完成后,应与用户一起明确作出此决定,而不是直接进入运行:
- 完成定义与目标兼容 → 建议采用放手执行的方式,并给出一条命令:从运行器运行该史诗(步骤 5);同时向
tk next添加--autonomous(或设置policy.autonomous_mode: true),以便顺利通过项目检查点。 - 缺少完成定义,或其与目标不兼容 → 说明哪些内容尚不明确,提议先完善完成定义,或者使用默认设置,在每个项目边界暂停等待人工检查点。
在这里,你可以决定运行在停止等待你之前要推进多远——一个史诗、一个项目,还是整个路线图——而不是等运行中途才发现。
同样的决定也适用于项目:如果项目的所有目标事实都可通过经批准的验收证据映射自动验证(见上文项目目标和 references/goal-design.md),就可以安全地端到端交接——运行会在项目边界验证目标,只有遇到实际缺口时才会停止。若项目包含需要人工判断的事实,无论是否启用自主模式,都会在检查点停止。
目标日期与延期信号
任何任务项都可以带有可选的 target_date(精确到 ISO 日期)。该信号是派生得出的,不会存储,因此不会过时或引发合并冲突:
- 已逾期——超过
target_date,且至少有一个未完成的后代任务项。 - 进展正常——设有
target_date,且日期尚未过去。 - (无日期)——无信号;工作完全由依赖关系驱动。
日期不会阻止执行,只会生成供人类查看和筛选查询使用的标记。
tk create "v2.0 launch" -d "<release outcome>" --target-date 2026-09-30
tk update <id> --target-date 2026-10-15 # revise the date
tk list --overdue # past target_date with open work
tk list --due-before 2026-08-01 # target_date strictly before this date
tk list --sort target_date # ascending; undated ticks sort last
示例
示例 1——带日期的发布分组史诗(一个项目)
# "v2.0 launch" is created without -t epic, so it is a project — it groups and
# provides a checkpoint boundary but is not "run as a unit" itself.
# Its epics run exactly as epics do today.
tk create "v2.0 launch" -d "<release outcome>" --target-date 2026-09-30
tk create "Auth revamp" -t epic --parent <v2> # front epic — flesh out now
tk create "Billing" -t epic --parent <v2> --after <auth> # downstream — rough scope only
tk create "Dashboard" -t epic --parent <v2> --after <billing>
# Epics auto-continue into each other. When the last one closes, the v2.0
# project boundary stops for human sign-off. target_date feeds the overdue /
# on-track signal; it never gates execution.
示例 2——嵌套项目(Linear 所称的“计划”——纯粹是一种约定)
tk create "Q3 Platform" --target-date 2026-09-30 # top-level project
tk create "Payments" --parent <q3> --target-date 2026-08-15 # sub-project (milestone-ish)
tk create "Auth revamp" -t epic --parent <payments> # epic under the sub-project
# Each sub-project boundary is its own checkpoint; the engine ascends the tree as
# each level completes.
示例 3——被动分组(分组但不编排)
# No -t epic means a bucket. Groups for visibility and rolls up a count;
# the bugs inside flow through the normal ready queue independently, never
# coordinated as a unit.
tk create "Q3 bug triage"
tk create "Fix flaky login test" --parent <triage>
tk create "Dashboard chart off-by-one" --parent <triage>
为并行执行而设计
同一波次中不存在阻塞关系的任务会并发运行,每个任务都在各自的 Git 工作树中执行。工作树可避免 Agent 在执行过程中互相覆盖,但如果两个任务都修改同一个文件,分支合并时仍会冲突;如果两个任务的测试访问同一个无法隔离的资源(例如一个测试数据库或固定端口),也会破坏彼此的运行结果。
按约束面划分。 如果两个交付项会共用一个文件或资源,那么这个共享对象——即 约束面——应决定任务边界,而不是功能列表。按以下顺序处理每个共享面(操作步骤见 references/tick-patterns.md):
- 双方都会修改的接缝文件 → 交给一个任务。 一个负责人不会与自己冲突;将其拆分成两个任务并排序,只会推迟冲突。只有在合并后的任务会过大时,才使用
--blocked-by进行拆分和排序——可预见的合并冲突是硬依赖,绝不能使用--after。 - 共享的、无法隔离的资源(一个测试数据库、固定端口)→ 每个波次中最多只能有一个任务访问它,即使这意味着要将跨功能的工作合并在一起。
- 锁文件和生成文件也属于接缝: 同一波次中,两个分别添加依赖的任务都会改写
pnpm-lock.yaml/go.sum——将所有依赖添加操作放到一个较早的任务中,或将它们串行化。
在每个约束组内进行纵向切片。 按用户可见的能力(从头到尾完成一个功能)划分任务,而不是按层划分(先完成所有架构,再完成所有 API,最后完成所有 UI),这样每个任务结束时,系统都能正常运行并进行演示。纵向切片与约束面冲突时,以约束面为准。完整说明见 references/tick-patterns.md。
先定义共享契约。 如果多个任务会使用同一个接口(API 结构、数据库架构、共享类型),就创建一个任务来定义它,并让其他任务通过 --blocked-by 依赖它。提前稳定契约,可以让依赖它的任务基于明确的结构并行开展,而不是靠猜测;也能让它们在描述中使用一致的名称。
合理排序,快速发现问题。 排列任务时,应确保每个任务完成后,构建都保持通过,应用都能运行;同时将风险最高或最不确定的任务放在前面——应在第 2 个任务而不是第 12 个任务时发现假设有误。对于希望检查后再继续的阶段边界,创建一个 --awaiting checkpoint 任务;对于确实尚无定论的问题,创建一个 --awaiting input 任务,而不要猜测。
运行前,检查 Epic 的任务。 创建任务后,快速检查一遍:
- 覆盖范围——逐项检查从已收集的理解中得出的要求(针对当前阶段),并指出由哪个任务实现。为任何遗漏补充任务。
- 任务规模——拆分标题中需要用到“以及”的任务,或验收标准无法在 3 条要点中写清的任务。
- 命名一致性——同一接口在各任务描述中应使用相同名称;一个任务中将契约命名为
clearLayers,另一个任务中却称为clearFullLayers,就是一个潜在缺陷。 - 波次安全性——运行
tk graph <epic>,确认同一波次中的任意两个任务都不会共用文件或无法隔离的资源。
这项检查成本很低,却能发现分区错误;一旦 Agent 开始运行,这些错误就很难修正。
步骤 4:指导用户完成阻塞性的人工任务
如果人工任务会阻塞自动化任务,请在运行 Agent 前指导用户完成这些任务。
# Check for blocking human tasks
tk list --awaiting work
tk blocked # See what's waiting
指导用户完成每项阻塞任务,然后将其关闭:
tk close <id> --reason "Completed: connection string in .env"
第 5 步:运行 Epic
在当前 harness 中执行 Epic。先阅读 references/agent-runner.md,然后阅读对应的 harness 适配器:如果在 Codex 中运行,则阅读 references/codex-runner.md;如果在 Claude Code 中运行,则阅读 references/claude-runner.md;如果在 Pi 中运行,则阅读 references/pi-runner.md;如果在 Prime Agent 中运行,则阅读 references/prime-runner.md。适配器决定由谁负责编排;另一个独立选择决定如何调度工作者——即 substrate,可以是 harness 自带的子 Agent,也可以是异构的 herdr 集群(references/herdr-runner.md,须与 harness 适配器一同阅读,不能用它替代适配器)。.tick/runners.toml 中的 [orchestration].substrate(herdr | harness | auto,默认值为 auto)决定采用哪种方式;如果指定了 herdr 但不可用,则会明确降级为 harness 调度——相关语义见 references/runners-config.md。如果还没决定,请在启动前先确定 目标就绪移交(上文)的决策:本次运行应该推进到什么程度,才停下来交给人工处理?流程如下:
tk graph <epic-id> --json— 获取执行波次和可并行运行的任务数。如果结果包含"needs_planning": true,说明 Epic 还没有子 tick——先补全其内容(参见上文“大局”部分),然后重新运行tk graph。- EPIC-SKELETON 预检——如果同一结果包含非空的
missing_process_ticks,则在第 1 波之前,使用--role创建缺失的流程 tick(模板见上文“大局”部分)。 - 对于每个波次,为每个就绪 tick 启动一个实现者,并让每个实现者使用各自独立的 git worktree,使用适配器的并行调度原语。
- 使用适配器的完成原语等待,并暂时合并每个已验证的分支;保留分支和 worktree,推迟成功的 tracker 状态转换。
- 将测试门禁持久化,并在完全合并后的代码树上运行。只有测试成功,才能持久地关闭该波次并清理;如果失败,则保持所有受影响的 tick 为打开状态,保留修复状态,并阻塞依赖项。然后进入下一波;实现波次完成后,最终审查和收尾 tick 会依次解除阻塞。
所有 tick 状态均由你负责;实现者只在各自的 worktree 中编写代码。除非遇到实际阻塞,否则应连续推进各个波次。
快速参考
创建 Tick
tk create "Title" -d "Description" --acceptance "Tests pass" # Task
tk create "Title" -t epic # Epic
tk create "Title" --parent <epic-id> # Under epic
tk create "Title" --blocked-by <task-id> # Blocked (hard dependency)
tk create "Title" --after <task-id> # Soft ordering preference (never blocks)
tk create "Title" --awaiting work # Human task
tk create "Title" --requires approval # Needs approval gate
tk create "Title" --parent <epic> --role review # Epic's final-review process tick
tk create "Title" --parent <epic> --role closeout # Epic's close-out process tick
Epic 也支持
--acceptance——请用它定义 Epic 的完成标准(强烈建议;参见 Epic 完成标准)。与目标相符的完成标准能让你顺利移交 Epic,然后放心离开。
tk的长选项使用标准的双连字符。-acceptance/-parent/-blocked-by(单连字符)不可用——请使用--acceptance/--parent/--blocked-by。-d、-t、-p、-l、-b等单字母简写可以使用。
查询
tk list # All open ticks
tk list -t epic # Epics only
tk list --parent <epic-id> # Tasks in epic
tk ready # Unblocked tasks
tk next <epic-id> # Next task for agent
tk next <epic-id> --json # JSON: action field is "implement" | "plan" | "await"
tk blocked # Blocked tasks
tk list --awaiting= # Tasks awaiting human
tk graph <epic-id> # Dependency graph with parallelization
tk graph <epic-id> --json # JSON output; needs_planning:true means epic needs child ticks;
# non-empty missing_process_ticks means EPIC-SKELETON needs repair
管理
tk show <id> # Show details
tk close <id> --reason "Completed: <one-line summary>" # Close tick — always pass --reason
tk note <id> "text" # Add note
tk approve <id> # Approve awaiting tick
tk reject <id> "feedback" # Reject with required feedback
**关闭原因约定:**关闭时始终使用 --reason 并提供具体摘要。
tk close <id> --reason "Completed: <one-line summary of what landed>" — 绝不要只运行 tk close。
**执行者约定(编排运行):**在运行开始时导出 TK_ACTOR=<runner>:orchestrator,例如 claude:orchestrator、codex:orchestrator、pi:orchestrator 或 prime:orchestrator,以便活动记录保留运行器来源。使用 --actor <name> 可覆盖单次调用的执行者。
优先级:--actor 标志 > TK_ACTOR 环境变量 > tick 所有者默认值。
运行 Epic
从当前运行框架启动执行(共享详情见 references/agent-runner.md;然后根据所用环境查看 codex-runner.md(Codex)、claude-runner.md(Claude Code)、pi-runner.md(Pi)或 prime-runner.md(Prime Agent))。
然后选择调度基础设施——运行框架原生子 Agent,或由一组 herdr 独立工作进程组成的舰队(references/herdr-runner.md,作为运行框架适配器的补充)。该设置来自 .tick/runners.toml 的 [orchestration].substrate(herdr | harness | auto,默认值为 auto;只读探测发现 herdr 时使用 herdr,否则使用运行框架);references/runners-config.md 中有决策表和明确降级规则。
# 1. Get the dependency graph (waves + max parallelism)
tk graph <epic-id> --json
# 2. Select the role tier, then launch one isolated implementer per ready tick.
# Planning and final review use frontier settings. Implementation uses the
# adapter's economy/balanced/strong mapping.
#
# 3. Wait using the adapter's native primitive, then integrate each tick:
git diff --name-only HEAD...<agent-branch> -- .tick/ # boundary check: must be empty
git merge <agent-branch> # if it conflicts: abort, have the agent rebase + resolve in its worktree
tk close <tick-id> --reason "Completed: <one-line summary of what landed>"
# 4. After the wave's merges land, run the test suite before launching the next wave
规划并行执行
启动 Agent 前,使用 tk graph 了解并行情况:
tk graph <epic-id> # Human-readable wave breakdown
tk graph <epic-id> --json # Machine-readable for orchestration
图表显示:
- 波次:可以并行运行的 tick 分组
- 最大并行数:最宽波次中可同时启动的子 Agent 数量
- 关键路径:完成该 Epic 所需的最少连续波次数
- 依赖项:每个 tick 被哪些事项阻塞
每个波次最多启动 max_parallel 个子 Agent(如需控制成本或减少干扰,可降低数量),并在开始下一个波次前合并当前波次的工作,确保依赖项基于已完成的工作继续推进。
完整参考请见 references/tk-commands.md。
协助处理待处理的 Tick
以交互方式工作时,帮助用户处理待处理的 tick:
tk list --awaiting= # Find ticks awaiting human
tk next --awaiting= # Next one needing attention
使用 AskUserQuestion 帮助用户作出决定,然后执行:
# User approves
tk approve <id>
# User rejects
tk reject <id> "feedback here"
# User provides input
tk note <id> "Use sliding window algorithm" --from human
tk approve <id>
代表用户添加备注时,始终使用 --from human。