[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-dotnet-build-perf-diagnostics":3,"mdc--7qwet1-key":37,"related-org-dotnet-build-perf-diagnostics":1594,"related-repo-dotnet-build-perf-diagnostics":1750},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":32,"sourceUrl":35,"mdContent":36},"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},"dotnet",".NET (Microsoft)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdotnet.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Performance","performance","tag",{"name":17,"slug":18,"type":15},".NET","net",{"name":20,"slug":21,"type":15},"Engineering","engineering",{"name":23,"slug":24,"type":15},"Debugging","debugging",4576,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills","2026-07-12T08:21:40.961722","MIT",332,[31],"agent-skills",{"repoUrl":26,"stars":25,"forks":29,"topics":33,"description":34},[31],"Repository for skills to assist AI coding agents with .NET and C#","https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills\u002Ftree\u002FHEAD\u002Fplugins\u002Fdotnet-msbuild\u002Fskills\u002Fbuild-perf-diagnostics","---\nname: build-perf-diagnostics\ndescription: \"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.\"\nlicense: MIT\n---\n\n## Performance Analysis Methodology\n\n1. **Generate a binlog**: `dotnet build \u002Fbl:{} -m`\n2. Use the **binlog MCP server** (`Microsoft.AITools.BinlogMcp`, exposed under the `binlog` MCP namespace) which is bundled with this plugin\n\n### Alternate flow when MCP is unavailable: binlog replay to text logs\n\n1. **Generate a binlog**: `dotnet build \u002Fbl:{} -m`\n2. **Replay to diagnostic log with performance summary**:\n   ```bash\n   dotnet msbuild build.binlog -noconlog -fl -flp:v=diag;logfile=full.log;performancesummary\n   ```\n3. **Read the performance summary** (at the end of `full.log`):\n   ```bash\n   grep \"Target Performance Summary\\|Task Performance Summary\" -A 50 full.log\n   ```\n4. **Find expensive targets and tasks**: The PerformanceSummary section lists all targets\u002Ftasks sorted by cumulative time\n5. **Check for node utilization**: grep for scheduling and node messages\n   ```bash\n   grep -i \"node.*assigned\\|building with\\|scheduler\" full.log | head -30\n   ```\n6. **Check analyzers**: grep for analyzer timing\n   ```bash\n   grep -i \"analyzer.*elapsed\\|Total analyzer execution time\\|CompilerAnalyzerDriver\" full.log\n   ```\n\n## Key Metrics and Thresholds\n\n- **Build duration**: what's \"normal\" — small project \u003C10s, medium \u003C60s, large \u003C5min\n- **Node utilization**: ideal is >80% active time across nodes. Low utilization = serialization bottleneck\n- **Single target domination**: if one target is >50% of build time, investigate\n- **Analyzer time vs compile time**: analyzers should be \u003C30% of Csc task time. If higher, consider removing expensive analyzers\n- **RAR time**: ResolveAssemblyReference >5s is concerning. >15s is pathological\n\n## Common Bottlenecks\n\n### 1. ResolveAssemblyReference (RAR) Slowness\n\n- **Symptoms**: RAR taking >5s per project\n- **Root causes**: too many assembly references, network-based reference paths, large assembly search paths\n- **Fixes**: reduce reference count, use `\u003CDesignTimeBuild>false\u003C\u002FDesignTimeBuild>` for RAR-heavy analysis, set `\u003CResolveAssemblyReferencesSilent>true\u003C\u002FResolveAssemblyReferencesSilent>` for diagnostic\n- **Advanced**: `\u003CDesignTimeBuild>` and `\u003CResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>`\n- **Key insight**: RAR runs unconditionally even on incremental builds because users may have installed targeting packs or GACed assemblies (see dotnet\u002Fmsbuild#2015). With .NET Core micro-assemblies, the reference count is often very high.\n- **Reduce transitive references**: Set `\u003CDisableTransitiveProjectReferences>true\u003C\u002FDisableTransitiveProjectReferences>` to avoid pulling in the full transitive closure (note: projects may need to add direct references for any types they consume). Use `ReferenceOutputAssembly=\"false\"` on ProjectReferences that are only needed at build time (not API surface). Trim unused PackageReferences.\n\n### 2. Roslyn Analyzers and Source Generators\n\n- **Symptoms**: Csc task takes much longer than expected for file count (>2× clean compile time)\n- **Diagnosis**: Check the Task Performance Summary in the replayed log for Csc task time; grep for analyzer timing messages; compare Csc duration with and without analyzers (`\u002Fp:RunAnalyzers=false`)\n- **Fixes**:\n  - Conditionally disable in dev: `\u003CRunAnalyzers Condition=\"'$(ContinuousIntegrationBuild)' != 'true'\">false\u003C\u002FRunAnalyzers>`\n  - Per-configuration: `\u003CRunAnalyzers Condition=\"'$(Configuration)' == 'Debug'\">false\u003C\u002FRunAnalyzers>`\n  - Code-style only: `\u003CEnforceCodeStyleInBuild Condition=\"'$(ContinuousIntegrationBuild)' == 'true'\">true\u003C\u002FEnforceCodeStyleInBuild>`\n  - Remove genuinely redundant analyzers from inner loop\n  - Severity config in .editorconfig for less critical rules\n- **Key principle**: Preserve analyzer enforcement in CI. Never just \"remove\" analyzers — configure them conditionally.\n- **GlobalPackageReference**: Analyzers added via `GlobalPackageReference` in `Directory.Packages.props` apply to ALL projects. Consider if test projects need the same analyzer set as production code.\n- **EnforceCodeStyleInBuild**: When set to `true` in `Directory.Build.props`, forces code-style analysis on every build. Should be conditional on CI environment (`ContinuousIntegrationBuild`) to avoid slowing dev inner loop.\n\n### 3. Serialization Bottlenecks (Single-threaded targets)\n\n- **Symptoms**: Performance summary shows most build time concentrated in a single project; diagnostic log shows idle nodes while one works\n- **Common culprits**: targets without proper dependency declaration, single project on critical path\n- **Fixes**: split large projects, optimize the critical path project, ensure proper `BuildInParallel`\n\n### 4. Excessive File I\u002FO (Copy tasks)\n\n- **Symptoms**: Copy task shows high aggregate time\n- **Root causes**: copying thousands of files, copying across network drives, Copy task unintentionally running once per item (per-file) instead of as a single batch (see dotnet\u002Fmsbuild#12884)\n- **Fixes**: use hardlinks (`\u003CCreateHardLinksForCopyFilesToOutputDirectoryIfPossible>true\u003C\u002FCreateHardLinksForCopyFilesToOutputDirectoryIfPossible>`), reduce CopyToOutputDirectory items, use `\u003CUseCommonOutputDirectory>true\u003C\u002FUseCommonOutputDirectory>` when appropriate, set `\u003CSkipCopyUnchangedFiles>true\u003C\u002FSkipCopyUnchangedFiles>`, consider `--artifacts-path` (.NET 8+) for centralized output layout\n- **Dev Drive**: On Windows, switching to a Dev Drive (ReFS with copy-on-write and reduced Defender scans) can significantly reduce file I\u002FO overhead for Copy-heavy builds. Recommend for both dev machines and self-hosted CI agents.\n\n### 5. Evaluation Overhead\n\n- **Symptoms**: build starts slow before any compilation\n- **Root causes**: complex Directory.Build.props, wildcard globs scanning large directories, NuGetSdkResolver overhead (adds 180-400ms per project evaluation even when restored — see dotnet\u002Fmsbuild#4025)\n- **Fixes**: reduce Directory.Build.props complexity, use `\u003CEnableDefaultItems>false\u003C\u002FEnableDefaultItems>` for legacy projects with explicit file lists, avoid NuGet-based SDK resolvers if possible\n- See: `eval-performance` skill for detailed guidance\n\n### 6. NuGet Restore in Build\n\n- **Symptoms**: restore runs every build even when unnecessary\n- **Fixes**:\n  - Separate restore from build: `dotnet restore` then `dotnet build --no-restore`\n  - Enable static graph evaluation: `\u003CRestoreUseStaticGraphEvaluation>true\u003C\u002FRestoreUseStaticGraphEvaluation>` in Directory.Build.props — can save significant time in large builds (results are workload-dependent)\n\n### 7. Large Project Count and Graph Shape\n\n- **Symptoms**: many small projects, each takes minimal time but overhead adds up; deep dependency chains serialize the build\n- **Consider**: project consolidation, or use `\u002Fgraph` mode for better scheduling\n- **Graph shape matters**: a wide dependency graph (few levels, many parallel branches) builds faster than a deep one (many levels, serialized). Refactoring from deep to wide can yield significant improvements in both clean and incremental build times.\n- **Actions**: look for unnecessary project dependencies, consider splitting a bottleneck project into two, or merging small leaf projects\n\n## Using Binlog Replay for Performance Analysis\n\nStep-by-step workflow using text log replay:\n\n1. **Replay with performance summary**:\n   ```bash\n   dotnet msbuild build.binlog -noconlog -fl -flp:v=diag;logfile=full.log;performancesummary\n   ```\n2. **Read target\u002Ftask performance summaries** (at the end of `full.log`):\n   ```bash\n   grep \"Target Performance Summary\\|Task Performance Summary\" -A 50 full.log\n   ```\n   This shows all targets and tasks sorted by cumulative time — equivalent to finding expensive targets\u002Ftasks.\n3. **Find per-project build times**:\n   ```bash\n   grep \"done building project\\|Project Performance Summary\" full.log\n   ```\n4. **Check parallelism** (multi-node scheduling):\n   ```bash\n   grep -i \"node.*assigned\\|RequiresLeadingNewline\\|Building with\" full.log | head -30\n   ```\n5. **Check analyzer overhead**:\n   ```bash\n   grep -i \"Total analyzer execution time\\|analyzer.*elapsed\\|CompilerAnalyzerDriver\" full.log\n   ```\n6. **Drill into a specific slow target**:\n   ```bash\n   grep 'Target \"CoreCompile\"\\|Target \"ResolveAssemblyReferences\"' full.log\n   ```\n\n## Quick Wins Checklist\n\n- [ ] Use `\u002Fmaxcpucount` (or `-m`) for parallel builds\n- [ ] Separate restore from build (`dotnet restore` then `dotnet build --no-restore`)\n- [ ] Enable static graph restore (`\u003CRestoreUseStaticGraphEvaluation>true\u003C\u002FRestoreUseStaticGraphEvaluation>`)\n- [ ] Enable hardlinks for Copy (`\u003CCreateHardLinksForCopyFilesToOutputDirectoryIfPossible>true\u003C\u002FCreateHardLinksForCopyFilesToOutputDirectoryIfPossible>`)\n- [ ] Disable analyzers conditionally in dev inner loop: `\u003CRunAnalyzers Condition=\"'$(ContinuousIntegrationBuild)' != 'true'\">false\u003C\u002FRunAnalyzers>`\n- [ ] Enable reference assemblies (`\u003CProduceReferenceAssembly>true\u003C\u002FProduceReferenceAssembly>`)\n- [ ] Check for broken incremental builds (see `incremental-build` skill)\n- [ ] Check for bin\u002Fobj clashes (see `check-bin-obj-clash` skill)\n- [ ] Use graph build (`\u002Fgraph`) for multi-project solutions\n- [ ] Use `--artifacts-path` (.NET 8+) for centralized output layout\n- [ ] Enable Dev Drive (ReFS) on Windows dev machines and self-hosted CI\n\n## Impact Categorization\n\nWhen reporting findings, categorize by impact to help prioritize fixes:\n\n- 🔴 **HIGH IMPACT** (do first): Items consuming >10% of total build time, or a single target >50% of build time\n- 🟡 **MEDIUM IMPACT**: Items consuming 2-10% of build time\n- 🟢 **QUICK WINS**: Easy changes with modest impact (e.g., property flags in Directory.Build.props)\n",{"data":38,"body":39},{"name":4,"description":6,"license":28},{"type":40,"children":41},"root",[42,51,102,109,394,400,454,460,466,574,580,732,738,775,781,853,859,910,916,971,977,1027,1033,1039,1345,1351,1538,1544,1549,1588],{"type":43,"tag":44,"props":45,"children":47},"element","h2",{"id":46},"performance-analysis-methodology",[48],{"type":49,"value":50},"text","Performance Analysis Methodology",{"type":43,"tag":52,"props":53,"children":54},"ol",{},[55,74],{"type":43,"tag":56,"props":57,"children":58},"li",{},[59,65,67],{"type":43,"tag":60,"props":61,"children":62},"strong",{},[63],{"type":49,"value":64},"Generate a binlog",{"type":49,"value":66},": ",{"type":43,"tag":68,"props":69,"children":71},"code",{"className":70},[],[72],{"type":49,"value":73},"dotnet build \u002Fbl:{} -m",{"type":43,"tag":56,"props":75,"children":76},{},[77,79,84,86,92,94,100],{"type":49,"value":78},"Use the ",{"type":43,"tag":60,"props":80,"children":81},{},[82],{"type":49,"value":83},"binlog MCP server",{"type":49,"value":85}," (",{"type":43,"tag":68,"props":87,"children":89},{"className":88},[],[90],{"type":49,"value":91},"Microsoft.AITools.BinlogMcp",{"type":49,"value":93},", exposed under the ",{"type":43,"tag":68,"props":95,"children":97},{"className":96},[],[98],{"type":49,"value":99},"binlog",{"type":49,"value":101}," MCP namespace) which is bundled with this plugin",{"type":43,"tag":103,"props":104,"children":106},"h3",{"id":105},"alternate-flow-when-mcp-is-unavailable-binlog-replay-to-text-logs",[107],{"type":49,"value":108},"Alternate flow when MCP is unavailable: binlog replay to text logs",{"type":43,"tag":52,"props":110,"children":111},{},[112,125,214,277,287,349],{"type":43,"tag":56,"props":113,"children":114},{},[115,119,120],{"type":43,"tag":60,"props":116,"children":117},{},[118],{"type":49,"value":64},{"type":49,"value":66},{"type":43,"tag":68,"props":121,"children":123},{"className":122},[],[124],{"type":49,"value":73},{"type":43,"tag":56,"props":126,"children":127},{},[128,133,135],{"type":43,"tag":60,"props":129,"children":130},{},[131],{"type":49,"value":132},"Replay to diagnostic log with performance summary",{"type":49,"value":134},":\n",{"type":43,"tag":136,"props":137,"children":142},"pre",{"className":138,"code":139,"language":140,"meta":141,"style":141},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dotnet msbuild build.binlog -noconlog -fl -flp:v=diag;logfile=full.log;performancesummary\n","bash","",[143],{"type":43,"tag":68,"props":144,"children":145},{"__ignoreMap":141},[146],{"type":43,"tag":147,"props":148,"children":151},"span",{"class":149,"line":150},"line",1,[152,157,163,168,173,178,183,189,195,200,205,209],{"type":43,"tag":147,"props":153,"children":155},{"style":154},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[156],{"type":49,"value":8},{"type":43,"tag":147,"props":158,"children":160},{"style":159},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[161],{"type":49,"value":162}," msbuild",{"type":43,"tag":147,"props":164,"children":165},{"style":159},[166],{"type":49,"value":167}," build.binlog",{"type":43,"tag":147,"props":169,"children":170},{"style":159},[171],{"type":49,"value":172}," -noconlog",{"type":43,"tag":147,"props":174,"children":175},{"style":159},[176],{"type":49,"value":177}," -fl",{"type":43,"tag":147,"props":179,"children":180},{"style":159},[181],{"type":49,"value":182}," -flp:v=diag",{"type":43,"tag":147,"props":184,"children":186},{"style":185},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[187],{"type":49,"value":188},";",{"type":43,"tag":147,"props":190,"children":192},{"style":191},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[193],{"type":49,"value":194},"logfile",{"type":43,"tag":147,"props":196,"children":197},{"style":185},[198],{"type":49,"value":199},"=",{"type":43,"tag":147,"props":201,"children":202},{"style":159},[203],{"type":49,"value":204},"full.log",{"type":43,"tag":147,"props":206,"children":207},{"style":185},[208],{"type":49,"value":188},{"type":43,"tag":147,"props":210,"children":211},{"style":154},[212],{"type":49,"value":213},"performancesummary\n",{"type":43,"tag":56,"props":215,"children":216},{},[217,222,224,229,231],{"type":43,"tag":60,"props":218,"children":219},{},[220],{"type":49,"value":221},"Read the performance summary",{"type":49,"value":223}," (at the end of ",{"type":43,"tag":68,"props":225,"children":227},{"className":226},[],[228],{"type":49,"value":204},{"type":49,"value":230},"):\n",{"type":43,"tag":136,"props":232,"children":234},{"className":138,"code":233,"language":140,"meta":141,"style":141},"grep \"Target Performance Summary\\|Task Performance Summary\" -A 50 full.log\n",[235],{"type":43,"tag":68,"props":236,"children":237},{"__ignoreMap":141},[238],{"type":43,"tag":147,"props":239,"children":240},{"class":149,"line":150},[241,246,251,256,261,266,272],{"type":43,"tag":147,"props":242,"children":243},{"style":154},[244],{"type":49,"value":245},"grep",{"type":43,"tag":147,"props":247,"children":248},{"style":185},[249],{"type":49,"value":250}," \"",{"type":43,"tag":147,"props":252,"children":253},{"style":159},[254],{"type":49,"value":255},"Target Performance Summary\\|Task Performance Summary",{"type":43,"tag":147,"props":257,"children":258},{"style":185},[259],{"type":49,"value":260},"\"",{"type":43,"tag":147,"props":262,"children":263},{"style":159},[264],{"type":49,"value":265}," -A",{"type":43,"tag":147,"props":267,"children":269},{"style":268},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[270],{"type":49,"value":271}," 50",{"type":43,"tag":147,"props":273,"children":274},{"style":159},[275],{"type":49,"value":276}," full.log\n",{"type":43,"tag":56,"props":278,"children":279},{},[280,285],{"type":43,"tag":60,"props":281,"children":282},{},[283],{"type":49,"value":284},"Find expensive targets and tasks",{"type":49,"value":286},": The PerformanceSummary section lists all targets\u002Ftasks sorted by cumulative time",{"type":43,"tag":56,"props":288,"children":289},{},[290,295,297],{"type":43,"tag":60,"props":291,"children":292},{},[293],{"type":49,"value":294},"Check for node utilization",{"type":49,"value":296},": grep for scheduling and node messages\n",{"type":43,"tag":136,"props":298,"children":300},{"className":138,"code":299,"language":140,"meta":141,"style":141},"grep -i \"node.*assigned\\|building with\\|scheduler\" full.log | head -30\n",[301],{"type":43,"tag":68,"props":302,"children":303},{"__ignoreMap":141},[304],{"type":43,"tag":147,"props":305,"children":306},{"class":149,"line":150},[307,311,316,320,325,329,334,339,344],{"type":43,"tag":147,"props":308,"children":309},{"style":154},[310],{"type":49,"value":245},{"type":43,"tag":147,"props":312,"children":313},{"style":159},[314],{"type":49,"value":315}," -i",{"type":43,"tag":147,"props":317,"children":318},{"style":185},[319],{"type":49,"value":250},{"type":43,"tag":147,"props":321,"children":322},{"style":159},[323],{"type":49,"value":324},"node.*assigned\\|building with\\|scheduler",{"type":43,"tag":147,"props":326,"children":327},{"style":185},[328],{"type":49,"value":260},{"type":43,"tag":147,"props":330,"children":331},{"style":159},[332],{"type":49,"value":333}," full.log",{"type":43,"tag":147,"props":335,"children":336},{"style":185},[337],{"type":49,"value":338}," |",{"type":43,"tag":147,"props":340,"children":341},{"style":154},[342],{"type":49,"value":343}," head",{"type":43,"tag":147,"props":345,"children":346},{"style":159},[347],{"type":49,"value":348}," -30\n",{"type":43,"tag":56,"props":350,"children":351},{},[352,357,359],{"type":43,"tag":60,"props":353,"children":354},{},[355],{"type":49,"value":356},"Check analyzers",{"type":49,"value":358},": grep for analyzer timing\n",{"type":43,"tag":136,"props":360,"children":362},{"className":138,"code":361,"language":140,"meta":141,"style":141},"grep -i \"analyzer.*elapsed\\|Total analyzer execution time\\|CompilerAnalyzerDriver\" full.log\n",[363],{"type":43,"tag":68,"props":364,"children":365},{"__ignoreMap":141},[366],{"type":43,"tag":147,"props":367,"children":368},{"class":149,"line":150},[369,373,377,381,386,390],{"type":43,"tag":147,"props":370,"children":371},{"style":154},[372],{"type":49,"value":245},{"type":43,"tag":147,"props":374,"children":375},{"style":159},[376],{"type":49,"value":315},{"type":43,"tag":147,"props":378,"children":379},{"style":185},[380],{"type":49,"value":250},{"type":43,"tag":147,"props":382,"children":383},{"style":159},[384],{"type":49,"value":385},"analyzer.*elapsed\\|Total analyzer execution time\\|CompilerAnalyzerDriver",{"type":43,"tag":147,"props":387,"children":388},{"style":185},[389],{"type":49,"value":260},{"type":43,"tag":147,"props":391,"children":392},{"style":159},[393],{"type":49,"value":276},{"type":43,"tag":44,"props":395,"children":397},{"id":396},"key-metrics-and-thresholds",[398],{"type":49,"value":399},"Key Metrics and Thresholds",{"type":43,"tag":401,"props":402,"children":403},"ul",{},[404,414,424,434,444],{"type":43,"tag":56,"props":405,"children":406},{},[407,412],{"type":43,"tag":60,"props":408,"children":409},{},[410],{"type":49,"value":411},"Build duration",{"type":49,"value":413},": what's \"normal\" — small project \u003C10s, medium \u003C60s, large \u003C5min",{"type":43,"tag":56,"props":415,"children":416},{},[417,422],{"type":43,"tag":60,"props":418,"children":419},{},[420],{"type":49,"value":421},"Node utilization",{"type":49,"value":423},": ideal is >80% active time across nodes. Low utilization = serialization bottleneck",{"type":43,"tag":56,"props":425,"children":426},{},[427,432],{"type":43,"tag":60,"props":428,"children":429},{},[430],{"type":49,"value":431},"Single target domination",{"type":49,"value":433},": if one target is >50% of build time, investigate",{"type":43,"tag":56,"props":435,"children":436},{},[437,442],{"type":43,"tag":60,"props":438,"children":439},{},[440],{"type":49,"value":441},"Analyzer time vs compile time",{"type":49,"value":443},": analyzers should be \u003C30% of Csc task time. If higher, consider removing expensive analyzers",{"type":43,"tag":56,"props":445,"children":446},{},[447,452],{"type":43,"tag":60,"props":448,"children":449},{},[450],{"type":49,"value":451},"RAR time",{"type":49,"value":453},": ResolveAssemblyReference >5s is concerning. >15s is pathological",{"type":43,"tag":44,"props":455,"children":457},{"id":456},"common-bottlenecks",[458],{"type":49,"value":459},"Common Bottlenecks",{"type":43,"tag":103,"props":461,"children":463},{"id":462},"_1-resolveassemblyreference-rar-slowness",[464],{"type":49,"value":465},"1. ResolveAssemblyReference (RAR) Slowness",{"type":43,"tag":401,"props":467,"children":468},{},[469,479,489,515,538,548],{"type":43,"tag":56,"props":470,"children":471},{},[472,477],{"type":43,"tag":60,"props":473,"children":474},{},[475],{"type":49,"value":476},"Symptoms",{"type":49,"value":478},": RAR taking >5s per project",{"type":43,"tag":56,"props":480,"children":481},{},[482,487],{"type":43,"tag":60,"props":483,"children":484},{},[485],{"type":49,"value":486},"Root causes",{"type":49,"value":488},": too many assembly references, network-based reference paths, large assembly search paths",{"type":43,"tag":56,"props":490,"children":491},{},[492,497,499,505,507,513],{"type":43,"tag":60,"props":493,"children":494},{},[495],{"type":49,"value":496},"Fixes",{"type":49,"value":498},": reduce reference count, use ",{"type":43,"tag":68,"props":500,"children":502},{"className":501},[],[503],{"type":49,"value":504},"\u003CDesignTimeBuild>false\u003C\u002FDesignTimeBuild>",{"type":49,"value":506}," for RAR-heavy analysis, set ",{"type":43,"tag":68,"props":508,"children":510},{"className":509},[],[511],{"type":49,"value":512},"\u003CResolveAssemblyReferencesSilent>true\u003C\u002FResolveAssemblyReferencesSilent>",{"type":49,"value":514}," for diagnostic",{"type":43,"tag":56,"props":516,"children":517},{},[518,523,524,530,532],{"type":43,"tag":60,"props":519,"children":520},{},[521],{"type":49,"value":522},"Advanced",{"type":49,"value":66},{"type":43,"tag":68,"props":525,"children":527},{"className":526},[],[528],{"type":49,"value":529},"\u003CDesignTimeBuild>",{"type":49,"value":531}," and ",{"type":43,"tag":68,"props":533,"children":535},{"className":534},[],[536],{"type":49,"value":537},"\u003CResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>",{"type":43,"tag":56,"props":539,"children":540},{},[541,546],{"type":43,"tag":60,"props":542,"children":543},{},[544],{"type":49,"value":545},"Key insight",{"type":49,"value":547},": RAR runs unconditionally even on incremental builds because users may have installed targeting packs or GACed assemblies (see dotnet\u002Fmsbuild#2015). With .NET Core micro-assemblies, the reference count is often very high.",{"type":43,"tag":56,"props":549,"children":550},{},[551,556,558,564,566,572],{"type":43,"tag":60,"props":552,"children":553},{},[554],{"type":49,"value":555},"Reduce transitive references",{"type":49,"value":557},": Set ",{"type":43,"tag":68,"props":559,"children":561},{"className":560},[],[562],{"type":49,"value":563},"\u003CDisableTransitiveProjectReferences>true\u003C\u002FDisableTransitiveProjectReferences>",{"type":49,"value":565}," to avoid pulling in the full transitive closure (note: projects may need to add direct references for any types they consume). Use ",{"type":43,"tag":68,"props":567,"children":569},{"className":568},[],[570],{"type":49,"value":571},"ReferenceOutputAssembly=\"false\"",{"type":49,"value":573}," on ProjectReferences that are only needed at build time (not API surface). Trim unused PackageReferences.",{"type":43,"tag":103,"props":575,"children":577},{"id":576},"_2-roslyn-analyzers-and-source-generators",[578],{"type":49,"value":579},"2. Roslyn Analyzers and Source Generators",{"type":43,"tag":401,"props":581,"children":582},{},[583,592,610,664,674,699],{"type":43,"tag":56,"props":584,"children":585},{},[586,590],{"type":43,"tag":60,"props":587,"children":588},{},[589],{"type":49,"value":476},{"type":49,"value":591},": Csc task takes much longer than expected for file count (>2× clean compile time)",{"type":43,"tag":56,"props":593,"children":594},{},[595,600,602,608],{"type":43,"tag":60,"props":596,"children":597},{},[598],{"type":49,"value":599},"Diagnosis",{"type":49,"value":601},": Check the Task Performance Summary in the replayed log for Csc task time; grep for analyzer timing messages; compare Csc duration with and without analyzers (",{"type":43,"tag":68,"props":603,"children":605},{"className":604},[],[606],{"type":49,"value":607},"\u002Fp:RunAnalyzers=false",{"type":49,"value":609},")",{"type":43,"tag":56,"props":611,"children":612},{},[613,617,618],{"type":43,"tag":60,"props":614,"children":615},{},[616],{"type":49,"value":496},{"type":49,"value":134},{"type":43,"tag":401,"props":619,"children":620},{},[621,632,643,654,659],{"type":43,"tag":56,"props":622,"children":623},{},[624,626],{"type":49,"value":625},"Conditionally disable in dev: ",{"type":43,"tag":68,"props":627,"children":629},{"className":628},[],[630],{"type":49,"value":631},"\u003CRunAnalyzers Condition=\"'$(ContinuousIntegrationBuild)' != 'true'\">false\u003C\u002FRunAnalyzers>",{"type":43,"tag":56,"props":633,"children":634},{},[635,637],{"type":49,"value":636},"Per-configuration: ",{"type":43,"tag":68,"props":638,"children":640},{"className":639},[],[641],{"type":49,"value":642},"\u003CRunAnalyzers Condition=\"'$(Configuration)' == 'Debug'\">false\u003C\u002FRunAnalyzers>",{"type":43,"tag":56,"props":644,"children":645},{},[646,648],{"type":49,"value":647},"Code-style only: ",{"type":43,"tag":68,"props":649,"children":651},{"className":650},[],[652],{"type":49,"value":653},"\u003CEnforceCodeStyleInBuild Condition=\"'$(ContinuousIntegrationBuild)' == 'true'\">true\u003C\u002FEnforceCodeStyleInBuild>",{"type":43,"tag":56,"props":655,"children":656},{},[657],{"type":49,"value":658},"Remove genuinely redundant analyzers from inner loop",{"type":43,"tag":56,"props":660,"children":661},{},[662],{"type":49,"value":663},"Severity config in .editorconfig for less critical rules",{"type":43,"tag":56,"props":665,"children":666},{},[667,672],{"type":43,"tag":60,"props":668,"children":669},{},[670],{"type":49,"value":671},"Key principle",{"type":49,"value":673},": Preserve analyzer enforcement in CI. Never just \"remove\" analyzers — configure them conditionally.",{"type":43,"tag":56,"props":675,"children":676},{},[677,682,684,689,691,697],{"type":43,"tag":60,"props":678,"children":679},{},[680],{"type":49,"value":681},"GlobalPackageReference",{"type":49,"value":683},": Analyzers added via ",{"type":43,"tag":68,"props":685,"children":687},{"className":686},[],[688],{"type":49,"value":681},{"type":49,"value":690}," in ",{"type":43,"tag":68,"props":692,"children":694},{"className":693},[],[695],{"type":49,"value":696},"Directory.Packages.props",{"type":49,"value":698}," apply to ALL projects. Consider if test projects need the same analyzer set as production code.",{"type":43,"tag":56,"props":700,"children":701},{},[702,707,709,715,716,722,724,730],{"type":43,"tag":60,"props":703,"children":704},{},[705],{"type":49,"value":706},"EnforceCodeStyleInBuild",{"type":49,"value":708},": When set to ",{"type":43,"tag":68,"props":710,"children":712},{"className":711},[],[713],{"type":49,"value":714},"true",{"type":49,"value":690},{"type":43,"tag":68,"props":717,"children":719},{"className":718},[],[720],{"type":49,"value":721},"Directory.Build.props",{"type":49,"value":723},", forces code-style analysis on every build. Should be conditional on CI environment (",{"type":43,"tag":68,"props":725,"children":727},{"className":726},[],[728],{"type":49,"value":729},"ContinuousIntegrationBuild",{"type":49,"value":731},") to avoid slowing dev inner loop.",{"type":43,"tag":103,"props":733,"children":735},{"id":734},"_3-serialization-bottlenecks-single-threaded-targets",[736],{"type":49,"value":737},"3. Serialization Bottlenecks (Single-threaded targets)",{"type":43,"tag":401,"props":739,"children":740},{},[741,750,760],{"type":43,"tag":56,"props":742,"children":743},{},[744,748],{"type":43,"tag":60,"props":745,"children":746},{},[747],{"type":49,"value":476},{"type":49,"value":749},": Performance summary shows most build time concentrated in a single project; diagnostic log shows idle nodes while one works",{"type":43,"tag":56,"props":751,"children":752},{},[753,758],{"type":43,"tag":60,"props":754,"children":755},{},[756],{"type":49,"value":757},"Common culprits",{"type":49,"value":759},": targets without proper dependency declaration, single project on critical path",{"type":43,"tag":56,"props":761,"children":762},{},[763,767,769],{"type":43,"tag":60,"props":764,"children":765},{},[766],{"type":49,"value":496},{"type":49,"value":768},": split large projects, optimize the critical path project, ensure proper ",{"type":43,"tag":68,"props":770,"children":772},{"className":771},[],[773],{"type":49,"value":774},"BuildInParallel",{"type":43,"tag":103,"props":776,"children":778},{"id":777},"_4-excessive-file-io-copy-tasks",[779],{"type":49,"value":780},"4. Excessive File I\u002FO (Copy tasks)",{"type":43,"tag":401,"props":782,"children":783},{},[784,793,802,843],{"type":43,"tag":56,"props":785,"children":786},{},[787,791],{"type":43,"tag":60,"props":788,"children":789},{},[790],{"type":49,"value":476},{"type":49,"value":792},": Copy task shows high aggregate time",{"type":43,"tag":56,"props":794,"children":795},{},[796,800],{"type":43,"tag":60,"props":797,"children":798},{},[799],{"type":49,"value":486},{"type":49,"value":801},": copying thousands of files, copying across network drives, Copy task unintentionally running once per item (per-file) instead of as a single batch (see dotnet\u002Fmsbuild#12884)",{"type":43,"tag":56,"props":803,"children":804},{},[805,809,811,817,819,825,827,833,835,841],{"type":43,"tag":60,"props":806,"children":807},{},[808],{"type":49,"value":496},{"type":49,"value":810},": use hardlinks (",{"type":43,"tag":68,"props":812,"children":814},{"className":813},[],[815],{"type":49,"value":816},"\u003CCreateHardLinksForCopyFilesToOutputDirectoryIfPossible>true\u003C\u002FCreateHardLinksForCopyFilesToOutputDirectoryIfPossible>",{"type":49,"value":818},"), reduce CopyToOutputDirectory items, use ",{"type":43,"tag":68,"props":820,"children":822},{"className":821},[],[823],{"type":49,"value":824},"\u003CUseCommonOutputDirectory>true\u003C\u002FUseCommonOutputDirectory>",{"type":49,"value":826}," when appropriate, set ",{"type":43,"tag":68,"props":828,"children":830},{"className":829},[],[831],{"type":49,"value":832},"\u003CSkipCopyUnchangedFiles>true\u003C\u002FSkipCopyUnchangedFiles>",{"type":49,"value":834},", consider ",{"type":43,"tag":68,"props":836,"children":838},{"className":837},[],[839],{"type":49,"value":840},"--artifacts-path",{"type":49,"value":842}," (.NET 8+) for centralized output layout",{"type":43,"tag":56,"props":844,"children":845},{},[846,851],{"type":43,"tag":60,"props":847,"children":848},{},[849],{"type":49,"value":850},"Dev Drive",{"type":49,"value":852},": On Windows, switching to a Dev Drive (ReFS with copy-on-write and reduced Defender scans) can significantly reduce file I\u002FO overhead for Copy-heavy builds. Recommend for both dev machines and self-hosted CI agents.",{"type":43,"tag":103,"props":854,"children":856},{"id":855},"_5-evaluation-overhead",[857],{"type":49,"value":858},"5. Evaluation Overhead",{"type":43,"tag":401,"props":860,"children":861},{},[862,871,880,897],{"type":43,"tag":56,"props":863,"children":864},{},[865,869],{"type":43,"tag":60,"props":866,"children":867},{},[868],{"type":49,"value":476},{"type":49,"value":870},": build starts slow before any compilation",{"type":43,"tag":56,"props":872,"children":873},{},[874,878],{"type":43,"tag":60,"props":875,"children":876},{},[877],{"type":49,"value":486},{"type":49,"value":879},": complex Directory.Build.props, wildcard globs scanning large directories, NuGetSdkResolver overhead (adds 180-400ms per project evaluation even when restored — see dotnet\u002Fmsbuild#4025)",{"type":43,"tag":56,"props":881,"children":882},{},[883,887,889,895],{"type":43,"tag":60,"props":884,"children":885},{},[886],{"type":49,"value":496},{"type":49,"value":888},": reduce Directory.Build.props complexity, use ",{"type":43,"tag":68,"props":890,"children":892},{"className":891},[],[893],{"type":49,"value":894},"\u003CEnableDefaultItems>false\u003C\u002FEnableDefaultItems>",{"type":49,"value":896}," for legacy projects with explicit file lists, avoid NuGet-based SDK resolvers if possible",{"type":43,"tag":56,"props":898,"children":899},{},[900,902,908],{"type":49,"value":901},"See: ",{"type":43,"tag":68,"props":903,"children":905},{"className":904},[],[906],{"type":49,"value":907},"eval-performance",{"type":49,"value":909}," skill for detailed guidance",{"type":43,"tag":103,"props":911,"children":913},{"id":912},"_6-nuget-restore-in-build",[914],{"type":49,"value":915},"6. NuGet Restore in Build",{"type":43,"tag":401,"props":917,"children":918},{},[919,928],{"type":43,"tag":56,"props":920,"children":921},{},[922,926],{"type":43,"tag":60,"props":923,"children":924},{},[925],{"type":49,"value":476},{"type":49,"value":927},": restore runs every build even when unnecessary",{"type":43,"tag":56,"props":929,"children":930},{},[931,935,936],{"type":43,"tag":60,"props":932,"children":933},{},[934],{"type":49,"value":496},{"type":49,"value":134},{"type":43,"tag":401,"props":937,"children":938},{},[939,958],{"type":43,"tag":56,"props":940,"children":941},{},[942,944,950,952],{"type":49,"value":943},"Separate restore from build: ",{"type":43,"tag":68,"props":945,"children":947},{"className":946},[],[948],{"type":49,"value":949},"dotnet restore",{"type":49,"value":951}," then ",{"type":43,"tag":68,"props":953,"children":955},{"className":954},[],[956],{"type":49,"value":957},"dotnet build --no-restore",{"type":43,"tag":56,"props":959,"children":960},{},[961,963,969],{"type":49,"value":962},"Enable static graph evaluation: ",{"type":43,"tag":68,"props":964,"children":966},{"className":965},[],[967],{"type":49,"value":968},"\u003CRestoreUseStaticGraphEvaluation>true\u003C\u002FRestoreUseStaticGraphEvaluation>",{"type":49,"value":970}," in Directory.Build.props — can save significant time in large builds (results are workload-dependent)",{"type":43,"tag":103,"props":972,"children":974},{"id":973},"_7-large-project-count-and-graph-shape",[975],{"type":49,"value":976},"7. Large Project Count and Graph Shape",{"type":43,"tag":401,"props":978,"children":979},{},[980,989,1007,1017],{"type":43,"tag":56,"props":981,"children":982},{},[983,987],{"type":43,"tag":60,"props":984,"children":985},{},[986],{"type":49,"value":476},{"type":49,"value":988},": many small projects, each takes minimal time but overhead adds up; deep dependency chains serialize the build",{"type":43,"tag":56,"props":990,"children":991},{},[992,997,999,1005],{"type":43,"tag":60,"props":993,"children":994},{},[995],{"type":49,"value":996},"Consider",{"type":49,"value":998},": project consolidation, or use ",{"type":43,"tag":68,"props":1000,"children":1002},{"className":1001},[],[1003],{"type":49,"value":1004},"\u002Fgraph",{"type":49,"value":1006}," mode for better scheduling",{"type":43,"tag":56,"props":1008,"children":1009},{},[1010,1015],{"type":43,"tag":60,"props":1011,"children":1012},{},[1013],{"type":49,"value":1014},"Graph shape matters",{"type":49,"value":1016},": a wide dependency graph (few levels, many parallel branches) builds faster than a deep one (many levels, serialized). Refactoring from deep to wide can yield significant improvements in both clean and incremental build times.",{"type":43,"tag":56,"props":1018,"children":1019},{},[1020,1025],{"type":43,"tag":60,"props":1021,"children":1022},{},[1023],{"type":49,"value":1024},"Actions",{"type":49,"value":1026},": look for unnecessary project dependencies, consider splitting a bottleneck project into two, or merging small leaf projects",{"type":43,"tag":44,"props":1028,"children":1030},{"id":1029},"using-binlog-replay-for-performance-analysis",[1031],{"type":49,"value":1032},"Using Binlog Replay for Performance Analysis",{"type":43,"tag":1034,"props":1035,"children":1036},"p",{},[1037],{"type":49,"value":1038},"Step-by-step workflow using text log replay:",{"type":43,"tag":52,"props":1040,"children":1041},{},[1042,1108,1162,1202,1259,1303],{"type":43,"tag":56,"props":1043,"children":1044},{},[1045,1050,1051],{"type":43,"tag":60,"props":1046,"children":1047},{},[1048],{"type":49,"value":1049},"Replay with performance summary",{"type":49,"value":134},{"type":43,"tag":136,"props":1052,"children":1053},{"className":138,"code":139,"language":140,"meta":141,"style":141},[1054],{"type":43,"tag":68,"props":1055,"children":1056},{"__ignoreMap":141},[1057],{"type":43,"tag":147,"props":1058,"children":1059},{"class":149,"line":150},[1060,1064,1068,1072,1076,1080,1084,1088,1092,1096,1100,1104],{"type":43,"tag":147,"props":1061,"children":1062},{"style":154},[1063],{"type":49,"value":8},{"type":43,"tag":147,"props":1065,"children":1066},{"style":159},[1067],{"type":49,"value":162},{"type":43,"tag":147,"props":1069,"children":1070},{"style":159},[1071],{"type":49,"value":167},{"type":43,"tag":147,"props":1073,"children":1074},{"style":159},[1075],{"type":49,"value":172},{"type":43,"tag":147,"props":1077,"children":1078},{"style":159},[1079],{"type":49,"value":177},{"type":43,"tag":147,"props":1081,"children":1082},{"style":159},[1083],{"type":49,"value":182},{"type":43,"tag":147,"props":1085,"children":1086},{"style":185},[1087],{"type":49,"value":188},{"type":43,"tag":147,"props":1089,"children":1090},{"style":191},[1091],{"type":49,"value":194},{"type":43,"tag":147,"props":1093,"children":1094},{"style":185},[1095],{"type":49,"value":199},{"type":43,"tag":147,"props":1097,"children":1098},{"style":159},[1099],{"type":49,"value":204},{"type":43,"tag":147,"props":1101,"children":1102},{"style":185},[1103],{"type":49,"value":188},{"type":43,"tag":147,"props":1105,"children":1106},{"style":154},[1107],{"type":49,"value":213},{"type":43,"tag":56,"props":1109,"children":1110},{},[1111,1116,1117,1122,1123,1160],{"type":43,"tag":60,"props":1112,"children":1113},{},[1114],{"type":49,"value":1115},"Read target\u002Ftask performance summaries",{"type":49,"value":223},{"type":43,"tag":68,"props":1118,"children":1120},{"className":1119},[],[1121],{"type":49,"value":204},{"type":49,"value":230},{"type":43,"tag":136,"props":1124,"children":1125},{"className":138,"code":233,"language":140,"meta":141,"style":141},[1126],{"type":43,"tag":68,"props":1127,"children":1128},{"__ignoreMap":141},[1129],{"type":43,"tag":147,"props":1130,"children":1131},{"class":149,"line":150},[1132,1136,1140,1144,1148,1152,1156],{"type":43,"tag":147,"props":1133,"children":1134},{"style":154},[1135],{"type":49,"value":245},{"type":43,"tag":147,"props":1137,"children":1138},{"style":185},[1139],{"type":49,"value":250},{"type":43,"tag":147,"props":1141,"children":1142},{"style":159},[1143],{"type":49,"value":255},{"type":43,"tag":147,"props":1145,"children":1146},{"style":185},[1147],{"type":49,"value":260},{"type":43,"tag":147,"props":1149,"children":1150},{"style":159},[1151],{"type":49,"value":265},{"type":43,"tag":147,"props":1153,"children":1154},{"style":268},[1155],{"type":49,"value":271},{"type":43,"tag":147,"props":1157,"children":1158},{"style":159},[1159],{"type":49,"value":276},{"type":49,"value":1161},"\nThis shows all targets and tasks sorted by cumulative time — equivalent to finding expensive targets\u002Ftasks.",{"type":43,"tag":56,"props":1163,"children":1164},{},[1165,1170,1171],{"type":43,"tag":60,"props":1166,"children":1167},{},[1168],{"type":49,"value":1169},"Find per-project build times",{"type":49,"value":134},{"type":43,"tag":136,"props":1172,"children":1174},{"className":138,"code":1173,"language":140,"meta":141,"style":141},"grep \"done building project\\|Project Performance Summary\" full.log\n",[1175],{"type":43,"tag":68,"props":1176,"children":1177},{"__ignoreMap":141},[1178],{"type":43,"tag":147,"props":1179,"children":1180},{"class":149,"line":150},[1181,1185,1189,1194,1198],{"type":43,"tag":147,"props":1182,"children":1183},{"style":154},[1184],{"type":49,"value":245},{"type":43,"tag":147,"props":1186,"children":1187},{"style":185},[1188],{"type":49,"value":250},{"type":43,"tag":147,"props":1190,"children":1191},{"style":159},[1192],{"type":49,"value":1193},"done building project\\|Project Performance Summary",{"type":43,"tag":147,"props":1195,"children":1196},{"style":185},[1197],{"type":49,"value":260},{"type":43,"tag":147,"props":1199,"children":1200},{"style":159},[1201],{"type":49,"value":276},{"type":43,"tag":56,"props":1203,"children":1204},{},[1205,1210,1212],{"type":43,"tag":60,"props":1206,"children":1207},{},[1208],{"type":49,"value":1209},"Check parallelism",{"type":49,"value":1211}," (multi-node scheduling):\n",{"type":43,"tag":136,"props":1213,"children":1215},{"className":138,"code":1214,"language":140,"meta":141,"style":141},"grep -i \"node.*assigned\\|RequiresLeadingNewline\\|Building with\" full.log | head -30\n",[1216],{"type":43,"tag":68,"props":1217,"children":1218},{"__ignoreMap":141},[1219],{"type":43,"tag":147,"props":1220,"children":1221},{"class":149,"line":150},[1222,1226,1230,1234,1239,1243,1247,1251,1255],{"type":43,"tag":147,"props":1223,"children":1224},{"style":154},[1225],{"type":49,"value":245},{"type":43,"tag":147,"props":1227,"children":1228},{"style":159},[1229],{"type":49,"value":315},{"type":43,"tag":147,"props":1231,"children":1232},{"style":185},[1233],{"type":49,"value":250},{"type":43,"tag":147,"props":1235,"children":1236},{"style":159},[1237],{"type":49,"value":1238},"node.*assigned\\|RequiresLeadingNewline\\|Building with",{"type":43,"tag":147,"props":1240,"children":1241},{"style":185},[1242],{"type":49,"value":260},{"type":43,"tag":147,"props":1244,"children":1245},{"style":159},[1246],{"type":49,"value":333},{"type":43,"tag":147,"props":1248,"children":1249},{"style":185},[1250],{"type":49,"value":338},{"type":43,"tag":147,"props":1252,"children":1253},{"style":154},[1254],{"type":49,"value":343},{"type":43,"tag":147,"props":1256,"children":1257},{"style":159},[1258],{"type":49,"value":348},{"type":43,"tag":56,"props":1260,"children":1261},{},[1262,1267,1268],{"type":43,"tag":60,"props":1263,"children":1264},{},[1265],{"type":49,"value":1266},"Check analyzer overhead",{"type":49,"value":134},{"type":43,"tag":136,"props":1269,"children":1271},{"className":138,"code":1270,"language":140,"meta":141,"style":141},"grep -i \"Total analyzer execution time\\|analyzer.*elapsed\\|CompilerAnalyzerDriver\" full.log\n",[1272],{"type":43,"tag":68,"props":1273,"children":1274},{"__ignoreMap":141},[1275],{"type":43,"tag":147,"props":1276,"children":1277},{"class":149,"line":150},[1278,1282,1286,1290,1295,1299],{"type":43,"tag":147,"props":1279,"children":1280},{"style":154},[1281],{"type":49,"value":245},{"type":43,"tag":147,"props":1283,"children":1284},{"style":159},[1285],{"type":49,"value":315},{"type":43,"tag":147,"props":1287,"children":1288},{"style":185},[1289],{"type":49,"value":250},{"type":43,"tag":147,"props":1291,"children":1292},{"style":159},[1293],{"type":49,"value":1294},"Total analyzer execution time\\|analyzer.*elapsed\\|CompilerAnalyzerDriver",{"type":43,"tag":147,"props":1296,"children":1297},{"style":185},[1298],{"type":49,"value":260},{"type":43,"tag":147,"props":1300,"children":1301},{"style":159},[1302],{"type":49,"value":276},{"type":43,"tag":56,"props":1304,"children":1305},{},[1306,1311,1312],{"type":43,"tag":60,"props":1307,"children":1308},{},[1309],{"type":49,"value":1310},"Drill into a specific slow target",{"type":49,"value":134},{"type":43,"tag":136,"props":1313,"children":1315},{"className":138,"code":1314,"language":140,"meta":141,"style":141},"grep 'Target \"CoreCompile\"\\|Target \"ResolveAssemblyReferences\"' full.log\n",[1316],{"type":43,"tag":68,"props":1317,"children":1318},{"__ignoreMap":141},[1319],{"type":43,"tag":147,"props":1320,"children":1321},{"class":149,"line":150},[1322,1326,1331,1336,1341],{"type":43,"tag":147,"props":1323,"children":1324},{"style":154},[1325],{"type":49,"value":245},{"type":43,"tag":147,"props":1327,"children":1328},{"style":185},[1329],{"type":49,"value":1330}," '",{"type":43,"tag":147,"props":1332,"children":1333},{"style":159},[1334],{"type":49,"value":1335},"Target \"CoreCompile\"\\|Target \"ResolveAssemblyReferences\"",{"type":43,"tag":147,"props":1337,"children":1338},{"style":185},[1339],{"type":49,"value":1340},"'",{"type":43,"tag":147,"props":1342,"children":1343},{"style":159},[1344],{"type":49,"value":276},{"type":43,"tag":44,"props":1346,"children":1348},{"id":1347},"quick-wins-checklist",[1349],{"type":49,"value":1350},"Quick Wins Checklist",{"type":43,"tag":401,"props":1352,"children":1355},{"className":1353},[1354],"contains-task-list",[1356,1385,1406,1421,1436,1450,1466,1483,1499,1515,1529],{"type":43,"tag":56,"props":1357,"children":1360},{"className":1358},[1359],"task-list-item",[1361,1367,1369,1375,1377,1383],{"type":43,"tag":1362,"props":1363,"children":1366},"input",{"disabled":1364,"type":1365},true,"checkbox",[],{"type":49,"value":1368}," Use ",{"type":43,"tag":68,"props":1370,"children":1372},{"className":1371},[],[1373],{"type":49,"value":1374},"\u002Fmaxcpucount",{"type":49,"value":1376}," (or ",{"type":43,"tag":68,"props":1378,"children":1380},{"className":1379},[],[1381],{"type":49,"value":1382},"-m",{"type":49,"value":1384},") for parallel builds",{"type":43,"tag":56,"props":1386,"children":1388},{"className":1387},[1359],[1389,1392,1394,1399,1400,1405],{"type":43,"tag":1362,"props":1390,"children":1391},{"disabled":1364,"type":1365},[],{"type":49,"value":1393}," Separate restore from build (",{"type":43,"tag":68,"props":1395,"children":1397},{"className":1396},[],[1398],{"type":49,"value":949},{"type":49,"value":951},{"type":43,"tag":68,"props":1401,"children":1403},{"className":1402},[],[1404],{"type":49,"value":957},{"type":49,"value":609},{"type":43,"tag":56,"props":1407,"children":1409},{"className":1408},[1359],[1410,1413,1415,1420],{"type":43,"tag":1362,"props":1411,"children":1412},{"disabled":1364,"type":1365},[],{"type":49,"value":1414}," Enable static graph restore (",{"type":43,"tag":68,"props":1416,"children":1418},{"className":1417},[],[1419],{"type":49,"value":968},{"type":49,"value":609},{"type":43,"tag":56,"props":1422,"children":1424},{"className":1423},[1359],[1425,1428,1430,1435],{"type":43,"tag":1362,"props":1426,"children":1427},{"disabled":1364,"type":1365},[],{"type":49,"value":1429}," Enable hardlinks for Copy (",{"type":43,"tag":68,"props":1431,"children":1433},{"className":1432},[],[1434],{"type":49,"value":816},{"type":49,"value":609},{"type":43,"tag":56,"props":1437,"children":1439},{"className":1438},[1359],[1440,1443,1445],{"type":43,"tag":1362,"props":1441,"children":1442},{"disabled":1364,"type":1365},[],{"type":49,"value":1444}," Disable analyzers conditionally in dev inner loop: ",{"type":43,"tag":68,"props":1446,"children":1448},{"className":1447},[],[1449],{"type":49,"value":631},{"type":43,"tag":56,"props":1451,"children":1453},{"className":1452},[1359],[1454,1457,1459,1465],{"type":43,"tag":1362,"props":1455,"children":1456},{"disabled":1364,"type":1365},[],{"type":49,"value":1458}," Enable reference assemblies (",{"type":43,"tag":68,"props":1460,"children":1462},{"className":1461},[],[1463],{"type":49,"value":1464},"\u003CProduceReferenceAssembly>true\u003C\u002FProduceReferenceAssembly>",{"type":49,"value":609},{"type":43,"tag":56,"props":1467,"children":1469},{"className":1468},[1359],[1470,1473,1475,1481],{"type":43,"tag":1362,"props":1471,"children":1472},{"disabled":1364,"type":1365},[],{"type":49,"value":1474}," Check for broken incremental builds (see ",{"type":43,"tag":68,"props":1476,"children":1478},{"className":1477},[],[1479],{"type":49,"value":1480},"incremental-build",{"type":49,"value":1482}," skill)",{"type":43,"tag":56,"props":1484,"children":1486},{"className":1485},[1359],[1487,1490,1492,1498],{"type":43,"tag":1362,"props":1488,"children":1489},{"disabled":1364,"type":1365},[],{"type":49,"value":1491}," Check for bin\u002Fobj clashes (see ",{"type":43,"tag":68,"props":1493,"children":1495},{"className":1494},[],[1496],{"type":49,"value":1497},"check-bin-obj-clash",{"type":49,"value":1482},{"type":43,"tag":56,"props":1500,"children":1502},{"className":1501},[1359],[1503,1506,1508,1513],{"type":43,"tag":1362,"props":1504,"children":1505},{"disabled":1364,"type":1365},[],{"type":49,"value":1507}," Use graph build (",{"type":43,"tag":68,"props":1509,"children":1511},{"className":1510},[],[1512],{"type":49,"value":1004},{"type":49,"value":1514},") for multi-project solutions",{"type":43,"tag":56,"props":1516,"children":1518},{"className":1517},[1359],[1519,1522,1523,1528],{"type":43,"tag":1362,"props":1520,"children":1521},{"disabled":1364,"type":1365},[],{"type":49,"value":1368},{"type":43,"tag":68,"props":1524,"children":1526},{"className":1525},[],[1527],{"type":49,"value":840},{"type":49,"value":842},{"type":43,"tag":56,"props":1530,"children":1532},{"className":1531},[1359],[1533,1536],{"type":43,"tag":1362,"props":1534,"children":1535},{"disabled":1364,"type":1365},[],{"type":49,"value":1537}," Enable Dev Drive (ReFS) on Windows dev machines and self-hosted CI",{"type":43,"tag":44,"props":1539,"children":1541},{"id":1540},"impact-categorization",[1542],{"type":49,"value":1543},"Impact Categorization",{"type":43,"tag":1034,"props":1545,"children":1546},{},[1547],{"type":49,"value":1548},"When reporting findings, categorize by impact to help prioritize fixes:",{"type":43,"tag":401,"props":1550,"children":1551},{},[1552,1564,1576],{"type":43,"tag":56,"props":1553,"children":1554},{},[1555,1557,1562],{"type":49,"value":1556},"🔴 ",{"type":43,"tag":60,"props":1558,"children":1559},{},[1560],{"type":49,"value":1561},"HIGH IMPACT",{"type":49,"value":1563}," (do first): Items consuming >10% of total build time, or a single target >50% of build time",{"type":43,"tag":56,"props":1565,"children":1566},{},[1567,1569,1574],{"type":49,"value":1568},"🟡 ",{"type":43,"tag":60,"props":1570,"children":1571},{},[1572],{"type":49,"value":1573},"MEDIUM IMPACT",{"type":49,"value":1575},": Items consuming 2-10% of build time",{"type":43,"tag":56,"props":1577,"children":1578},{},[1579,1581,1586],{"type":49,"value":1580},"🟢 ",{"type":43,"tag":60,"props":1582,"children":1583},{},[1584],{"type":49,"value":1585},"QUICK WINS",{"type":49,"value":1587},": Easy changes with modest impact (e.g., property flags in Directory.Build.props)",{"type":43,"tag":1589,"props":1590,"children":1591},"style",{},[1592],{"type":49,"value":1593},"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":1595,"total":1749},[1596,1608,1621,1636,1654,1668,1688,1698,1710,1720,1733,1740],{"slug":1597,"name":1597,"fn":1598,"description":1599,"org":1600,"tags":1601,"stars":1605,"repoUrl":1606,"updatedAt":1607},"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},[1602,1603,1604],{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},5535,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fmsbuild","2026-07-22T05:37:33.965588",{"slug":1609,"name":1609,"fn":1610,"description":1611,"org":1612,"tags":1613,"stars":25,"repoUrl":26,"updatedAt":1620},"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},[1614,1615,1618,1619],{"name":17,"slug":18,"type":15},{"name":1616,"slug":1617,"type":15},"Code Analysis","code-analysis",{"name":23,"slug":24,"type":15},{"name":13,"slug":14,"type":15},"2026-07-12T08:23:25.400375",{"slug":1622,"name":1622,"fn":1623,"description":1624,"org":1625,"tags":1626,"stars":25,"repoUrl":26,"updatedAt":1635},"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},[1627,1628,1631,1632],{"name":17,"slug":18,"type":15},{"name":1629,"slug":1630,"type":15},"Android","android",{"name":23,"slug":24,"type":15},{"name":1633,"slug":1634,"type":15},"Microsoft","microsoft","2026-07-12T08:23:21.595572",{"slug":1637,"name":1637,"fn":1638,"description":1639,"org":1640,"tags":1641,"stars":25,"repoUrl":26,"updatedAt":1653},"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},[1642,1643,1644,1647,1650],{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":1645,"slug":1646,"type":15},"iOS","ios",{"name":1648,"slug":1649,"type":15},"macOS","macos",{"name":1651,"slug":1652,"type":15},"Observability","observability","2026-07-12T08:23:20.369986",{"slug":1655,"name":1655,"fn":1656,"description":1657,"org":1658,"tags":1659,"stars":25,"repoUrl":26,"updatedAt":1667},"assertion-quality","evaluate assertion quality in test suites","Analyzes the variety and depth of assertions across test suites in any language. Use when the user asks to evaluate assertion quality, find shallow tests, identify assertion-free tests (no assertions or only trivial ones like Assert.IsNotNull \u002F toBeTruthy()), flag self-referential or tautological assertions, measure assertion diversity, or audit whether tests verify different facets of behavior. Polyglot: .NET, Python, TS\u002FJS, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, C++. DO NOT USE FOR: writing new tests (use code-testing-agent \u002F writing-mstest-tests), mutation reasoning about whether tests would catch a bug (use test-gap-analysis), or a general severity-ranked anti-pattern audit (use test-anti-patterns), fixing or rewriting assertions, or writing, fixing, or modernizing MSTest tests, assertions, or attributes (use writing-mstest-tests).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1660,1661,1664],{"name":1616,"slug":1617,"type":15},{"name":1662,"slug":1663,"type":15},"QA","qa",{"name":1665,"slug":1666,"type":15},"Testing","testing","2026-07-12T08:23:51.277743",{"slug":1669,"name":1669,"fn":1670,"description":1671,"org":1672,"tags":1673,"stars":25,"repoUrl":26,"updatedAt":1687},"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},[1674,1675,1678,1681,1684],{"name":17,"slug":18,"type":15},{"name":1676,"slug":1677,"type":15},"Blazor","blazor",{"name":1679,"slug":1680,"type":15},"C#","csharp",{"name":1682,"slug":1683,"type":15},"UI Components","ui-components",{"name":1685,"slug":1686,"type":15},"Web Development","web-development","2026-07-15T06:03:29.216359",{"slug":1689,"name":1689,"fn":1690,"description":1691,"org":1692,"tags":1693,"stars":25,"repoUrl":26,"updatedAt":1697},"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},[1694,1695,1696],{"name":1616,"slug":1617,"type":15},{"name":23,"slug":24,"type":15},{"name":1633,"slug":1634,"type":15},"2026-07-12T08:21:34.637923",{"slug":1699,"name":1699,"fn":1700,"description":1701,"org":1702,"tags":1703,"stars":25,"repoUrl":26,"updatedAt":1709},"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},[1704,1707,1708],{"name":1705,"slug":1706,"type":15},"Build","build",{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},"2026-07-19T05:38:19.340791",{"slug":1711,"name":1711,"fn":1712,"description":1713,"org":1714,"tags":1715,"stars":25,"repoUrl":26,"updatedAt":1719},"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},[1716,1717,1718],{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},"2026-07-19T05:38:18.364937",{"slug":1721,"name":1721,"fn":1722,"description":1723,"org":1724,"tags":1725,"stars":25,"repoUrl":26,"updatedAt":1732},"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},[1726,1727,1730,1731],{"name":20,"slug":21,"type":15},{"name":1728,"slug":1729,"type":15},"Monitoring","monitoring",{"name":13,"slug":14,"type":15},{"name":1665,"slug":1666,"type":15},"2026-07-12T08:21:35.865649",{"slug":4,"name":4,"fn":5,"description":6,"org":1734,"tags":1735,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1736,1737,1738,1739],{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"slug":1497,"name":1497,"fn":1741,"description":1742,"org":1743,"tags":1744,"stars":25,"repoUrl":26,"updatedAt":1748},"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},[1745,1746,1747],{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"name":1662,"slug":1663,"type":15},"2026-07-19T05:38:14.336279",144,{"items":1751,"total":1800},[1752,1759,1766,1774,1780,1788,1794],{"slug":1609,"name":1609,"fn":1610,"description":1611,"org":1753,"tags":1754,"stars":25,"repoUrl":26,"updatedAt":1620},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1755,1756,1757,1758],{"name":17,"slug":18,"type":15},{"name":1616,"slug":1617,"type":15},{"name":23,"slug":24,"type":15},{"name":13,"slug":14,"type":15},{"slug":1622,"name":1622,"fn":1623,"description":1624,"org":1760,"tags":1761,"stars":25,"repoUrl":26,"updatedAt":1635},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1762,1763,1764,1765],{"name":17,"slug":18,"type":15},{"name":1629,"slug":1630,"type":15},{"name":23,"slug":24,"type":15},{"name":1633,"slug":1634,"type":15},{"slug":1637,"name":1637,"fn":1638,"description":1639,"org":1767,"tags":1768,"stars":25,"repoUrl":26,"updatedAt":1653},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1769,1770,1771,1772,1773],{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"name":1645,"slug":1646,"type":15},{"name":1648,"slug":1649,"type":15},{"name":1651,"slug":1652,"type":15},{"slug":1655,"name":1655,"fn":1656,"description":1657,"org":1775,"tags":1776,"stars":25,"repoUrl":26,"updatedAt":1667},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1777,1778,1779],{"name":1616,"slug":1617,"type":15},{"name":1662,"slug":1663,"type":15},{"name":1665,"slug":1666,"type":15},{"slug":1669,"name":1669,"fn":1670,"description":1671,"org":1781,"tags":1782,"stars":25,"repoUrl":26,"updatedAt":1687},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1783,1784,1785,1786,1787],{"name":17,"slug":18,"type":15},{"name":1676,"slug":1677,"type":15},{"name":1679,"slug":1680,"type":15},{"name":1682,"slug":1683,"type":15},{"name":1685,"slug":1686,"type":15},{"slug":1689,"name":1689,"fn":1690,"description":1691,"org":1789,"tags":1790,"stars":25,"repoUrl":26,"updatedAt":1697},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1791,1792,1793],{"name":1616,"slug":1617,"type":15},{"name":23,"slug":24,"type":15},{"name":1633,"slug":1634,"type":15},{"slug":1699,"name":1699,"fn":1700,"description":1701,"org":1795,"tags":1796,"stars":25,"repoUrl":26,"updatedAt":1709},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1797,1798,1799],{"name":1705,"slug":1706,"type":15},{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},96]