Documentation Index
Fetch the complete documentation index at: https://quintsecurity.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
Status: shipped — Stage 1 in shadow mode. The flow matrix computes per-session; used by corroboration gates that are logged, not enforced.
Session Relationships
The fingerprint captures the statistical shape of an agent’s individual actions, but it doesn’t capture structural flow patterns — how capabilities transition from one to another within a session. The session buffer fills this gap with fixed-size flow matrices that capture the shape of behavior without hardcoding specific patterns.Design: Flow Matrices, Not Pattern Matching
The proxy does not enumerate specific relationship types (e.g., “read then send = exfiltration”). Instead, it accumulates fixed-size matrices that capture the structural shape of capability transitions. Anomaly = divergence from the agent’s learned flow baseline. This means new attack patterns are detected because they produce unusual flow shapes, not because we anticipated the specific capability pair.Session Flow Accumulator
EveryPush() to the session buffer increments counters in three fixed-size matrices:
1. Flow Matrix [12][12]uint16
Counts how many times each capability transitioned to each other capability in this session.
2. Resource Flow Matrix [12][12]uint16
Counts how many times the same resource crossed from one capability to another. Only incremented when action.ResourceHash == previousAction.ResourceHash AND the capabilities differ.
This captures data movement: a file read then sent, a credential accessed then exfiltrated. Without naming specific patterns — just counting boundary crossings.
3. Depth-Capability Profile [12][8]uint16
Counts which capabilities appeared at which sub-agent nesting depths. Privilege escalation shows up as high-risk capabilities (execute, send) at deep depths that the agent hasn’t exhibited before.
How Gate 3 Uses Flow Matrices
Gate 3 compares session flow against the agent’s baseline using three JSD checks:| Check | What It Compares | Threshold | Signal |
|---|---|---|---|
| Flow divergence | Session FlowMatrix vs fingerprint FlowMatrix | JSD > 0.3 | flow:structural_divergence |
| Resource boundary | Session ResourceFlows vs fingerprint baseline | Novel crossings > 5% | flow:resource_boundary_crossing |
| Depth anomaly | Session DepthProfile vs fingerprint DepthProfile | JSD > 0.3 | flow:depth_anomaly |
Why Not Hardcoded Patterns?
The previous approach used enumerated relationship types (RelTemporalAdjacency, RelResourceSharing, RelCausality, RelDataFlow) with a capability pair switch statement mapping read+send=1.0, read+delete=0.9, etc.
Problems with that approach:
- New attack patterns required code changes
- Strengths were static — they didn’t learn
- An attacker using
query→send_messageinstead ofread_file→curlwas invisible because the specific pair wasn’t cataloged
- No code changes for new patterns — divergence from baseline catches any unusual shape
- Baselines learn via EWMA in the fingerprint’s FlowMatrix
- Any unusual capability flow is detected because the shape is abnormal, not because we enumerated it
Memory Budget
| Component | Size | What It Captures |
|---|---|---|
| Flow matrix | 288B | Capability transition counts |
| Resource flow matrix | 288B | Resource boundary crossing counts |
| Depth-capability profile | 192B | Capability occurrences per depth |
| Total session overhead | ~768B | Full structural shape, fixed memory |
Session Export
On session end or periodic flush (60s), the flow matrices are included in theSessionSnapshot JSON export to NATS:
What the Session CAN vs CANNOT Detect
- Detects (Local)
- Cannot Detect (Remote Engine)
- Unusual capability flow shapes (any combination, not enumerated)
- Resources crossing novel capability boundaries
- Capabilities appearing at unusual nesting depths
- Temporal compression on specific transition types (via fingerprint’s TemporalFlow)
- Any structural divergence from the agent’s learned baseline