Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/cwoodruff/dotnet-claude-code-kit/async-hygienenpx skills add cwoodruff/dotnet-claude-code-kit --skill async-hygienegit clone --depth 1 https://github.com/cwoodruff/dotnet-claude-code-kitWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/cwoodruff/dotnet-claude-code-kit/async-hygiene)<a href="https://agentmods.dev/skills/cwoodruff/dotnet-claude-code-kit/async-hygiene"><img src="https://agentmods.dev/badge/skills/cwoodruff/dotnet-claude-code-kit/async-hygiene.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00057 | $0.00389 |
| Opus 5 | $0.00028 | $0.00195 |
| Sonnet 5 | $0.00011 | $0.00078 |
| Haiku 4.5 | $0.00006 | $0.00039 |
Grade A, and why
async-hygiene scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 3d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
This is a copy
100% identical to async-hygiene — 0 lines differ, which has more behind it and is treated as the original. This page carries a canonical link to it rather than competing with it.
What it actually says
Async/Await Hygiene Sweep
Scan the target scope (default: whole solution) for each anti-pattern, in this order, and fix with the standard remedy:
| Anti-pattern | Find | Fix |
|---|---|---|
| Sync-over-async | .Result, .Wait(), .GetAwaiter().GetResult() |
Make the caller async and await |
async void |
any non-event-handler | Return Task |
| Missing CancellationToken | async public methods without a token parameter | Add CancellationToken cancellationToken = default and thread it through |
| Fire-and-forget | unawaited Task-returning calls | Await, or route through a background service with error handling |
Task.Run in ASP.NET request path |
Task.Run( in Api project |
Remove — the request is already on a thread-pool thread |
| Async lambda passed to sync delegate | async lambda to Action<> |
Change delegate type or restructure |
Unnecessary async/await wrapper |
method whose only await is the final return | Return the Task directly (unless in a using/try) |
| Blocking I/O in async method | File.ReadAllText, Thread.Sleep inside async |
Use async equivalents (ReadAllTextAsync, Task.Delay) |
Process: grep for each pattern → read the surrounding code (some hits are legitimate, e.g. Main, console tools) → fix true positives → dotnet build → report a table of what changed and any hits deliberately left alone with reasoning.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 3d ago First seen · 22 lines · 57 tokens per session scan A 80c2bc150c7a
async-hygiene is a skill published in the GitHub repository cwoodruff/dotnet-claude-code-kit (2 stars, last pushed 1mo ago), licensed MIT. It adds 57 tokens to every session and 389 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 0 findings. It is 100% identical to async-hygiene, differing in 0 lines, and is treated as a copy.
Other skills, from other repositories
build-and-test
How to build and test .NET projects in the Agent Framework repository. Use this when verifying or testing changes.
nunit-testing
Use when writing or modifying tests in NUnit's own test projects, or when making a behavioral change to production code that needs test coverage. Covers test structure, attribute choice, helper visibility, platform guards, and which test projects are real.
agents-sdk-dotnet
Use when any code imports Microsoft.Agents.Hosting.AspNetCore, Microsoft.Agents.Builder, or related Agents SDK packages, or when the user is building, configuring, or asking questions about a Microsoft 365 Agents SDK agent in C# / .NET. Trigger on questions about appsettings.json, connection configuration…
agents-sdk-dotnet-otel
Use when adding, configuring, validating, or troubleshooting OpenTelemetry observability for a Microsoft 365 Agents SDK application in C# / .NET. Trigger when the user mentions OpenTelemetry, OTel, telemetry, traces, metrics, logs, OTLP, Aspire Dashboard, Application Insights, Azure Monitor, distributed tracing…
bf-to-agents-sdk-dotnet-migration
Use when migrating a Bot Framework .NET SDK bot to Microsoft 365 Agents SDK. Triggered by projects that depend on packages: Microsoft.Bot.Builder or Microsoft.Bot.Builder.Integration.AspNet.Core that want to migrate to Agents SDK.
agents-sdk-dotnet-debugging
Use when troubleshooting an agent built with the Microsoft Agents SDK (Microsoft.Agents.Hosting.AspNetCore and related packages) in C# / .NET. Trigger on any of these symptoms: build or C# compile errors, crashes on startup, 401 or auth errors on incoming requests, the bot not responding to messages, appsettings.json…