Problem
PR #76 removed JetBrains.Annotations wholesale (~1450 [PublicAPI] + friends). Side effect: Rider/ReSharper now flag Fallout's public build-authoring surface as "unused" — because it is unused in-repo by design (external consumers call it, we don't). Contributors get persistent false-positive "unused symbol" noise on exactly the API we ship.
[PublicAPI] tells the IDE "this is intentional API, consumed externally — don't flag it." It's an IDE authoring hint only: zero runtime/semantic effect.
Not this issue: API-surface break detection / changelog gating. That's #410 / #530 (Roslyn PublicApiAnalyzers). Complementary and separate — one silences an IDE hint, the other guards the shipped surface.
Outcome
Consumer-facing ("outer") assemblies advertise their public surface as intentional API again, so:
- contributors stop getting false unused-symbol warnings on shipped API;
- consumers' own Rider/ReSharper sees our surface as API too (the annotation flows through the package, no
PrivateAssets).
Acceptance criteria
Problem
PR #76 removed
JetBrains.Annotationswholesale (~1450[PublicAPI]+ friends). Side effect: Rider/ReSharper now flag Fallout's public build-authoring surface as "unused" — because it is unused in-repo by design (external consumers call it, we don't). Contributors get persistent false-positive "unused symbol" noise on exactly the API we ship.[PublicAPI]tells the IDE "this is intentional API, consumed externally — don't flag it." It's an IDE authoring hint only: zero runtime/semantic effect.Not this issue: API-surface break detection / changelog gating. That's #410 / #530 (Roslyn
PublicApiAnalyzers). Complementary and separate — one silences an IDE hint, the other guards the shipped surface.Outcome
Consumer-facing ("outer") assemblies advertise their public surface as intentional API again, so:
PrivateAssets).Acceptance criteria
JetBrains.Annotationsreferenced so the annotation flows to consumers (noPrivateAssets).[assembly: PublicAPI]via a single allowlist (one source of truth), not ~1450 hand-placed attributes.[PublicAPI]in source) — the hybrid split.