- Code (intent) - where the flow lives in your codebase. Glassray reads your code to learn the flow exists and what it’s meant to do.
- Traces (reality) - the evidence the flow actually ran.
How traces join a flow
Glassray sorts each incoming trace into a flow by its shape - matching which agents ran, and how they’re wired, against the flows it found in your code. A trace that doesn’t match any flow goes into an unmatched pool, which Glassray can cluster into proposed new flows for you to confirm. Every trace records how it joined its flow and why, so membership is always something you can inspect - never a black box.Flow states
A flow’s two anchors - its place in your code and the evidence of it running in your traces - can arrive independently, which gives a flow one of three states:Confirmed
Defined in your code and seen in your traces. Real and ready to evaluate.
Waiting
Defined in your code but not yet seen in the traces you’ve synced. Never “dead” - just waiting for evidence.
Discovered
Seen in your traces, but Glassray doesn’t yet have a reference to where it lives in your code. Glassray proposes it so you can confirm it.
Why flows matter
Every trace has a home
Each trace lands in exactly one flow (or the unmatched pool), so nothing falls through the cracks.
The unit of quality
Glassray tracks behavior and finds deviations per flow - so a problem is scoped to the job it actually affects.
Cold-start value
Because flows can be defined from your code, you see your flows and how they wire up before you’ve synced much trace volume.
Explainable membership
Every trace records how and why it joined its flow - inspect it in the dashboard or over MCP.