Tagout

.NET add-on

tagout-migrate takes a legacy .NET application to verified production with the seven-phase /migrate pipeline. RoselineMCP does every C# analysis and edit, so it needs the .NET 10 SDK. It installs next to tagout, the issue → pull request lifecycle:

claude plugin marketplace add phmatray/tagout
claude plugin install tagout@tagout-marketplace
claude plugin install tagout-migrate@tagout-marketplace
Chords
18 min
Les Fleurs du Mal
~30 min
Pokédex G
~1 h

Seven locks, one hasp

assess read-only audit
baseline tests and diagnostics recorded
retarget target framework moved
remediate errors and warnings cleared
modernize safe idioms applied
verify build and tests green
deliver report and release

Lock-out record: four dead platforms, cleared

Four apps from 2013–2016, built for platforms nothing runs any more, were audited, migrated to Blazor WebAssembly and verified live: characterization tests first, legacy data and art byte for byte, measured WCAG AA, offline proven with the network cut. The minutes come from the gate commits, not a stopwatch.

App, liveLocked onCleared in
ChordsWindows Phone18 minpipeline, measured
Les Fleurs du MalWinRT 8.1~30 minpipeline, measured
Pokédex GUWP, SQLite 49 MB~1 hpipeline, measured
SokobanWinRT 8.1First wavenot timed

The audit, the per-app reports and what each wave taught the kit: the case study.

A refusal, as the gate writes it

The roseline gate denies a Read of a C# file and names the tool that replaces it. Why the gate exists.

Refusal, as written by the gatehooks/roseline-gate.sh

Locked by
roseline-gate.sh
On
Read of Program.cs
Reason
Program.cs is C#, and this kit routes all C# analysis through RoselineMCP.
Use instead
mcp__roseline__search_symbols for the file's shape, mcp__roseline__get_symbol_info to read one member's body.

What the gates refuse

Two ways an agent-driven upgrade goes wrong without anyone noticing, and the lock that stops each one.

  • Upgrading means bumping the target framework and hoping.

    Seven phases, each ending at a build, test and diagnostics gate. A red gate stops the pipeline.

  • The agent reads whole C# files instead of asking Roslyn.

    The roseline gate denies a Read of a .cs file and names the RoselineMCP tool that replaces it.

Which command?

Once installed, say what you have.

SituationReach for
A legacy .NET app/migrate-assess, then /migrate
A migrated app to re-verify/migrate-verify
A portfolio to cost/migrate-audit
Open follow-ups across migrated repos/migrate-followups

More: a real pipeline run on the bundled legacy fixture, and the audit, the per-app reports and what each wave taught the kit.