Skip to content

Issue trackers

Used with cascade ticket <provider>:<id> to fetch a ticket from your tracker and run it through the pipeline. The same module also backs cascade build when stories were originally extracted from tickets.

TrackerIdentifier formatExampleHosted/Self-hosted
GitHub Issuesgithub:owner/repo#Ngithub:myorg/myrepo#42Both (Enterprise via --base-url)
Jirajira:KEY-Njira:PROJ-123Cloud + Server / Data Center
Linearlinear:KEY-Nlinear:ENG-456Cloud only
Azure DevOps Boardsazure_devops:org/project/Nazure_devops:myorg/myproj/123Cloud + Server
GitLab Issuesgitlab:group/project#Ngitlab:myteam/myrepo#42Cloud + Self-hosted
Terminal window
cascade configure issue github --token ghp_xxx

Reuses the same token type as the GitHub VCS provider. If you already ran cascade configure vcs github, you can use the same token.

Required scopes:

  • repo (full) for private repos
  • public_repo is enough for public repos
Terminal window
cascade configure issue jira \
--token JIRA_API_TOKEN \
--base-url https://yourcompany.atlassian.net \

Create the API token at id.atlassian.com/manage-profile/security/api-tokens. The token is sent with your email as HTTP Basic auth (Atlassian’s standard scheme).

Required permissions: Browse Projects, View Issues on the project containing the tickets.

Same configure command, but --base-url points at your installation:

Terminal window
cascade configure issue jira \
--token JIRA_API_TOKEN \
--base-url https://jira.acme.com \
--user your-jira-username

Note: Jira Server uses your Jira username (not email) for the --user flag.

Terminal window
cascade configure issue linear --token lin_api_xxx

Create the token at linear.app/settings/api. Tokens are workspace-scoped; if you work across multiple Linear workspaces, you need one token per workspace.

Required permissions: Read access to the team containing the tickets. Linear’s permission model is per-workspace, not per-token.

Terminal window
cascade configure issue azure_devops --token your_pat

PAT scopes:

  • Work Items (Read) for fetching tickets
  • Code (Read) if you also want Cascade to push to the same Azure DevOps repo

If you already configured Azure DevOps as your VCS provider, you can reuse that PAT as long as it has Work Items (Read).

Terminal window
cascade configure issue gitlab --token glpat-xxx
# Self-hosted GitLab
cascade configure issue gitlab --token glpat-xxx --base-url https://gitlab.acme.io

Token needs api scope (read is sufficient for fetching issues).

For each tracker, Cascade pulls the ticket and converts it into a Story:

Story fieldSource
TitleTicket title
DescriptionTicket body. Format conversion: Jira ADF → plain text; Linear markdown → preserved; GitHub markdown → preserved; Azure HTML → plain text; GitLab markdown → preserved.
Acceptance criteriaOne placeholder criterion. If you want richer criteria, run with --no-pr and edit before building, or pre-extract via cascade ticket --extract-only.
StatusSet to APPROVED automatically. Tracker tickets are assumed pre-approved by whoever ticketed them.
Source linkIncluded in the story notes and the opened PR description.
SizeEstimated by the LLM from the description length and complexity.
NotesIncludes the original ticket URL and the fetched timestamp.
  • Custom fields (Jira story points, Linear estimates, etc.)
  • Labels and tags
  • Sprint / iteration assignments
  • Assignee and reporter
  • Sub-tasks and linked tickets
  • Attachments
  • Comments

These all live in the tracker. If your team relies on them, capture the relevant detail in the ticket description before running Cascade, or in your team-memory/conventions.md.

What happensWhyFix
404 Not Found from any trackerWrong identifier, or no read access to the projectVerify the identifier format. Confirm your token has read access.
Jira: 401 UnauthorizedWrong email or tokenFor Cloud, email is your Atlassian login (not display name). For Server, it is your Jira username.
Linear: UnauthorizedWrong workspace or token revokedVerify token at linear.app/settings/api. Tokens are workspace-scoped.
GitHub: 403 Forbidden on org repoOrganization has not approved your fine-grained PATOrg admin must approve. Or use a classic PAT with repo scope.
Azure DevOps: Resource not foundPAT lacks Work Items (Read), or wrong org/project in identifierCheck PAT scopes and identifier format.
GitLab: Insufficient scopeToken has only read_user, not apiRecreate with api scope.

Cascade does not currently have a built-in bulk ticket import. For a sprint of tickets, loop:

Terminal window
for ticket in PROJ-101 PROJ-102 PROJ-105 PROJ-110; do
echo "==> Building $ticket"
cascade ticket "jira:$ticket" --max-cost 1.00 || break
done

--max-cost aborts the loop if cumulative cost exceeds budget. || break stops on the first failure.

For a Linear cycle:

Terminal window
# Get a list of ticket IDs from Linear's API or CLI, then:
for ticket in $(cat sprint-tickets.txt); do
cascade ticket "linear:$ticket"
done

Tracker tickets are written for humans, not for AI agents. They often lack technical detail. Two patterns:

Edit the ticket in the tracker, add file references, acceptance criteria, and out-of-scope notes. Re-run cascade ticket. Cascade fetches the latest version every time. This works well if your team treats tickets as the source of truth.

Pattern 2: Use a prompt with ticket context inline

Section titled “Pattern 2: Use a prompt with ticket context inline”
Terminal window
cascade prompt "Implement PROJ-123 (cursor pagination on /api/users): use ?limit (default 50, max 200) and ?after (last seen ID), wrap responses in {data: [...], cursor: '...'}, update the OpenAPI schema in docs/api.yaml"

This works well when you have specific technical context not worth adding to the ticket itself.

  • Bulk import: cascade ticket --query "project = PROJ AND status = 'To Do'" to fetch a backlog as a StoryBatch
  • Bidirectional sync: post a comment on the ticket when the PR opens, update status when the PR merges
  • ClickUp, Asana, Shortcut, Trello as additional trackers
  • Sub-task expansion: walk the link graph and fetch related tickets