This is Part 2 of the Enterprise Intelligence Platform Playbook series. Part 1 defined the eight-layer reference architecture. Part 2 is a specification: the deployable topology, the open-source tooling, the decision catalogue, and the phased build plan that turn the reference architecture into infrastructure. Part 3 covers the engineering disciplines that operate the platform.
Part 1 gave you the eight-layer reference architecture. This part shows you how to build it. We will translate those layers into a deployable topology with open-source tooling, define the decisions the platform must support, specify the operators the execution gateway exposes, and lay out a phased build plan. The question we are answering: how do you deploy this thing without handing your architecture to a single cloud vendor?
Those eight layers map onto three zones. Each zone has a distinct security posture, scaling model, and operational cadence. A platform engineering team treats each zone as an internal product with documented APIs, SLAs, and self-service onboarding. The tools recommended here are open-source unless noted otherwise. If you use a managed cloud service for any of these, the logical structure is identical – substitute the appropriate equivalent.
The Three-Zone Deployment Topology

Layer-by-Layer Tech Stack
Here is where each layer lives in the stack and what it does. The table shows what each layer provides, consumes, and outputs. Teams building on the platform interact with these interfaces. The platform team owns the implementation.
| Layer | Provides | Consumes | Outputs |
|---|---|---|---|
| Compute Foundation | ModelInference(), EmbedText(), CacheLookup() | Model requests, GPU resources | Inference results, embeddings |
| Context Fabric | ResolveContext(), RetrieveHistory(), SearchKnowledge() | Intent, Identity, Policies | Context Object |
| Enterprise Reality Model | GetEntity(), QueryRelationship(), GetState() | Context Object, Domain schemas | Business Objects |
| Logic Engine | EvaluateDecision(), CheckPolicy(), SolveConstraint() | Context, Business Objects, Decision Models, Policies | Decision |
| Execution Gateway | ExecuteOperator(), OrchestrateAction(), TranslateProtocol() | Decision, Operators, Action Adapters | Action Results |
| Trust Guardrails | ValidateRequest(), EnforcePolicy(), AuditAction() | Every request, every response | Allowed/Blocked, Audit trail |
| Agent Kernel | PlanTask(), DecomposeQuery(), CoordinateAgents() | Intent, Context, Decision, Action Results | Agent orchestration |
| Collaboration Interface | ExposeAPI(), StreamChat(), ReceiveWebhook() | User input, External events | User-facing responses |
Layer 1 - The Compute Foundation
Every service in every zone runs on Kubernetes. Treat your K8s cluster as the platform’s platform - it is the first thing you build and the last thing you change.
| Capability | Open-Source Tool | Notes |
|---|---|---|
| Cluster orchestration | Kubernetes (K8s) | The substrate for every zone. Distribution-agnostic (kubeadm, K3s, Rancher, OpenShift) |
| GPU management | Nvidia GPU Operator + Kueue | Driver provisioning, GPU sharing, batch queue scheduling |
| Node autoscaling | Karpenter or Cluster Autoscaler | GPU and CPU node pools, binpacking, spot instance fallback |
| Service mesh | Istio or Cilium | mTLS, observability, traffic policy across all three zones |
| Model serving | vLLM | PagedAttention, continuous batching, OpenAI-compatible API |
| Model serving (alt) | Triton Inference Server | Multi-framework, GPU-optimized |
| Inference gateway | Kong + custom plugin | Cost-based routing, model fallback, canary deployments |
| Embedding service | TEI (Text Embeddings Inference) | HuggingFace-backed, OpenAI-compatible |
| Semantic cache | Redis | TTL-based, embedding similarity matching on K8s StatefulSet |
Layer 2 - The Context Fabric
| Capability | Open-Source Tool | Notes |
|---|---|---|
| Vector database | Qdrant or Milvus | Qdrant for moderate scale, Milvus for 100M+ vectors |
| Knowledge graph | Neo4j | Relationships, hierarchies, policy traversal |
| Session memory | Redis | TTL-based, per-agent namespacing |
| Operational memory | PostgreSQL | Task state, agent checkpoints, durable |
| Historical memory | MinIO + Trino | Parquet on object store, SQL queryable |
| CDC ingestion | Debezium + Kafka | Real-time streaming from any DB with commit log |
Layer 3 - The Enterprise Reality Model
When a team wants to add a new domain - say, supply chain or customer success - they contribute to the Enterprise Reality Model. They define the business objects, their relationships, and their current state. The platform provides the infrastructure. The team provides the domain knowledge. The Reality Model grows without the platform team rebuilding it.
| Capability | Open-Source Tool | Notes |
|---|---|---|
| Business object store | PostgreSQL + MinIO | Relational state with blob attachments |
| Real-time sync | Kafka + Flink | Stream processing, materialized views |
| Relationship mapping | Neo4j | Cross-object queries, path traversal |
| Temporal queries | pg_temporal or PostgreSQL | Native temporal extensions |
| Permission model | Cedar | Fine-grained authorization policies |
Layer 4 - The Logic Engine
| Capability | Open-Source Tool | Notes |
|---|---|---|
| Business rules | OPA + Drools + Cedar | OPA for cloud-native policies, Drools for complex rules, Cedar for authorization |
| Decision traceability | PostgreSQL + OTel | Immutable decision log with trace context |
| Approval workflows | Temporal | Durable execution, human-in-the-loop signals |
| Optimization engine | OR-Tools or OptaPlanner | Constraint solving, resource allocation |
Layer 5 - The Execution Gateway
| Capability | Open-Source Tool | Notes |
|---|---|---|
| API exposure | Kong or Envoy | Rate limiting, auth, observability at gateway |
| Action orchestration | Temporal | Multi-step actions, retries, saga patterns |
| Integration middleware | Kafka Connect + custom adapters | Pre-built connectors for SAP, Salesforce, JDBC, Terraform, PagerDuty |
| Idempotency | PostgreSQL + idempotency key | Application-level dedup lock |
This is where the rubber meets the road. The execution gateway exposes business capabilities as operators. An agent does not call APIs. It calls operators. Each operator is a governed action that orchestrates multiple technical operations behind a single business outcome.
| Operator | Description | Example |
|---|---|---|
| Approve | Allow something to proceed | Approve deployment |
| Reject | Prevent an action | Reject loan |
| Recommend | Suggest the best option | Recommend product |
| Prioritize | Rank competing work | Prioritize incidents |
| Allocate | Assign limited resources | Allocate ICU bed |
| Authorize | Verify permissions | Authorize payment |
| Optimize | Improve efficiency | Optimize routing |
| Predict | Forecast future state | Predict churn |
| Recover | Restore normal operation | Recover service |
| Escalate | Transfer to higher authority | Escalate security incident |
| Schedule | Determine timing | Schedule maintenance |
| Retire | Remove or decommission | Retire application |
These twelve operators are the system calls of the execution gateway. Every business capability maps to one or more operators. The agent reasons in business language. The platform translates that into operator calls. The operators enforce idempotency, audit, and rollback. The agent never touches infrastructure directly.
Layer 6 - The Trust Guardrails
Trust is not optional. Every request and response passes through guardrails that enforce policy, redact sensitive data, and maintain an audit trail. This layer is what makes the platform enterprise-grade rather than a side project.
| Capability | Open-Source Tool | Notes |
|---|---|---|
| Prompt injection detection | NeMo Guardrails | Colang policies, runtime detection |
| PII redaction | Microsoft Presidio | Pre/post processing with NLP-based detection |
| Auth + identity | Keycloak | OIDC, SAML, federated with any IdP |
| Audit trail | OpenTelemetry + Loki | Every inference, action, decision traced |
| Secrets | HashiCorp Vault | Dynamic secrets, KMS integration, rotation |
| Compliance enforcement | OPA + Drools + Kyverno | Admission control, policy-as-code |
Layer 7 - The Agent Kernel
| Capability | Open-Source Tool | Notes |
|---|---|---|
| Agent orchestration | LangGraph | Graph-based agent workflows, tool calling |
| State management | PostgreSQL + Redis | Session persistence, checkpointing |
| Multi-agent coordination | NATS + Temporal | Cross-agent task delegation, durable RPC |
| Observability | OpenTelemetry + Prometheus + Grafana | Full tracing, metrics, and dashboards |
Layer 8 - The Collaboration Interface
| Capability | Open-Source Tool | Notes |
|---|---|---|
| Internal API | Kong + Keycloak | Developer-facing agent APIs with OAuth |
| Chat interface | Streamlit or custom React | Web UI with WebSocket streaming |
| Webhook integration | Kafka + Webhook Relay | Ingest external events into context fabric |
| SDK / CLI | OpenAPI Generator + Cobra | Auto-generated SDKs, CLI tool |
Request Flow: End to End
Here is what happens when an agent processes a single enterprise request:
1. User submits: "Approve travel request #4412 for Alok"
│
2. Kong authenticates via Keycloak, NeMo Guardrails inspects prompt
│
3. LangGraph receives intent: APPROVE_TRAVEL
│
4. Agent Kernel queries Context Fabric:
├─ Retrieve employee profile (PostgreSQL)
├─ Get travel policy (Qdrant vector search)
└─ Check booking details (PostgreSQL via Debezium)
│
5. Context is assembled, ranked, compressed by LangGraph
│
6. OPA + Drools + Cedar evaluate: role-based approval limit, budget remaining, policy compliance
│
7. If auto-approvable → execute via Temporal workflow
│ ├─ Update booking status (PostgreSQL)
│ ├─ Notify employee (NATS)
│ └─ Log decision (PostgreSQL + OTel)
│
8. If needs manager approval → Temporal pauses workflow
│ └─ NATS notification → manager approves via web UI
│ └─ Temporal resumes execution
│
9. Result returned to user. Every step traced in OTel + Prometheus + Grafana.
Pseudocode
The flowchart above shows the high-level path. This trace shows the exact API calls through the eight layers for a refund request:
# Layer 8 & 6: Ingest and Screen
raw_input = CollaborationInterface.StreamChat(source="mobile_app_client")
# "I want a refund for order #9482. The ceramic vase arrived completely shattered."
sanitized_intent = TrustGuardrails.ValidateRequest(
input_payload=raw_input,
policy_context="external_customer_ruleset"
)
# Layer 7: Plan
execution_plan = AgentKernel.DecomposeQuery(intent=sanitized_intent)
# -> Step 1: Resolve Order 9482
# -> Step 2: Run Eligibility Check
# -> Step 3: Trigger Ledger Payout
# Layer 2 & 3: Contextualize and Hydrate Data
context_data = ContextFabric.SearchKnowledge(query="refund fragile items window")
order_record = EnterpriseRealityModel.GetEntity(entity_type="Order", entity_id="9482")
customer_record = EnterpriseRealityModel.GetEntity(
entity_type="Customer", entity_id=order_record.customer_id
)
# Layer 4: Hard Rule Evaluation (No LLM hallucinations allowed here)
refund_decision = LogicEngine.EvaluateDecision(
context=context_data,
business_objects=[order_record, customer_record],
policy_id="automated_returns_v4"
)
# Returns: { "status": "APPROVED", "payout_target": "original_visa", "amount": 45.00 }
# Layer 5: Execution Core
gateway_receipt = ExecutionGateway.OrchestrateAction(
action_verb="PROCESS_REVERSAL",
operators=["stripe_adapter", "sap_erp_adapter"],
parameters=refund_decision
)
# Returns: { "stripe_status": "SUCCESS", "stripe_tx": "ch_3M8x", "sap_status": "SUCCESS" }
# Return Loop to Layer 8
CollaborationInterface.ExposeAPI(
payload=(
f"Refund of ${refund_decision.amount} successfully processed to your card. "
f"Transaction ID: {gateway_receipt.stripe_tx}."
)
)
When the decision is rejected, the flow changes at Layer 5:
# Layer 4: Decision returned REJECTED
refund_decision = LogicEngine.EvaluateDecision(...)
# Returns: { "status": "REJECTED", "reason": "outside_return_window" }
# Layer 5: Escalate instead of execute
if refund_decision.status == "REJECTED":
ExecutionGateway.OrchestrateAction(
action_verb="ESCALATE",
operators=["human_review_adapter"],
parameters=refund_decision
)
The same eight layers handle infrastructure incidents. The trace is identical. Only the operators change:
# Layer 8 & 6: Ingest and Filter Threat Vector
raw_alert = CollaborationInterface.ReceiveWebhook(source="datadog_severity_1")
sanitized_incident = TrustGuardrails.ValidateRequest(
input_payload=raw_alert,
identity_context="systems_engineering_service_account"
)
# Layer 7: Generate Execution DAG
incident_dag = AgentKernel.PlanTask(intent=sanitized_incident)
# -> Step 1: Map Node Blast Radius
# -> Step 2: Query Failover Hard Rules
# -> Step 3: Await Human Sign-Off (if required)
# -> Step 4: Execute Infrastructure State Change
# Layer 2 & 3: Hydrate Live Operational Map
incident_context = ContextFabric.ResolveContext(target="DB-PROD-02")
live_infra_node = EnterpriseRealityModel.GetEntity(
entity_type="DatabaseCluster", entity_id="DB-PROD-02"
)
downstream_apps = EnterpriseRealityModel.QueryRelationship(
origin=live_infra_node, relationship="supports"
)
# Layer 4: Evaluate Deterministic Architectural Policies
mitigation_gate = LogicEngine.EvaluateDecision(
context=incident_context,
business_objects=[live_infra_node, downstream_apps],
policy_id="production_failover_safety_rules"
)
# Returns: { "action_required": "FAILOVER", "requires_human_signoff": True, "blast_radius_cost": "HIGH" }
# Layer 8: Human-in-the-Loop Intercept
if mitigation_gate.requires_human_signoff:
confirmed_payload = CollaborationInterface.ExposeAPI(
target_channel="#ops-war-room",
payload=(
f"CRITICAL: Approve failover for DB-PROD-02? "
f"Blast radius affects: {downstream_apps.names}"
)
)
# Layer 5: Kernel Level System Call Execution
gateway_receipt = ExecutionGateway.OrchestrateAction(
action_verb="RECOVER_PRODUCTION_SERVICE",
operators=["terraform_cloud_adapter", "pagerduty_api"],
parameters=confirmed_payload
)
# Returns: { "terraform_status": "APPLIED", "traffic_rerouted": True, "incident_status": "RESOLVED" }
Two traces. Same architecture. Same API calls. Different operators. The platform does not care whether the decision is about a refund or a failover. The decision model changes. The operators change. The eight layers do not.
Decision Catalogue
This is the heart of the platform. These are the questions the Logic Engine answers. Each row is a decision type. Each column is the industry-specific form that decision takes.
| Decision Type | Platform Engineering / IT | Telecom | Retail & eCommerce | Banking & Financial Services | Manufacturing & Supply Chain |
|---|---|---|---|---|---|
| Deploy | Can this deployment proceed? | Can this subscriber be activated? | Should this refund be approved? | Should this loan be approved? | Should production continue? |
| Rollback | Should we rollback this release? | Should this network incident auto-remediate? | Should inventory be replenished? | Is this transaction fraudulent? | Which machine should be serviced first? |
| Scale | Should the cluster autoscale? | Which network slice should scale? | Which products should be recommended? | Should this payment be authorized? | Should production be rescheduled? |
| Failover | Should we fail over to another region? | Should traffic be rerouted? | Which warehouse should fulfill this order? | Should the credit limit increase? | Should this supplier be replaced? |
| Remediate | Can this incident be auto-remediated? | Which customers are likely to churn? | Should pricing be optimized? | Which customers have highest default risk? | Which production line should run next? |
| Rotate | Should we rotate credentials? | Should roaming be enabled? | Should this return be accepted? | Should collections begin? | Should inventory be reordered? |
| Maintain | Which alerts require human review? | Which towers require maintenance? | Which promotion should launch next? | Should this account be frozen? | Which factory has excess capacity? |
| Optimize | Which AI model should execute this task? | Should this outage be escalated? | Which customers should receive loyalty offers? | Which investment portfolio should be recommended? | Which quality issues require escalation? |
| Validate | Is the enterprise ready for production? | Can maintenance wait until off-peak hours? | Which supplier should receive the purchase order? | Should fraud investigation begin? | Should this batch be rejected? |
| Prioritize | Which optimization delivers the highest ROI? | Which cell site should receive capacity upgrades? | Should this order be expedited? | Should this customer receive a new product offer? | Should predictive maintenance be scheduled? |
The decision catalogue is not documentation. It is a living specification. Every decision in this table must be implemented as a versioned decision model in the Logic Engine. When the business adds a new decision type, it enters this table first, then the platform builds it.
Build Order and Profiles
Do not build all three zones at once. The dependency graph dictates the sequence. Each phase adds an internal platform product with a clear owner, documented API, and self-service onboarding path.
| Phase | Timeline | Focus | Deliverable |
|---|---|---|---|
| 1. Foundation | Weeks 1-8 | K8s cluster, inference gateway, one action | Single agent can accept a request, call a model, execute one action, return a result. Platform documented with node sizing, upgrade procedure, DR. |
| 2. Context | Weeks 9-16 | CDC ingestion, vector store, memory, PII guardrails | Agents retrieve live enterprise context. Cost visibility per agent. Context fabric has freshness and availability SLOs. |
| 3. Scale | Weeks 17-24 | Knowledge graph, multi-model routing, action catalog, FinOps | Multiple teams onboard via self-service. Actions reusable across agents. Cost and security guardrails enforced via policy-as-code. |
| 4. Optimize | Weeks 25+ | Fine-tuned models, evaluation pipelines, learning loop | Platform continuously improves. Agent development is self-service. Success measured by onboarding velocity and reliability. |
You do not need a cluster to prove the architecture works. Start at the Developer profile and evolve as adoption increases.
| Dimension | Developer | Team | Enterprise |
|---|---|---|---|
| Runtime | Docker Compose or Colima | Single Kubernetes cluster | Multi-zone Kubernetes (HA) |
| Compute | CPU-only or single GPU (laptop) | 1-2 shared GPUs (node pool) | Multiple GPU node pools, autoscaling |
| Models | 1 model (quantized or small) | 2-3 models | 5+ models (managed + self-hosted) |
| Agents | 1 | Up to 5 | 100+ across multiple teams |
| Context | Local files or SQLite | Qdrant or pgvector, Redis | Multi-region Qdrant, Neo4j knowledge graph |
| Use case | Prove a single agent end-to-end | One team building multiple agents | Organization-wide agent deployment |
Developer validates the architecture works. One agent, one model, one context source, one action. No Kubernetes. You are testing whether the decision-to-action pipeline makes sense before investing in infrastructure.
Team ships a K8s cluster with GPU Operator, Kong gateway, and basic observability. Multiple agents share infrastructure. Context retrieval and memory become shared services. The team owns its agents. The platform team owns the platform.
Enterprise means every zone is independently deployable and recoverable. The platform team has multiple engineers per discipline. Agents are onboarded via self-service. The action catalog is shared. The governance plane enforces policy across every agent.
The dominant cost driver is not just GPU compute, it is context retrieval and storage in terms of performance. A platform that optimizes context freshness, caching, and compression will spend 60-70% less on infrastructure than one that does not.
Platform Engineering Checklist
Before putting the platform in front of users, verify each of these. Each item represents a platform engineering concern, not just a configuration checkbox:
- Inference gateway is the only path to models (no direct model API calls)
- Prompt injection and PII detection run on every request, both directions
- All actions are idempotent with documented failure modes
- Context retrieval has a freshness SLO and staleness metadata exposed to agents
- Token usage is tracked per request, per agent, per team
- Model fallback routing is configured (premium -> standard -> batch)
- Cost circuit breakers pause non-critical agents when aggregate spend exceeds threshold
- Agent execution has max duration, max cost, and max retry limits enforced at the platform level
- Human-in-the-loop gates all destructive actions via Temporal signals
- OTel tracing covers the full request lifecycle across all three zones
- Every zone has independent disaster recovery and can fail over without cross-zone dependency
- Platform onboarding documentation exists for: new agent, new action, new data source, new model
- Helm charts and Terraform/Tofu modules are versioned with PR-based change management
- Load testing confirms p95 latency under 2x model inference time for the critical path
- GPU autoscaling policy is defined: min/max replicas, scale-up threshold, cooldown period
- K8s cluster upgrades are tested and documented (control plane, node pools, add-ons)
- Pod resource requests and limits are set for every service across all three zones
- NetworkPolicies enforce zone isolation (no cross-zone traffic except through gateway)
What You’re Actually Building
The eight-layer architecture from Part 1 is the reference. This specification is how you build it. The decision catalogue defines what decisions the platform must support. The operator catalogue defines what actions the execution gateway exposes.
I want you to think about the tools listed here as replaceable – PostgreSQL might become MongoDB, Qdrant might become Milvus, Temporal might become Camunda etc. It is the specification and discipline what endure.
In part 3 of the series we will cover the disciplines that operate this platform: Context Engineering, Decision Engineering, and Action Engineering. Those disciplines are what will make this static specification an “intelligent” platform.