Skip to content

Analyzers README promises an Error never reports more within a major; 2.3.0's CMTK0003 does, with no decision record #153

Closed

Description

@CaffeinatedCoder

Found by a pre-release sweep of release/2.3.0 @ 99c6032 (weaving-review §8, "Analyzer Errors freeze"); read from the source and the analyzer's own tests.

Problem

The Analyzers README promises consumers that an Error rule never widens inside a major version:

Within a major version, an Error never reports more than it did. A new Error rule, or an Error that reports more, waits for the next major version.

(src/CodoMetis.TypeKit.Analyzers/README.md:759-760, and decision 34.)

2.3.0 widens CMTK0003, which is an Error since 2.0.0. It now also reports an assertion of CodoMetis.TypeKit.Testing on a Task or ValueTask that is left without await (IgnoredOutcomeAnalyzer.cs:157-159, IsPendingAssertion). The changelog announces it ("an assertion left without await is reported (CMTK0003)"), and IgnoredOutcomeAnalyzerTests.cs:120-123 holds it:

{|#1:service.FindAsync().ShouldBeNone()|};   // CMTK0003, Error, new in 2.3.0

Nothing records the exception:

  • No decision after 0034 allows it.
  • The CMTK0003 row in design/analyzers.md:36 doesn't list the form.
  • The README sentence stays as it is, so the shipped 2.3.0 README contradicts the shipped 2.3.0 analyzer.

The exception is sound in substance. Every such assertion is new in 2.3, so no build that worked on 2.2.0 breaks, as the code comment says. What's missing is the written decision. #152 widens the same form further before the tag, and the same decision covers it.

Change

  • A decision record: an Error may report, in a minor version, a form that only an API new in that version can write, because it breaks no build that worked before. Add its row to design/adr/README.md.
  • The README's "What a new version may change" sentence states that exception.
  • The CMTK0003 row of design/analyzers.md lists the dropped pending assertion.
  • Then decide whether CMTK0003 misses dropped async assertions through Task wrappers and branches #152's wider reach ships in 2.3.0, under the same rule: the forms freeze at the tag.

Test

The README sentence becomes a claim in test/oracles/claims.json, quoted verbatim, so OracleCatalogueTests notices when it is reworded. It is held by the test that pins CMTK0003's severity, or waived with a reason.

Activity

  1. added this to the 2.3.0 milestone on Oct 29, 2026
  2. CaffeinatedCoder commented on Oct 29, 2026

    @CaffeinatedCoder
    OwnerAuthor

    PR #156 (into release/2.3.0): decision 118 (design/adr/0118-an-error-may-learn-a-form-only-new-api-can-write.md) refines decision 34: in a minor version an Error may report a form only that version's new API can write, and the forms freeze at the tag; it covers #152. The Analyzers README's "What a new version may change" states it, claim T01-an-error-learns-only-new-api-forms quotes it (held by IgnoredOutcomeAnalyzerTests, seeded by rewording the sentence), and the CMTK0003 row of design/analyzers.md lists the pending-assertion forms.

  3. CaffeinatedCoder commented on Oct 29, 2026

    @CaffeinatedCoder
    OwnerAuthor

    Done in #156, merged into release/2.3.0 (5ee8068): decision 118 lets an Error learn, in a minor version, a form only that version's new API can write, with #159 as 2.3.0's one exception (approved by the maintainer); the Analyzers README and design/analyzers.md say so.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentationpackage/analyzersAffects CodoMetis.TypeKit.Analyzerspackage/testingAffects CodoMetis.TypeKit.Testing

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions