AnyKanban

A board for types that never reach a backlog

Support requests, customer feedback, impediments, risks and test cases are real work with real states, and none of them appear on any backlog. Azure Boards draws a board for the backlog levels of a team, so a work item type that sits outside that hierarchy has no board at all. The items exist, people work on them every day, and the only way to see them together is a query result: a flat table, with no columns, no flow and no order anyone agreed on.

AnyKanban closes that gap without changing anything about your process. A query finds the items, the work item type's own state model supplies the columns, and everything the query returns becomes a card.

This guide is written for the process owner or team lead who runs this kind of work. It covers the query, the board, telling several types apart, making service-level pressure visible, and, the part that decides whether the board is trusted, what happens when the types you put on one board have state models that do not line up.

The types this guide is about

The demo organization runs the same five types most insurers and banks end up with beside their delivery backlog:

Type What it holds Why it has no board
Support Request Customer and broker incidents, with a service-level date Not a backlog level. It feeds delivery work rather than being delivery work
Feedback What users and brokers tell you, before anyone decides what to do about it Deliberately outside the backlog: most of it never becomes a work package
Risk Operational and audit findings under active management Governance, tracked by a different group of people entirely
Impediment Blockers raised in the Daily Scrum A Scrum process type that is not on a backlog level
Test Case Regression evidence Lives in Test Plans, not on a backlog

Each one already has states, an owner and a life cycle. What none of them has is a column.

The query

Board membership comes from one saved flat query. For the support desk in the demo organization, with the neighboring types it works alongside:

SELECT [System.Id]
  FROM WorkItems
 WHERE [System.TeamProject] = 'Claims Platform'
   AND [System.WorkItemType] IN ('Support Request', 'Feedback', 'Impediment', 'Test Case')
 ORDER BY [Microsoft.VSTS.Common.StackRank] ASC

Three details separate a board that works from one that half-works:

Risks in the demo organization live in Core Insurance, not in Claims Platform. Widening the board to include them is a query edit and nothing else: add 'Risk' to the type list, widen the project clause to IN ('Claims Platform', 'Core Insurance'), and turn on Query across projects in the query editor. Without it, Azure DevOps scopes the query to the project it is saved in. The board needs no change at all: it reads and writes items in every project the query returns.

Screenshot pending: The backing query in the query editor: flat, several types, ordered by rank

Building the board

  1. In your project's left navigation, open Boards and select AnyKanban.
  2. Select New board. The suggestions gallery opens. Choose Use existing query, and the board settings panel, titled New board, opens on General.
  3. Board name. What the team calls this work, for example Support desk.
  4. Backing query. Pick the saved query. Queries are listed with their folder path, and only the first two levels of the query tree are offered, so keep board queries near the top of Shared Queries.
  5. Work item type. Pick Support Request. This choice supplies the columns, and it is the one decision on this panel you should make deliberately: pick the type whose flow the board is meant to show.
  6. Card order. The row appears once the type is chosen and names the field the type orders by. Nothing is chosen here. In the demo organization, whose process inherits from Scrum, Support Request carries no Backlog Priority, so with Stack Rank on the type the row begins Support Request orders by Stack Rank because it does not carry Backlog Priority, the order field of your process. While the type carries neither field, the board has only the process's Backlog Priority to look for, and this query sorts by Stack Rank, so the row says the query controls the order. A query with no ORDER BY gets a different sentence there: the type does not have Backlog Priority, with the page where an administrator adds it.
  7. Select Create, then open the board from the list.

The columns are the Support Request type's own states, in state-category order: New, Triage, In Progress, Waiting on customer, In Review, Done. Nothing here is hardcoded and nothing is invented. Waiting on customer is a state this organization added, and it becomes a column because the process says it exists. The Rejected state does not become a column: it belongs to the Removed category, and removed-category states stay off the board exactly as they do on native boards.

Then open Settings and make the board readable at a glance:

Tab Setting Why it earns its place here
Fields Card fields: Assigned To, SLA due The date the conversation is actually about, on the card
Columns WIP limit 3 on In Progress A support desk fails by starting, not by finishing
Columns Definition of done on Done Written once, read by whoever picks up the queue next
Tag colors sla-breach, regulatory, complaint Three tags this queue really carries. Add Tags to the card fields above if you want the colored pills on the cards
Styles An SLA rule, described below

Two things about card fields on a board like this. Work Item Type is not available as a card field. Like the title, the ID and the state, it belongs to the card's own frame rather than to the list you configure. On a board carrying several types you still tell them apart at a glance: each card shows its own type's icon beside the title and its own type's color on the left strip, so a support request, a risk and a test case look different as long as your process gives them different icons and colors. If Azure DevOps cannot describe a type, for example one that exists only in another project, its cards show a plain square where the icon would be. To group the types rather than just mark them, use swimlanes by type or the List view's Type column. And the counter in a column header counts every item in that column, including the ones your filter is currently hiding, because a work-in-progress limit measures real work in progress not what you happen to be looking at. Nothing is ever blocked; the counter turns red above the limit and that is the whole mechanism.

The support board: SLA styling, the SLA due date on each card and a work-in-progress limit

Telling the types apart, with swimlanes by work item type

On a board that carries four or five types, the most useful grouping is usually the type itself. Open Settings → Swimlanes and, in the simple-mode box at the bottom, enter the reference name System.WorkItemType. Leave the named lanes above it empty, because lanes with conditions take precedence over simple mode whenever both are filled in.

The board then renders one row per distinct type in the result set, in alphabetical order, each with its own header, its own collapse chevron and its own count. Support requests, feedback and test cases stop competing for the same column.

Swimlanes by work item type: one row per type, each with its own count

Three things to know before you turn this on:

Cards whose state is not a column of the board's type appear in an Unmapped column at the right of their own lane row. The next section explains why.

When the state models do not line up

Put four types on one board and their state models will not agree. This is where AnyKanban makes a deliberate choice, and it is worth understanding rather than working around.

Columns follow exactly one type, the one on the General tab. When the query also returns other types and at least one of their cards is in a state that has no column, a warning card appears above the board:

Some cards have work item types whose states do not match the columns for “Support Request”. They appear in Unmapped: Closed, Design, Open, Ready. Filter the query to matching work item types, or review those cards in Unmapped.

The list after the colon names the states that actually stranded cards on your board. On the demo board it is those four, the states of the impediments and test cases.

Behind the warning is the rule the board follows: a card is placed by its state name, not by its type. If an item's state is one of the board's columns, it goes into that column no matter what type it is. Only items in a state that has no column go to Unmapped, and the column is drawn only while the board holds at least one such item.

On the demo board, widened to include Risks, that works out like this:

Item Type State Where it lands
"Kestrel Logistics: claim 2026-04417 stuck after adjuster upload" Support Request In Progress In Progress
"Trident Freight: fleet policy renewal not visible in the broker portal" Support Request Waiting on customer Waiting on customer
"Adjusters ask for the damage photos before the policy summary" Feedback Triage Triage, because Feedback has a Triage state too
"Single adjuster can both approve and release a payout" Risk In Progress In Progress, the same state name on a different type
"Test environment has no anonymised claims data since the June refresh" Impediment Open Unmapped, because Support Request has no Open
"Payout below €500 is released without a second approval" Test Case Ready Unmapped, because Support Request has no Ready

Feedback and Risk share enough of the support desk's vocabulary to sit in ordinary columns and be managed there. Impediment (Open / Closed) and Test Case (Design / Ready / Closed) speak a different language, and the board says so instead of guessing.

The Unmapped column, holding items whose states the board's type does not have

Why Unmapped is a feature

The alternative designs are all worse. A board could drop those items silently, and then the query and the board disagree, and nobody notices until an audit. It could invent columns for every state of every type, and then the board stops being a picture of one flow. It could refuse to load, and then a single stray item costs everyone their board.

Instead: the query is the contract. Everything the query returns is accounted for somewhere.

The List view is the complete answer

The List view renders the whole query result, meaning every card on the board, everything in Unmapped and the removed-state items the board hides, as a dense table, ID, Type, Title, State and Tags unless the board's settings choose other columns, in the query's own order. Rows drag to reorder through the same rank field as the board.

That is the surface to use when someone asks "what is actually in this queue?". Turning swimlanes on does not hide anything from the board either: whenever any card on the board is unmapped, the Unmapped column appears at the right of every lane row, and each row's Unmapped holds that row's own cards. The impediments and test cases stay on the board, inside the row for their type.

Unmapped column Swimlanes by type
Items in states the board's type lacks Shown, on the right Shown, in Unmapped at the right of each row
Grouping by type None on the board, beyond the List view's Type column One row per type
Inline New item Available Not offered
WIP limit editing from the header Available Settings → Columns instead

Both layouts show everything the board holds. Turn swimlanes on when you want each type in its own row; leave them off when you want the inline New item button and WIP limit editing from the column header.

The List view: the complete query result, with a Type column

Making the service level visible

A support board that does not show its clock is a list with extra steps. Three settings do the work.

Card styling. The demo board carries two rules, and both read tags. SLA breached matches a card whose Tags contains sla-breach. Blocked, below it, matches Tags contains blocked and paints the two blocked impediments a brighter red. To build the first one, open Settings → Styles, select Add rule, name it SLA breached, pick red from the palette, then Add condition: the Tags field, operator contains, value sla-breach. Matching cards get a faint red tint behind them (the left strip keeps showing the work item type).

A card the SLA rule matched: the red tint behind it, with the type's own color still on the left strip

Or read the date instead of a tag. A tag is only there when somebody remembers to add it. If your requests carry the SLA date, a rule can compare the date itself: SLA due, operator <, value @Today matches every request whose due date has passed, tagged or not. The demo board does not carry this rule. On the demo data it would pick out the same two requests the tag rule does, because they are the two whose SLA date has already passed.

How the rules evaluate, in the order it matters:

Tag colors. On the Tag colors tab, pick a color per tag name: sla-breach, regulatory, complaint. Tag pills render only when Tags is one of the configured card fields, and matching is exact on the tag name.

Definition of done. On the Columns tab, give Done a definition of done. It accepts bold, lists and links, and it surfaces as an info icon in the column header that opens on hover or keyboard focus, which is where "resolved" gets defined once instead of in every stand-up.

On the card itself

A support request card ends in one row of chips. The related-work chip opens the delivery work the request triggered, meaning the backlog items it is linked to, each with its current state, so you can see whether anything is actually happening without opening the item. Tasks and linked test cases can join the same row once you tick Show tasks on cards on the Annotations tab and Show test cases on cards on the Tests tab of board settings. Both start off on a board like this one. Once they are on, child tasks get a chip with a count of how many are done, which is the honest measure of how far a request has really got, and test cases get a chip of their own, so the regression evidence sits next to the work it covers. A completion count is shown even when the linked delivery item is undecomposed. It then reads 0/1, the item counting as itself. That is an answer rather than an empty value: the delivery work exists and nobody has started or broken it down yet. AnyKanban only ever adds Related links to backlog items, never parent/child. A support request can point at one team's feature and another team's backlog item at the same time, and nothing you do here changes the hierarchy those teams' boards depend on.

What stays untouched

Troubleshooting

Symptom Cause and fix
A warning says some cards' types do not match the columns Expected on this kind of board. Only items whose state the board's type does not have go to Unmapped, and the rest sit in ordinary columns.
Cards sit in an Unmapped column Their state is not one of the board's columns. Narrow the query, or build a second board whose work item type matches those items.
Dragging a card between type lanes fails, or changes its type The lane field is the work item type, so the drop asks Azure DevOps to change the item's type, which the service may refuse or accept. Type lanes are a grouping, not a control.
The Waiting on customer column dims while you drag a card, or the card returns to where it was That state belongs to Support Request, and an item of another type cannot move into a state its own type does not have. When a drag starts, the board asks Azure DevOps which states it would refuse for that card and dims those columns; a drop on a dimmed column is canceled and nothing is written. If that answer has not arrived yet, the drop is attempted, refused, and the card returns with the server's message.
Reordering does nothing The query sorts by another field, which a line above the board says; or the type has neither Stack Rank nor Backlog Priority, which the board says in a warning banner naming the process's field.
The State filter does not offer Open or Ready The State facet lists the board's columns. Type those words into the keyword box instead, because it matches the state name as well as the id, title and tags.
Some items are missing and a note counts them They are in a Removed-category state, which in this process is Rejected. Hidden from the board like on a native board; the List view still shows them.
The board is empty The query returned nothing. Run it in the query editor first.