planning-tracker
Use when a planning skill must read, create, link, label, or close planning items (maps, decisions, specs, tickets) and the tracker backend must be resolved as local Markdown files or GitHub Issues.
SKILL.mdskills/planning-tracker/SKILL.md
GitHubPlanning Tracker
Purpose
Give the planning skills one tracker-neutral contract. planning-interview, planning-spec, planning-tickets, and planning-wayfinder describe work as items with kinds, statuses, labels, parents, and blocking edges; this skill maps those operations onto the backend the repository uses. Two backends are supported: local Markdown (the default and reference backend) and GitHub Issues.
Activate when
- a planning skill needs to create, read, update, link, label, or close an item
- the next unblocked item (the frontier) must be found
- the repository's planning backend is unknown or ambiguous
- a local tracker directory must be validated
Repository inspection
- Look for a tracker declaration: a
## Planning trackersection inAGENTS.mdorCLAUDE.mdnaminglocal(with its root) orgithub(withowner/repo). - Look for an existing local tracker directory,
docs/planning/by default, and existing item files (NNNN-slug.md). - For GitHub, confirm which tools are available in this session (the
ghCLI or GitHub MCP tools) and that the repository matches the declaration. - Read existing labels before inventing new ones.
Decision rules
Resolve the backend in this order and state the result before the first write:
- an explicit instruction in the current task;
- the repository's
## Planning trackerdeclaration; - an existing local tracker directory;
- otherwise ask the user; if nobody can answer, use local Markdown at
docs/planning/.
Then use the item model below and load the backend's reference for the exact operations.
Item model
| Field | Values | Meaning |
|---|---|---|
id |
integer | stable identity; local ids are sequential, GitHub ids are issue numbers |
title |
text | the name people use; refer to items by title, with the id inside the link |
kind |
map, decision, spec, ticket |
a map indexes a large effort; a decision resolves one question; a spec describes a feature; a ticket is one vertical slice of work |
status |
open, closed |
nothing else; progress detail belongs in the body |
labels |
list | workflow labels such as ready-for-agent and needs-decision |
parent |
item id | the map or spec the item belongs to |
blocked_by |
item ids | items that must close before this one can start |
assignee |
name | who claimed the item; claim before starting work so parallel sessions skip it |
The frontier is every open, unclaimed item, other than a map, whose blockers are all closed.
Operations
| Operation | Local Markdown | GitHub Issues |
|---|---|---|
| create item | write NNNN-slug.md with the next id |
create an issue |
| read item | read the file | view the issue and its comments |
| update body or fields | edit the file | edit the issue body or labels |
| link parent | parent: front matter |
native sub-issue when supported, else a Parent: #N body line |
| link blockers | blocked_by: front matter |
a Blocked by: #N, #M body line |
| comment | append a dated ## Notes entry |
add an issue comment |
| claim | assignee: front matter |
assign the issue |
| close | status: closed |
close the issue |
| frontier | scripts/tracker.rb frontier |
list open child issues and check each Blocked by line |
Critical invariants
- One backend per effort. Never split a map's items across local files and GitHub.
- Creating, editing, labelling, or closing a GitHub issue is outward-facing: get the user's confirmation before the first remote write in a session unless the repository declaration authorizes the agent to publish.
- Never delete an item to "close" it; closing keeps the history that later decisions cite.
- Every blocking edge points to an existing item and the graph has no cycles; run
scripts/tracker.rb validateafter local edits. - Never write secrets, credentials, or personal data into items; they may be published or committed.
References
Load only the reference for the resolved backend; each is one level deep.
| Load when | Reference | Covers | Patterns |
|---|---|---|---|
| the backend is local Markdown | references/local-markdown.md | Directory layout; item file format; ids; the tracker script; body sections | none |
| the backend is GitHub Issues | references/github.md | Issue mapping; labels; parent and blocker links; frontier queries; confirmation | none |
Reference example
A local tracker, validated and queried with the bundled script (paths relative to this skill's directory):
ruby scripts/tracker.rb validate --root docs/planning
ruby scripts/tracker.rb frontier --root docs/planning --parent 1
ruby scripts/tracker.rb next-id --root docs/planning
Tracker valid: 7 items under docs/planning
0003 decision open Decide where refund tax is recorded
0004 decision open Decide the refund ledger entry
0008
Agent review checklist
- backend resolved from instruction, declaration, existing directory, or the user, and stated
- items use the shared kinds, statuses, parents, and blocking edges
- remote writes confirmed or authorized
- local tracker validates with no errors
- items referred to by title, not bare ids
- no secrets or personal data in items
Failure modes
- guessing a backend and publishing issues the user did not expect
- inventing statuses such as
in-progressinstead of labels and body notes - blocking edges that point at missing items, or cycles that leave the frontier empty
- deleting items, so later decisions cite nothing
- mixing local files and GitHub issues within one effort
Verification
For local Markdown, run ruby scripts/tracker.rb validate --root <root> and confirm it reports no errors. For GitHub, re-read each created or edited issue and confirm its labels, parent, and Blocked by line.
Source foundation
The item model and backend split are this repository's design. The planning workflow they serve (maps of decision tickets, specs, tracer-bullet tickets with blocking edges) is adapted from the wayfinder, to-spec, and to-tickets skills in https://github.com/mattpocock/skills (MIT License, Copyright (c) 2026 Matt Pocock), with the tracker made backend-neutral.