The object graph of a mid-size Salesforce org39 objects from the Nonprofit Success Pack's metadata, joined by 59 relationships (50 lookup, 9 master-detail). The 20 objects drawn in green carry an Apex trigger. Larger circles have more relationships.DataImport__cOpportunityEngagement_Plan__cAccountContactAllocation__cCampaignnpe03__Recurring_Donation__cBatch__cAddress__cEngagement_Plan_Task__cEngagement_Plan_Template__cEntityDefinitionFilter_Rule__mdtRollup__mdtAccount_Soft_Credit__cActivityDataImportBatch__cData_Import_Field_Mapping_Set__mdtData_Import_Object_Mapping_Set__mdt
The object graph of a mid-size Salesforce org39 objects from the Nonprofit Success Pack's metadata, joined by 59 relationships (50 lookup, 9 master-detail). The 20 objects drawn in green carry an Apex trigger. Larger circles have more relationships.DataImport__cOpportunityEngagement_Plan__cAccountAllocation__cCampaignnpe03__Recurring_Donation__cBatch__cAddress__cEngagement_Plan_Template__cEntityDefinitionFilter_Rule__mdtRollup__mdtAccount_Soft_Credit__cActivityDataImportBatch__cData_Import_Field_Mapping_Set__mdtData_Import_Field_Mapping__mdtData_Import_Object_Mapping_Set__mdtData_Import_Object_Mapping__mdt

This is a mid-size Salesforce org. Every line is something a change can break.

Point atTap any object to see what a change to it would touch.

How confident are you that your last change did not break something three objects away?

How long do you wait for a sandbox to find out?

Can every developer on your team test at the same time?

Fidelic.

It boots that org on your laptop in seconds. Your tests run against it the way they run against a real org, and every request can tell you exactly what fired. No sandbox, no queue, no shared data.

A real NPSP trigger ran before the record saved.

You saved a record. This is what ran.

Every save, update, and delete comes back with a trace like this. Which triggers ran, what each one changed, in what order.

Execution trace req-112 entries for POST /services/data/v62.0/sobjects/DataImportBatch__c. Outcome: committed, HTTP 201. 0 entries were rolled back.Transaction Trace: req-1POST /services/data/v62.0/sobjects/DataImportBatch__cOutcome: Committed (201)seqat01StartHTTP POST /services/data/v62.0/sobjects/DataImportBatch__cseq 0, at 112TransactionTransaction begunseq 1, at 223Field ChangeBatch_Status__c = "Open"seq 2, at 334TriggerTDTM_DataImportBatch (before insert)seq 3, at 445DMLinsert DataImportBatch__c a04000…8AAAseq 4, at 556TriggerTDTM_DataImportBatch (before update)seq 5, at 667DMLupdate DataImportBatch__c a04000…8AAAseq 6, at 778Field ChangeBatch_Status__c: Open → Closedseq 7, at 889TriggerTDTM_DataImportBatch (after update)seq 8, at 9910TriggerDIB_CloseOnInsert (after insert)seq 9, at 101011TriggerTDTM_DataImportBatch (after insert)seq 10, at 111112CommitTransaction committedseq 11, at 12

DIB_CloseOnInsert is a bug we planted so you can see how it looks. The row two above it is where it flipped the status from Open to Closed. Paste your own trace

Everything on this page comes from a command you can run. See the receipts

Want to try it on your org? Email me.