Skip to content

Skipped StyleCop rules

Every StyleCop.Analyzers rule StyleBro doesn't cover, with why and what it would take to revisit it, so the decisions can be picked up again later. Rules that are covered but behave differently are at the end. The full picture, including covered rules, is in stylecop-mapping.md.

How to revisit a rule

  1. Check the demand: how many surveyed teams keep the rule on, and how often it fires (the numbers in each entry; the repos are listed in stylecop-mapping.md).
  2. If the SDK might cover it, add a case to scripts/stylecop-survey/sdk-check-cases.ps1 and run Test-SdkCoverage.ps1. Then check it doesn't change code StyleCop accepts: Measure-MigrationDelta.ps1 on a StyleCop-clean repo (that's how the preset's SA1501/SA1502 and IDE0040 settings were caught).
  3. For a StyleBro rule, follow the design rules in CLAUDE.md (fix + Fix All, idempotent, skip unsafe cases), add a parity set to parity/parity.psd1 and run Compare-WithStyleCop.ps1 against StyleCop 1.2.
  4. Move the entry out of skipped.psd1 (into decisions.psd1) and regenerate.

Summary

44 rules: 0 candidate, 0 SDK not on yet, 32 drop, 10 not in StyleCop, 0 variant, 2 n/a.

Rule Title Status Teams keeping it on (OTel / Polly / App) Diagnostics (OTel / Polly / App)
SA1118 Parameter should not span multiple lines drop on / on / off 0 / 0 / 126
SA1401 Fields should be private drop off / off / off 141 / 48 / 39
SA1402 File may only contain a single type drop on / off / off 0 / 34 / 1
SA1403 File may only contain a single namespace drop on / on / on 0 / 0 / 0
SA1404 Code analysis suppression should have justification drop on / on / on 0 / 0 / 0
SA1405 Debug.Assert should provide message text drop on / on / on 0 / 0 / 0
SA1406 Debug.Fail should provide message text drop on / on / on 0 / 0 / 0
SA1414 Tuple types in signatures should have element names drop on / on / on 0 / 0 / 0
SA1601 Partial elements should be documented drop on / off / on 16 / 78 / 0
SA1602 Enumeration items should be documented drop on / on / on 0 / 10 / 530
SA1603 Documentation should contain valid XML drop off / on / off 0 / 0 / 0
SA1604 Element documentation should have summary drop on / on / on 0 / 0 / 1
SA1605 Partial element documentation should have summary drop on / on / on 0 / 0 / 0
SA1606 Element documentation should have summary text drop on / on / on 0 / 0 / 0
SA1607 Partial element documentation should have summary text drop on / on / on 0 / 0 / 0
SA1608 Element documentation should not have default summary drop on / on / on 0 / 0 / 0
SA1609 Property documentation should have value drop off / off / off 292 / 171 / 8
SA1610 Property documentation should have value text drop on / off / on 0 / 0 / 0
SA1611 Element parameters should be documented drop on / on / on 8 / 1 / 11
SA1614 Element parameter documentation should have text drop on / on / off 0 / 0 / 4
SA1615 Element return value should be documented drop on / on / on 3 / 1 / 6
SA1616 Element return value documentation should have text drop on / on / on 0 / 0 / 0
SA1618 Generic type parameters should be documented drop on / on / on 0 / 0 / 1
SA1619 Generic type parameters should be documented partial class drop on / on / on 0 / 0 / 0
SA1622 Generic type parameter documentation should have text drop on / on / on 0 / 0 / 0
SA1625 Element documentation should not be copied and pasted drop on / on / on 0 / 0 / 0
SA1639 File header should have summary drop off / off / off 0 / 0 / 0
SA1645 Included documentation file does not exist drop off / on / off 0 / 0 / 0
SA1646 Included documentation XPath does not exist drop off / on / off 0 / 0 / 0
SA1647 Include node does not contain valid file and path drop off / on / off 0 / 0 / 0
SA1648 inheritdoc should be used with inheriting class drop on / on / on 0 / 0 / 0
SA1649 File name should match first type name drop off / on / off 0 / 0 / 1
SA1109 Block statements should not contain embedded regions not in StyleCop off / on / off 0 / 0 / 0
SA1126 Prefix calls correctly not in StyleCop off / off / off 0 / 0 / 0
SA1301 Element should begin with lower-case letter not in StyleCop off / off / off 0 / 0 / 0
SA1409 Remove unnecessary code not in StyleCop off / on / off 0 / 0 / 0
SA1628 Documentation text should begin with a capital letter not in StyleCop off / on / off 0 / 0 / 0
SA1630 Documentation text should contain whitespace not in StyleCop off / on / off 0 / 0 / 0
SA1631 Documentation should meet character percentage not in StyleCop off / on / off 0 / 0 / 0
SA1632 Documentation text should meet minimum character length not in StyleCop off / on / off 0 / 0 / 0
SA1644 Documentation headers should not contain blank lines not in StyleCop off / on / off 0 / 0 / 0
SA1650 Element documentation should be spelled correctly not in StyleCop off / on / off 0 / 0 / 0
SA0001 XML comment analysis disabled n/a on / off / off 0 / 0 / 0
SA0002 Invalid settings file n/a on / on / on 0 / 0 / 0

Dropped: no safe automatic fix

SA1118: Parameter should not span multiple lines

Readability rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): on / on / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 126.

Why: StyleCop has no fix. A multi-line argument (other than the first, or a lambda/anonymous object) needs extracting into a variable: a refactoring that names things. 126 findings in the private app.

To revisit: Only if a deterministic extraction is acceptable (variable name from the parameter name). Probably stays a human job.

SA1401: Fields should be private

Maintainability rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): off / off / off. Diagnostics with every rule on (OTel / Polly / App): 141 / 48 / 39.

Why: Making a public or protected field private changes the public API and breaks callers. 141 / 48 / 39 findings with the rule on.

To revisit: Only for private nested types or internal fields without InternalsVisibleTo, converting to a property. Probably not worth it.

SA1402: File may only contain a single type

Maintainability rule. StyleCop: on by default, has a code fix. Teams keeping it on (OTel / Polly / App): on / off / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 34 / 1.

Why: Moving a type to its own file isn't something dotnet format can do (code fixes can't add documents through it).

To revisit: Would need a separate tool (stylebro-migrate could do it as a one-off).

SA1403: File may only contain a single namespace

Maintainability rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: StyleCop has no fix; splitting namespaces into files has the same problem as SA1402.

To revisit: Same as SA1402.

SA1404: Code analysis suppression should have justification

Maintainability rule. StyleCop: on by default, has a code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: The justification of a SuppressMessage has to be written by a person.

To revisit: Nothing automatic.

SA1405: Debug.Assert should provide message text

Maintainability rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: StyleCop has no fix; the message for Debug.Assert has to be written by a person.

To revisit: A generated message (the condition's text, like CallerArgumentExpression) is possible but adds little.

SA1406: Debug.Fail should provide message text

Maintainability rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: StyleCop has no fix; the message for Debug.Fail has to be written by a person.

To revisit: Nothing automatic.

SA1414: Tuple types in signatures should have element names

Readability rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: StyleCop has no fix (1.2 only); tuple element names in signatures have to be chosen by a person.

To revisit: Nothing automatic.

SA1601: Partial elements should be documented

Documentation rule. StyleCop: on by default, has a code fix. Teams keeping it on (OTel / Polly / App): on / off / on. Diagnostics with every rule on (OTel / Polly / App): 16 / 78 / 0.

Why: Missing documentation on a partial element; the only fix is placeholder text (no stubs, user decision).

To revisit: Revisit with the stub decision.

SA1602: Enumeration items should be documented

Documentation rule. StyleCop: on by default, has a code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 0 / 10 / 530.

Why: Missing documentation on enum members; the only fix is placeholder text (no stubs, user decision). 530 findings in the private app.

To revisit: Revisit with the stub decision.

SA1603: Documentation should contain valid XML

Documentation rule. StyleCop: off by default, no code fix. Teams keeping it on (OTel / Polly / App): off / on / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: Off by default, no StyleCop fix; invalid XML needs a person to say what was meant.

To revisit: A narrow fix is possible: escape a lone & or < in text. Probe how often that's the cause.

SA1604: Element documentation should have summary

Documentation rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 1.

Why: A doc comment without <summary>; the fix would be placeholder text.

To revisit: Revisit with the stub decision. If the comment has plain text outside any tag, wrapping it in <summary> is a real fix: worth a probe.

SA1605: Partial element documentation should have summary

Documentation rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: Same as SA1604 for partial elements.

To revisit: With SA1604.

SA1606: Element documentation should have summary text

Documentation rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: An empty <summary>; the fix would be placeholder text (no stubs, user decision).

To revisit: Revisit with the stub decision.

SA1607: Partial element documentation should have summary text

Documentation rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: Same as SA1606 for partial elements.

To revisit: With SA1606.

SA1608: Element documentation should not have default summary

Documentation rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: The default "Summary description for X" text has to be replaced by a person.

To revisit: Nothing automatic.

SA1609: Property documentation should have value

Documentation rule. StyleCop: off by default, has a code fix. Teams keeping it on (OTel / Polly / App): off / off / off. Diagnostics with every rule on (OTel / Polly / App): 292 / 171 / 8.

Why: Off by default. Missing <value>; the fix would be placeholder text (no stubs, user decision).

To revisit: Revisit with the stub decision. A <value> derived from the summary ("Gets the name." -> "The name.") is conceivable.

SA1610: Property documentation should have value text

Documentation rule. StyleCop: on by default, has a code fix. Teams keeping it on (OTel / Polly / App): on / off / on. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: An empty <value>; StyleCop's fix writes placeholder text.

To revisit: Removing the empty tag would be a real fix, but trades one diagnostic for SA1609 (off by default). Decide with SA1609.

SA1611: Element parameters should be documented

Documentation rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 8 / 1 / 11.

Why: Missing <param>; the fix would be placeholder text (no stubs, user decision).

To revisit: Revisit with the stub decision.

SA1614: Element parameter documentation should have text

Documentation rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): on / on / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 4.

Why: An empty <param>; the fix would be placeholder text.

To revisit: Revisit with the stub decision.

SA1615: Element return value should be documented

Documentation rule. StyleCop: on by default, has a code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 3 / 1 / 6.

Why: Missing <returns>; the fix would be placeholder text.

To revisit: Revisit with the stub decision.

SA1616: Element return value documentation should have text

Documentation rule. StyleCop: on by default, has a code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: An empty <returns>; the fix would be placeholder text.

To revisit: Revisit with the stub decision.

SA1618: Generic type parameters should be documented

Documentation rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 1.

Why: Missing <typeparam>; the fix would be placeholder text.

To revisit: Revisit with the stub decision.

SA1619: Generic type parameters should be documented partial class

Documentation rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: Same as SA1618 for partial types.

To revisit: With SA1618.

SA1622: Generic type parameter documentation should have text

Documentation rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: An empty <typeparam>; the fix would be placeholder text.

To revisit: Revisit with the stub decision.

SA1625: Element documentation should not be copied and pasted

Documentation rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: Identical text copied between tags has to be rewritten by a person.

To revisit: Nothing automatic.

SA1639: File header should have summary

Documentation rule. StyleCop: off by default, has a code fix. Teams keeping it on (OTel / Polly / App): off / off / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: Off by default; the header's <summary> has to be written by a person.

To revisit: Nothing automatic.

SA1645: Included documentation file does not exist

Documentation rule. StyleCop: off by default, no code fix. Teams keeping it on (OTel / Polly / App): off / on / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: Off by default; a missing <include> file can't be fixed automatically.

To revisit: Nothing automatic.

SA1646: Included documentation XPath does not exist

Documentation rule. StyleCop: off by default, no code fix. Teams keeping it on (OTel / Polly / App): off / on / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: Off by default; a wrong <include> XPath can't be fixed automatically.

To revisit: Nothing automatic.

SA1647: Include node does not contain valid file and path

Documentation rule. StyleCop: off by default, no code fix. Teams keeping it on (OTel / Polly / App): off / on / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: Off by default; an <include> without file/path can't be fixed automatically.

To revisit: Nothing automatic.

SA1648: inheritdoc should be used with inheriting class

Documentation rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: <inheritdoc/> where there is nothing to inherit: the fix is real documentation.

To revisit: Nothing automatic. (BRO1601 only adds <inheritdoc/> where there is something to inherit.)

SA1649: File name should match first type name

Documentation rule. StyleCop: on by default, has a code fix. Teams keeping it on (OTel / Polly / App): off / on / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 1.

Why: Renaming files isn't something dotnet format can do.

To revisit: Would need a separate tool (stylebro-migrate could do it as a one-off, with git mv).

Dropped: StyleCop never reports it

SA1109: Block statements should not contain embedded regions

Readability rule. StyleCop: off by default, no code fix; SDK check: StyleCop reports nothing. Teams keeping it on (OTel / Polly / App): off / on / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: Off by default and no diagnostic for a region between if (b) and its block (probed).

To revisit: Nothing to port. Regions are BRO1112/BRO1113.

SA1126: Prefix calls correctly

Readability rule. StyleCop: off by default, no code fix; SDK check: StyleCop reports nothing. Teams keeping it on (OTel / Polly / App): off / off / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: Off by default and no diagnostic on an unprefixed member call (probed).

To revisit: Nothing to port.

SA1301: Element should begin with lower-case letter

Naming rule. StyleCop: off by default, no code fix; SDK check: StyleCop reports nothing. Teams keeping it on (OTel / Polly / App): off / off / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: Off by default and no diagnostic (probed). StyleCop keeps the id for compatibility.

To revisit: Nothing to port.

SA1409: Remove unnecessary code

Maintainability rule. StyleCop: off by default, no code fix; SDK check: StyleCop reports nothing. Teams keeping it on (OTel / Polly / App): off / on / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: Off by default and no diagnostic for an empty try { } finally { } (probed).

To revisit: Nothing to port.

SA1628: Documentation text should begin with a capital letter

Documentation rule. StyleCop: off by default, no code fix. Teams keeping it on (OTel / Polly / App): off / on / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: StyleCop 1.2 never reports it (not implemented, probed while building BRO16xx).

To revisit: Nothing to port. A capitalization fix would be easy if a team wants it.

SA1630: Documentation text should contain whitespace

Documentation rule. StyleCop: off by default, no code fix; SDK check: StyleCop reports nothing. Teams keeping it on (OTel / Polly / App): off / on / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: Off by default and no diagnostic on a one-word summary (probed).

To revisit: Nothing to port.

SA1631: Documentation should meet character percentage

Documentation rule. StyleCop: off by default, no code fix; SDK check: StyleCop reports nothing. Teams keeping it on (OTel / Polly / App): off / on / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: Off by default and no diagnostic on a summary of symbols (probed).

To revisit: Nothing to port.

SA1632: Documentation text should meet minimum character length

Documentation rule. StyleCop: off by default, no code fix; SDK check: StyleCop reports nothing. Teams keeping it on (OTel / Polly / App): off / on / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: Off by default and no diagnostic on a one-letter summary (probed).

To revisit: Nothing to port.

SA1644: Documentation headers should not contain blank lines

Documentation rule. StyleCop: off by default, no code fix. Teams keeping it on (OTel / Polly / App): off / on / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: StyleCop 1.2 never reports it (not implemented, probed while building BRO16xx).

To revisit: Nothing to port.

SA1650: Element documentation should be spelled correctly

Documentation rule. StyleCop: off by default, no code fix; SDK check: StyleCop reports nothing. Teams keeping it on (OTel / Polly / App): off / on / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: Off by default and no diagnostic on misspelled words (probed).

To revisit: Nothing to port.

Not applicable

SA0001: XML comment analysis disabled

Special rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): on / off / off. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: StyleCop's own setup diagnostic: XML comment analysis is disabled (no GenerateDocumentationFile).

To revisit: Nothing to port. stylebro-migrate already detects the same condition and keeps the XML documentation rules (BRO1603-BRO1611) off.

SA0002: Invalid settings file

Special rule. StyleCop: on by default, no code fix. Teams keeping it on (OTel / Polly / App): on / on / on. Diagnostics with every rule on (OTel / Polly / App): 0 / 0 / 0.

Why: StyleCop's own diagnostic for an invalid stylecop.json.

To revisit: Nothing to port. stylebro-migrate parses stylecop.json leniently (comments, trailing commas).

Covered, with known differences

SA1206: Declaration keywords should follow order

Covered by: SDK: IDE0036 (csharp_preferred_modifier_order, the SDK default order)

Difference: IDE0036 (csharp_preferred_modifier_order) enforces the whole modifier order, while StyleCop only wants the access modifier first and static next. Measured on six repos (2026-10-02): IDE0036 reordered nothing that StyleCop accepts (Polly, OpenTelemetry, the private app, FFMpegCore, Serilog 0; Newtonsoft.Json 27 lines, all SA1206 violations such as public new static).

To revisit: Only if a team reports reorders StyleCop accepted (async override vs override async); then a BRO rule that only moves access modifiers and static.

SA1600: Elements should be documented

Covered by: StyleBro BRO1601 (done) for overrides and implementations only (<inheritdoc/>); other missing documentation is not reported (no placeholder stubs, user decision)

Difference: BRO1601 adds <inheritdoc/> to overrides and implementations; other missing documentation isn't reported (no stubs, user decision).

To revisit: Revisit with the stub decision (also SA1601, SA1602, SA1604-SA1607, SA1609-SA1611, SA1614-SA1616, SA1618, SA1619, SA1622).