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¶
- 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).
- If the SDK might cover it, add a case to
scripts/stylecop-survey/sdk-check-cases.ps1and runTest-SdkCoverage.ps1. Then check it doesn't change code StyleCop accepts:Measure-MigrationDelta.ps1on a StyleCop-clean repo (that's how the preset's SA1501/SA1502 and IDE0040 settings were caught). - 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.psd1and runCompare-WithStyleCop.ps1against StyleCop 1.2. - Move the entry out of
skipped.psd1(intodecisions.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).