resolve-project-references — Codex skill
Explains why high ResolveProjectReferences time in MSBuild can be misleading. Use it when a binlog points to that target as the apparent build bottleneck.
npx skills add dotnet/skills --skill resolve-project-references -a claude-codeWhat resolve-project-references does
This skill handles a specific MSBuild performance symptom: ResolveProjectReferences ranks highest in the Target Performance Summary. Its reported duration includes time spent waiting for dependent projects while an MSBuild node yields work, rather than CPU work done by the target itself.
It redirects the investigation to Task Performance Summary and task self-time. The preferred route uses the binlog MCP server's expensive_tasks tool; if MCP is unavailable, it replays build.binlog into a diagnostic text log and searches the task summary.
You need a diagnostic build log or a binlog with Target Performance Summary. That requirement matters: without one, there is nothing to inspect. When Csc, Copy, or ResolveAssemblyReference is the actual bottleneck, the skill points to build-perf-diagnostics.
What it helps with
- avoid tuning target wait time as CPU work
- rank expensive tasks from a binlog
- inspect Task Performance Summary instead of target totals
- replay a binlog into a diagnostic text log
- route
CscandCopybottlenecks to another skill
Example prompts for the agent
- Inspect
build.binlog: why doesResolveProjectReferencestake the most time? - Compare Target Performance Summary with task self-time and identify the real bottleneck.
- I have an MSBuild diagnostic log; check whether
ResolveProjectReferencesis only waiting on dependent projects.
How to install resolve-project-references
1Skills CLI (Vercel)
npx skills add dotnet/skills --skill resolve-project-references -a claude-code2Manually: put the files in place
~/.claude/skills/resolve-project-references/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/resolve-project-references/
1Skills CLI (Vercel)
npx skills add dotnet/skills --skill resolve-project-references -a codex2Manually: put the files in place
.agents/skills/resolve-project-references/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add dotnet/skills --skill resolve-project-references -a cursor2Manually: put the files in place
.cursor/skills/resolve-project-references/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install dotnet/skills resolve-project-references2Manually: put the files in place
.github/skills/resolve-project-references/SKILL.md1Skills CLI (Vercel)
npx skills add dotnet/skills --skill resolve-project-references -a gemini-cli2Platform CLI
gemini skills install https://github.com/dotnet/skills --path plugins/dotnet-msbuild/skills/resolve-project-referencesManually: put the files in place
.devin/skills/resolve-project-references/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add dotnet/skills --skill resolve-project-references -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about resolve-project-references
How do I install resolve-project-references in Codex?
Run npx skills add dotnet/skills --skill resolve-project-references -a codex. The skill file is placed at .agents/skills/resolve-project-references/SKILL.md.
What does resolve-project-references do?
It explains why the reported ResolveProjectReferences time can include waits for dependent project builds. It then directs the analysis to task self-time in Task Performance Summary.
What do I need to use this skill?
Use a diagnostic build log or binlog that contains Target Performance Summary. It uses the binlog MCP server's expensive_tasks tool when available, with a text-log replay path as a fallback.
Source text
SKILL.md · MIT
--- name: resolve-project-references description: "Guide for interpreting ResolveProjectReferences time in MSBuild performance summaries. Activate when ResolveProjectReferences appears as the most expensive target and developers are trying to optimize it directly. Explains that the reported time includes wait time for dependent project builds and is misleading. Guides users to focus on task self-time instead. Do not activate for general build performance -- use build-perf-diagnostics instead." license: MIT --- # Misleading ResolveProjectReferences Time Prevent misguided optimization of `ResolveProjectReferences` by explaining that its reported time is wall-clock wait time, not CPU work. ## When to Use - `ResolveProjectReferences` appears as the most expensive target in the Target Performance Summary - A developer is trying to optimize `ResolveProjectReferences` directly - Build performance analysis shows a single target consuming 50-80% of total build time ## When Not to Use - General build performance optimization (use `build-perf-diagnostics` instead) - The bottleneck is clearly a different target (e.g., `Csc`, `ResolveAssemblyReference`) - The user has not yet captured a binlog or performance summary ## Inputs | Input | Required | Description | |-------|----------|-------------| | Build log or binlog | Yes | A diagnostic build log or binlog containing the Target Performance Summary | ## Workflow ### Step 1: Confirm the misleading symptom Verify that `ResolveProjectReferences` appears as the top target in the **Target** Performance Summary. This is the misleading metric. ### Step 2: Explain why it is misleading The reported time includes **waiting for dependent projects to build** while the MSBuild node is yielded (see dotnet/msbuild#3135). During this wait, the node may be doing useful work on other projects. The target itself does very little work. ### Step 3: Redirect to task self-time Use the **Task** Performance Summary to identify the real bottleneck. #### Primary: binlog MCP (preferred) Use the **binlog MCP server** expensive_tasks tool to get task self-time rankings directly from the binlog. #### Fallback: text-log replay (when MCP is unavailable) ```bash dotnet msbuild build.binlog -noconlog -fl "-flp:v=diag;logfile=full.log;performancesummary" grep "Task Performance Summary" -A 50 full.log ``` Focus on self-time of actual tasks: - **Csc**: see `build-perf-diagnostics` skill (Section 2: Roslyn Analyzers) - **ResolveAssemblyReference**: see `build-perf-diagnostics` skill (Section 1: RAR) - **Copy**: see `build-perf-diagnostics` skill (Section 4: File I/O) - **Serialization bottlenecks**: see `build-parallelism` skill ## Validation - [ ] Task Performance Summary was used instead of Target Performance Summary - [ ] `ResolveProjectReferences` was not set as the optimization target - [ ] A concrete task (e.g., `Csc`, `Copy`, `ResolveAssemblyReference`) was identified as the true bottleneck
© dotnet · MIT · dotnet/skills