Orkestia
Blog
Cockpit app

Tickets

The Tickets section of Orkestia Cockpit — the board and the list, the filters, what led to a ticket and what it produced, and how the app copes with an older platform

Tickets is the last item of the Today group. It shows what the organization is working on and what that work produced: the tickets the platform holds, the plans written for them and the runs those plans started. The section only reads; to create, plan or launch a ticket use the coding agent flow and the tickets guide.

Every list is a page of the platform's ticket.search workflow, and the ticket behind a row is ticket.get. Both run in the window's organization, so switching organization drops everything of the old one: the rows, the pick, the filters and the view.

Board and List

The Board | List switch sits in the toolbar of both views. Switching only changes the view: the rows in hand, the picked ticket and the filters stay, and nothing is read again. A fresh window opens on Board.

Board

Five columns, in this order. A ticket sits in the column its status maps to.

ColumnStatuses that land here
Newopen, and any status the board does not model. A ticket nobody has triaged is New
Triagedtriaged
In progressin_progress
Blockedblocked
Doneresolved, closed

Done is hidden by default: Show done (N) in the toolbar reveals it. Ignored tickets are not work in New, so they sit in a collapsed Ignored (N) trail under the columns.

Each column heading shows its count. Picking a card opens the ticket page beside the board.

List

The list column holds the tickets, the ticket page fills the right. The column resizes by its edge. The picked row scrolls into view.

Each row shows a status dot, the title, a status tag, the kind, how long ago it was last touched (updated_at, or last_seen_at when the platform has no update time), N times when it recurred, and Waiting on you when the ticket carries the founder-wait label.

Similar tickets fold

Tickets that are the same item said twice show as one card with a N similar disclosure. Two tickets stack when they have the same status and the same title after the app lowercases it and removes a leading [tag] and any UUID. Stacks only form inside one column, the newest ticket is the card, and a stack that holds the picked ticket stays open. Wording that still differs stays separate.

Search and filters

ControlBehavior
Search ticketsTyping narrows the rows already loaded at once (title, UUID and labels). Enter asks the platform for the pages of what you typed. Esc clears it and reloads
Filters (List only)Status: All, Open, Triaged, In progress, Blocked, Resolved, Closed, Ignored. The Board shows a Show every status link instead when a status is chosen
PriorityAll, Urgent, High, Normal, Later
OwnerAnyone, Mine (disabled without a signed-in user), Unassigned

Choosing a filter drops the rows in hand and reads the new set from the platform. The platform's priority names map to words: page is Urgent, priority High, routine Normal, deferred Later. The aliases urgent, high, medium and low fold onto the same words. Severity reads as Critical, Major, High, Medium, Minor or Low.

Filters that are empty are not sent. The call carries only what you chose.

Paging

The platform returns a page at a time (50 rows by default). Load more tickets (under the list, or in the Board toolbar) follows the platform's cursor and appends. The subtitle reads N matching, or N of M matching when the platform reports a total larger than what is loaded. A read counts as fresh for 30 seconds: reopening the section inside that window does not call the platform again; the reload button does.

Older platforms

A platform that predates the newer filter fields rejects them. The app then drops those fields, falls back to limit and offset, and applies your filters to the rows already loaded instead. When that happens and you chose a status, priority or owner, the filter bar says Showing the tickets already loaded. Owner filters cannot be applied locally (a row carries no assignee), so on such a platform they narrow nothing until the platform supports them.

If a page is larger than the platform sends at once, the app asks again with half the page.

The ticket page

Picking a ticket shows what the row already had straight away and the full ticket as soon as it is read.

PartContent
Header lineStatus, priority, severity and kind, Waiting on you when the founder-wait label is set, and when it was last seen
DatesOpened and Last seen, in your local time
Labels (N)Collapsed; the founder-wait label is shown as a tag instead
Impact and Required to unblockLifted out of the description when it has a paragraph that starts with those words (or a heading of the same name), so you read them first
Full reportThe rest of the description, collapsed when Impact or Required to unblock was lifted out; shown in full otherwise
Coding specThe ## Coding spec section of the body, collapsed
What led hereLinks and events. See below
What it producedPlans and runs. See below
ButtonsCopy Ticket ID, Open on the web

What led here

The links ticket.get returns plus the ticket's events, newest first.

  • Search link notes matches the note text on a link, not the UUID it points at.
  • Link kind and Target type are built from what the links in hand carry. A ticket with no link of a kind does not offer it.
  • A link to another ticket opens that ticket in the section, so you can walk the chain. A link to anything else is a reference, not a button. Its badge shows the target's status only when that ticket is in the loaded rows; otherwise it reads idle rather than a guess.
  • Events show what happened, who did it (system when the platform does not say) and when.

Your choices on this column stay when you pick another ticket, so the same kind filter reads the next ticket of a chain.

What it produced

The plans written for the ticket and the runs those plans started, in the same state vocabulary as the rest of the app.

  • Plan status and Run state narrow what is shown. They are views over the loaded ticket, not queries, and they also survive a change of ticket.
  • A row can open a URL or show an age only when the platform's answer carries one; the app does not invent either.
  • Right-click a row for its menu (copy id; open when a URL exists).

Empty and error states

You seeMeaning
Loading tickets…The first read is running
Couldn't load: …The first read failed. Rows already in hand stay when a later reload fails; the toolbar shows Couldn't refresh with the reason on hover
No tickets matchWiden the filters or clear the search
Pick a ticketNothing selected. The pane lists what the page will show
Nothing led hereThe ticket carries no links and no events yet
Couldn't open the ticket: …ticket.get failed for the pick
A decision about a ticket in Decisions shows the same ticket with its timeline. Use the ticket page when you want the whole history, and the decision when you want to answer.