Review the theme taxonomy
Find duplicate, vague, oversized and stale themes in Deck, propose fixes, and apply them after the user approves.
This page is an agent-readable workflow for Deck. Humans can follow along. Coding agents should treat the steps as the source of truth.
Review the theme taxonomy — agent workflow
- Use it when: the user asks "clean up our themes", "we have duplicate themes", "review the taxonomy" or "which themes are stale?", or after a large import.
- Outcome: each problem theme has a decision. Duplicates are merged, vague themes have clear names and descriptions, oversized themes are split, and stale themes are kept or archived by the user's choice.
- Needs: Deck MCP. Every member with MCP access can use the theme write tools. They spend no credits. Subthemes, which help to split a theme, need the Starter plan or higher.
1. Probe Deck MCP
Call get_user_context. This must be a real tool call.
- 401 Unauthorized: tell the user to connect Deck MCP in this client (Settings → Connections). Stop.
- No Deck tools: fetch and follow https://docs.getdeck.io/docs/agents/getting-started/prompts/ai-pm.md. Stop this workflow until the tools work.
2. List every theme
Call explore_themes with limit set to 100 and include_empty set to true. Page with offset until you have every theme. Keep the ID, name, description, insight_count, recent_insights and latest_insight_at of each theme.
Make these calls at the same time, to find stale themes:
explore_themeswithsortset tolatest_insight_atanddirectionset toasc. The first rows had no new insights for the longest time.explore_themeswithwindow_daysset to 180 andlimitset to 100. Page withoffsetuntilhasMoreisfalse. A theme of the full list that is in no page of this list had no insights in the last 180 days.
3. Find the problems
Check each theme against these four tests. A theme can fail more than one.
- Duplicate: two themes cover the same product area. Look for similar names, and call
explore_themeswith aqueryword to find themes whose name or description match. Compare a sample of their insights withexplore_insightsandtheme_id. An insight that is in both themes shows the overlap:explore_insightswithinsight_idlists itstheme_associations. - Vague: the name does not say a product area, for example "General", "Other", "Issues" or "UX". Or the name says a feeling or a solution. Or the description is empty.
- Oversized: the theme is at the top of Deck's
insight_countorder and holds several product areas. Callexplore_subthemeswith itstheme_idandsegment_scope: "all_customers". Subthemes that belong to different product areas show where to split. - Stale: step 2 shows no recent insights, or
insight_countis 0. The area can still be valid: a fixed problem also stops new feedback.
4. Propose the fixes
Show the user one table: theme, problem, Deck's evidence (counts and dates), proposed fix. Use these fixes:
| Problem | Fix | Tools |
|---|---|---|
| Duplicate | Merge into the clearest theme | merge_themes, then update_theme for the target |
| Vague | New name and description | update_theme |
| Oversized | Split one area into a new theme | create_theme, then move_theme_insights |
| Stale with insights | Keep, or merge into a broader theme | merge_themes |
| Stale with 0 insights | Keep, or archive | archive_theme |
Name and description rules:
- A name has 1 to 120 characters and must be unique in the organization, without case. Archived themes keep their names. A taken name returns
CONFLICT. When the conflict is an archived theme, the message gives its ID forrestore_theme. - To give a merge target the name of a source, first rename the source with
update_theme, then merge, then rename the target. - A description has at most 1000 characters. It says what belongs in the theme and what does not.
- When PII redaction is on, Deck masks the emails and phone numbers in the theme descriptions that it returns, for example
j***@acme.com. Never send a masked description back: Deck refuses it withVALIDATION_ERROR. Write a new description without the masked text, or do not change the description.
Ask: "Apply these fixes?" Wait for a yes. Then get an explicit yes for each merge and each archive.
5. Apply the fixes
- Merge:
merge_themeswithtarget_theme_idand 1 to 10source_theme_ids. Deck moves every insight link to the target, removes duplicate links and archives the sources. Readlinks_movedandarchived_theme_ids. It cannot be fully undone:restore_themebrings back an empty source theme. - Rename or describe:
update_themewiththeme_idand one or more ofname,descriptionandcolor. - Split:
create_themewithnameanddescription. Thenmove_theme_insightswithsource_theme_id,target_theme_idand up to 100insight_idsfor each call. Get the IDs fromexplore_subthemeswith asubtheme_idandviewset toinsights, or fromexplore_insightswiththeme_id. Readmovedandnot_linked. - Archive:
archive_themewiththeme_id.restore_themewith the sametheme_idundoes it.
One unknown insight ID fails the whole call with NOT_FOUND. The missing IDs are in error.details.details.missing_insight_ids. Remove them and call again.
6. Check the result
- Call
explore_themeswith each changedtheme_id. For a merge, use the target ID. - Call
explore_themesfor the full list again. Show the user the changed themes with Deck's counts and theirdeck_url. - Tell the user that subthemes do not change now. Deck rebuilds them on the next synthesis run.
For a full redesign of the themes, fetch and follow https://docs.getdeck.io/docs/agents/workflows/design-taxonomy.md.
Rules
- Base each finding on Deck's data: counts, dates, subthemes and sample insights. Do not guess from names alone.
- Quote Deck's numbers. Do not compute your own.
- Show the plan and get a yes before you call write tools.
merge_themesis a sensitive write: get an explicit yes for each merge, every time. Do the same for eacharchive_themecall. - Do not archive a theme that still has insights. Merge it into the theme that should hold them.
- After each write, check for a top-level
errorkey. Whenidempotency.replayedistrue, Deck did not run the write again. See Write responses and retries. - If the user has more than one Deck organization, call
select_organizationfirst and passorg_idon every call.
Done when
- Each problem theme has a fix that the user approved or declined.
- Each approved fix returned success, and
explore_themesshows the result. - The user knows that subthemes refresh on the next synthesis run.