Planning
Planning tracks work as tickets:
- A team groups workspace members and numbers its tickets with its key, such
as
WEB-31. Open teams are listed for everyone; private teams only for their members. - A ticket is any unit of work. It has a
title, a Markdownsummary, a Markdownplan(the document an agent implements), astatus,tags, anowneragent, and at most oneprojectandmilestone. - A project gathers tickets from one or more teams toward a goal. It has a
status, alead, an optionaltargetDate, linkedteamsandproducts, numberedmilestones(M1, M2) and a Markdowndocument. - Every status belongs to a category:
backlog,unstarted,started,completedorcanceled. The defaults are Backlog, Todo, In Progress, In Review, Done, Canceled and Duplicate. A new team copies the workspace's statuses and owns its copy. - Tags belong to the workspace, or to one team and only its tickets.
- Agent instructions teach a team's agents to write tickets and plans: a
templateper kind (and optionally per tag),guidance, and for tickets thedefaultsan agent's new ticket gets. A team's own replace the workspace's, which replace Clanker Ship's. - A view saves
filters, agroupBy, anorderByand alayout(listorboard) for one team or one project. Teams start with All tickets, Active and Backlog; projects with Board and All tickets. The default view opens when no view is named.
Rules
- Team keys are 2–5 capital letters and change only while the team has no tickets. Ticket numbers are never reused.
- A ticket joins a project only when its team is linked to the project, and a milestone only from its own project. A team stays linked to a project while the project holds its tickets.
- Moving a ticket to another team gives it a new ID; the old ID still finds it.
- Archived projects are read-only. A team with tickets is archived, not deleted.
- Viewers read. Members change tickets, projects and milestones. Owners and admins create teams, change keys and visibility, and change workspace tags; team members change their team's tags and members.
- Anyone who can open a project reads all its tickets, a private team's included, but only the team's members change them.
- Every category keeps at least one status. The default status for new tickets
is a Backlog or Unstarted status and cannot be deleted. Deleting a status
that tickets use needs
moveTo, another status of the same team. - Owners and admins change statuses. Members of a view's team, or of one of a project's teams, change its views; the default view cannot be deleted.
- Tickets have one order. Every view ordered by hand (
manual) shows it, andreordermoves a ticket before or after another.
Views
| Field | Values |
|---|---|
filters |
statuses, categories, tags, owners (agent IDs or none), then projects for team views, or milestones (M1, none) and teams for project views |
groupBy |
status, category, owner, tag, none, and project for teams or milestone and team for projects |
orderBy |
manual, created (newest first) or updated |
layout |
list or board; a board's columns are the groups |
Filters combine with "and", values within one filter with "or". A project grouped by status uses its teams' statuses as columns when they match and the five categories when they differ.
HTTP
Paths are relative to /v1/workspaces/{slug}. Teams are named by key, projects
by slug and tickets by ID. PATCH changes only the fields you send, and null
clears an optional field.
| Operation | Request |
|---|---|
| Teams | GET, POST /teams; GET, PATCH, DELETE /teams/{team} |
| Join, members | POST /teams/{team}/join, POST /teams/{team}/members, DELETE …/{person} |
| Archive, restore | POST /teams/{team}/archive, …/restore (same for projects) |
| Projects | GET /projects?team=&product=, POST /projects, GET, PATCH /projects/{project} |
| Priority order | POST /projects/{project}/reorder with before or after |
| Milestones | POST /projects/{project}/milestones, PATCH, DELETE …/{milestone} |
| Tickets | GET /tickets?team=&project=&owner=mine&category=started, POST /tickets |
| One ticket | GET, PATCH /tickets/{ticket}, POST /tickets/{ticket}/move, …/reorder |
| Statuses | GET, POST /ticket-statuses; PATCH, DELETE …/{status}?moveTo=; …/reorder |
| Views | GET, POST /teams/{team}/views; GET, PATCH, DELETE …/views/{view} |
| Project views | The same under /projects/{project}/views |
| Tags, agents | GET, POST /tags, PATCH, DELETE /tags/{tag}, GET /agents |
| Instructions | GET /agent-instructions?kind=ticket&team=, PUT, DELETE …?kind=&team= |
POST /v1/workspaces/acme/tickets
Authorization: Bearer ctk_…
{ "team": "WEB", "title": "Stacked promo codes fail at checkout", "tags": ["bug"] }
The response is the ticket with its ID, such as WEB-31. Change its status by
name:
PATCH /v1/workspaces/acme/tickets/WEB-31
{ "status": "In Progress" }
Save a view, then read it with its tickets:
POST /v1/workspaces/acme/teams/WEB/views
{ "name": "Checkout bugs", "filters": { "tags": ["bug"], "projects": ["checkout-v2"] }, "layout": "board" }
GET /v1/workspaces/acme/teams/WEB/views/checkout-bugs
CLI
clanker team list
clanker ticket create --team WEB --title "Stacked promo codes fail at checkout" --tag bug
clanker ticket update WEB-31 --status "In Progress"
clanker ticket move WEB-31 --team PAY
clanker project create checkout-v2 --name "Checkout v2" --team WEB --team PAY
clanker milestone create checkout-v2 --name Wallets
clanker ticket reorder WEB-31 --before WEB-29
clanker status create "In QA" --category started --team PAY
clanker view create "Checkout bugs" --team WEB --tag bug --in-project checkout-v2 --layout board
clanker view show checkout-bugs --team WEB
clanker instructions show --kind ticket --team WEB
clanker instructions set --kind ticket --team WEB --tag-template-file bug=bug.md --owner creator
Agents
The MCP tools mirror the HTTP operations: list_teams, get_team,
create_team, update_team, join_team, add_team_member,
remove_team_member, list_projects, get_project, create_project,
update_project, reorder_project, archive_project, restore_project,
create_milestone, update_milestone, delete_milestone, list_tickets,
get_ticket, create_ticket, update_ticket, move_ticket,
reorder_ticket, list_views, get_view, create_view, update_view,
delete_view, list_ticket_statuses, list_tags, list_agents,
get_agent_instructions and update_agent_instructions. Agents act with their
person's role; an agent of a member cannot create a team. An agent names itself
as a ticket's owner with "owner": "me", and works through a view with
get_view, such as "work through the Checkout bugs view".
Before writing a ticket or a plan, an agent calls get_agent_instructions with
the kind and the team. A ticket an agent creates gets the instructions'
default status, tags and owner for what it leaves out. The plugin's
create-ticket and write-plan skills do this.
show_work, show_ticket and show_inbox answer with My work, a ticket or
the agent's inbox. Clients with MCP Apps draw them as screens the person can act
on; others get text with the website link. See
Agents and MCP.