diff --git a/src/app/api/devops/standup/route.ts b/src/app/api/devops/standup/route.ts index 9fd9d6f..fca3438 100644 --- a/src/app/api/devops/standup/route.ts +++ b/src/app/api/devops/standup/route.ts @@ -240,13 +240,14 @@ export async function GET(request: NextRequest) { const displayColumnNames = new Set(displayColumns.map((c) => c.name)); - // Map non-display states to the fallback column for their category + // Map non-display states to the fallback column for their category. + // 'Removed' is omitted because getStandupData filters those out before + // we get here (issue #277). const categoryFallback: Record = { Proposed: 'New', InProgress: 'Active', Resolved: 'Resolved', Completed: 'Closed', - Removed: 'Closed', }; // Resolve any DevOps state to one of the 6 display columns diff --git a/src/lib/devops.ts b/src/lib/devops.ts index 9700ebe..a464e26 100644 --- a/src/lib/devops.ts +++ b/src/lib/devops.ts @@ -2448,11 +2448,14 @@ export class AzureDevOpsService { nextDay.setDate(nextDay.getDate() + 1); const nextDayStr = nextDay.toISOString().split('T')[0]; - // Build state lists dynamically from categories + // Build state lists dynamically from categories. + // 'Removed' states are intentionally excluded — removed work items are + // hidden from the Kanban board (issue #277). const doneStates: string[] = []; const activeStates: string[] = []; for (const [state, category] of Object.entries(stateCategories)) { - if (category === 'Resolved' || category === 'Completed' || category === 'Removed') { + if (category === 'Removed') continue; + if (category === 'Resolved' || category === 'Completed') { doneStates.push(state); } else { activeStates.push(state);