deprecation-and-migration

Plans deprecation and migration of .NET code, NuGet packages, and EF Core schemas.

7|Updated Jan 11, 2026
One-click install
npx skills add https://github.com/peterblazejewicz/claude-plugins --skill deprecation-and-migration-peterblazejewicz
Or copy as Structured Prompt for Agent
Please help me install this Agent Skill.
Skill: deprecation-and-migration
Source: https://github.com/peterblazejewicz/claude-plugins/tree/main/plugins/dotnet-skills/skills/deprecation-and-migration
Command: npx skills add https://github.com/peterblazejewicz/claude-plugins --skill deprecation-and-migration-peterblazejewicz

SYSTEM DOCUMENTATION & REQUIREMENTS

What problem does it solve? Removing old .NET code is hard: consumers depend on undocumented behavior, migrations stall, and zombie code accumulates security debt. This Skill provides a disciplined process for deprecating systems and migrating consumers safely, from the initial decision through final removal. ## Core Features & Use Cases - Deprecation Decision Framework: Structured questions to decide whether to maintain, deprecate, or remove a system, using NuGet download stats, Application Insights telemetry, and maintenance-cost analysis. - Four-Step Migration Process: Build the replacement, announce with a migration guide, migrate consumers incrementally, then remove the old system with verification of zero usage. - Migration Patterns: Strangler pattern with canary traffic, adapter pattern bridging sync-to-async APIs (with deadlock warnings for UI threads), and feature-flag migration using IOptionsMonitor, including EF Core dual-write schema migrations. - Use Case: You need to retire a legacy synchronous TaskService in favor of an async ITaskService. The Skill walks you through marking the old type [Obsolete], shipping a Roslyn analyzer code fix, migrating DI registrations, and unlisting the old NuGet package. ## Quick Start Ask the agent to plan the deprecation of a legacy service or NuGet package and produce a migration guide with incremental rollout steps.

Frequently Asked Questions about deprecation-and-migration

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I deprecate a .NET API or NuGet package safely?

Deprecate a .NET API by first shipping a production-proven replacement, then marking the old type with [Obsolete] and publishing a migration guide. Migrate consumers incrementally, verify zero usage via telemetry or grep, and only then remove the code and unlist the old NuGet package.

What is the difference between advisory and compulsory deprecation in C#?

Advisory deprecation uses [Obsolete("Message", error: false)] so consumers migrate on their own timeline, while compulsory deprecation uses error: true with a hard removal deadline. Default to advisory; use compulsory only when security risk or maintenance cost justifies forcing migration with tooling.

Is it safe to use GetAwaiter().GetResult() in a sync-to-async adapter?

GetAwaiter().GetResult() is acceptable only inside an adapter whose explicit purpose is bridging sync callers to async code and whose host captures no SynchronizationContext. In WPF, WinForms, MAUI, or Avalonia UI threads it deadlocks; prefer making signatures async or using Task.Run with a busy state.

How do I migrate an EF Core schema without downtime?

Migrate an EF Core schema incrementally using the dual-write pattern: write to both old and new columns behind a feature flag, backfill existing data, then flip reads to the new schema. This mirrors the strangler pattern and avoids a single high-risk cutover.

When should I remove zombie code instead of maintaining it?

Remove zombie code when it has no owner, no commits in 6+ months, skipped tests, vulnerable NuGet dependencies, or an EOL TargetFramework. Either assign an owner and invest in maintenance, or deprecate it with a concrete migration plan — limbo is not an option.