What you’re looking at
Gable shows how data moves through your service, from where it enters, through the transformations in your code, to what gets written or returned. This is not a trace of your code line-by-line. It’s a representation of data behavior:- what inputs are used
- how they are transformed
- what outputs are produced
What should (and shouldn’t) change
Most code changes do not change data lineage. Things like refactoring or renaming intermediary functions, moving logic into helpers, or reorganizing files usually leave lineage unchanged. If your change didn’t alter what data is used or produced, you should expect the lineage to look the same. If lineage does change in those cases, that’s a signal worth checking. On the other hand, lineage should change when you:- add or remove input fields
- change how fields are computed
- modify the structure of the output
- introduce new writes, responses, or external calls (e.g. ingress / egress points)
Where issues usually come from
When lineage looks wrong, it’s rarely about internal transformation logic. Most issues show up at the edges of the system, where data enters or leaves:- how requests, events, or DB reads are handled (ingress)
- how data is written, returned, or emitted (egress)
- how data is passed across service or library boundaries
- disappear (missing paths)
- partially degrade (missing fields)
- or look disconnected
What to do if something looks off
If lineage doesn’t match your expectations:- Sanity check the change. Did you modify inputs, outputs, or data structures?
- Look at boundaries. Did anything change in how data enters or leaves the service?
- Determine if it’s signal or scanner defect.
- If behavior changed → lineage should change
- If behavior didn’t change → this may be a scanner detection gap