Rulebearing Playground Coverage Schemas GitHub

ADR-0022: The .NET extractor stays the Rust metadata reader; the C# fallback is not invoked

Context

ADR-0003 fixed the rule: if the Rust reader attributes at least 99% of the .NET oracle repositories' types to a source file within the three-week window, it stays; otherwise a C# dotnet tool replaces it. The wave 0 plan operationalised "attributed" before any measurement (§ 1.6 and Step 9): the trigger figure is (pdb + inferred) / (types - excluded), where excluded is <Module> and every type carrying CompilerGeneratedAttribute, and inferred covers a nested type taking its enclosing type's file and the <TypeName>.cs naming convention.

The reader was built in sub-wave 0D and measured on 2026-09-22 over the eleven .NET oracles in testbeds/manifest.yaml at their pinned commits, each built with -c Release -p:DebugType=portable (conformance/archunitnet/scripts/spike-b-attribution.sh; per-repository JSON under conformance/archunitnet/attribution/).

Figure Attributed of 4,495 attributable types Share
PDB only (MethodDebugInformation, TypeDefinitionDocuments) 4,196 0.9335
PDB, plus nested types taking a PDB-attributed enclosing type's file 4,424 0.9842
Trigger figure (§ 1.6): PDB plus both inferences 4,463 0.9929
Raw, counting the 3,497 excluded types in the denominator 4,463 of 7,992 0.5584

Ten of the eleven repositories were measured; TNG/ArchUnitNET's global.json requires a newer SDK than the measuring machine had, and the weekly spike-b workflow measures it with the current SDK. One project targets .NET Framework (Nager.Date); no assembly had a Windows or missing PDB. TestAssembly attributes 45 of 45 types through the PDB.

Of the 32 unattributed types, most are compiler-synthesised without the attribute that would exclude them (<>y__InlineArray21, a synthesised collection's nested enumerator, <PrivateImplementationDetails>+__StaticArrayInitTypeSize=88); the rule counts them against the reader, as it was fixed to. The rest are Razor Page models (LoginModelinLogin.cshtml.cs`) and one nested enum in a type with no sequence points.

Decision

Consequences

Alternatives considered