skills/ticks/SKILL.md
Work with Ticks issue tracker and AI agent runner. Use when managing tasks or issues with tk commands, running AI agents on epics, creating ticks from a SPEC.md, or working in a repo with a .tick directory. Triggers on phrases like create ticks, tk, run ticker, epic, close the task, plan this, break this down.
npx skillsauth add pengelbrecht/ticks ticksInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Ticks is an issue tracker designed for AI agents. The tk CLI manages tasks, runs agents in continuous loops, and provides a web-based board for monitoring.
Use Ticks (tk) for work that:
Use TodoWrite for:
Don't over-index on creating ticks for every small thing. Use your judgment.
When invoked, follow this workflow:
1. Git repository:
git status 2>/dev/null || git init
2. Ticks initialized:
ls .tick/ 2>/dev/null || tk init
3. tk installed:
which tk || echo "Install: curl -fsSL https://raw.githubusercontent.com/pengelbrecht/ticks/main/scripts/install.sh | sh"
4. Git tracking (important):
The .tick/ directory should be tracked by git, not gitignored. Ticks are designed to be version-controlled so they sync across machines and team members via normal git workflows.
If you see .tick or .tick/ in the project's .gitignore, remove it. The only things that should be gitignored are internal/local files, which is handled by .tick/.gitignore (ignores .index.json and logs/).
# Check if .tick is gitignored (should return nothing)
git check-ignore .tick/
# If it returns ".tick/", remove the entry from .gitignore
Look for a SPEC.md (or similar spec file) in the repo root.
If no spec exists: Go to Step 2a (Create Spec) If spec exists but incomplete: Go to Step 2b (Complete Spec) If spec is complete: Skip to Step 3 (Create Ticks)
Have a natural conversation with the user to understand their idea:
Conversation topics to explore:
If SPEC.md exists but has gaps:
Every task should be an atomic, committable piece of work with tests.
The ideal task:
Good task:
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>
Bad task:
tk create "Add email validation" -d "Make sure emails are valid"
# No test cases, no verification criteria - agent will guess
Run the Definition of Ready checklist in references/tick-patterns.md against each tick before creating it; see that file for the full patterns.
Transform the spec into ticks organized by epic.
For phased specs: Focus on creating ticks for the current/next phase only. Don't create ticks for future phases - they may change based on learnings.
Epic organization:
--blocked-by--awaiting workDesigning for parallel execution: Ticks in the same wave (no blocking relationship) run concurrently, each in its own git worktree. Worktrees keep agents from clobbering each other mid-run, but two ticks that edit the same file will still collide at merge time. To keep merges clean:
tk graph <epic> to see the waves and confirm ticks in the same wave touch different filesauth.go, Task B edits auth.go → B should block on A# Create epics
tk create "Authentication" -t epic
tk create "API Endpoints" -t epic
# Create tasks with acceptance criteria
tk create "Add JWT token generation" \
-d "Implement JWT signing and verification" \
--acceptance "JWT tests pass" \
--parent <auth-epic>
tk create "Add login endpoint" \
-d "POST /api/login with email/password" \
--acceptance "Login endpoint tests pass" \
--parent <api-epic> \
--blocked-by <jwt-task>
# Human-only tasks (skipped by tk next)
tk create "Set up production database" --awaiting work \
-d "Create RDS instance and configure access"
tk create "Create Stripe API keys" --awaiting work \
-d "Set up Stripe account and get API credentials"
Slice vertically. Carve the epic into ticks by user-visible capability (one feature front-to-back), not by layer (all schema, then all API, then all UI). Each tick should leave the system working and demoable. See references/tick-patterns.md for the full reasoning and the parallel-safety caveat.
Define shared contracts first. When several ticks consume the same interface (an API shape, a DB schema, a shared type), make one tick that defines it and have the others --blocked-by it. A stable contract up front lets the dependents run in parallel against a known shape instead of guessing — and keeps their descriptions naming things the same way.
Order for working state and fail fast. Sequence ticks so each leaves the build green and the app runnable, and put the riskiest or most uncertain ticks early — discover a wrong assumption on tick 2, not tick 12. For a phase boundary where you want to look before continuing, create an --awaiting checkpoint tick; for a genuinely open question, create an --awaiting input tick rather than guessing.
Before running, review the epic's ticks. Once the ticks exist, do a quick pass:
clearLayers in one tick and clearFullLayers in another is a latent bug.tk graph <epic> and confirm ticks in the same wave touch different files.This review is cheap and catches the partitioning mistakes that are expensive to unwind once agents are running.
If human tasks block automated tasks, guide the user through them before running the agent.
# Check for blocking human tasks
tk list --awaiting work
tk blocked # See what's waiting
Walk the user through each blocking task, then close it:
tk close <id> --reason "Completed - connection string in .env"
Execute the epic by orchestrating subagents from this Claude Code session. The full workflow is in references/claude-runner.md; the shape is:
tk graph <epic-id> --json — get the waves and how wide you can run.isolation: "worktree"), in the background.You own all tick state; subagents only write code in their worktrees. That keeps parallel work conflict-free and tick history clean. Run wave to wave continuously — don't stop to check in between waves unless you hit a real blocker.
Ticks also ships a standalone runner (
tk run) with its own worktree and cost-tracking machinery. It's intentionally not the path this skill uses right now, so execution goes through Claude orchestration instead.
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
tk create "Title" --awaiting work # Human task
tk create "Title" --requires approval # Needs approval gate
tkuses standard double-dash for long flags.-acceptance/-parent/-blocked-by(single dash) do not work — use--acceptance/--parent/--blocked-by. Single-letter shorthands like-d,-t,-p,-l,-bare fine.
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 blocked # Blocked tasks
tk list --awaiting= # Tasks awaiting human
tk graph <epic-id> # Dependency graph with parallelization
tk graph <epic-id> --json # JSON output for agents
tk show <id> # Show details
tk close <id> --reason "reason" # Close tick
tk note <id> "text" # Add note
tk approve <id> # Approve awaiting tick
tk reject <id> "feedback" # Reject with required feedback
Drive execution from this Claude Code session (full details in references/claude-runner.md):
# 1. Get the dependency graph (waves + max parallelism)
tk graph <epic-id> --json
# 2. For each wave, launch one Agent per ready tick — all in ONE message:
# Agent(subagent_type: "general-purpose",
# name: "<epic>-w<wave>-<tick>",
# isolation: "worktree",
# run_in_background: true,
# mode: "bypassPermissions",
# model: "sonnet") # haiku for trivial, opus for complex
#
# 3. Wait for completion notifications (no polling), then integrate each tick:
git merge <agent-branch>
tk close <tick-id> --reason "Completed via Claude orchestration"
Before launching agents, use tk graph to understand the parallelism:
tk graph <epic-id> # Human-readable wave breakdown
tk graph <epic-id> --json # Machine-readable for orchestration
The graph shows:
Launch up to max_parallel subagents per wave (cap it if you want to limit cost or noise), and merge each wave before starting the next so dependent ticks build on completed work.
See references/tk-commands.md for full reference.
When working interactively, help users process awaiting ticks:
tk list --awaiting= # Find ticks awaiting human
tk next --awaiting= # Next one needing attention
Use AskUserQuestion to help users decide, then execute:
# 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>
Always use --from human when adding notes on behalf of the user.
data-ai
Example TaskFlow authoring pattern for inbox triage. Use when messages need different treatment based on intent, with some routes notifying immediately, some waiting on outside answers, and others rolling into a later summary.
data-ai
Example TaskFlow authoring pattern for inbox triage. Use when messages need different treatment based on intent, with some routes notifying immediately, some waiting on outside answers, and others rolling into a later summary.
data-ai
OpenProse VM skill pack. Activate on any `prose` command, .prose files, or OpenProse mentions; orchestrates multi-agent workflows.
data-ai
OpenProse VM skill pack. Activate on any `prose` command, .prose files, or OpenProse mentions; orchestrates multi-agent workflows.