What problem does it solve? Designing [LoggerMessage] source-generated logging in .NET involves subtle constraints — templates cannot format collections, EventIds need per-category ranges, and call-site interpolation defeats the source generator — while testing log output requires knowing the exact FakeLogger generic vs non-generic compile contract. This Skill codifies those design rules and testing patterns so log lines stay inside the high-performance invariant and tests actually compile and assert correctly. ## Core Features & Use Cases - LoggerMessage design rules: nested static partial Log classes, explicit EventIds allocated per category range, pre-joining collections at the call site, per-item detail logs vs counts, and avoiding record widening that ripples into API/MCP wire contracts. - FakeLogger testing guidance: generic vs non-generic compile contract (CS1503 avoidance), LatestRecord/AllRecords assertions, fresh-collector isolation under xunit parallelism, and RED-first EventId tests with non-vacuous guard assertions. - Use Case: When a finding says "feature promises to log ranked candidates but logs only counts", use this Skill to design the new EventId (e.g. 507), write the RED FakeLogger test asserting level and message contents, and decide implement-vs-correct-docs by counting promise surfaces. ## Quick Start Use the dotnet-logger-message-design skill to design a new LoggerMessage detail log with an explicit EventId and write a RED-first FakeLogger test asserting its level and message contents.