{"owner":"reactiveui","repo":"refit","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md","CLAUDE.md"],"skills":{"AGENTS.md":"# AGENTS.md\n\nCompatibility entrypoint only.\n\nFollow `CLAUDE.md` in this repository as the authoritative instruction file.\n","CLAUDE.md":"# CLAUDE.md\n\nThis file is the single source of truth for AI/agent assistance in this repository. It consolidates build/test commands, repository layout, test runner usage, and the main constraints needed to work safely in `Refit`.\n\nIf there is any conflict between other agent instruction files and this file, follow **CLAUDE.md**.\n\n---\n\n## Repository Orientation\n\n- **Repository root:** `.`\n- **Primary working directory for build/test:** `./src`\n- **Main solution:** `src/Refit.slnx`\n- **Tests:** `src/tests/`\n- **Examples:** `src/examples/`\n- **Benchmarks:** `src/Benchmarks/`\n\n---\n\n## Solution Format: SLNX\n\nThis repository uses **SLNX** (XML-based solution format) instead of legacy `.sln`.\n\n- Main file: `src/Refit.slnx`\n- Use `dotnet build` / `dotnet test` against the `.slnx` file the same way as a `.sln`\n\n---\n\n## Build Environment Requirements\n\n### Working Directory Rule\n\n**CRITICAL:** Run `dotnet` build/test commands from `./src`, not the repository root, unless the command explicitly uses `src/`-prefixed paths.\n\nRunning `dotnet test` from the repository root can trigger Microsoft Testing Platform / VSTest invocation issues on .NET 10+ SDKs.\n\n### Restore And Build\n\n```bash\ncd src\n\ndotnet restore \"Refit.slnx\"\ndotnet build \"Refit.slnx\"\ndotnet build \"Refit.slnx\" -c Release\ndotnet clean \"Refit.slnx\"\n```\n\n### Targeted Build Examples\n\n```bash\ncd src\n\ndotnet build \"InterfaceStubGenerator.Roslyn48/InterfaceStubGenerator.Roslyn48.csproj\" -v:minimal --no-restore /p:NuGetAudit=false /m:1\ndotnet build \"tests/Refit.GeneratedCode.TestModels/Refit.GeneratedCode.TestModels.csproj\" -f net8.0 -v:minimal --no-restore /p:NuGetAudit=false /m:1\ndotnet build \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 -v:minimal --no-restore /p:NuGetAudit=false /m:1\n```\n\nIf you run from the repository root, use explicit `src/`-prefixed paths:\n\n```bash\ndotnet build \"src/Refit.slnx\"\n```\n\n---\n\n## Testing: Microsoft Testing Platform (MTP) + TUnit\n\nThis repository uses **Microsoft Testing Platform (MTP)** with **TUnit**. This differs from VSTest.\n\n- Test support is enabled centrally in `src/Directory.Build.props`\n- Test execution settings live in `src/testconfig.json`\n- Command-line filtering uses **TUnit/MTP** syntax, not NUnit/xUnit/VSTest filter syntax\n\n### Testing Best Practices\n\n- Do **not** use repository-root `dotnet test`\n- Run `dotnet` commands from `./src`\n- Prefer building before testing rather than relying on stale binaries\n- Place TUnit/MTP-specific arguments **after** `--`\n- Test projects are executable; `dotnet run --project ...` is a valid way to invoke the TUnit/MTP runner directly\n\n### Test Commands\n\n```bash\ncd src\n\n# Run all tests\ndotnet test \"Refit.slnx\"\n\n# Run a specific project\ndotnet test \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0\n\n# Direct TUnit/MTP runner invocation\ndotnet run --project \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 --no-restore --no-build\n\n# Detailed output (argument goes after --)\ndotnet test \"Refit.slnx\" -- --output Detailed\n\n# List tests for a project\ndotnet test \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 -- --list-tests\n\n# Fail fast\ndotnet test \"Refit.slnx\" -- --fail-fast\n```\n\n### TUnit `--treenode-filter` Syntax\n\nPattern shape:\n\n```text\n/{AssemblyName}/{Namespace}/{ClassName}/{TestMethodName}\n```\n\nExamples:\n\n```bash\ncd src\n\n# Single test\ndotnet test \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 -- \\\n  --treenode-filter \"/*/*/*/GeneratedRequestBuilding_CanBeEmittedLoadedAndInvoked\"\n\n# All tests in a class\ndotnet test \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 -- \\\n  --treenode-filter \"/*/*/GeneratedRequestBuildingTests/*\"\n\n# Direct runner with a filter\ndotnet run --project \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 --no-restore --no-build -- \\\n  --treenode-filter \"/*/*/GeneratedRequestBuildingTests/*\"\n```\n\n---\n\n## Source Generator Work\n\n- Source generator projects live under `src/InterfaceStubGenerator.*`.\n- Generated output is emitted to `obj/Generated` by default through `src/Directory.Build.props`.\n- The generated-code compliance project is `src/tests/Refit.GeneratedCode.TestModels/Refit.GeneratedCode.TestModels.csproj`.\n- `RefitEmitGeneratedCodeMarkers=false` is used by generated-code compliance tests so analyzers treat generator output as normal source.\n- Keep generated source compatible with the repository `.editorconfig`; avoid broad `#pragma warning disable`.\n\n### Generator performance\n\nSettle generator perf with benchmarks and EventPipe traces, never by inspection or a hunch that \"it's already optimal\" — build overall (whole-generator) and micro (per-component) benchmarks and let the traces show where the real cost is before optimizing. Context, not a verdict that nothing can improve: the generator already uses `ForAttributeWithMetadataName`, value-equatable `readonly record struct` models + `ImmutableEquatableArray` (incremental caching depends on this), `PooledStringBuilder`, and incremental-cache regression tests. The generator builds against a single Roslyn version (4.8) and ships in a single `analyzers/dotnet/roslyn4.8/cs` slot; do not reintroduce a second slot to pick up newer Roslyn APIs without also handling legacy non-SDK consumers, which receive every slot at once (see `AnalyzerPackagingTests`).\n\nGenerator / incremental-pipeline benchmarks go in their own BenchmarkDotNet project (`src/benchmarks/Refit.Generator.Benchmarks`), separate from the runtime `Refit.Benchmarks`, built on the existing BenchmarkDotNet setup — never a bespoke driver. Profile with BenchmarkDotNet's native `[EventPipeProfiler(EventPipeProfile.GcVerbose|CpuSampling)]` diagnoser — EventPipe is the right lens for a Roslyn generator, whereas `[MemoryDiagnoser]` is a weak signal for whole-generator runs. Widening a generator member `private` -> `internal` (with `InternalsVisibleTo`) to micro-benchmark it is fine. Name benchmark classes for the component under test (parser, emitter, query/path building), not the measurement type.\n\nUseful validation:\n\n```bash\ncd src\n\ndotnet build \"InterfaceStubGenerator.Roslyn48/InterfaceStubGenerator.Roslyn48.csproj\" -v:minimal --no-restore /p:NuGetAudit=false /m:1\ndotnet build \"tests/Refit.GeneratedCode.TestModels/Refit.GeneratedCode.TestModels.csproj\" -f net8.0 -v:minimal --no-restore /p:NuGetAudit=false /m:1\ndotnet run --project \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 --no-restore --no-build\n```\n\n---\n\n## Repository Conventions\n\n- Shared target frameworks and package versions are centralized in `src/Directory.Build.props` and `src/Directory.Packages.props`.\n- The repository uses `LangVersion=latest`; use modern C# features where they improve clarity or generated-code quality.\n- AOT and trim analyzer behavior is enabled for compatible TFMs; prefer APIs that avoid reflection, dynamic code, and runtime type lookup.\n- Keep changes scoped. Do not rewrite unrelated files while touching generator/runtime paths.\n- Prefer focused tests that compile or execute the real generated output when changing source generator behavior.\n\n---\n\n## Public API tracking\n\nThe runtime projects use the public-API analyzer, so every public/protected member is recorded under `src/Refit/PublicAPI/<tfm>/`.\n\n- New public surface goes in `PublicAPI.Unshipped.txt` for each affected TFM while you iterate.\n- **Before opening a PR, move those new entries from `PublicAPI.Unshipped.txt` into the matching `PublicAPI.Shipped.txt` (and reset each unshipped file to just `#nullable enable`).** This repo ships almost immediately after merge, so unshipped API is promoted as part of the change rather than left pending.\n- For behavior changes or public API additions, also add a breaking-changes note to the README.\n- Shipped entries are assumed to be carried forward; you do not need to call them out separately in the PR.\n\n"},"files":{"AGENTS.md":"# AGENTS.md\n\nCompatibility entrypoint only.\n\nFollow `CLAUDE.md` in this repository as the authoritative instruction file.\n","CLAUDE.md":"# CLAUDE.md\n\nThis file is the single source of truth for AI/agent assistance in this repository. It consolidates build/test commands, repository layout, test runner usage, and the main constraints needed to work safely in `Refit`.\n\nIf there is any conflict between other agent instruction files and this file, follow **CLAUDE.md**.\n\n---\n\n## Repository Orientation\n\n- **Repository root:** `.`\n- **Primary working directory for build/test:** `./src`\n- **Main solution:** `src/Refit.slnx`\n- **Tests:** `src/tests/`\n- **Examples:** `src/examples/`\n- **Benchmarks:** `src/Benchmarks/`\n\n---\n\n## Solution Format: SLNX\n\nThis repository uses **SLNX** (XML-based solution format) instead of legacy `.sln`.\n\n- Main file: `src/Refit.slnx`\n- Use `dotnet build` / `dotnet test` against the `.slnx` file the same way as a `.sln`\n\n---\n\n## Build Environment Requirements\n\n### Working Directory Rule\n\n**CRITICAL:** Run `dotnet` build/test commands from `./src`, not the repository root, unless the command explicitly uses `src/`-prefixed paths.\n\nRunning `dotnet test` from the repository root can trigger Microsoft Testing Platform / VSTest invocation issues on .NET 10+ SDKs.\n\n### Restore And Build\n\n```bash\ncd src\n\ndotnet restore \"Refit.slnx\"\ndotnet build \"Refit.slnx\"\ndotnet build \"Refit.slnx\" -c Release\ndotnet clean \"Refit.slnx\"\n```\n\n### Targeted Build Examples\n\n```bash\ncd src\n\ndotnet build \"InterfaceStubGenerator.Roslyn48/InterfaceStubGenerator.Roslyn48.csproj\" -v:minimal --no-restore /p:NuGetAudit=false /m:1\ndotnet build \"tests/Refit.GeneratedCode.TestModels/Refit.GeneratedCode.TestModels.csproj\" -f net8.0 -v:minimal --no-restore /p:NuGetAudit=false /m:1\ndotnet build \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 -v:minimal --no-restore /p:NuGetAudit=false /m:1\n```\n\nIf you run from the repository root, use explicit `src/`-prefixed paths:\n\n```bash\ndotnet build \"src/Refit.slnx\"\n```\n\n---\n\n## Testing: Microsoft Testing Platform (MTP) + TUnit\n\nThis repository uses **Microsoft Testing Platform (MTP)** with **TUnit**. This differs from VSTest.\n\n- Test support is enabled centrally in `src/Directory.Build.props`\n- Test execution settings live in `src/testconfig.json`\n- Command-line filtering uses **TUnit/MTP** syntax, not NUnit/xUnit/VSTest filter syntax\n\n### Testing Best Practices\n\n- Do **not** use repository-root `dotnet test`\n- Run `dotnet` commands from `./src`\n- Prefer building before testing rather than relying on stale binaries\n- Place TUnit/MTP-specific arguments **after** `--`\n- Test projects are executable; `dotnet run --project ...` is a valid way to invoke the TUnit/MTP runner directly\n\n### Test Commands\n\n```bash\ncd src\n\n# Run all tests\ndotnet test \"Refit.slnx\"\n\n# Run a specific project\ndotnet test \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0\n\n# Direct TUnit/MTP runner invocation\ndotnet run --project \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 --no-restore --no-build\n\n# Detailed output (argument goes after --)\ndotnet test \"Refit.slnx\" -- --output Detailed\n\n# List tests for a project\ndotnet test \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 -- --list-tests\n\n# Fail fast\ndotnet test \"Refit.slnx\" -- --fail-fast\n```\n\n### TUnit `--treenode-filter` Syntax\n\nPattern shape:\n\n```text\n/{AssemblyName}/{Namespace}/{ClassName}/{TestMethodName}\n```\n\nExamples:\n\n```bash\ncd src\n\n# Single test\ndotnet test \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 -- \\\n  --treenode-filter \"/*/*/*/GeneratedRequestBuilding_CanBeEmittedLoadedAndInvoked\"\n\n# All tests in a class\ndotnet test \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 -- \\\n  --treenode-filter \"/*/*/GeneratedRequestBuildingTests/*\"\n\n# Direct runner with a filter\ndotnet run --project \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 --no-restore --no-build -- \\\n  --treenode-filter \"/*/*/GeneratedRequestBuildingTests/*\"\n```\n\n---\n\n## Source Generator Work\n\n- Source generator projects live under `src/InterfaceStubGenerator.*`.\n- Generated output is emitted to `obj/Generated` by default through `src/Directory.Build.props`.\n- The generated-code compliance project is `src/tests/Refit.GeneratedCode.TestModels/Refit.GeneratedCode.TestModels.csproj`.\n- `RefitEmitGeneratedCodeMarkers=false` is used by generated-code compliance tests so analyzers treat generator output as normal source.\n- Keep generated source compatible with the repository `.editorconfig`; avoid broad `#pragma warning disable`.\n\n### Generator performance\n\nSettle generator perf with benchmarks and EventPipe traces, never by inspection or a hunch that \"it's already optimal\" — build overall (whole-generator) and micro (per-component) benchmarks and let the traces show where the real cost is before optimizing. Context, not a verdict that nothing can improve: the generator already uses `ForAttributeWithMetadataName`, value-equatable `readonly record struct` models + `ImmutableEquatableArray` (incremental caching depends on this), `PooledStringBuilder`, and incremental-cache regression tests. The generator builds against a single Roslyn version (4.8) and ships in a single `analyzers/dotnet/roslyn4.8/cs` slot; do not reintroduce a second slot to pick up newer Roslyn APIs without also handling legacy non-SDK consumers, which receive every slot at once (see `AnalyzerPackagingTests`).\n\nGenerator / incremental-pipeline benchmarks go in their own BenchmarkDotNet project (`src/benchmarks/Refit.Generator.Benchmarks`), separate from the runtime `Refit.Benchmarks`, built on the existing BenchmarkDotNet setup — never a bespoke driver. Profile with BenchmarkDotNet's native `[EventPipeProfiler(EventPipeProfile.GcVerbose|CpuSampling)]` diagnoser — EventPipe is the right lens for a Roslyn generator, whereas `[MemoryDiagnoser]` is a weak signal for whole-generator runs. Widening a generator member `private` -> `internal` (with `InternalsVisibleTo`) to micro-benchmark it is fine. Name benchmark classes for the component under test (parser, emitter, query/path building), not the measurement type.\n\nUseful validation:\n\n```bash\ncd src\n\ndotnet build \"InterfaceStubGenerator.Roslyn48/InterfaceStubGenerator.Roslyn48.csproj\" -v:minimal --no-restore /p:NuGetAudit=false /m:1\ndotnet build \"tests/Refit.GeneratedCode.TestModels/Refit.GeneratedCode.TestModels.csproj\" -f net8.0 -v:minimal --no-restore /p:NuGetAudit=false /m:1\ndotnet run --project \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 --no-restore --no-build\n```\n\n---\n\n## Repository Conventions\n\n- Shared target frameworks and package versions are centralized in `src/Directory.Build.props` and `src/Directory.Packages.props`.\n- The repository uses `LangVersion=latest`; use modern C# features where they improve clarity or generated-code quality.\n- AOT and trim analyzer behavior is enabled for compatible TFMs; prefer APIs that avoid reflection, dynamic code, and runtime type lookup.\n- Keep changes scoped. Do not rewrite unrelated files while touching generator/runtime paths.\n- Prefer focused tests that compile or execute the real generated output when changing source generator behavior.\n\n---\n\n## Public API tracking\n\nThe runtime projects use the public-API analyzer, so every public/protected member is recorded under `src/Refit/PublicAPI/<tfm>/`.\n\n- New public surface goes in `PublicAPI.Unshipped.txt` for each affected TFM while you iterate.\n- **Before opening a PR, move those new entries from `PublicAPI.Unshipped.txt` into the matching `PublicAPI.Shipped.txt` (and reset each unshipped file to just `#nullable enable`).** This repo ships almost immediately after merge, so unshipped API is promoted as part of the change rather than left pending.\n- For behavior changes or public API additions, also add a breaking-changes note to the README.\n- Shipped entries are assumed to be carried forward; you do not need to call them out separately in the PR.\n\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"# AGENTS.md\n\nCompatibility entrypoint only.\n\nFollow `CLAUDE.md` in this repository as the authoritative instruction file.\n","category":"root","tokens":31},{"name":"CLAUDE.md","path":"CLAUDE.md","title":"CLAUDE.md","content":"# CLAUDE.md\n\nThis file is the single source of truth for AI/agent assistance in this repository. It consolidates build/test commands, repository layout, test runner usage, and the main constraints needed to work safely in `Refit`.\n\nIf there is any conflict between other agent instruction files and this file, follow **CLAUDE.md**.\n\n---\n\n## Repository Orientation\n\n- **Repository root:** `.`\n- **Primary working directory for build/test:** `./src`\n- **Main solution:** `src/Refit.slnx`\n- **Tests:** `src/tests/`\n- **Examples:** `src/examples/`\n- **Benchmarks:** `src/Benchmarks/`\n\n---\n\n## Solution Format: SLNX\n\nThis repository uses **SLNX** (XML-based solution format) instead of legacy `.sln`.\n\n- Main file: `src/Refit.slnx`\n- Use `dotnet build` / `dotnet test` against the `.slnx` file the same way as a `.sln`\n\n---\n\n## Build Environment Requirements\n\n### Working Directory Rule\n\n**CRITICAL:** Run `dotnet` build/test commands from `./src`, not the repository root, unless the command explicitly uses `src/`-prefixed paths.\n\nRunning `dotnet test` from the repository root can trigger Microsoft Testing Platform / VSTest invocation issues on .NET 10+ SDKs.\n\n### Restore And Build\n\n```bash\ncd src\n\ndotnet restore \"Refit.slnx\"\ndotnet build \"Refit.slnx\"\ndotnet build \"Refit.slnx\" -c Release\ndotnet clean \"Refit.slnx\"\n```\n\n### Targeted Build Examples\n\n```bash\ncd src\n\ndotnet build \"InterfaceStubGenerator.Roslyn48/InterfaceStubGenerator.Roslyn48.csproj\" -v:minimal --no-restore /p:NuGetAudit=false /m:1\ndotnet build \"tests/Refit.GeneratedCode.TestModels/Refit.GeneratedCode.TestModels.csproj\" -f net8.0 -v:minimal --no-restore /p:NuGetAudit=false /m:1\ndotnet build \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 -v:minimal --no-restore /p:NuGetAudit=false /m:1\n```\n\nIf you run from the repository root, use explicit `src/`-prefixed paths:\n\n```bash\ndotnet build \"src/Refit.slnx\"\n```\n\n---\n\n## Testing: Microsoft Testing Platform (MTP) + TUnit\n\nThis repository uses **Microsoft Testing Platform (MTP)** with **TUnit**. This differs from VSTest.\n\n- Test support is enabled centrally in `src/Directory.Build.props`\n- Test execution settings live in `src/testconfig.json`\n- Command-line filtering uses **TUnit/MTP** syntax, not NUnit/xUnit/VSTest filter syntax\n\n### Testing Best Practices\n\n- Do **not** use repository-root `dotnet test`\n- Run `dotnet` commands from `./src`\n- Prefer building before testing rather than relying on stale binaries\n- Place TUnit/MTP-specific arguments **after** `--`\n- Test projects are executable; `dotnet run --project ...` is a valid way to invoke the TUnit/MTP runner directly\n\n### Test Commands\n\n```bash\ncd src\n\n# Run all tests\ndotnet test \"Refit.slnx\"\n\n# Run a specific project\ndotnet test \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0\n\n# Direct TUnit/MTP runner invocation\ndotnet run --project \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 --no-restore --no-build\n\n# Detailed output (argument goes after --)\ndotnet test \"Refit.slnx\" -- --output Detailed\n\n# List tests for a project\ndotnet test \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 -- --list-tests\n\n# Fail fast\ndotnet test \"Refit.slnx\" -- --fail-fast\n```\n\n### TUnit `--treenode-filter` Syntax\n\nPattern shape:\n\n```text\n/{AssemblyName}/{Namespace}/{ClassName}/{TestMethodName}\n```\n\nExamples:\n\n```bash\ncd src\n\n# Single test\ndotnet test \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 -- \\\n  --treenode-filter \"/*/*/*/GeneratedRequestBuilding_CanBeEmittedLoadedAndInvoked\"\n\n# All tests in a class\ndotnet test \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 -- \\\n  --treenode-filter \"/*/*/GeneratedRequestBuildingTests/*\"\n\n# Direct runner with a filter\ndotnet run --project \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 --no-restore --no-build -- \\\n  --treenode-filter \"/*/*/GeneratedRequestBuildingTests/*\"\n```\n\n---\n\n## Source Generator Work\n\n- Source generator projects live under `src/InterfaceStubGenerator.*`.\n- Generated output is emitted to `obj/Generated` by default through `src/Directory.Build.props`.\n- The generated-code compliance project is `src/tests/Refit.GeneratedCode.TestModels/Refit.GeneratedCode.TestModels.csproj`.\n- `RefitEmitGeneratedCodeMarkers=false` is used by generated-code compliance tests so analyzers treat generator output as normal source.\n- Keep generated source compatible with the repository `.editorconfig`; avoid broad `#pragma warning disable`.\n\n### Generator performance\n\nSettle generator perf with benchmarks and EventPipe traces, never by inspection or a hunch that \"it's already optimal\" — build overall (whole-generator) and micro (per-component) benchmarks and let the traces show where the real cost is before optimizing. Context, not a verdict that nothing can improve: the generator already uses `ForAttributeWithMetadataName`, value-equatable `readonly record struct` models + `ImmutableEquatableArray` (incremental caching depends on this), `PooledStringBuilder`, and incremental-cache regression tests. The generator builds against a single Roslyn version (4.8) and ships in a single `analyzers/dotnet/roslyn4.8/cs` slot; do not reintroduce a second slot to pick up newer Roslyn APIs without also handling legacy non-SDK consumers, which receive every slot at once (see `AnalyzerPackagingTests`).\n\nGenerator / incremental-pipeline benchmarks go in their own BenchmarkDotNet project (`src/benchmarks/Refit.Generator.Benchmarks`), separate from the runtime `Refit.Benchmarks`, built on the existing BenchmarkDotNet setup — never a bespoke driver. Profile with BenchmarkDotNet's native `[EventPipeProfiler(EventPipeProfile.GcVerbose|CpuSampling)]` diagnoser — EventPipe is the right lens for a Roslyn generator, whereas `[MemoryDiagnoser]` is a weak signal for whole-generator runs. Widening a generator member `private` -> `internal` (with `InternalsVisibleTo`) to micro-benchmark it is fine. Name benchmark classes for the component under test (parser, emitter, query/path building), not the measurement type.\n\nUseful validation:\n\n```bash\ncd src\n\ndotnet build \"InterfaceStubGenerator.Roslyn48/InterfaceStubGenerator.Roslyn48.csproj\" -v:minimal --no-restore /p:NuGetAudit=false /m:1\ndotnet build \"tests/Refit.GeneratedCode.TestModels/Refit.GeneratedCode.TestModels.csproj\" -f net8.0 -v:minimal --no-restore /p:NuGetAudit=false /m:1\ndotnet run --project \"tests/Refit.GeneratorTests/Refit.GeneratorTests.csproj\" -f net8.0 --no-restore --no-build\n```\n\n---\n\n## Repository Conventions\n\n- Shared target frameworks and package versions are centralized in `src/Directory.Build.props` and `src/Directory.Packages.props`.\n- The repository uses `LangVersion=latest`; use modern C# features where they improve clarity or generated-code quality.\n- AOT and trim analyzer behavior is enabled for compatible TFMs; prefer APIs that avoid reflection, dynamic code, and runtime type lookup.\n- Keep changes scoped. Do not rewrite unrelated files while touching generator/runtime paths.\n- Prefer focused tests that compile or execute the real generated output when changing source generator behavior.\n\n---\n\n## Public API tracking\n\nThe runtime projects use the public-API analyzer, so every public/protected member is recorded under `src/Refit/PublicAPI/<tfm>/`.\n\n- New public surface goes in `PublicAPI.Unshipped.txt` for each affected TFM while you iterate.\n- **Before opening a PR, move those new entries from `PublicAPI.Unshipped.txt` into the matching `PublicAPI.Shipped.txt` (and reset each unshipped file to just `#nullable enable`).** This repo ships almost immediately after merge, so unshipped API is promoted as part of the change rather than left pending.\n- For behavior changes or public API additions, also add a breaking-changes note to the README.\n- Shipped entries are assumed to be carried forward; you do not need to call them out separately in the PR.\n\n","category":"root","tokens":1982}]}