Skip to content

FR: breaking-change detection — diff metadata against a baseline revision, classified by what it breaks #300

Description

@dmealing

Gap

There is no way to ask "did this metadata change break a downstream consumer?"

For a shared model consumed by several teams, this is the difference between a model that can evolve and one nobody dares touch.

What we already have (two-thirds of it)

  • meta migrate already diffs metadata against a schema snapshot and gates destructive operations behind a closed --allow token vocabulary (drop-column, drop-table, type-change, nullable-to-not-null, …). That is breaking-change detection on the schema axis, with explicit named consent.
  • meta verify --codegen covers code-vs-metadata drift.

What is missing: metadata-vs-metadata across two revisions, classified by which consumers a change breaks.

Prior art (open source)

Buf compares a working tree against a baseline — including a git ref (buf breaking --against '.git#branch=main') — and classifies breakage into four categories from strictest to most lenient: FILE and PACKAGE (breaks generated source), WIRE and WIRE_JSON (breaks encoded messages). The category is chosen per consumer contract. https://buf.build/docs/breaking/rules/

Direction

Prefer extending the existing --allow token pattern to model-level changes over importing a second, parallel mechanism — it is already the idiom in this codebase and already expresses "named destructive operation requiring explicit consent."

MetaObjects has a differentiator none of the surveyed tools have: because it knows the generated artifacts per port, it can classify a single change as source-breaking in one language, wire-compatible, schema-breaking — Buf cannot, because it only knows protobuf.

Sequencing

Downstream of shared collections actually existing (see #9 and the source-resolution design). Highest enterprise value in the deferred set.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions