Reported by the maintainer; confirmed in code.
Symptom
A project using a builtin schema (schemas: [common, aspice, …] with no local schemas/ dir) sees new validation issues appear on unchanged artifacts after upgrading rivet — the same rivet validate that passed now flags things.
Root cause
embedded::load_schemas_with_fallback (rivet-core/src/embedded.rs:250) resolves each schema name by preferring an on-disk <schemas_dir>/<name>.yaml, else falling back to the embedded (compiled-into-the-binary) copy. So with no local schemas, the schema you validate against is whatever shipped in that rivet build. Every release that tightens or adds rules to a builtin schema silently changes validation semantics for every embedded-schema consumer — recent examples that would do exactly this: the status enum on common (status-allowed-values), the coverage-rule-consistency meta-check, prose-mention-without-typed-link, the ASPICE gate changes.
Schemas carry a version: field (common 0.1.0, aspice 0.2.0), but it's cosmetic — there's no pin in rivet.yaml, no min-rivet-version/version gate, and no drift detection. So the change is completely silent.
This is working-as-coded but a real stability gap. Options:
- Mitigation that already works today: vendor the schemas into the project —
rivet init can write schemas/*.yaml, and the loader prefers on-disk over embedded — so they're pinned in the project's git and immune to binary upgrades. Worth documenting prominently as the recommended posture for projects that need stable validation across upgrades. (Does rivet init vendor schemas by default? If not, an --vendor-schemas flag would make this one step.)
- Pin + detect: let
rivet.yaml record the schema version(s) it expects and have validate warn when the embedded schema version differs (turn the cosmetic version: into a real gate).
- Surface:
rivet validate could print the schema name@version set it used (and rivet schema list could show embedded-vs-vendored + version), so an upgrade-induced change is at least visible.
Recommend (1) documented now + (3) as a small surfacing change; (2) is the fuller fix (a maintainer call on the pin syntax). Found while researching the report — can implement the surfacing (3) and a docs section for (1) if you want.
Reported by the maintainer; confirmed in code.
Symptom
A project using a builtin schema (
schemas: [common, aspice, …]with no localschemas/dir) sees new validation issues appear on unchanged artifacts after upgrading rivet — the samerivet validatethat passed now flags things.Root cause
embedded::load_schemas_with_fallback(rivet-core/src/embedded.rs:250) resolves each schema name by preferring an on-disk<schemas_dir>/<name>.yaml, else falling back to the embedded (compiled-into-the-binary) copy. So with no local schemas, the schema you validate against is whatever shipped in that rivet build. Every release that tightens or adds rules to a builtin schema silently changes validation semantics for every embedded-schema consumer — recent examples that would do exactly this: thestatusenum oncommon(status-allowed-values), thecoverage-rule-consistencymeta-check,prose-mention-without-typed-link, the ASPICE gate changes.Schemas carry a
version:field (common0.1.0,aspice0.2.0), but it's cosmetic — there's no pin inrivet.yaml, nomin-rivet-version/version gate, and no drift detection. So the change is completely silent.This is working-as-coded but a real stability gap. Options:
rivet initcan writeschemas/*.yaml, and the loader prefers on-disk over embedded — so they're pinned in the project's git and immune to binary upgrades. Worth documenting prominently as the recommended posture for projects that need stable validation across upgrades. (Doesrivet initvendor schemas by default? If not, an--vendor-schemasflag would make this one step.)rivet.yamlrecord the schema version(s) it expects and havevalidatewarn when the embedded schema version differs (turn the cosmeticversion:into a real gate).rivet validatecould print the schema name@version set it used (andrivet schema listcould show embedded-vs-vendored + version), so an upgrade-induced change is at least visible.Recommend (1) documented now + (3) as a small surfacing change; (2) is the fuller fix (a maintainer call on the pin syntax). Found while researching the report — can implement the surfacing (3) and a docs section for (1) if you want.