Ticket Fields
Commands: ti tag, ti assign, ti priority, ti points, ti milestone, ti subissue, ti spec, ti code, ti meta, ti edit
Every ticket has a set of built-in fields. These commands let you set them without opening an editor.
Tags
$ ti tag bug
$ ti tag "bug,urgent"
$ ti tag --ticket a3f security compliance
$ ti tag --remove bug
$ ti tag -d urgent
Tags are useful for filtering:
$ ti list --tag bug
$ ti list --only-tagged
Assign
$ ti assign alice@example.com
$ ti assign --ticket a3f bob@example.com
$ ti assign --clear
Removes the assignee.
In list output, the email domain is stripped for readability (alice@example.com shows as alice).
$ ti list --assigned alice@example.com
Priority
$ ti priority 3
$ ti priority --ticket a3f 5
$ ti priority --clear
Lower values mean more important (e.g. 1 is highest priority). Priority is the dominant factor in ti next scoring.
Points
$ ti points 5
$ ti points --ticket a3f 8
$ ti points --clear
Milestone
$ ti milestone v2.0
$ ti milestone --ticket a3f "sprint-14"
$ ti milestone --clear
Sub-issues
Tickets can be organized into parent/child hierarchies. A child ticket has a single parent, and a parent ticket lists all its children.
$ ti subissue a3f
Makes the checked-out ticket a sub-issue of a3f.
$ ti subissue --ticket b7e a3f
Makes b7e a sub-issue of a3f.
$ ti subissue --clear
Removes the sub-issue relationship from the checked-out ticket.
You can also create a ticket as a sub-issue in one step:
$ ti new --title "fix edge case" --subissue a3f
Created: c4d81b (sub-issue of a3f29c)
When a ticket has a parent or children, ti show displays the relationships:
$ ti show a3f
-----------------------------------------------------------
Title : Refactor auth middleware
Id : a3f29c84-d6ec-3da1-a180-0a33fb090d59
Created : 2026-05-09 (0d) by alice@example.com
Status : open
State : in-progress
Children : c4d81b, e9f2a1
Tags : security, refactor
...
Circular chains are detected and rejected. A ticket cannot be its own ancestor.
Spec
The spec field holds implementation specifications -- the "how", separate from the description's "what/why". It's a top-level ticket field like title and description.
Use a spec when the ticket title and description identify the problem, but the implementation path needs to be agreed on before coding. Specs are especially useful for multi-step changes, agent workflows, and review handoff because they travel with the ticket and show up in JSON, Markdown, and filtered output.
Viewing the spec
When a spec is set, ti show displays its first line in the ticket header:
$ ti show a3f
-----------------------------------------------------------
Title : Refactor auth middleware
Id : a3f29c84-d6ec-3da1-a180-0a33fb090d59
Created : 2026-05-09 (0d) by alice@example.com
Status : open
State : in-progress
Spec : Use RS256 tokens with 24h expiry, rotate via cron
Tags : security, refactor
...
To read the full spec (which may be multiline), use --filter or --json:
$ ti show a3f --filter .spec
Use RS256 tokens with 24h expiry, rotate via cron.
Migrate existing HS256 sessions in a background job.
Add a feature flag for gradual rollout.
$ ti show a3f --json | jq -r '.spec'
Use RS256 tokens with 24h expiry, rotate via cron.
Migrate existing HS256 sessions in a background job.
Add a feature flag for gradual rollout.
Setting the spec
Use ti spec to set the spec inline, from a file, or via your editor:
$ ti spec "Use RS256 tokens with 24h expiry"
a3f29c spec: Use RS256 tokens with 24h expiry
$ ti spec --ticket a3f "Use RS256 tokens with 24h expiry"
$ ti spec
Opens $EDITOR with the current spec for editing.
$ ti spec --ticket a3f
Edit the spec for a specific ticket.
Code
Link a ticket to a specific branch in a Git repository using ti code. The URI format is https://<host>/<path>:<branch>.
$ ti code https://github.com/schacon/ticgit:sc-fix-parser
a3f29c code: https://github.com/schacon/ticgit:sc-fix-parser
$ ti code --ticket a3f https://github.com/schacon/ticgit:feature-branch
The URI is validated on set: it must start with http:// or https://, include a host and path, and end with :branch-name.
Custom metadata
For anything that doesn't fit the built-in fields, use ti meta to set arbitrary key-value pairs:
$ ti meta branch feature/auth-refactor
$ ti meta priority P0
$ ti meta --ticket a3f source "customer-report"
$ ti meta spec-doc --file design.md
Custom metadata shows up in ti show output and in JSON:
$ ti show a3f --filter .meta.branch
feature/auth-refactor
All fields in JSON
The full ticket schema is at ticgit.dev/schema/v1.json. A ticket object looks like:
{
"id": "a3f29c84-...",
"title": "fix parser panic",
"description": "Panics on empty input...",
"spec": null,
"status": "open",
"state": "in-progress",
"assigned": "alice@example.com",
"points": 5,
"milestone": "v2.0",
"code": "https://github.com/owner/repo:fix-branch",
"tags": ["bug", "urgent"],
"parent": "7b2e4f91-...",
"children": ["c4d81b23-...", "e9f2a1d7-..."],
"meta": { "branch": "feature/fix-parser" },
"comments": [...],
"created_at": "2026-05-01T10:30:00Z",
"created_by": "bob@example.com"
}