Automation · Data operations
How to build schema change management
A field is renamed in the CRM on Tuesday and three dashboards quietly show the wrong number from Wednesday. Here is how catching it first actually works, the prompts that build it, and what running it demands.
Built with Tray Headless
- System Salesforce
- Step Snapshot schema
- Step Diff against last
- Step Resolve dependents
- System Slack
Changes are detected at source and resolved to everything downstream, so the alert names what will break rather than what changed.
The short answer
What is schema change management?
Four things make up schema change management: snapshotting source schemas so a change is detected instead of discovered, classifying changes by whether they break anything, resolving what depends on each changed field, and telling the owner before the pipeline runs rather than after. The mistake that costs most is watching only for failures. A renamed picklist value does not fail anything; it silently creates a new category and every report grouping by it is quietly wrong.
What matters here
- Watch the schema, not only for failures. The changes that break loudly are the easy ones.
- A renamed picklist value breaks nothing and silently corrupts every report grouping by it.
- Resolve what depends on a field before alerting. "Field removed" is noise; "these four dashboards break" is actionable.
- Classify by impact: additive is safe, a type change or removal is breaking, a rename is the dangerous middle.
- Alert the owner of what breaks, not the owner of the source system. They did not know you were reading it.
Who this is for
You run data or analytics engineering. Source systems change without telling you, and the first sign is a dashboard that looks wrong or a pipeline that failed overnight.
How it works in practice
What happens between a source system changing and a report being wrong.
- 1
Source schemas are snapshotted on a schedule
Fields, types, picklist values and required flags, so a change is detectable at all.
- 2
Each snapshot is diffed against the last
Additions, removals, type changes, renames and picklist changes.
- 3
Changes are classified by impact
Additive is safe, removals and type changes break, renames are the dangerous middle.
- 4
Dependencies are resolved for anything breaking
Which models, dashboards and syncs use that field.
- 5
The owner of what breaks is told before the run
Not the owner of the source system, who did not know you were reading it.
- 6
Breaking changes can pause the pipeline
Better a stale dashboard that says so than a current one that is wrong.
What change management is made of
Four pieces, and the third is what makes an alert worth reading.
Schema snapshots
Regular captures of fields, types and picklist values. Without a baseline there is no change, only a surprise.
Classified diffs
Additive, breaking, or the dangerous middle. A rename or a picklist value change breaks nothing and corrupts silently.
Dependency resolution
Which models, dashboards and reverse ETL syncs touch the changed field. Without it the alert is a puzzle.
Warning before the run
Told in time to act, with the option to pause. A stale dashboard that says so beats a current one that is wrong.
The Tray Headless prompts
Paste these into Claude Code or Codex with the Tray Headless plugin installed. Each stage runs on its own. The systems named in them are the worked example rather than a requirement, and every prompt says so.
Once per project, run
/tray-workflows:set-workspace
to pick the workspace these build in. Point it at a sandbox first.
- 1
Set up and snapshot the source schemas
Without a baseline there is no change, only a surprise.
Headless skills
build-workflowUse build-workflow. The systems in play are Salesforce, NetSuite and Snowflake, or whatever we run in those seats. Snapshot each source schema on a schedule. From Salesforce that means describe on every object in scope, Account, Opportunity, Lead, Contact and any __c object: field names, types, whether each is required, and for a picklist every accepted value. Do the same for the NetSuite records and the Snowflake information schema. Store snapshots with a timestamp. This is the baseline, and without one every change is a discovery, not a detection. Include picklist values explicitly. They are the most commonly changed thing and the least commonly monitored, because changing one breaks nothing at all.
- 2
Diff and classify by impact
The changes that break loudly are the easy ones.
Headless skills
build-workflowUse build-workflow. Diff each snapshot against the previous and classify: Safe: a new optional field, a new picklist value nobody groups by Breaking: a field removed, a type changed, a field becoming required, a picklist value removed that data still uses Dangerous: a field renamed, a picklist value renamed, a field repurposed to mean something different The dangerous category is the point. A renamed picklist value fails nothing. The pipeline runs, the dashboard renders, and a new category appears that nobody notices while the old grouping quietly under-counts. Flag any field whose distribution changes sharply without a schema change. That is usually a repurposed field, which no schema diff can see.
A field that silently changes meaning is the hardest case here and the one worth the distribution check, because nothing in the schema itself moves.
- 3
Resolve what actually depends on it
"Field removed" is a puzzle; "these four dashboards break" is a task.
For every breaking or dangerous change, resolve the dependents before alerting: Which dbt models reference the field Which dashboards use those models Which reverse ETL syncs write or read it Which other pipelines consume it Which downstream tables would be affected Then alert with that list. Field X removed from object Y is a puzzle somebody has to investigate. The revenue dashboard and two reverse ETL syncs will break because field X was removed is a task somebody can size in seconds and act on.
- 4
Tell the right person, before the run
The source system owner did not know you were reading it.
Headless skills
tray-gotchasUse tray-gotchas, then alert the owner of what breaks, not the owner of the source system. The Salesforce administrator who renamed a field was doing their job and had no idea a warehouse model depended on it. Alerting them produces confusion; alerting the model owner produces a fix. Alert before the next scheduled run wherever possible, so the choice is still available. Offer to pause the affected pipeline. A dashboard that is stale and says so is better than one that is current and wrong, and that is a choice the data team should make deliberately, not discover. Handle: a change in a sandbox that has not reached production yet, which is a warning rather than an alert; a field added and removed between two snapshots, which is noise; and a change during a known migration, which should be suppressible with an expiry.
- 5
Report the changes that actually cost something
Volume of schema changes is not interesting.
Report: breaking changes detected and how many were caught before a failure, dashboards affected, time from detection to fix, and changes that reached production before detection. That last one is the coverage measure. Every instance is a snapshot cadence that is too slow, or a source not being watched at all. Also report the sources that change most often. A system changing weekly needs a tighter snapshot cadence and possibly a conversation with whoever owns it about telling you first. Do not report total schema changes. Most are additive, harmless and frequent, and counting them buries the handful that matter.
- 6
Check it end to end, then hand the sources to analytics engineering
Because new sources appear and cadence differs by system.
Run the per-step schema checks and the whole-workflow audit before this touches production. Introduce a deliberate breaking change in a sandbox and confirm the alert names the right dashboards and the right owner. Then open the same workflow in Tray Build so analytics engineering can add sources, adjust snapshot cadence and change the classification rules in the visual canvas.
What it connects to
Changes happen at the source and consequences land downstream.
Salesforce
Read object and field metadata including picklist values, which is where most silent changes originate.
Reads
Snowflake
Read warehouse schemas and hold the snapshot history that every diff is computed against.
Reads and writes
dbt
Resolve which models reference a changed field, which is the first hop of the dependency chain.
Reads
Looker
Resolve which dashboards depend on those models, so an alert can name what a person will notice.
Reads
Same build, other stacks
The design does not change if you run something else in one of these seats. The same prompts build it against Microsoft Dynamics 365, Google BigQuery, Microsoft Teams, ServiceNow, Power BI or HubSpot.
Named systems are the ones most teams run, not the only ones that work. Each is an authentication in your Tray workspace, referenced by name, so the workflow never holds a credential. Where we have a connector page, the name links to it.
Running it in production
This catches the failures that do not announce themselves. Cadence and coverage are everything.
It runs where production runs, not on a laptop
Snapshots on a schedule across every source, diffed and resolved continuously, so a Tuesday rename is caught on Tuesday.
Snapshot history is retained
Every schema as it was, with timestamps. When a number turns out to have been wrong for six weeks, that history is how the cause is found.
Credentials are managed, never written into the build
Metadata read access across every source system. Read-only, scoped and held in your workspace.
Analytics engineering own the sources
Which systems are watched, at what cadence, and how changes are classified, all open in Tray Build.
Pausing is a deliberate option
A stale dashboard that says so beats a current one that is wrong, and the data team should be able to choose that, not discover it.
Questions people ask
Why watch the schema, not for failures?
Because the changes that fail loudly are the easy ones. A renamed picklist value breaks nothing, the pipeline runs, and every report grouping by it is quietly wrong from that day.
What is the dangerous category?
Renames and repurposing. A removed field fails immediately and gets fixed; a renamed one creates a new category nobody notices while the old grouping silently under-counts.
Who should be alerted?
The owner of what breaks, not the owner of the source system. The administrator who renamed the field was doing their job and had no idea a warehouse model depended on it.
Should a breaking change pause the pipeline?
It should be an option the data team can take. A dashboard that is stale and says so is better than one that is current and wrong.
What is the coverage measure?
Changes that reached production before being detected. Every one is either a snapshot cadence that is too slow or a source nobody is watching at all.
Vibe-coding app guides
Vibe-code an entire app with Helix
This moves the data between systems. It does not give anybody a screen to work in. Build that app in Claude Code, Codex or Cursor, then deploy and run it governed on Tray Helix. Same kind of guide, same kind of prompts.
How to build a metric definitions catalogue (opens helix.tray.ai in a new tab)
Related guides
Data operations
How to build data quality monitoring
Test what breaks decisions, alert the owner rather than a channel, and say what depends on a failure. The Headless prompts that build it.
Data operations
How to build a CRM to warehouse sync
Capture history instead of current state, handle deletes and field changes, land raw then model, and prove the row counts. The Headless prompts that build it.
Platform engineering
How to build an API facade
Give consumers one contract instead of six systems, absorb upstream changes rather than leaking them, and keep the caller identity intact. The prompts.
Last reviewed September 2026.