Skip to main content
skill CX Codex

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.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add dotnet/skills --skill resolve-project-references -a claude-code
Open on GitHub

What 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 Csc and Copy bottlenecks to another skill

Example prompts for the agent

  • Inspect build.binlog: why does ResolveProjectReferences take the most time?
  • Compare Target Performance Summary with task self-time and identify the real bottleneck.
  • I have an MSBuild diagnostic log; check whether ResolveProjectReferences is 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-code

2Manually: put the files in place

~/.claude/skills/resolve-project-references/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/resolve-project-references/

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

Similar skills

Everything for DevOps and infrastructure →

From the same set101

thread-abort-migration Guides migration of legacy .NET Framework Thread.Abort calls to cooperative cancellation using CancellationToken in .NET 6+. Helps resolve PlatformNotSupportedException and SYSLIB0006. CX Codex +1 3,300installs maui-app-lifecycle Tells your coding agent how .NET MAUI apps move between states and how to save data when the app gets backgrounded. CX Codex +1 3,300installs generate-testability-wrappers A skill that writes wrappers and DI registration for static C# dependencies no test can replace, or moves the code onto built-in abstractions. CX Codex +1 3,300installs nuget-trusted-publishing Configures OIDC-based trusted publishing for NuGet packages via GitHub Actions. It replaces long-lived API secrets with temporary tokens for secure nuget.org releases. CX Codex +1 3,300installs migrate-dotnet8-to-dotnet9 A skill that walks a project from net8.0 to net9.0: updates the TargetFramework, then works through build errors and behavioral changes in .NET 9, C# 13, ASP.NET Core 9 and EF Core 9. CX Codex +1 3,400installs including-generated-files Helps wire build-generated files into MSBuild compilation or output. Use it when an artifact exists during a build but is not picked up automatically. CX Codex +1 3,400installs clr-activation-debugging Reads the CLRLoad logs written by mscoree.dll and shows which runtime the shim picked for a .NET Framework process, or where the pick went wrong. CX Codex +1 3,400installs mtp-hot-reload Sets up a persistent Microsoft Testing Platform console host to apply code edits and rerun .NET tests immediately. CX Codex +1 3,400installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor