Enterprise Data Plane Split & Tagging Schema
Data Plane Architecture
Engram uses a two-plane storage architecture to separate concerns and optimize for different access patterns:
System of Record (Record Plane)
Purpose: Store raw artifacts, parsed documents, and provenance metadata.
Storage: Azure Blob Storage
Contents:
- Original documents (PDF, DOCX, etc.)
- Parsed/chunked artifacts from Unstructured
- Checksums and metadata
- Access control lists (ACLs)
- Retention policies
Tag: Plane=record
System of Recall (Recall Plane)
Purpose: Store searchable, queryable memory (episodic + semantic).
Storage: Zep (PostgreSQL with pgvector)
Contents:
- Episodic memory (conversation sessions)
- Semantic memory (knowledge graph facts)
- Vector embeddings
- Entity relationships
Tag: Plane=recall
Tagging Schema
All Azure resources use a consistent tagging schema for:
- Cost allocation (FinOps)
- Resource organization (filtering, grouping)
- Governance (policies, compliance)
- Operations (alerting, runbooks)
Standard Tags
| Tag Key | Values | Description | Example |
|---|---|---|---|
Project | Engram | Project identifier | Engram |
Environment | staging, dev, test, uat, prod | Environment type | staging |
Component | Component name | Service/component identifier | BackendAPI, Zep, PostgreSQL, BlobStorage |
Plane | record, recall | Data plane classification | record (Blob), recall (Zep/Postgres) |
Owner | Team/contact | Resource owner | zimax-engram-team |
CostCenter | Cost center code | Financial allocation | engram-platform |
DataClass | internal, confidential, restricted | Data classification | internal, confidential (Key Vault) |
Tag Examples
Blob Storage (Record Plane)
{
"Project": "Engram",
"Environment": "staging",
"Component": "BlobStorage",
"Plane": "record",
"Owner": "zimax-engram-team",
"CostCenter": "engram-platform",
"DataClass": "internal"
}
Zep Container App (Recall Plane)
{
"Project": "Engram",
"Environment": "staging",
"Component": "Zep",
"Plane": "recall",
"Owner": "zimax-engram-team",
"CostCenter": "engram-platform",
"DataClass": "internal"
}
Postgres (Recall Plane)
{
"Project": "Engram",
"Environment": "staging",
"Component": "PostgreSQL",
"Plane": "recall",
"Owner": "zimax-engram-team",
"CostCenter": "engram-platform",
"DataClass": "internal"
}
Key Vault (Confidential)
{
"Project": "Engram",
"Environment": "staging",
"Component": "KeyVault",
"Plane": "",
"Owner": "zimax-engram-team",
"CostCenter": "engram-platform",
"DataClass": "confidential"
}
Component Naming Convention
Resources follow the pattern: {org}-engram-{env}-{component}
Examples:
zimax-engram-staging-api(Backend API)zimax-engram-staging-worker(Temporal Worker)zimax-engram-staging-zep(Zep)zimax-engram-staging-temporal-server(Temporal Server)zimax-engram-staging-db(PostgreSQL)
Environment Definitions
| Environment | Purpose | Network Posture | Private Link |
|---|---|---|---|
staging | POC, development | Public ingress allowed (limited) | Disabled |
dev | Feature development | Public ingress allowed | Disabled |
test | Integration testing | Public ingress allowed | Disabled |
uat | Customer acceptance | Private ingress preferred | Enabled |
prod | Production workload | Private ingress required | Enabled |
Data Classification
- Internal: Default for most Engram resources (API, workers, Zep, Postgres, Blob)
- Confidential: Key Vault (secrets, credentials)
- Restricted: Future use for PII/PHI datasets (if applicable)
Tag Application in IaC
Tags are applied consistently across all resources via Bicep parameters:
var baseTags = {
Project: 'Engram'
Environment: environment // staging, dev, test, uat, prod
Component: '' // Set per resource
Plane: '' // record or recall
Owner: 'zimax-engram-team'
CostCenter: 'engram-platform'
DataClass: 'internal'
}
var storageTags = union(baseTags, {
Component: 'BlobStorage'
Plane: 'record'
})
var zepTags = union(baseTags, {
Component: 'Zep'
Plane: 'recall'
})
Cost Allocation
Use tags for FinOps reporting:
# Cost by environment
az costmanagement query --type Usage \
--timeframe MonthToDate \
--dataset aggregation='{"totalCost":{"name":"PreTaxCost","function":"Sum"}}' \
--dataset grouping='[{"name":"TagName","type":"Tag"}]' \
--query "filter(TagName=='Environment')"
# Cost by data plane
az costmanagement query --type Usage \
--timeframe MonthToDate \
--dataset aggregation='{"totalCost":{"name":"PreTaxCost","function":"Sum"}}' \
--dataset grouping='[{"name":"TagName","type":"Tag"}]' \
--query "filter(TagName=='Plane')"
Governance Policies
Use Azure Policy to enforce tagging:
{
"if": {
"field": "tags['Project']",
"exists": false
},
"then": {
"effect": "deny"
}
}
Migration Path
When moving from staging → dev/test/uat/prod:
- Update environment parameter in IaC deployment
- Tags automatically applied per environment
- Private Link toggled based on environment (
enablePrivateLinkparam) - Storage/Postgres SKU adjusted per environment tier