From 5e4eadb276779fe7a78b049ad0d5a0b02840812d Mon Sep 17 00:00:00 2001 From: Reuven Harrison Date: Sun, 6 Sep 2026 00:52:56 +0300 Subject: [PATCH 1/2] model: transitions The multi-edit shapes recognized as one semantic change join the file: name, description, the kinds of raw findings each suppresses at its shape, and the changes that report it. Their claimed kinds are named claimed_kinds, not claims, since change claims are locations and the two should not share a word. Generator pinned to the oasdiff commit that exports transition metadata. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01QDvUFsg5nu1NBWQffErGDw --- README.md | 1 + SPEC.md | 4 + generator/go.mod | 7 +- generator/go.sum | 22 ++- generator/main.go | 39 ++++- openapi-changes-model.yaml | 294 ++++++++++++++++++++++++------------- 6 files changed, 248 insertions(+), 119 deletions(-) diff --git a/README.md b/README.md index 018b000..bda7c55 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ The model is one file, [`openapi-changes-model.yaml`](openapi-changes-model.yaml - **The vocabulary**: every term the model uses, defined in the file itself: the location grammar and the claim syntax built on it, the seven actions a document edit can perform (add, remove, set, unset, increase, decrease, change), the wire directions, the areas and kinds that situate each change in the OpenAPI object model, the six effects a change can have on the set of valid payloads, the guards (document states that qualify a verdict), the severity levels, and the statuses and categories of the coverage listing. - **The severity law**: one rule that derives every verdict. Guards apply first; then narrowing breaks request consumers, widening breaks response consumers, an incomparable change breaks both, and an unknown one is a warning. When a change cannot be proven safe, it is breaking. +- **The transitions**: multi-edit document shapes recognized as one semantic change (a schema wrapped to become nullable, a schema replaced by the boolean `false`), each with the kinds of raw findings it explains away and the changes that report it instead. - **681 named changes**, each with its direction, effect, guards, derived severity, human-readable message, and its **claims**: the exact document locations and actions it covers, as `location:action` patterns over the OpenAPI object model. - **The full edit space**: 15,255 possible edits, enumerated mechanically from the OpenAPI specification's object model. Every edit is covered by named changes, waived with a written reason, or classified as non-contract (unable to affect which payloads are valid). None are undecided. diff --git a/SPEC.md b/SPEC.md index c677973..75c22b3 100644 --- a/SPEC.md +++ b/SPEC.md @@ -49,6 +49,10 @@ Every level is derived, never assigned. Guards apply first, each nullifying or r The asymmetry is deliberate: reporting a safe change as breaking costs a reviewer one look, while reporting a breaking change as safe ships it to production. A change is declared safe only when it is provably safe for every consumer that conformed to the old contract; any gap in that proof resolves to breaking. Where the specification itself lacks the information to decide, the verdict is a warning that says what is missing, never a guess. +## Transitions + +Some edits arrive together as one semantic change. Wrapping a schema in `oneOf: [{type: "null"}, X]` to make it nullable is a single decision, but the raw diff shows several edits: the type changed, an enum moved, a `oneOf` appeared. A **transition** names such a shape. At a recognized shape, raw findings of the transition's *claimed kinds* are echoes of the one change and are suppressed; findings of other kinds are independent changes and still report. The transition itself is reported by its listed changes, so nothing is silently dropped: the finding moves from the echoes to the recognition. + ## Coverage dispositions Every edit in the space has exactly one disposition: diff --git a/generator/go.mod b/generator/go.mod index bfb19c1..76182e9 100644 --- a/generator/go.mod +++ b/generator/go.mod @@ -3,7 +3,7 @@ module github.com/oasdiff/openapi-changes-model/generator go 1.26.2 require ( - github.com/oasdiff/oasdiff v1.31.0 + github.com/oasdiff/oasdiff v1.31.1-0.20260905155854-e887d0d25541 gopkg.in/yaml.v3 v3.0.1 ) @@ -11,13 +11,12 @@ require ( cloud.google.com/go v0.123.0 // indirect github.com/TwiN/go-color v1.4.1 // indirect github.com/getkin/kin-openapi v0.149.0 // indirect - github.com/go-openapi/jsonpointer v0.22.5 // indirect - github.com/go-openapi/swag/jsonname v0.25.5 // indirect + github.com/go-openapi/jsonpointer v1.0.1 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/oasdiff/yaml v0.1.1 // indirect github.com/oasdiff/yaml3 v0.0.14 // indirect github.com/santhosh-tekuri/jsonschema/v6 v6.0.3 // indirect - github.com/tidwall/gjson v1.18.0 // indirect + github.com/tidwall/gjson v1.19.0 // indirect github.com/tidwall/match v1.2.0 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect diff --git a/generator/go.sum b/generator/go.sum index ff7014d..b6a021a 100644 --- a/generator/go.sum +++ b/generator/go.sum @@ -7,20 +7,18 @@ github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxK github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/getkin/kin-openapi v0.149.0 h1:ZbhmVJ4yq5RZDUsyP8lcBcGMsjsaTqXEFt6isdtMDfA= github.com/getkin/kin-openapi v0.149.0/go.mod h1:1+BHDzstro+P5CKtPy1X4PfofnFgmRe6uvMy9+r9fKY= -github.com/go-openapi/jsonpointer v0.22.5 h1:8on/0Yp4uTb9f4XvTrM2+1CPrV05QPZXu+rvu2o9jcA= -github.com/go-openapi/jsonpointer v0.22.5/go.mod h1:gyUR3sCvGSWchA2sUBJGluYMbe1zazrYWIkWPjjMUY0= -github.com/go-openapi/swag/jsonname v0.25.5 h1:8p150i44rv/Drip4vWI3kGi9+4W9TdI3US3uUYSFhSo= -github.com/go-openapi/swag/jsonname v0.25.5/go.mod h1:jNqqikyiAK56uS7n8sLkdaNY/uq6+D2m2LANat09pKU= -github.com/go-openapi/testify/v2 v2.4.0 h1:8nsPrHVCWkQ4p8h1EsRVymA2XABB4OT40gcvAu+voFM= -github.com/go-openapi/testify/v2 v2.4.0/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54= +github.com/go-openapi/jsonpointer v1.0.1 h1:2KxywRmNwJkT/FMBa3iRNHEaAxSJvjqoufQZy3au1Mg= +github.com/go-openapi/jsonpointer v1.0.1/go.mod h1:wI7ZYsFmbIi9nBXOZqgDaS/bqOchRGZjqxFli7FBYxY= +github.com/go-openapi/testify/v2 v2.7.0 h1:bycOreEj6wfBvijg3YFogZ/sFjTCDmQnwSodSzHa3X8= +github.com/go-openapi/testify/v2 v2.7.0/go.mod h1:SgsVHtfooshd0tublTtJ50FPKhujf47YRqauXXOUxfw= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/oasdiff/oasdiff v1.31.0 h1:4ggpCCxYK5ABpT387yb2wvCI3+1mc9d75i8tcVV5dkQ= -github.com/oasdiff/oasdiff v1.31.0/go.mod h1:25aWQvm5UvK1SJE34s3MPpAyhQUQwf7Q/t/gWDIrHM8= +github.com/oasdiff/oasdiff v1.31.1-0.20260905155854-e887d0d25541 h1:fsM+dtUOEP7gxR47aNl/zTP88UrGFkgMjwMc1P0o7cI= +github.com/oasdiff/oasdiff v1.31.1-0.20260905155854-e887d0d25541/go.mod h1:zrOVqxQfWeiPci5XvFhtnCQrJVLov2v8+oEZhAKAHtA= github.com/oasdiff/yaml v0.1.1 h1:6nHx+pn9gBRM6YpBlFZFQGCCd1nuvqOBtTD3KKTgGxY= github.com/oasdiff/yaml v0.1.1/go.mod h1:EYJNoyktvWMJ0Hmhx+6qTaqMOsalUaRGT8Sj1hNcegU= github.com/oasdiff/yaml3 v0.0.14 h1:aLJee3hxBK2H5wdXd9iPcIXb93Nty1Ge0pT171eHtkw= @@ -33,8 +31,8 @@ github.com/santhosh-tekuri/jsonschema/v6 v6.0.3/go.mod h1:JXeL+ps8p7/KNMjDQk3TCw github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWDWE= github.com/stretchr/testify v1.12.1/go.mod h1:MDEgiDPPsNp5cuIrHPPCyornHKgEVbtFUmoNlxoYthg= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= -github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.19.0 h1:xwxm7n691Uf3u5OFjzngavjGTh55KX5q/9w9xHW88JU= +github.com/tidwall/gjson v1.19.0/go.mod h1:V37/opeE/JbLUOfH0QTXiNez2l0RUjYUhpT4szFQAfc= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/match v1.2.0 h1:0pt8FlkOwjN2fPt4bIl4BoNxb98gGHN2ObFEDkrfZnM= github.com/tidwall/match v1.2.0/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= @@ -47,8 +45,8 @@ github.com/wI2L/jsondiff v0.7.1 h1:Fg9+yj+1/x3UtPBJhR91TKEzRkrEEWcAcLbg9dzEaNM= github.com/wI2L/jsondiff v0.7.1/go.mod h1:yAt2W7U6Jd4HK0RA8DGSGk0zDtfEtOUUJVnH/xICpjo= github.com/yargevad/filepathx v1.0.0 h1:SYcT+N3tYGi+NvazubCNlvgIPbzAk7i7y2dwg3I5FYc= github.com/yargevad/filepathx v1.0.0/go.mod h1:BprfX/gpYNJHJfc35GjRRpVcwWXS89gGulUIU5tK3tA= -github.com/yuin/goldmark v1.8.5 h1:r6N5afV5qj/5S4UTch8agZHJ8UxNCMwX7WjkkJam2NA= -github.com/yuin/goldmark v1.8.5/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= +github.com/yuin/goldmark v1.8.6 h1:d0VcaP1sx9GkFVkoW+KtggpGi2KZ965i14b0+bDQST4= +github.com/yuin/goldmark v1.8.6/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8= diff --git a/generator/main.go b/generator/main.go index 5e86c29..da0f788 100644 --- a/generator/main.go +++ b/generator/main.go @@ -8,6 +8,7 @@ import ( "fmt" "os" "runtime/debug" + "slices" "sort" "github.com/oasdiff/oasdiff/checker" @@ -23,7 +24,11 @@ type Model struct { GeneratedFrom string `yaml:"generated_from"` Vocabulary Vocabulary `yaml:"vocabulary"` SeverityLaw SeverityLaw `yaml:"severity_law"` - Changes []Change `yaml:"changes"` + // Transitions are multi-edit document shapes recognized as one semantic + // change: the raw edits of the listed kinds at the recognized shape are + // echoes and are suppressed; the reporting changes carry the finding. + Transitions []Transition `yaml:"transitions"` + Changes []Change `yaml:"changes"` // Coverage is the full edit space of an OpenAPI document with each // edit's disposition: covered by named changes, waived with a reason, // or non-contract. @@ -64,6 +69,16 @@ type VerdictRule struct { Level string `yaml:"level"` } +type Transition struct { + Name string `yaml:"name"` + Description string `yaml:"description"` + // ClaimedKinds are the kinds of raw findings the transition suppresses + // at the shape it recognizes; findings of other kinds still report. + ClaimedKinds []string `yaml:"claimed_kinds"` + // ReportedBy are the changes that report the transition itself. + ReportedBy []string `yaml:"reported_by"` +} + type Change struct { Id string `yaml:"id"` Level string `yaml:"level"` @@ -116,6 +131,23 @@ func main() { } sort.Slice(changes, func(i, j int) bool { return changes[i].Id < changes[j].Id }) + transitions := make([]Transition, 0) + for _, tr := range checker.GetTransitions() { + kinds := make([]string, 0, len(tr.Claims)) + for _, k := range tr.Claims { + kinds = append(kinds, k.String()) + } + reportedBy := slices.Clone(tr.ReportedBy) + sort.Strings(reportedBy) + transitions = append(transitions, Transition{ + Name: tr.Name, + Description: tr.Description, + ClaimedKinds: kinds, + ReportedBy: reportedBy, + }) + } + sort.Slice(transitions, func(i, j int) bool { return transitions[i].Name < transitions[j].Name }) + model := Model{ Model: "OpenAPI Changes Model", Version: "0.1.0-draft", @@ -218,8 +250,9 @@ func main() { {Effect: "none", Level: "info"}, }, }, - Changes: changes, - Coverage: coverage.Analyze(metadata), + Transitions: transitions, + Changes: changes, + Coverage: coverage.Analyze(metadata), } data, err := yaml.Marshal(model) diff --git a/openapi-changes-model.yaml b/openapi-changes-model.yaml index 90aa0ff..b3a6592 100644 --- a/openapi-changes-model.yaml +++ b/openapi-changes-model.yaml @@ -2,7 +2,7 @@ # do not edit by hand. See README.md for how to propose a change. model: OpenAPI Changes Model version: 0.1.0-draft -generated_from: oasdiff v1.31.0 +generated_from: oasdiff v1.31.1-0.20260905155854-e887d0d25541 vocabulary: locations: 'A location is a path through the OpenAPI object model, dot-separated, with * standing in for a name the API author chooses (a path, a method, a media type, a property name) and x-* for a specification extension: paths.*.*.requestBody.content.*.schema.maxLength names the maxLength keyword of any request body schema. A claim is location:action[,action...], the edits a change covers; a claim pattern may use ** to cover a location family.' actions: @@ -97,6 +97,100 @@ severity_law: level: warning - effect: none level: info +transitions: + - name: boolean-false-schema + description: the schema at a node was replaced by the JSON Schema boolean false, which accepts no instance, or the reverse + claimed_kinds: + - constraints + - existence + - requiredness + - structure + - type + - values + reported_by: + - request-body-schema-became-false + - request-body-schema-became-not-false + - request-parameter-property-schema-became-false + - request-parameter-property-schema-became-not-false + - request-parameter-schema-became-false + - request-parameter-schema-became-not-false + - request-property-schema-became-false + - request-property-schema-became-not-false + - response-body-schema-became-false + - response-body-schema-became-not-false + - response-header-schema-became-false + - response-header-schema-became-not-false + - response-property-schema-became-false + - response-property-schema-became-not-false + - name: list-of-types + description: a single type became a oneOf or anyOf of scalar types, or the reverse + claimed_kinds: + - structure + - type + reported_by: + - request-body-list-of-types-narrowed + - request-body-list-of-types-widened + - request-parameter-list-of-types-narrowed + - request-parameter-list-of-types-widened + - request-parameter-property-list-of-types-narrowed + - request-parameter-property-list-of-types-widened + - request-property-list-of-types-narrowed + - request-property-list-of-types-widened + - response-body-list-of-types-narrowed + - response-body-list-of-types-widened + - response-property-list-of-types-narrowed + - response-property-list-of-types-widened + - name: null-only-type-change + description: 'null was added to or removed from the type set with no other type or format change, the OpenAPI 3.1 type: [string, "null"] form' + claimed_kinds: + - type + reported_by: + - request-body-became-not-nullable + - request-body-became-nullable + - request-parameter-became-not-nullable + - request-parameter-became-nullable + - request-parameter-property-became-not-nullable + - request-parameter-property-became-nullable + - request-property-became-not-nullable + - request-property-became-nullable + - response-body-became-not-nullable + - response-body-became-nullable + - response-property-became-not-nullable + - response-property-became-nullable + - name: nullable-wrapping + description: 'a schema X became oneOf: [{type: "null"}, X], the OpenAPI 3.1 idiom for making a referenced schema nullable, or the wrapper was removed' + claimed_kinds: + - constraints + - existence + - requiredness + - structure + - type + - values + reported_by: + - request-body-became-not-nullable + - request-body-became-nullable + - request-parameter-became-not-nullable + - request-parameter-became-nullable + - request-parameter-property-became-not-nullable + - request-parameter-property-became-nullable + - request-property-became-not-nullable + - request-property-became-nullable + - response-body-became-not-nullable + - response-body-became-nullable + - response-property-became-not-nullable + - response-property-became-nullable + - name: oneof-wrapping + description: a concrete object schema became a oneOf of object alternatives + claimed_kinds: + - structure + - type + reported_by: + - request-body-wrapped-in-one-of + - request-body-wrapped-in-one-of-original-preserved + - request-property-one-of-added + - response-body-wrapped-in-one-of + - response-body-wrapped-in-one-of-original-preserved + - response-property-one-of-added changes: - id: api-deprecated-sunset-missing level: error @@ -54348,35 +54442,35 @@ coverage: polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-additional-properties-changed - location: paths.*.*.parameters.*.schema.additionalProperties action: set polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-additional-properties-set - location: paths.*.*.parameters.*.schema.additionalProperties action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-additional-properties-unset - location: paths.*.*.parameters.*.schema.allOf.* action: add polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-all-of-added - location: paths.*.*.parameters.*.schema.allOf.* action: remove polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-all-of-removed - location: paths.*.*.parameters.*.schema.allowEmptyValue action: set @@ -54393,105 +54487,105 @@ coverage: polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-any-of-added - location: paths.*.*.parameters.*.schema.anyOf.* action: remove polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-any-of-removed - location: paths.*.*.parameters.*.schema.const action: change polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-const-changed - location: paths.*.*.parameters.*.schema.const action: set polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-const-set - location: paths.*.*.parameters.*.schema.const action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-const-unset - location: paths.*.*.parameters.*.schema.contains action: set polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-contains-set - location: paths.*.*.parameters.*.schema.contains action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-contains-unset - location: paths.*.*.parameters.*.schema.contentEncoding action: change polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-content-encoding-changed - location: paths.*.*.parameters.*.schema.contentEncoding action: set polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-content-encoding-set - location: paths.*.*.parameters.*.schema.contentEncoding action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-content-encoding-unset - location: paths.*.*.parameters.*.schema.contentMediaType action: change polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-content-media-type-changed - location: paths.*.*.parameters.*.schema.contentMediaType action: set polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-content-media-type-set - location: paths.*.*.parameters.*.schema.contentMediaType action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-content-media-type-unset - location: paths.*.*.parameters.*.schema.contentSchema action: set polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-content-schema-set - location: paths.*.*.parameters.*.schema.contentSchema action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-content-schema-unset - location: paths.*.*.parameters.*.schema.default action: change @@ -54516,42 +54610,42 @@ coverage: polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-dependent-required-added - location: paths.*.*.parameters.*.schema.dependentRequired.* action: remove polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-dependent-required-removed - location: paths.*.*.parameters.*.schema.dependentSchemas.* action: add polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-dependent-schema-added - location: paths.*.*.parameters.*.schema.dependentSchemas.* action: remove polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-dependent-schema-removed - location: paths.*.*.parameters.*.schema.deprecated action: set polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-deprecated-set - location: paths.*.*.parameters.*.schema.deprecated action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-deprecated-unset - location: paths.*.*.parameters.*.schema.description action: change @@ -54573,70 +54667,70 @@ coverage: polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-discriminator-set - location: paths.*.*.parameters.*.schema.discriminator action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-discriminator-unset - location: paths.*.*.parameters.*.schema.discriminator.mapping.* action: add polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-mapping-added - location: paths.*.*.parameters.*.schema.discriminator.mapping.* action: change polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-mapping-changed - location: paths.*.*.parameters.*.schema.discriminator.mapping.* action: remove polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-mapping-removed - location: paths.*.*.parameters.*.schema.discriminator.mapping.* action: set polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-mapping-set - location: paths.*.*.parameters.*.schema.discriminator.mapping.* action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-mapping-unset - location: paths.*.*.parameters.*.schema.discriminator.propertyName action: change polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-property-name-changed - location: paths.*.*.parameters.*.schema.discriminator.propertyName action: set polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-property-name-set - location: paths.*.*.parameters.*.schema.discriminator.propertyName action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-property-name-unset - location: paths.*.*.parameters.*.schema.discriminator.x-* action: add @@ -54658,14 +54752,14 @@ coverage: polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-else-set - location: paths.*.*.parameters.*.schema.else action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-else-unset - location: paths.*.*.parameters.*.schema.enum action: add @@ -54731,7 +54825,7 @@ coverage: polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-exclusive-maximum-unset - location: paths.*.*.parameters.*.schema.exclusiveMinimum action: decrease @@ -54756,7 +54850,7 @@ coverage: polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-exclusive-minimum-unset - location: paths.*.*.parameters.*.schema.externalDocs action: set @@ -54845,42 +54939,42 @@ coverage: polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-if-set - location: paths.*.*.parameters.*.schema.if action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-if-unset - location: paths.*.*.parameters.*.schema.items action: set polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-items-set - location: paths.*.*.parameters.*.schema.items action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-items-unset - location: paths.*.*.parameters.*.schema.maxContains action: decrease polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-max-contains-decreased - location: paths.*.*.parameters.*.schema.maxContains action: increase polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-max-contains-increased - location: paths.*.*.parameters.*.schema.maxContains action: set @@ -54947,14 +55041,14 @@ coverage: polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-max-properties-decreased - location: paths.*.*.parameters.*.schema.maxProperties action: increase polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-max-properties-increased - location: paths.*.*.parameters.*.schema.maxProperties action: set @@ -54997,14 +55091,14 @@ coverage: polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-min-contains-decreased - location: paths.*.*.parameters.*.schema.minContains action: increase polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-min-contains-increased - location: paths.*.*.parameters.*.schema.minContains action: set @@ -55071,14 +55165,14 @@ coverage: polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-min-properties-decreased - location: paths.*.*.parameters.*.schema.minProperties action: increase polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-min-properties-increased - location: paths.*.*.parameters.*.schema.minProperties action: set @@ -55121,14 +55215,14 @@ coverage: polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-multiple-of-decreased - location: paths.*.*.parameters.*.schema.multipleOf action: increase polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-multiple-of-increased - location: paths.*.*.parameters.*.schema.multipleOf action: set @@ -55147,14 +55241,14 @@ coverage: polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-not-set - location: paths.*.*.parameters.*.schema.not action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-not-unset - location: paths.*.*.parameters.*.schema.nullable action: set @@ -55175,14 +55269,14 @@ coverage: polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-one-of-added - location: paths.*.*.parameters.*.schema.oneOf.* action: remove polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-one-of-removed - location: paths.*.*.parameters.*.schema.pattern action: change @@ -55208,28 +55302,28 @@ coverage: polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-pattern-propertie-added - location: paths.*.*.parameters.*.schema.patternProperties.* action: remove polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-pattern-propertie-removed - location: paths.*.*.parameters.*.schema.prefixItems.* action: add polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-prefix-item-added - location: paths.*.*.parameters.*.schema.prefixItems.* action: remove polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-prefix-item-removed - location: paths.*.*.parameters.*.schema.properties.* action: add @@ -55242,35 +55336,35 @@ coverage: polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-propertie-removed - location: paths.*.*.parameters.*.schema.propertyNames action: set polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-property-names-set - location: paths.*.*.parameters.*.schema.propertyNames action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-property-names-unset - location: paths.*.*.parameters.*.schema.readOnly action: set polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-read-only-set - location: paths.*.*.parameters.*.schema.readOnly action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-read-only-unset - location: paths.*.*.parameters.*.schema.required action: add @@ -55283,21 +55377,21 @@ coverage: polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-required-removed - location: paths.*.*.parameters.*.schema.then action: set polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-then-set - location: paths.*.*.parameters.*.schema.then action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-then-unset - location: paths.*.*.parameters.*.schema.title action: change @@ -55348,70 +55442,70 @@ coverage: polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-unevaluated-items-changed - location: paths.*.*.parameters.*.schema.unevaluatedItems action: set polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-unevaluated-items-set - location: paths.*.*.parameters.*.schema.unevaluatedItems action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-unevaluated-items-unset - location: paths.*.*.parameters.*.schema.unevaluatedProperties action: change polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-unevaluated-properties-changed - location: paths.*.*.parameters.*.schema.unevaluatedProperties action: set polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-unevaluated-properties-set - location: paths.*.*.parameters.*.schema.unevaluatedProperties action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-unevaluated-properties-unset - location: paths.*.*.parameters.*.schema.uniqueItems action: set polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-unique-items-set - location: paths.*.*.parameters.*.schema.uniqueItems action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-unique-items-unset - location: paths.*.*.parameters.*.schema.writeOnly action: set polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-write-only-set - location: paths.*.*.parameters.*.schema.writeOnly action: unset polarity: request status: waived category: open - reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157, #1159)' + reason: 'parameter schemas are checked for type/format, enum, bounds, pattern, nullable, default, and required/property membership; the remaining schema keywords are unchecked (tracked in #1054, #1155, #1156, #1157)' suggestedId: request-parameter-write-only-unset - location: paths.*.*.parameters.*.schema.x-* action: add @@ -59235,7 +59329,7 @@ coverage: polarity: request status: waived category: open - reason: 'remaining directions are unchecked; the breaking directions have rules (tracked in #1159)' + reason: 'the version-split boolean/number representation needs its own bound classification before set/unset can be generated; the breaking change directions have rules (tracked in #1222)' suggestedId: request-body-exclusive-maximum-unset - location: paths.*.*.requestBody.content.*.schema.exclusiveMinimum action: decrease @@ -59264,7 +59358,7 @@ coverage: polarity: request status: waived category: open - reason: 'remaining directions are unchecked; the breaking directions have rules (tracked in #1159)' + reason: 'the version-split boolean/number representation needs its own bound classification before set/unset can be generated; the breaking change directions have rules (tracked in #1222)' suggestedId: request-body-exclusive-minimum-unset - location: paths.*.*.requestBody.content.*.schema.externalDocs action: set @@ -59557,7 +59651,7 @@ coverage: polarity: request status: waived category: open - reason: 'remaining directions are unchecked; the breaking directions have rules (tracked in #1159)' + reason: 'increase/decrease at header scope are unchecked; every other direction has rules (tracked in #1117, #1162)' suggestedId: request-body-min-items-decreased - location: paths.*.*.requestBody.content.*.schema.minItems action: increase @@ -59613,7 +59707,7 @@ coverage: polarity: request status: waived category: open - reason: 'remaining directions and non-body contexts are unchecked; the breaking directions have rules (tracked in #1159, #1171 for the set case)' + reason: 'increase/decrease at parameter and header scope are unchecked; set/unset have rules at every scope (tracked in #1117, #1162)' suggestedId: request-body-min-properties-decreased - location: paths.*.*.requestBody.content.*.schema.minProperties action: increase @@ -63811,7 +63905,7 @@ coverage: polarity: response status: waived category: open - reason: 'remaining directions are unchecked; the breaking directions have rules (tracked in #1159)' + reason: 'the version-split boolean/number representation needs its own bound classification before set/unset can be generated; the breaking change directions have rules (tracked in #1222)' suggestedId: response-exclusive-maximum-decreased - location: paths.*.*.responses.*.content.*.schema.exclusiveMaximum action: increase @@ -63825,14 +63919,14 @@ coverage: polarity: response status: waived category: open - reason: 'remaining directions are unchecked; the breaking directions have rules (tracked in #1159)' + reason: 'the version-split boolean/number representation needs its own bound classification before set/unset can be generated; the breaking change directions have rules (tracked in #1222)' suggestedId: response-exclusive-maximum-set - location: paths.*.*.responses.*.content.*.schema.exclusiveMaximum action: unset polarity: response status: waived category: open - reason: 'remaining directions are unchecked; the breaking directions have rules (tracked in #1159)' + reason: 'the version-split boolean/number representation needs its own bound classification before set/unset can be generated; the breaking change directions have rules (tracked in #1222)' suggestedId: response-exclusive-maximum-unset - location: paths.*.*.responses.*.content.*.schema.exclusiveMinimum action: decrease @@ -63846,21 +63940,21 @@ coverage: polarity: response status: waived category: open - reason: 'remaining directions are unchecked; the breaking directions have rules (tracked in #1159)' + reason: 'the version-split boolean/number representation needs its own bound classification before set/unset can be generated; the breaking change directions have rules (tracked in #1222)' suggestedId: response-exclusive-minimum-increased - location: paths.*.*.responses.*.content.*.schema.exclusiveMinimum action: set polarity: response status: waived category: open - reason: 'remaining directions are unchecked; the breaking directions have rules (tracked in #1159)' + reason: 'the version-split boolean/number representation needs its own bound classification before set/unset can be generated; the breaking change directions have rules (tracked in #1222)' suggestedId: response-exclusive-minimum-set - location: paths.*.*.responses.*.content.*.schema.exclusiveMinimum action: unset polarity: response status: waived category: open - reason: 'remaining directions are unchecked; the breaking directions have rules (tracked in #1159)' + reason: 'the version-split boolean/number representation needs its own bound classification before set/unset can be generated; the breaking change directions have rules (tracked in #1222)' suggestedId: response-exclusive-minimum-unset - location: paths.*.*.responses.*.content.*.schema.externalDocs action: set @@ -64013,7 +64107,7 @@ coverage: polarity: response status: waived category: open - reason: 'remaining directions (request unset widens, response set/decrease narrow the server''s output) and non-body contexts are unchecked; the breaking directions have rules (tracked in #1159)' + reason: 'increase/decrease at header scope are unchecked; every other direction has rules (tracked in #1117, #1162)' suggestedId: response-max-items-decreased - location: paths.*.*.responses.*.content.*.schema.maxItems action: increase @@ -64041,7 +64135,7 @@ coverage: polarity: response status: waived category: open - reason: 'remaining directions are unchecked; the breaking directions have rules (tracked in #1159)' + reason: 'increase/decrease at header scope are unchecked; every other direction has rules (tracked in #1117, #1162)' suggestedId: response-max-length-decreased - location: paths.*.*.responses.*.content.*.schema.maxLength action: increase @@ -64069,7 +64163,7 @@ coverage: polarity: response status: waived category: open - reason: 'remaining directions and non-body contexts are unchecked; the breaking directions have rules (tracked in #1159)' + reason: 'increase/decrease at parameter and header scope are unchecked; set/unset have rules at every scope (tracked in #1117, #1162)' suggestedId: response-max-properties-decreased - location: paths.*.*.responses.*.content.*.schema.maxProperties action: increase @@ -64097,7 +64191,7 @@ coverage: polarity: response status: waived category: open - reason: 'remaining directions (request unset widens, response set/decrease narrows the server''s output) are unchecked; the breaking directions have rules (tracked in #1159)' + reason: 'increase/decrease at header scope are unchecked; every other direction has rules (tracked in #1117, #1162)' suggestedId: response-maximum-decreased - location: paths.*.*.responses.*.content.*.schema.maximum action: increase @@ -64160,7 +64254,7 @@ coverage: polarity: response status: waived category: open - reason: 'remaining directions are unchecked; the breaking directions have rules (tracked in #1159)' + reason: 'increase/decrease at header scope are unchecked; every other direction has rules (tracked in #1117, #1162)' suggestedId: response-min-items-increased - location: paths.*.*.responses.*.content.*.schema.minItems action: set @@ -64188,7 +64282,7 @@ coverage: polarity: response status: waived category: open - reason: 'remaining directions are unchecked; the breaking directions have rules (tracked in #1159)' + reason: 'increase/decrease at header scope are unchecked; every other direction has rules (tracked in #1117, #1162)' suggestedId: response-min-length-increased - location: paths.*.*.responses.*.content.*.schema.minLength action: set @@ -64216,7 +64310,7 @@ coverage: polarity: response status: waived category: open - reason: 'remaining directions and non-body contexts are unchecked; the breaking directions have rules (tracked in #1159, #1171 for the set case)' + reason: 'increase/decrease at parameter and header scope are unchecked; set/unset have rules at every scope (tracked in #1117, #1162)' suggestedId: response-min-properties-increased - location: paths.*.*.responses.*.content.*.schema.minProperties action: set @@ -64244,7 +64338,7 @@ coverage: polarity: response status: waived category: open - reason: 'remaining directions are unchecked; the breaking directions have rules (tracked in #1159)' + reason: 'increase/decrease at header scope are unchecked; every other direction has rules (tracked in #1117, #1162)' suggestedId: response-minimum-increased - location: paths.*.*.responses.*.content.*.schema.minimum action: set @@ -64552,7 +64646,7 @@ coverage: polarity: response status: waived category: open - reason: 'response set (narrowing the output) and non-body contexts are unchecked; the breaking directions have rules (tracked in #1159)' + reason: response set (narrowing the output) and parameter/header scopes are unchecked; a flag rather than an ordered bound, so outside the generated set/unset rules suggestedId: response-unique-items-set - location: paths.*.*.responses.*.content.*.schema.uniqueItems action: unset From c5ec8adec4a64e8e343850dc0221a4370cba9d35 Mon Sep 17 00:00:00 2001 From: Reuven Harrison Date: Sun, 6 Sep 2026 00:56:04 +0300 Subject: [PATCH 2/2] generator: the model file documents itself; the code need not repeat it Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01QDvUFsg5nu1NBWQffErGDw --- generator/main.go | 38 ++++++++++++-------------------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/generator/main.go b/generator/main.go index da0f788..4068afd 100644 --- a/generator/main.go +++ b/generator/main.go @@ -19,26 +19,17 @@ import ( ) type Model struct { - Model string `yaml:"model"` - Version string `yaml:"version"` - GeneratedFrom string `yaml:"generated_from"` - Vocabulary Vocabulary `yaml:"vocabulary"` - SeverityLaw SeverityLaw `yaml:"severity_law"` - // Transitions are multi-edit document shapes recognized as one semantic - // change: the raw edits of the listed kinds at the recognized shape are - // echoes and are suppressed; the reporting changes carry the finding. - Transitions []Transition `yaml:"transitions"` - Changes []Change `yaml:"changes"` - // Coverage is the full edit space of an OpenAPI document with each - // edit's disposition: covered by named changes, waived with a reason, - // or non-contract. - Coverage []coverage.Edit `yaml:"coverage"` + Model string `yaml:"model"` + Version string `yaml:"version"` + GeneratedFrom string `yaml:"generated_from"` + Vocabulary Vocabulary `yaml:"vocabulary"` + SeverityLaw SeverityLaw `yaml:"severity_law"` + Transitions []Transition `yaml:"transitions"` + Changes []Change `yaml:"changes"` + Coverage []coverage.Edit `yaml:"coverage"` } type Vocabulary struct { - // Locations describes the location grammar and the claim syntax built - // on it; locations are an open set derived from the OpenAPI object - // model, not an enumeration. Locations string `yaml:"locations"` Actions map[string]string `yaml:"actions"` Directions map[string]string `yaml:"directions"` @@ -47,7 +38,6 @@ type Vocabulary struct { Effects map[string]string `yaml:"effects"` Guards map[string]string `yaml:"guards"` Levels map[string]string `yaml:"levels"` - // Statuses and Categories describe the coverage dispositions. Statuses map[string]string `yaml:"statuses"` Categories map[string]string `yaml:"categories"` } @@ -70,13 +60,10 @@ type VerdictRule struct { } type Transition struct { - Name string `yaml:"name"` - Description string `yaml:"description"` - // ClaimedKinds are the kinds of raw findings the transition suppresses - // at the shape it recognizes; findings of other kinds still report. + Name string `yaml:"name"` + Description string `yaml:"description"` ClaimedKinds []string `yaml:"claimed_kinds"` - // ReportedBy are the changes that report the transition itself. - ReportedBy []string `yaml:"reported_by"` + ReportedBy []string `yaml:"reported_by"` } type Change struct { @@ -269,5 +256,4 @@ func main() { fmt.Printf("wrote %s: %d changes, %d edits\n", *out, len(changes), len(model.Coverage)) } -// ensure the law encoded above matches the implementation -var _ = rules.DeriveLevel +var _ = rules.DeriveLevel // the law encoded above is the one this implementation runs