[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-dotnet-scaffold-dotnet-test-project":3,"mdc-sel6eb-key":34,"related-repo-dotnet-scaffold-dotnet-test-project":1069,"related-org-dotnet-scaffold-dotnet-test-project":1176},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":29,"sourceUrl":32,"mdContent":33},"scaffold-dotnet-test-project","scaffold .NET test projects","Create the first .NET test project. USE FOR: \"solution has no tests\", xUnit tests, Tests.csproj\u002FProjectReference, add an omitted test project to .sln\u002F.slnx\u002F.slnf, central packages, or tests missing from CI. DO NOT USE FOR: a suitable project already registered in the requested build entry point (stop) or migration.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"dotnet",".NET (Microsoft)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdotnet.png",[12,16,19],{"name":13,"slug":14,"type":15},".NET","net","tag",{"name":17,"slug":18,"type":15},"Engineering","engineering",{"name":20,"slug":21,"type":15},"Testing","testing",4576,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills","2026-08-14T04:51:56.578848","MIT",332,[28],"agent-skills",{"repoUrl":23,"stars":22,"forks":26,"topics":30,"description":31},[28],"Repository for skills to assist AI coding agents with .NET and C#","https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills\u002Ftree\u002FHEAD\u002Fplugins\u002Fdotnet-test\u002Fskills\u002Fscaffold-dotnet-test-project","---\nname: scaffold-dotnet-test-project\ndescription: >-\n  Create the first .NET test project. USE FOR: \"solution has no tests\",\n  xUnit tests, Tests.csproj\u002FProjectReference, add an omitted test project to\n  .sln\u002F.slnx\u002F.slnf, central packages, or tests missing from CI. DO NOT USE FOR:\n  a suitable project already registered in the requested build entry point\n  (stop) or migration.\nlicense: MIT\n---\n\n# Scaffold a .NET Test Project\n\nCreate the smallest test project that fits the repository's existing build and\ntest conventions, wire it to the correct production project and build entry\npoint, and prove solution-level test discovery sees it. This skill scaffolds the\ncontainer for tests; it does not invent a solution-wide test architecture.\n\n## When to Use\n\n- A .NET solution or project has production code but no suitable test project.\n- A user asks to \"set up tests\" or \"add a test project\" from a vague starting point.\n- Tests pass when the new `.csproj` is targeted directly but CI cannot discover it.\n- A multi-project solution needs a bounded test project for one production project.\n\n## When Not to Use\n\n- A compatible test project already references the target production project.\n  Reuse it and continue with `code-testing-agent`.\n- The request is specifically about authoring or modernizing MSTest test code.\n  Use `writing-mstest-tests` after the project exists.\n- The repository's current build is broken for an unrelated reason. Report that\n  blocker; do not redesign project structure to hide it.\n- The user asks to migrate xUnit, NUnit, MSTest, TUnit, VSTest, or MTP.\n\n## Inputs\n\n| Input | Required | Description |\n|-------|----------|-------------|\n| Repository or solution path | No | Discover from the current workspace when omitted |\n| Production project | No | Infer the narrowest project in the requested scope |\n| Test framework | No | Use an explicit choice; otherwise infer repository convention |\n| Build entry point | No | Existing `.sln`, `.slnx`, `.slnf`, or project graph used by CI |\n\n## Workflow\n\n### Step 1: Establish the repository contract\n\nInspect only the files needed to answer these questions:\n\n1. Which production project is in scope?\n2. What command does CI or the repository use to build and test?\n3. Does a suitable test project already reference that production project?\n4. Which test framework and runner do neighboring test projects use?\n5. Are package versions centrally managed by `Directory.Packages.props`,\n   `Directory.Build.props`, `global.json`, or an MSBuild SDK declaration?\n6. Which target framework(s) must the test project compile against?\n\nTreat a test project as suitable only when its target framework can reference the\nproduction project and its purpose matches the requested layer. Do not create a\nsecond test project merely because its name differs from your preferred name.\n\n**No-op stop condition:** when a suitable project already exists and is registered\nin the requested build entry point, do not repair, normalize, convert, or replace\nthe solution. If the user did not ask for tests yet, report the existing project\npath and stop with the workspace byte-for-byte unchanged.\n\n### Step 2: Choose one bounded project\n\nDefault to one test project per production project, named according to repository\nconvention (`Foo.Tests`, `Foo.UnitTests`, and so on). For a vague multi-project\nrequest, start with the project that owns the user-visible behavior or has the\nhighest-value untested logic; do not create one test project per source project\nwithout evidence that the repository wants that layout.\n\nMatch, in order:\n\n1. The user's explicit framework choice.\n2. Existing test projects in the same repository.\n3. Repository-wide package\u002FSDK conventions.\n4. A standard SDK template only when the repository provides no convention.\n\nNever mix frameworks in one test project. Never add package versions directly\nwhen central package management supplies them.\n\n### Step 3: Scaffold and reference the target\n\nUse the matching `dotnet new` template (`xunit`, `nunit`, or `mstest`) rather than\nhand-writing template boilerplate. Then make only the repository-specific edits:\n\n1. Align target framework, nullable, implicit-usings, runner, and package style.\n2. Add a `ProjectReference` to each production project directly exercised by\n   the planned tests. Do not reference every project in the solution.\n3. Remove template sample tests that do not test repository behavior.\n\nFor xUnit v3 projects that the repository runs through `dotnet test`, preserve or\nadd both:\n\n```xml\n\u003COutputType>Exe\u003C\u002FOutputType>\n\u003CTestingPlatformDotnetTestSupport>true\u003C\u002FTestingPlatformDotnetTestSupport>\n```\n\n`OutputType=Exe` alone makes the self-hosted runner work with `dotnet run`; it is\nnot evidence that the repository's `dotnet test` command can discover the tests.\n\nPrefer `dotnet add \u003Ctest-project> reference \u003Cproduction-project>` for project\nreferences. Inspect the resulting project file before continuing.\n\n### Step 4: Register with the real build entry point\n\nCreating a `.csproj` is not enough. Add it to the exact solution artifact used by\nthe repository:\n\n- `.sln` or `.slnx`: `dotnet sln \u003Csolution> add \u003Ctest-project>`\n- `.slnf`: add the project to the underlying solution and include it in the\n  filter used by the requested\u002FCI test command.\n- No solution artifact: keep the existing project-oriented workflow. Do not\n  create a solution solely for aesthetics unless the user asked for one.\n\nDo not substitute a different solution file because it is easier to edit.\n\n### Step 5: Add a real smoke test\n\nReplace template examples with the **smallest smoke suite requested**. The tests\nmust:\n\n- instantiate or invoke a real symbol from the referenced production project;\n- assert a concrete result, not only non-null\u002Ftruthiness;\n- avoid network, wall-clock, process, and real filesystem dependencies.\n\nThese tests prove the project reference and discovery path. Stop after every\nbehavior explicitly named by the user is covered; extra boundary permutations\nare out of scope here and belong to `code-testing-agent`.\n\n### Step 6: Verify direct and harness-level execution\n\nRun, in this order:\n\n1. `dotnet test \u003Ctest-project>` to isolate scaffolding failures.\n2. The repository's solution\u002Froot test command to prove CI discovery.\n3. A solution\u002Fproject listing command to confirm the new project is registered.\n\nIf the direct command passes but the harness-level command discovers no new\ntest, the scaffolding is incomplete. Fix registration before reporting success.\nDo not claim success from `dotnet build` alone.\n\n## Output Contract\n\nReport a compact table:\n\n| Requirement | Evidence |\n|-------------|----------|\n| Test project created\u002Freused | Project path |\n| Production reference | Referenced `.csproj` path |\n| Build registration | `.sln`\u002F`.slnx`\u002F`.slnf` entry or project-oriented command |\n| Test discovery | Passing harness-level command and discovered test |\n\nIf validation is blocked, report the exact failing command and first actionable\nerror. Do not describe an unrun command as successful.\n\n## Validation\n\n- [ ] A suitable existing test project was ruled out before creating another.\n- [ ] Framework, runner, target framework, and package style match the repository.\n- [ ] Project references cover only the production projects under test.\n- [ ] Central package management was preserved.\n- [ ] Template sample tests were removed.\n- [ ] At least one real deterministic test asserts a concrete behavior.\n- [ ] The test project passes directly.\n- [ ] The repository's solution\u002Froot command discovers and runs the new test.\n\n## Common Pitfalls\n\n| Pitfall | Corrective action |\n|---------|-------------------|\n| Creating a project that CI never sees | Register it with the exact solution\u002Ffilter used by CI and run that command |\n| Picking a favorite framework | Infer the repository convention before using a default |\n| Adding package versions under CPM | Add versionless references and keep versions in `Directory.Packages.props` |\n| Referencing the whole solution | Reference only projects whose APIs the tests compile against |\n| Keeping `UnitTest1` | Replace it with a concrete test of repository behavior |\n| Creating parallel unit\u002Fintegration projects from a vague ask | Start with one bounded project; expand only for a demonstrated boundary |\n| Treating a green build as test discovery | Run the harness-level test command and observe the test |\n",{"data":35,"body":36},{"name":4,"description":6,"license":25},{"type":37,"children":38},"root",[39,48,54,61,95,101,140,146,271,277,284,289,346,351,362,368,388,393,416,421,427,463,489,502,533,559,572,578,590,631,636,642,654,672,683,689,694,718,731,737,742,841,846,852,933,939,1063],{"type":40,"tag":41,"props":42,"children":44},"element","h1",{"id":43},"scaffold-a-net-test-project",[45],{"type":46,"value":47},"text","Scaffold a .NET Test Project",{"type":40,"tag":49,"props":50,"children":51},"p",{},[52],{"type":46,"value":53},"Create the smallest test project that fits the repository's existing build and\ntest conventions, wire it to the correct production project and build entry\npoint, and prove solution-level test discovery sees it. This skill scaffolds the\ncontainer for tests; it does not invent a solution-wide test architecture.",{"type":40,"tag":55,"props":56,"children":58},"h2",{"id":57},"when-to-use",[59],{"type":46,"value":60},"When to Use",{"type":40,"tag":62,"props":63,"children":64},"ul",{},[65,71,76,90],{"type":40,"tag":66,"props":67,"children":68},"li",{},[69],{"type":46,"value":70},"A .NET solution or project has production code but no suitable test project.",{"type":40,"tag":66,"props":72,"children":73},{},[74],{"type":46,"value":75},"A user asks to \"set up tests\" or \"add a test project\" from a vague starting point.",{"type":40,"tag":66,"props":77,"children":78},{},[79,81,88],{"type":46,"value":80},"Tests pass when the new ",{"type":40,"tag":82,"props":83,"children":85},"code",{"className":84},[],[86],{"type":46,"value":87},".csproj",{"type":46,"value":89}," is targeted directly but CI cannot discover it.",{"type":40,"tag":66,"props":91,"children":92},{},[93],{"type":46,"value":94},"A multi-project solution needs a bounded test project for one production project.",{"type":40,"tag":55,"props":96,"children":98},{"id":97},"when-not-to-use",[99],{"type":46,"value":100},"When Not to Use",{"type":40,"tag":62,"props":102,"children":103},{},[104,117,130,135],{"type":40,"tag":66,"props":105,"children":106},{},[107,109,115],{"type":46,"value":108},"A compatible test project already references the target production project.\nReuse it and continue with ",{"type":40,"tag":82,"props":110,"children":112},{"className":111},[],[113],{"type":46,"value":114},"code-testing-agent",{"type":46,"value":116},".",{"type":40,"tag":66,"props":118,"children":119},{},[120,122,128],{"type":46,"value":121},"The request is specifically about authoring or modernizing MSTest test code.\nUse ",{"type":40,"tag":82,"props":123,"children":125},{"className":124},[],[126],{"type":46,"value":127},"writing-mstest-tests",{"type":46,"value":129}," after the project exists.",{"type":40,"tag":66,"props":131,"children":132},{},[133],{"type":46,"value":134},"The repository's current build is broken for an unrelated reason. Report that\nblocker; do not redesign project structure to hide it.",{"type":40,"tag":66,"props":136,"children":137},{},[138],{"type":46,"value":139},"The user asks to migrate xUnit, NUnit, MSTest, TUnit, VSTest, or MTP.",{"type":40,"tag":55,"props":141,"children":143},{"id":142},"inputs",[144],{"type":46,"value":145},"Inputs",{"type":40,"tag":147,"props":148,"children":149},"table",{},[150,174],{"type":40,"tag":151,"props":152,"children":153},"thead",{},[154],{"type":40,"tag":155,"props":156,"children":157},"tr",{},[158,164,169],{"type":40,"tag":159,"props":160,"children":161},"th",{},[162],{"type":46,"value":163},"Input",{"type":40,"tag":159,"props":165,"children":166},{},[167],{"type":46,"value":168},"Required",{"type":40,"tag":159,"props":170,"children":171},{},[172],{"type":46,"value":173},"Description",{"type":40,"tag":175,"props":176,"children":177},"tbody",{},[178,197,214,231],{"type":40,"tag":155,"props":179,"children":180},{},[181,187,192],{"type":40,"tag":182,"props":183,"children":184},"td",{},[185],{"type":46,"value":186},"Repository or solution path",{"type":40,"tag":182,"props":188,"children":189},{},[190],{"type":46,"value":191},"No",{"type":40,"tag":182,"props":193,"children":194},{},[195],{"type":46,"value":196},"Discover from the current workspace when omitted",{"type":40,"tag":155,"props":198,"children":199},{},[200,205,209],{"type":40,"tag":182,"props":201,"children":202},{},[203],{"type":46,"value":204},"Production project",{"type":40,"tag":182,"props":206,"children":207},{},[208],{"type":46,"value":191},{"type":40,"tag":182,"props":210,"children":211},{},[212],{"type":46,"value":213},"Infer the narrowest project in the requested scope",{"type":40,"tag":155,"props":215,"children":216},{},[217,222,226],{"type":40,"tag":182,"props":218,"children":219},{},[220],{"type":46,"value":221},"Test framework",{"type":40,"tag":182,"props":223,"children":224},{},[225],{"type":46,"value":191},{"type":40,"tag":182,"props":227,"children":228},{},[229],{"type":46,"value":230},"Use an explicit choice; otherwise infer repository convention",{"type":40,"tag":155,"props":232,"children":233},{},[234,239,243],{"type":40,"tag":182,"props":235,"children":236},{},[237],{"type":46,"value":238},"Build entry point",{"type":40,"tag":182,"props":240,"children":241},{},[242],{"type":46,"value":191},{"type":40,"tag":182,"props":244,"children":245},{},[246,248,254,256,262,263,269],{"type":46,"value":247},"Existing ",{"type":40,"tag":82,"props":249,"children":251},{"className":250},[],[252],{"type":46,"value":253},".sln",{"type":46,"value":255},", ",{"type":40,"tag":82,"props":257,"children":259},{"className":258},[],[260],{"type":46,"value":261},".slnx",{"type":46,"value":255},{"type":40,"tag":82,"props":264,"children":266},{"className":265},[],[267],{"type":46,"value":268},".slnf",{"type":46,"value":270},", or project graph used by CI",{"type":40,"tag":55,"props":272,"children":274},{"id":273},"workflow",[275],{"type":46,"value":276},"Workflow",{"type":40,"tag":278,"props":279,"children":281},"h3",{"id":280},"step-1-establish-the-repository-contract",[282],{"type":46,"value":283},"Step 1: Establish the repository contract",{"type":40,"tag":49,"props":285,"children":286},{},[287],{"type":46,"value":288},"Inspect only the files needed to answer these questions:",{"type":40,"tag":290,"props":291,"children":292},"ol",{},[293,298,303,308,313,341],{"type":40,"tag":66,"props":294,"children":295},{},[296],{"type":46,"value":297},"Which production project is in scope?",{"type":40,"tag":66,"props":299,"children":300},{},[301],{"type":46,"value":302},"What command does CI or the repository use to build and test?",{"type":40,"tag":66,"props":304,"children":305},{},[306],{"type":46,"value":307},"Does a suitable test project already reference that production project?",{"type":40,"tag":66,"props":309,"children":310},{},[311],{"type":46,"value":312},"Which test framework and runner do neighboring test projects use?",{"type":40,"tag":66,"props":314,"children":315},{},[316,318,324,326,332,333,339],{"type":46,"value":317},"Are package versions centrally managed by ",{"type":40,"tag":82,"props":319,"children":321},{"className":320},[],[322],{"type":46,"value":323},"Directory.Packages.props",{"type":46,"value":325},",\n",{"type":40,"tag":82,"props":327,"children":329},{"className":328},[],[330],{"type":46,"value":331},"Directory.Build.props",{"type":46,"value":255},{"type":40,"tag":82,"props":334,"children":336},{"className":335},[],[337],{"type":46,"value":338},"global.json",{"type":46,"value":340},", or an MSBuild SDK declaration?",{"type":40,"tag":66,"props":342,"children":343},{},[344],{"type":46,"value":345},"Which target framework(s) must the test project compile against?",{"type":40,"tag":49,"props":347,"children":348},{},[349],{"type":46,"value":350},"Treat a test project as suitable only when its target framework can reference the\nproduction project and its purpose matches the requested layer. Do not create a\nsecond test project merely because its name differs from your preferred name.",{"type":40,"tag":49,"props":352,"children":353},{},[354,360],{"type":40,"tag":355,"props":356,"children":357},"strong",{},[358],{"type":46,"value":359},"No-op stop condition:",{"type":46,"value":361}," when a suitable project already exists and is registered\nin the requested build entry point, do not repair, normalize, convert, or replace\nthe solution. If the user did not ask for tests yet, report the existing project\npath and stop with the workspace byte-for-byte unchanged.",{"type":40,"tag":278,"props":363,"children":365},{"id":364},"step-2-choose-one-bounded-project",[366],{"type":46,"value":367},"Step 2: Choose one bounded project",{"type":40,"tag":49,"props":369,"children":370},{},[371,373,379,380,386],{"type":46,"value":372},"Default to one test project per production project, named according to repository\nconvention (",{"type":40,"tag":82,"props":374,"children":376},{"className":375},[],[377],{"type":46,"value":378},"Foo.Tests",{"type":46,"value":255},{"type":40,"tag":82,"props":381,"children":383},{"className":382},[],[384],{"type":46,"value":385},"Foo.UnitTests",{"type":46,"value":387},", and so on). For a vague multi-project\nrequest, start with the project that owns the user-visible behavior or has the\nhighest-value untested logic; do not create one test project per source project\nwithout evidence that the repository wants that layout.",{"type":40,"tag":49,"props":389,"children":390},{},[391],{"type":46,"value":392},"Match, in order:",{"type":40,"tag":290,"props":394,"children":395},{},[396,401,406,411],{"type":40,"tag":66,"props":397,"children":398},{},[399],{"type":46,"value":400},"The user's explicit framework choice.",{"type":40,"tag":66,"props":402,"children":403},{},[404],{"type":46,"value":405},"Existing test projects in the same repository.",{"type":40,"tag":66,"props":407,"children":408},{},[409],{"type":46,"value":410},"Repository-wide package\u002FSDK conventions.",{"type":40,"tag":66,"props":412,"children":413},{},[414],{"type":46,"value":415},"A standard SDK template only when the repository provides no convention.",{"type":40,"tag":49,"props":417,"children":418},{},[419],{"type":46,"value":420},"Never mix frameworks in one test project. Never add package versions directly\nwhen central package management supplies them.",{"type":40,"tag":278,"props":422,"children":424},{"id":423},"step-3-scaffold-and-reference-the-target",[425],{"type":46,"value":426},"Step 3: Scaffold and reference the target",{"type":40,"tag":49,"props":428,"children":429},{},[430,432,438,440,446,447,453,455,461],{"type":46,"value":431},"Use the matching ",{"type":40,"tag":82,"props":433,"children":435},{"className":434},[],[436],{"type":46,"value":437},"dotnet new",{"type":46,"value":439}," template (",{"type":40,"tag":82,"props":441,"children":443},{"className":442},[],[444],{"type":46,"value":445},"xunit",{"type":46,"value":255},{"type":40,"tag":82,"props":448,"children":450},{"className":449},[],[451],{"type":46,"value":452},"nunit",{"type":46,"value":454},", or ",{"type":40,"tag":82,"props":456,"children":458},{"className":457},[],[459],{"type":46,"value":460},"mstest",{"type":46,"value":462},") rather than\nhand-writing template boilerplate. Then make only the repository-specific edits:",{"type":40,"tag":290,"props":464,"children":465},{},[466,471,484],{"type":40,"tag":66,"props":467,"children":468},{},[469],{"type":46,"value":470},"Align target framework, nullable, implicit-usings, runner, and package style.",{"type":40,"tag":66,"props":472,"children":473},{},[474,476,482],{"type":46,"value":475},"Add a ",{"type":40,"tag":82,"props":477,"children":479},{"className":478},[],[480],{"type":46,"value":481},"ProjectReference",{"type":46,"value":483}," to each production project directly exercised by\nthe planned tests. Do not reference every project in the solution.",{"type":40,"tag":66,"props":485,"children":486},{},[487],{"type":46,"value":488},"Remove template sample tests that do not test repository behavior.",{"type":40,"tag":49,"props":490,"children":491},{},[492,494,500],{"type":46,"value":493},"For xUnit v3 projects that the repository runs through ",{"type":40,"tag":82,"props":495,"children":497},{"className":496},[],[498],{"type":46,"value":499},"dotnet test",{"type":46,"value":501},", preserve or\nadd both:",{"type":40,"tag":503,"props":504,"children":509},"pre",{"className":505,"code":506,"language":507,"meta":508,"style":508},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003COutputType>Exe\u003C\u002FOutputType>\n\u003CTestingPlatformDotnetTestSupport>true\u003C\u002FTestingPlatformDotnetTestSupport>\n","xml","",[510],{"type":40,"tag":82,"props":511,"children":512},{"__ignoreMap":508},[513,524],{"type":40,"tag":514,"props":515,"children":518},"span",{"class":516,"line":517},"line",1,[519],{"type":40,"tag":514,"props":520,"children":521},{},[522],{"type":46,"value":523},"\u003COutputType>Exe\u003C\u002FOutputType>\n",{"type":40,"tag":514,"props":525,"children":527},{"class":516,"line":526},2,[528],{"type":40,"tag":514,"props":529,"children":530},{},[531],{"type":46,"value":532},"\u003CTestingPlatformDotnetTestSupport>true\u003C\u002FTestingPlatformDotnetTestSupport>\n",{"type":40,"tag":49,"props":534,"children":535},{},[536,542,544,550,552,557],{"type":40,"tag":82,"props":537,"children":539},{"className":538},[],[540],{"type":46,"value":541},"OutputType=Exe",{"type":46,"value":543}," alone makes the self-hosted runner work with ",{"type":40,"tag":82,"props":545,"children":547},{"className":546},[],[548],{"type":46,"value":549},"dotnet run",{"type":46,"value":551},"; it is\nnot evidence that the repository's ",{"type":40,"tag":82,"props":553,"children":555},{"className":554},[],[556],{"type":46,"value":499},{"type":46,"value":558}," command can discover the tests.",{"type":40,"tag":49,"props":560,"children":561},{},[562,564,570],{"type":46,"value":563},"Prefer ",{"type":40,"tag":82,"props":565,"children":567},{"className":566},[],[568],{"type":46,"value":569},"dotnet add \u003Ctest-project> reference \u003Cproduction-project>",{"type":46,"value":571}," for project\nreferences. Inspect the resulting project file before continuing.",{"type":40,"tag":278,"props":573,"children":575},{"id":574},"step-4-register-with-the-real-build-entry-point",[576],{"type":46,"value":577},"Step 4: Register with the real build entry point",{"type":40,"tag":49,"props":579,"children":580},{},[581,583,588],{"type":46,"value":582},"Creating a ",{"type":40,"tag":82,"props":584,"children":586},{"className":585},[],[587],{"type":46,"value":87},{"type":46,"value":589}," is not enough. Add it to the exact solution artifact used by\nthe repository:",{"type":40,"tag":62,"props":591,"children":592},{},[593,616,626],{"type":40,"tag":66,"props":594,"children":595},{},[596,601,603,608,610],{"type":40,"tag":82,"props":597,"children":599},{"className":598},[],[600],{"type":46,"value":253},{"type":46,"value":602}," or ",{"type":40,"tag":82,"props":604,"children":606},{"className":605},[],[607],{"type":46,"value":261},{"type":46,"value":609},": ",{"type":40,"tag":82,"props":611,"children":613},{"className":612},[],[614],{"type":46,"value":615},"dotnet sln \u003Csolution> add \u003Ctest-project>",{"type":40,"tag":66,"props":617,"children":618},{},[619,624],{"type":40,"tag":82,"props":620,"children":622},{"className":621},[],[623],{"type":46,"value":268},{"type":46,"value":625},": add the project to the underlying solution and include it in the\nfilter used by the requested\u002FCI test command.",{"type":40,"tag":66,"props":627,"children":628},{},[629],{"type":46,"value":630},"No solution artifact: keep the existing project-oriented workflow. Do not\ncreate a solution solely for aesthetics unless the user asked for one.",{"type":40,"tag":49,"props":632,"children":633},{},[634],{"type":46,"value":635},"Do not substitute a different solution file because it is easier to edit.",{"type":40,"tag":278,"props":637,"children":639},{"id":638},"step-5-add-a-real-smoke-test",[640],{"type":46,"value":641},"Step 5: Add a real smoke test",{"type":40,"tag":49,"props":643,"children":644},{},[645,647,652],{"type":46,"value":646},"Replace template examples with the ",{"type":40,"tag":355,"props":648,"children":649},{},[650],{"type":46,"value":651},"smallest smoke suite requested",{"type":46,"value":653},". The tests\nmust:",{"type":40,"tag":62,"props":655,"children":656},{},[657,662,667],{"type":40,"tag":66,"props":658,"children":659},{},[660],{"type":46,"value":661},"instantiate or invoke a real symbol from the referenced production project;",{"type":40,"tag":66,"props":663,"children":664},{},[665],{"type":46,"value":666},"assert a concrete result, not only non-null\u002Ftruthiness;",{"type":40,"tag":66,"props":668,"children":669},{},[670],{"type":46,"value":671},"avoid network, wall-clock, process, and real filesystem dependencies.",{"type":40,"tag":49,"props":673,"children":674},{},[675,677,682],{"type":46,"value":676},"These tests prove the project reference and discovery path. Stop after every\nbehavior explicitly named by the user is covered; extra boundary permutations\nare out of scope here and belong to ",{"type":40,"tag":82,"props":678,"children":680},{"className":679},[],[681],{"type":46,"value":114},{"type":46,"value":116},{"type":40,"tag":278,"props":684,"children":686},{"id":685},"step-6-verify-direct-and-harness-level-execution",[687],{"type":46,"value":688},"Step 6: Verify direct and harness-level execution",{"type":40,"tag":49,"props":690,"children":691},{},[692],{"type":46,"value":693},"Run, in this order:",{"type":40,"tag":290,"props":695,"children":696},{},[697,708,713],{"type":40,"tag":66,"props":698,"children":699},{},[700,706],{"type":40,"tag":82,"props":701,"children":703},{"className":702},[],[704],{"type":46,"value":705},"dotnet test \u003Ctest-project>",{"type":46,"value":707}," to isolate scaffolding failures.",{"type":40,"tag":66,"props":709,"children":710},{},[711],{"type":46,"value":712},"The repository's solution\u002Froot test command to prove CI discovery.",{"type":40,"tag":66,"props":714,"children":715},{},[716],{"type":46,"value":717},"A solution\u002Fproject listing command to confirm the new project is registered.",{"type":40,"tag":49,"props":719,"children":720},{},[721,723,729],{"type":46,"value":722},"If the direct command passes but the harness-level command discovers no new\ntest, the scaffolding is incomplete. Fix registration before reporting success.\nDo not claim success from ",{"type":40,"tag":82,"props":724,"children":726},{"className":725},[],[727],{"type":46,"value":728},"dotnet build",{"type":46,"value":730}," alone.",{"type":40,"tag":55,"props":732,"children":734},{"id":733},"output-contract",[735],{"type":46,"value":736},"Output Contract",{"type":40,"tag":49,"props":738,"children":739},{},[740],{"type":46,"value":741},"Report a compact table:",{"type":40,"tag":147,"props":743,"children":744},{},[745,761],{"type":40,"tag":151,"props":746,"children":747},{},[748],{"type":40,"tag":155,"props":749,"children":750},{},[751,756],{"type":40,"tag":159,"props":752,"children":753},{},[754],{"type":46,"value":755},"Requirement",{"type":40,"tag":159,"props":757,"children":758},{},[759],{"type":46,"value":760},"Evidence",{"type":40,"tag":175,"props":762,"children":763},{},[764,777,797,828],{"type":40,"tag":155,"props":765,"children":766},{},[767,772],{"type":40,"tag":182,"props":768,"children":769},{},[770],{"type":46,"value":771},"Test project created\u002Freused",{"type":40,"tag":182,"props":773,"children":774},{},[775],{"type":46,"value":776},"Project path",{"type":40,"tag":155,"props":778,"children":779},{},[780,785],{"type":40,"tag":182,"props":781,"children":782},{},[783],{"type":46,"value":784},"Production reference",{"type":40,"tag":182,"props":786,"children":787},{},[788,790,795],{"type":46,"value":789},"Referenced ",{"type":40,"tag":82,"props":791,"children":793},{"className":792},[],[794],{"type":46,"value":87},{"type":46,"value":796}," path",{"type":40,"tag":155,"props":798,"children":799},{},[800,805],{"type":40,"tag":182,"props":801,"children":802},{},[803],{"type":46,"value":804},"Build registration",{"type":40,"tag":182,"props":806,"children":807},{},[808,813,815,820,821,826],{"type":40,"tag":82,"props":809,"children":811},{"className":810},[],[812],{"type":46,"value":253},{"type":46,"value":814},"\u002F",{"type":40,"tag":82,"props":816,"children":818},{"className":817},[],[819],{"type":46,"value":261},{"type":46,"value":814},{"type":40,"tag":82,"props":822,"children":824},{"className":823},[],[825],{"type":46,"value":268},{"type":46,"value":827}," entry or project-oriented command",{"type":40,"tag":155,"props":829,"children":830},{},[831,836],{"type":40,"tag":182,"props":832,"children":833},{},[834],{"type":46,"value":835},"Test discovery",{"type":40,"tag":182,"props":837,"children":838},{},[839],{"type":46,"value":840},"Passing harness-level command and discovered test",{"type":40,"tag":49,"props":842,"children":843},{},[844],{"type":46,"value":845},"If validation is blocked, report the exact failing command and first actionable\nerror. Do not describe an unrun command as successful.",{"type":40,"tag":55,"props":847,"children":849},{"id":848},"validation",[850],{"type":46,"value":851},"Validation",{"type":40,"tag":62,"props":853,"children":856},{"className":854},[855],"contains-task-list",[857,870,879,888,897,906,915,924],{"type":40,"tag":66,"props":858,"children":861},{"className":859},[860],"task-list-item",[862,868],{"type":40,"tag":863,"props":864,"children":867},"input",{"disabled":865,"type":866},true,"checkbox",[],{"type":46,"value":869}," A suitable existing test project was ruled out before creating another.",{"type":40,"tag":66,"props":871,"children":873},{"className":872},[860],[874,877],{"type":40,"tag":863,"props":875,"children":876},{"disabled":865,"type":866},[],{"type":46,"value":878}," Framework, runner, target framework, and package style match the repository.",{"type":40,"tag":66,"props":880,"children":882},{"className":881},[860],[883,886],{"type":40,"tag":863,"props":884,"children":885},{"disabled":865,"type":866},[],{"type":46,"value":887}," Project references cover only the production projects under test.",{"type":40,"tag":66,"props":889,"children":891},{"className":890},[860],[892,895],{"type":40,"tag":863,"props":893,"children":894},{"disabled":865,"type":866},[],{"type":46,"value":896}," Central package management was preserved.",{"type":40,"tag":66,"props":898,"children":900},{"className":899},[860],[901,904],{"type":40,"tag":863,"props":902,"children":903},{"disabled":865,"type":866},[],{"type":46,"value":905}," Template sample tests were removed.",{"type":40,"tag":66,"props":907,"children":909},{"className":908},[860],[910,913],{"type":40,"tag":863,"props":911,"children":912},{"disabled":865,"type":866},[],{"type":46,"value":914}," At least one real deterministic test asserts a concrete behavior.",{"type":40,"tag":66,"props":916,"children":918},{"className":917},[860],[919,922],{"type":40,"tag":863,"props":920,"children":921},{"disabled":865,"type":866},[],{"type":46,"value":923}," The test project passes directly.",{"type":40,"tag":66,"props":925,"children":927},{"className":926},[860],[928,931],{"type":40,"tag":863,"props":929,"children":930},{"disabled":865,"type":866},[],{"type":46,"value":932}," The repository's solution\u002Froot command discovers and runs the new test.",{"type":40,"tag":55,"props":934,"children":936},{"id":935},"common-pitfalls",[937],{"type":46,"value":938},"Common Pitfalls",{"type":40,"tag":147,"props":940,"children":941},{},[942,958],{"type":40,"tag":151,"props":943,"children":944},{},[945],{"type":40,"tag":155,"props":946,"children":947},{},[948,953],{"type":40,"tag":159,"props":949,"children":950},{},[951],{"type":46,"value":952},"Pitfall",{"type":40,"tag":159,"props":954,"children":955},{},[956],{"type":46,"value":957},"Corrective action",{"type":40,"tag":175,"props":959,"children":960},{},[961,974,987,1005,1018,1037,1050],{"type":40,"tag":155,"props":962,"children":963},{},[964,969],{"type":40,"tag":182,"props":965,"children":966},{},[967],{"type":46,"value":968},"Creating a project that CI never sees",{"type":40,"tag":182,"props":970,"children":971},{},[972],{"type":46,"value":973},"Register it with the exact solution\u002Ffilter used by CI and run that command",{"type":40,"tag":155,"props":975,"children":976},{},[977,982],{"type":40,"tag":182,"props":978,"children":979},{},[980],{"type":46,"value":981},"Picking a favorite framework",{"type":40,"tag":182,"props":983,"children":984},{},[985],{"type":46,"value":986},"Infer the repository convention before using a default",{"type":40,"tag":155,"props":988,"children":989},{},[990,995],{"type":40,"tag":182,"props":991,"children":992},{},[993],{"type":46,"value":994},"Adding package versions under CPM",{"type":40,"tag":182,"props":996,"children":997},{},[998,1000],{"type":46,"value":999},"Add versionless references and keep versions in ",{"type":40,"tag":82,"props":1001,"children":1003},{"className":1002},[],[1004],{"type":46,"value":323},{"type":40,"tag":155,"props":1006,"children":1007},{},[1008,1013],{"type":40,"tag":182,"props":1009,"children":1010},{},[1011],{"type":46,"value":1012},"Referencing the whole solution",{"type":40,"tag":182,"props":1014,"children":1015},{},[1016],{"type":46,"value":1017},"Reference only projects whose APIs the tests compile against",{"type":40,"tag":155,"props":1019,"children":1020},{},[1021,1032],{"type":40,"tag":182,"props":1022,"children":1023},{},[1024,1026],{"type":46,"value":1025},"Keeping ",{"type":40,"tag":82,"props":1027,"children":1029},{"className":1028},[],[1030],{"type":46,"value":1031},"UnitTest1",{"type":40,"tag":182,"props":1033,"children":1034},{},[1035],{"type":46,"value":1036},"Replace it with a concrete test of repository behavior",{"type":40,"tag":155,"props":1038,"children":1039},{},[1040,1045],{"type":40,"tag":182,"props":1041,"children":1042},{},[1043],{"type":46,"value":1044},"Creating parallel unit\u002Fintegration projects from a vague ask",{"type":40,"tag":182,"props":1046,"children":1047},{},[1048],{"type":46,"value":1049},"Start with one bounded project; expand only for a demonstrated boundary",{"type":40,"tag":155,"props":1051,"children":1052},{},[1053,1058],{"type":40,"tag":182,"props":1054,"children":1055},{},[1056],{"type":46,"value":1057},"Treating a green build as test discovery",{"type":40,"tag":182,"props":1059,"children":1060},{},[1061],{"type":46,"value":1062},"Run the harness-level test command and observe the test",{"type":40,"tag":1064,"props":1065,"children":1066},"style",{},[1067],{"type":46,"value":1068},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1070,"total":1175},[1071,1088,1103,1121,1133,1153,1163],{"slug":1072,"name":1072,"fn":1073,"description":1074,"org":1075,"tags":1076,"stars":22,"repoUrl":23,"updatedAt":1087},"analyzing-dotnet-performance","analyze .NET code for performance anti-patterns","Scans .NET code for ~50 performance anti-patterns across async, memory, strings, collections, LINQ, regex, serialization, and I\u002FO with tiered severity classification. Use when analyzing .NET code for optimization opportunities, reviewing hot paths, or auditing allocation-heavy patterns.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1077,1078,1081,1084],{"name":13,"slug":14,"type":15},{"name":1079,"slug":1080,"type":15},"Code Analysis","code-analysis",{"name":1082,"slug":1083,"type":15},"Debugging","debugging",{"name":1085,"slug":1086,"type":15},"Performance","performance","2026-07-12T08:23:25.400375",{"slug":1089,"name":1089,"fn":1090,"description":1091,"org":1092,"tags":1093,"stars":22,"repoUrl":23,"updatedAt":1102},"android-tombstone-symbolication","symbolicate .NET runtime frames in Android tombstones","Symbolicate the .NET runtime frames in an Android tombstone file. Extracts BuildIds and PC offsets from the native backtrace, downloads debug symbols from the Microsoft symbol server, and runs llvm-symbolizer to produce function names with source file and line numbers. USE FOR triaging a .NET MAUI or Mono Android app crash from a tombstone, resolving native backtrace frames in libmonosgen-2.0.so or libcoreclr.so to .NET runtime source code, or investigating SIGABRT, SIGSEGV, or other native signals originating from the .NET runtime on Android. DO NOT USE FOR pure Java\u002FKotlin crashes, managed .NET exceptions that are already captured in logcat, or iOS crash logs. INVOKES Symbolicate-Tombstone.ps1 script, llvm-symbolizer, Microsoft symbol server.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1094,1095,1098,1099],{"name":13,"slug":14,"type":15},{"name":1096,"slug":1097,"type":15},"Android","android",{"name":1082,"slug":1083,"type":15},{"name":1100,"slug":1101,"type":15},"Microsoft","microsoft","2026-07-12T08:23:21.595572",{"slug":1104,"name":1104,"fn":1105,"description":1106,"org":1107,"tags":1108,"stars":22,"repoUrl":23,"updatedAt":1120},"apple-crash-symbolication","symbolicate .NET runtime frames in crash logs","Symbolicate .NET runtime frames in Apple platform .ips crash logs (iOS, tvOS, Mac Catalyst, macOS). Extracts UUIDs and addresses from the native backtrace, locates dSYM debug symbols, and runs atos to produce function names with source file and line numbers. Automatically downloads .dwarf symbols from the Microsoft symbol server using Mach-O UUIDs. USE FOR triaging a .NET MAUI or Mono app crash from an .ips file on any Apple platform, resolving native backtrace frames in libcoreclr or libmonosgen-2.0 to .NET runtime source code, retrieving .ips crash logs from a connected iOS device or iPhone, or investigating EXC_CRASH, EXC_BAD_ACCESS, SIGABRT, or SIGSEGV originating from the .NET runtime. DO NOT USE FOR pure Swift\u002FObjective-C crashes with no .NET components, or Android tombstone files. INVOKES Symbolicate-Crash.ps1 script, atos, dwarfdump, idevicecrashreport.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1109,1110,1111,1114,1117],{"name":13,"slug":14,"type":15},{"name":1082,"slug":1083,"type":15},{"name":1112,"slug":1113,"type":15},"iOS","ios",{"name":1115,"slug":1116,"type":15},"macOS","macos",{"name":1118,"slug":1119,"type":15},"Observability","observability","2026-07-12T08:23:20.369986",{"slug":1122,"name":1122,"fn":1123,"description":1124,"org":1125,"tags":1126,"stars":22,"repoUrl":23,"updatedAt":1132},"assertion-quality","evaluate assertion quality in test suites","MANDATORY for reviewing assertion strength, depth, and variety in existing tests. Invoke when the user asks whether individual assertions are weak, shallow, trivial, always true, self-referential, or diverse; asks which tests are assertion-free or rely only on presence\u002Ftruthiness checks; or requests assertion quality\u002Fdepth\u002Fvariety metrics. Polyglot: .NET, Python\u002Fpytest, TS\u002FJS\u002FJest, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, C++. DO NOT USE FOR: writing or fixing tests\u002Fassertions (use code-testing-agent or writing-mstest-tests), mutation reasoning (use test-gap-analysis), or a general severity-ranked anti-pattern audit (use test-anti-patterns).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1127,1128,1131],{"name":1079,"slug":1080,"type":15},{"name":1129,"slug":1130,"type":15},"QA","qa",{"name":20,"slug":21,"type":15},"2026-08-07T04:38:19.067839",{"slug":1134,"name":1134,"fn":1135,"description":1136,"org":1137,"tags":1138,"stars":22,"repoUrl":23,"updatedAt":1152},"author-component","create and review Blazor components","Create or review Blazor components (.razor files) with correct architecture. USE FOR: writing new Blazor components that do NOT involve JavaScript interop, implementing parameters and EventCallback, RenderFragment slots, component lifecycle (OnInitializedAsync, OnParametersSet), async patterns, IAsyncDisposable, CancellationToken, CSS isolation, code-behind. DO NOT USE FOR: creating new projects (use create-blazor-project), JavaScript interop or calling browser APIs from Blazor (use use-js-interop), forms and validation (use collect-user-input), prerendering issues (use support-prerendering), HTTP data fetching patterns (use fetch-and-send-data), coordinating state between unrelated components (use coordinate-components).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1139,1140,1143,1146,1149],{"name":13,"slug":14,"type":15},{"name":1141,"slug":1142,"type":15},"Blazor","blazor",{"name":1144,"slug":1145,"type":15},"C#","csharp",{"name":1147,"slug":1148,"type":15},"UI Components","ui-components",{"name":1150,"slug":1151,"type":15},"Web Development","web-development","2026-07-15T06:03:29.216359",{"slug":1154,"name":1154,"fn":1155,"description":1156,"org":1157,"tags":1158,"stars":22,"repoUrl":23,"updatedAt":1162},"binlog-failure-analysis","analyze MSBuild binary logs","Analyze MSBuild binary logs to diagnose build failures. USE FOR: build errors that are unclear from console output, diagnosing cascading failures across multi-project builds, tracing MSBuild target execution order, and generally any MSBuild build issues. Requires an existing .binlog file. DO NOT USE FOR: generating binlogs (use binlog-generation), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1159,1160,1161],{"name":1079,"slug":1080,"type":15},{"name":1082,"slug":1083,"type":15},{"name":1100,"slug":1101,"type":15},"2026-08-07T04:38:20.048408",{"slug":1164,"name":1164,"fn":1165,"description":1166,"org":1167,"tags":1168,"stars":22,"repoUrl":23,"updatedAt":1174},"binlog-generation","generate MSBuild binary logs for diagnostics","Generate MSBuild binary logs (binlogs) for build diagnostics and analysis. USE FOR: adding \u002Fbl:{} to any dotnet build, test, pack, publish, or restore command to capture a full build execution trace, prerequisite for binlog-failure-analysis and build-perf-diagnostics skills, enabling post-build investigation of errors or performance. Requires MSBuild 17.8+ \u002F .NET 8 SDK+ for {} placeholder; PowerShell needs -bl:{{}}. DO NOT USE FOR: non-MSBuild build systems (npm, Maven, CMake), analyzing an existing binlog (use binlog-failure-analysis instead).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1169,1172,1173],{"name":1170,"slug":1171,"type":15},"Build","build",{"name":1082,"slug":1083,"type":15},{"name":17,"slug":18,"type":15},"2026-07-19T05:38:19.340791",98,{"items":1177,"total":1282},[1178,1190,1197,1204,1212,1218,1226,1232,1238,1248,1261,1272],{"slug":1179,"name":1179,"fn":1180,"description":1181,"org":1182,"tags":1183,"stars":1187,"repoUrl":1188,"updatedAt":1189},"multithreaded-task-migration","migrate MSBuild tasks to multithreaded mode","Guide for migrating MSBuild tasks to multithreaded mode support, including compatibility red-team review. Use this when converting tasks to thread-safe versions, implementing IMultiThreadableTask, adding TaskEnvironment support, or auditing migrations for behavioral compatibility.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1184,1185,1186],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":1085,"slug":1086,"type":15},5535,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fmsbuild","2026-07-22T05:37:33.965588",{"slug":1072,"name":1072,"fn":1073,"description":1074,"org":1191,"tags":1192,"stars":22,"repoUrl":23,"updatedAt":1087},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1193,1194,1195,1196],{"name":13,"slug":14,"type":15},{"name":1079,"slug":1080,"type":15},{"name":1082,"slug":1083,"type":15},{"name":1085,"slug":1086,"type":15},{"slug":1089,"name":1089,"fn":1090,"description":1091,"org":1198,"tags":1199,"stars":22,"repoUrl":23,"updatedAt":1102},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1200,1201,1202,1203],{"name":13,"slug":14,"type":15},{"name":1096,"slug":1097,"type":15},{"name":1082,"slug":1083,"type":15},{"name":1100,"slug":1101,"type":15},{"slug":1104,"name":1104,"fn":1105,"description":1106,"org":1205,"tags":1206,"stars":22,"repoUrl":23,"updatedAt":1120},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1207,1208,1209,1210,1211],{"name":13,"slug":14,"type":15},{"name":1082,"slug":1083,"type":15},{"name":1112,"slug":1113,"type":15},{"name":1115,"slug":1116,"type":15},{"name":1118,"slug":1119,"type":15},{"slug":1122,"name":1122,"fn":1123,"description":1124,"org":1213,"tags":1214,"stars":22,"repoUrl":23,"updatedAt":1132},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1215,1216,1217],{"name":1079,"slug":1080,"type":15},{"name":1129,"slug":1130,"type":15},{"name":20,"slug":21,"type":15},{"slug":1134,"name":1134,"fn":1135,"description":1136,"org":1219,"tags":1220,"stars":22,"repoUrl":23,"updatedAt":1152},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1221,1222,1223,1224,1225],{"name":13,"slug":14,"type":15},{"name":1141,"slug":1142,"type":15},{"name":1144,"slug":1145,"type":15},{"name":1147,"slug":1148,"type":15},{"name":1150,"slug":1151,"type":15},{"slug":1154,"name":1154,"fn":1155,"description":1156,"org":1227,"tags":1228,"stars":22,"repoUrl":23,"updatedAt":1162},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1229,1230,1231],{"name":1079,"slug":1080,"type":15},{"name":1082,"slug":1083,"type":15},{"name":1100,"slug":1101,"type":15},{"slug":1164,"name":1164,"fn":1165,"description":1166,"org":1233,"tags":1234,"stars":22,"repoUrl":23,"updatedAt":1174},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1235,1236,1237],{"name":1170,"slug":1171,"type":15},{"name":1082,"slug":1083,"type":15},{"name":17,"slug":18,"type":15},{"slug":1239,"name":1239,"fn":1240,"description":1241,"org":1242,"tags":1243,"stars":22,"repoUrl":23,"updatedAt":1247},"build-parallelism","optimize MSBuild build parallelism","Diagnose and fix under-parallelized MSBuild builds. USE WHEN a multi-project solution build is slower than expected, doesn't speed up when you add cores, pegs a single core while others idle, or you want to know why `-m` isn't helping. Note: `\u002Fmaxcpucount` default is 1 (sequential) — always pass `-m` for parallel builds. Covers finding the critical path (longest serial ProjectReference chain), graph build (`\u002Fgraph`), BuildInParallel, and solution filters (`.slnf`). DO NOT USE FOR: single-project builds, incremental issues (use incremental-build), compilation slowness inside one project (use build-perf-diagnostics), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1244,1245,1246],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":1085,"slug":1086,"type":15},"2026-07-19T05:38:18.364937",{"slug":1249,"name":1249,"fn":1250,"description":1251,"org":1252,"tags":1253,"stars":22,"repoUrl":23,"updatedAt":1260},"build-perf-baseline","establish and optimize build performance baselines","Establish build performance baselines and apply systematic optimization techniques. USE FOR: diagnosing slow builds, establishing before\u002Fafter measurements (cold, warm, no-op scenarios), applying optimization strategies like MSBuild Server, static graph builds, artifacts output, and dependency graph trimming. Start here before diving into build-perf-diagnostics, incremental-build, or build-parallelism. DO NOT USE FOR: non-MSBuild build systems, detailed bottleneck analysis (use build-perf-diagnostics after baselining).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1254,1255,1258,1259],{"name":17,"slug":18,"type":15},{"name":1256,"slug":1257,"type":15},"Monitoring","monitoring",{"name":1085,"slug":1086,"type":15},{"name":20,"slug":21,"type":15},"2026-07-12T08:21:35.865649",{"slug":1262,"name":1262,"fn":1263,"description":1264,"org":1265,"tags":1266,"stars":22,"repoUrl":23,"updatedAt":1271},"build-perf-diagnostics","diagnose MSBuild build performance bottlenecks","Diagnose MSBuild build performance bottlenecks using binary log analysis. USE FOR: identifying why builds are slow by analyzing binlog performance summaries, detecting ResolveAssemblyReference (RAR) taking >5s, Roslyn analyzers consuming >30% of Csc time, single targets dominating >50% of build time, node utilization below 80%, excessive Copy tasks, NuGet restore running every build. Covers timeline analysis, Target\u002FTask Performance Summary interpretation, and 7 common bottleneck categories. Use after build-perf-baseline has established measurements. DO NOT USE FOR: establishing initial baselines (use build-perf-baseline first), fixing incremental build issues (use incremental-build), parallelism tuning (use build-parallelism), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1267,1268,1269,1270],{"name":13,"slug":14,"type":15},{"name":1082,"slug":1083,"type":15},{"name":17,"slug":18,"type":15},{"name":1085,"slug":1086,"type":15},"2026-07-12T08:21:40.961722",{"slug":1273,"name":1273,"fn":1274,"description":1275,"org":1276,"tags":1277,"stars":22,"repoUrl":23,"updatedAt":1281},"check-bin-obj-clash","detect MSBuild output path conflicts","Detects MSBuild projects with conflicting OutputPath or IntermediateOutputPath. USE FOR: builds failing with 'Cannot create a file when that file already exists', 'The process cannot access the file because it is being used by another process', intermittent build failures that succeed on retry, or missing\u002Foverwritten outputs in multi-project or multi-targeting builds where bin\u002Fobj (or project.assets.json) collide. Common causes: shared OutputPath, missing AppendTargetFrameworkToOutputPath, extra global properties (e.g. PublishReadyToRun), or SetTargetFramework on a ProjectReference to a single-targeting project. DO NOT USE FOR: file access errors unrelated to MSBuild (OS-level locking), single-project single-TFM builds, non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1278,1279,1280],{"name":1082,"slug":1083,"type":15},{"name":17,"slug":18,"type":15},{"name":1129,"slug":1130,"type":15},"2026-07-19T05:38:14.336279",146]