Skip to main content

SV0 Platform Mental Model

Connectors, data model, identity mapping, and risk classification.

This document bridges the gap between "what the connectors discover" and "what the platform stores and evaluates." Read this before setting up a dev environment, debugging connector output, or explaining the system to a non-developer.


High-Level Data Flow

High-Level Data Flow

Text diagram
                    ┌─────────────────┐
│ SV0 Platform │
│ (MongoDB) │
└────────▲─────────┘

POST /api/v1/ingest/
normalized-graph

┌──────────────┼──────────────┐
│ │ │
┌────────┴───────┐ ┌───┴────────┐ ┌───┴──────────┐
│ entra-servicenow│ │azure-foundry│ │ future: │
│ connector │ │ connector │ │ github, aws │
└────────┬───────┘ └───┬────────┘ └───┬──────────┘
│ │ │
┌─────┴─────┐ ┌────┴────┐ ┌────┴────┐
│ │ │ │ │ │
ServiceNow Azure Azure ARM GitHub AWS
REST API Graph Foundry RBAC API API
API API

Each connector:

  1. Discovers raw data from source systems
  2. Correlates across systems (e.g., SN OAuth client_id = Azure SP appId)
  3. Classifies (egress, origin, risk group, ownership)
  4. Transforms into NormalizedGraph JSON
  5. POSTs to platform ingestion endpoint

Core Entity Model (9 Entity Types)

Core Entity Model

Text diagram
                        ┌──────────┐
│ OWNER │ (human accountability)
└────┬─────┘
│ OWNED_BY

┌──────────┐ HAS_ROLE ┌──────────┐ RUNS_AS ┌──────────┐
│ ROLE │◄───────────│ IDENTITY │◄────────────│ WORKLOAD │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ GRANTS │ AUTHENTICATES_AS │ INVOKES
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│PERMISSION│ │CREDENTIAL│ │CONNECTION│
└────┬─────┘ └──────────┘ └──────────┘
│ APPLIES_TO USES ▲
▼ │
┌──────────┐ (from CONNECTION
│ RESOURCE │ to CREDENTIAL)
└──────────┘

┌──────────────────┐
│EXECUTION EVIDENCE│ (proof of activity)
└──────────────────┘
EVIDENCES ──▶ WORKLOAD/IDENTITY

Three paths through the model

Execution path (what runs and how): Workload → RUNS_AS → Identity → AUTHENTICATES_AS → Credential

Authorization path (what permissions exist): Identity → HAS_ROLE → Role → GRANTS → Permission → APPLIES_TO → Resource

Governance path (who is accountable): Owner → OWNED_BY → Identity/Workload

All 19 edge types

CALLS, INVOKES, USES, AUTHENTICATES_AS, AUTHENTICATES_TO, OWNED_BY, BELONGS_TO, HAS_ROLE, GRANTS, APPLIES_TO, EXECUTES_ON, RUNS_AS, TRIGGERS_ON, CREATED_BY, DELEGATES_TO, APPROVED_BY, MEMBER_OF, EVIDENCES, AUTHENTICATES_VIA (deprecated)


Cross-System Identity Mapping

ServiceNow ↔ Azure Entra Correlation

ServiceNow Azure Entra Correlation

Text diagram
┌─ ServiceNow ──────────────────────┐     ┌─ Azure Entra ──────────────┐
│ │ │ │
│ Business Rule ──────┐ │ │ │
│ Script Include ─────┤ (scripts │ │ │
│ Flow Designer ──────┤ reference) │ │ │
│ Scheduled Job ──────┘ │ │ │
│ │ │ │ │
│ ▼ │ │ │
│ REST Message ───▶ REST Method │ │ │
│ │ │ │ │
│ ▼ │ │ │
│ OAuth Entity ─────────────────────┼─────┼──▶ Service Principal │
│ (client_id) ═══ MATCH ═══════════ │ │ (appId) │
│ │ │ │ │
│ │ │ ▼ │
│ │ │ App Role Assignments │
│ │ │ OAuth2 Permission Grants │
│ │ │ │ │
│ │ │ ▼ │
│ │ │ Sign-in Logs │
│ │ │ (execution evidence) │
└────────────────────────────────────┘ └─────────────────────────────┘

The key correlation point: ServiceNow OAuth Entity client_id matches Azure SP appId.

Azure Foundry ↔ ARM RBAC Correlation

Azure Foundry ARM RBAC Correlation

Text diagram
┌─ Azure AI Foundry ────────────────┐     ┌─ ARM RBAC ─────────────────┐
│ │ │ │
│ AIServices Account │ │ │
│ │ │ │ │
│ ▼ │ │ │
│ Foundry Project │ │ │
│ │ │ │ │
│ ▼ │ │ │
│ AI Agent (workload) ──────────────┼─────┼──▶ Managed Identity │
│ │ │ │ (object_id match) │
│ ▼ │ │ │ │
│ Connections (to resources) │ │ ▼ │
│ - Azure OpenAI │ │ Role Assignments │
│ - Azure AI Search │ │ (Contributor, Reader...) │
│ - Azure Storage │ │ │ │
│ │ │ │ ▼ │
│ ▼ │ │ Scoped Resources │
│ Thread Runs (execution evidence) │ │ (/subscriptions/...) │
└────────────────────────────────────┘ └─────────────────────────────┘

The key correlation point: AIServices account identity.principalId matches Entra SP id (object ID).


Source System → Platform Entity Mapping

ServiceNow

ServiceNow ConceptPlatform EntitySubtypeNotes
Business Ruleworkloadbusiness_ruleServer-side automation on table events
Script Includeworkloadscript_includeReusable server script library
Flow Designer Flowworkloadflow_designer_flowLow-code automation
Scheduled Jobworkloadscheduled_jobCron-like recurring task
REST Messageconnectionrest_messageOutbound API endpoint
OAuth Entitycredentialoauth_providerOAuth config (holds client_id)
OAuth Profilecredentialoauth_profileInstance of OAuth config
Machine Accountidentitymachine_accountNon-human SN user
Integration Useridentityintegration_userService account
sys_user (human)ownerhuman_identityAccountability assignment

Azure Entra ID

Azure ConceptPlatform EntitySubtypeNotes
Service Principalidentityservice_principalApp identity in the tenant
Managed Identityidentityservice_principalSystem/user-assigned MI
App Role AssignmentroleRole granted to SP
API Permission (Application)permissionvariesOAA-canonicalized
API Permission (Delegated)permissionvariesUser-context permissions
Sign-in Logexecution_evidenceProof of SP activity
Owner (on App Reg)ownerhuman_identityApp registration owner

Azure AI Foundry

Foundry ConceptPlatform EntitySubtypeNotes
AIServices Account(context)Groups projects
Foundry Project(context)Groups agents and connections
AI Agentworkloadai_agentAutonomous AI workload
Agent ConnectionconnectionvariesLink to Azure OpenAI, Search, etc.
Managed Identityidentityservice_principalAgent's runtime identity
ARM Role Assignmentrole + permissionRBAC on Azure resources
Thread Runexecution_evidenceProof of agent execution

OAA Permission Canonicalization

Raw permissions from source systems are mapped to a 10-type canonical model:

Data operations: DataRead, DataWrite, DataCreate, DataDelete Config operations: MetadataRead, MetadataWrite, MetadataCreate, MetadataDelete Other: NonData (execute without mutation), Uncategorized

Examples:

Raw Permission (Azure)Canonical TypePrivileged?
Directory.ReadWrite.AllMetadataWriteYes
User.Read.AllDataReadNo
Mail.SendDataWriteYes (PII)
Application.ReadWrite.AllMetadataWriteYes
Files.ReadWrite.AllDataWriteYes

Risk Classification Model

Risk Classification Matrix

Text diagram
                     ┌────────────────────────────┐
│ EGRESS CATEGORY │
│ (where does data go?) │
├────────┬─────────┬──────────┤
│ LLM │External │ Internal │
┌───────────┼────────┼─────────┼──────────┤
│ HR/ │ RG1 │ RG2 │ RG4 │
ORIGIN │ Identity │ (high) │ (high) │ (low) │
(what ├───────────┼────────┼─────────┼──────────┤
data?) │ Customer/ │ RG1 │ RG2 │ RG4 │
│ Financial │ (high) │ (high) │ (low) │
├───────────┼────────┼─────────┼──────────┤
│ Config/ │ RG3 │ RG3 │ RG5 │
│ System │ (med) │ (med) │ (low) │
└───────────┴────────┴─────────┴──────────┘
  • RG1 = Sensitive data flowing to LLM (highest risk)
  • RG2 = Sensitive data flowing to external systems
  • RG3 = Config/system data flowing out
  • RG4 = Sensitive data staying internal
  • RG5 = Config/system data staying internal

Findings Pipeline

Findings Pipeline

Text diagram
NormalizedGraph ingested


┌─────────────────────┐
│ Graph Transformer │ builds entities, relationships,
│ │ execution paths, accessible_by
└─────────┬───────────┘


┌─────────────────────┐
│ Evaluator Engine │ runs 15 deterministic rules
│ │ against entity + path state
└─────────┬───────────┘


┌─────────────────────┐
│ Findings + Evidence │ created with status: active
│ │ sealed with SHA256 hashes
└─────────────────────┘

15 Finding Types

Ownership issues: orphaned_ownership, ownership_degraded, ownership_ambiguous, ownership_unknown, ownership_drift

Authority issues: dormant_authority, privilege_justification_gap, scope_drift, reachability_drift

Execution issues: unproven_execution, unknown_identity_binding, unresolved_cross_system_auth

Data flow issues: reachable_sensitive_domain, llm_egress, external_egress


Database Collections (13)

CollectionWhat it stores
entitiesCurrent state of all platform entities
entity_versionsHistorical snapshots (temporal queries)
eventsChange log (2-year TTL)
execution_evidenceSign-in logs, flow runs, job triggers
connector_syncsSync metadata and status
sync_cursorsPagination state for incremental syncs
findingsDetected security findings
evidence_packsSealed, hashed evidence bundles
execution_chainsAutomation workflow chains
authority_pathsMaterialized access paths (pre-computed)
baseline_metadataPoint-in-time baselines
baseline_entitiesEntity copies at baseline time
posture_snapshotsAggregate posture summaries

Design Principles

  1. Deterministic only — no ML, no probabilistic scoring
  2. Read-only connectors — never write back to source systems
  3. Evidence-grade output — sealed, timestamped, SHA256 hashed
  4. Multi-tenant — all queries scoped by tenant_id
  5. Temporal — point-in-time queries, version history, drift detection
  6. Connector-agnostic normalization — all connectors output the same NormalizedGraph format