| Executive surface |
Self-hosted chat client (Mattermost) + React web app on Kubernetes |
Open source |
Web portal only; a hosted collaboration suite |
Executives approve where they already talk; the web app carries the depth a chat attachment cannot. |
ADR-05 |
| Perimeter and WAF |
HAProxy pair with VRRP, Coraza WAF on the OWASP core rule set |
Open source |
NGINX + ModSecurity; an enterprise load balancer appliance |
TLS termination, rule-set WAF and failover from two small components the team can read end to end. |
ADR-06 |
| API gateway |
Kong Gateway, cluster-internal only |
Open source |
Apache APISIX; ingress plus custom middleware |
Per-tenant quota, token budgets and one enforced contract per surface, without writing a gateway. |
ADR-06 |
| Application hosting |
Kubernetes on bare metal, one cluster per site |
Open source |
A supported distribution such as OpenShift; plain hosts under configuration management |
A tenant becomes a namespace, and scaling down between briefings returns capacity to a fixed pool. |
ADR-11 |
| GPU platform |
NVIDIA GPU Operator with MIG partitioning on H100-class nodes |
Enterprise on-prem |
Time-sliced whole GPUs; CPU-only inference on a smaller model |
The router, embedding and reranking models share one card while the reasoning model keeps its own. |
ADR-10 |
| Service identity and east-west security |
Istio mesh with SPIFFE workload identity and mutual TLS |
Open source |
Cilium mTLS; TLS terminated per service |
Every hop is authenticated and encrypted without a credential in any configuration file. |
ADR-27 |
| Long-running investigations |
Temporal |
Open source |
A queue plus a hand-written state machine |
An investigation is a resumable orchestration with checkpoints, not a long HTTP request. |
ADR-07 |
| Agent runtime |
LangGraph on a FastAPI host, checkpointing to PostgreSQL |
Open source |
AutoGen; a bare tool-calling loop |
Durable graph execution and thread state, with the routing policy kept in code the team owns. |
ADR-08 |
| Language models |
vLLM serving an open-weight 70B-class reasoning model and a 7B-class router |
Open source |
One large model for everything; a hosted API under a data-boundary commitment |
Most turns need routing, not reasoning, and on fixed accelerators that is the largest capacity lever there is. |
ADR-10 |
| Enterprise retrieval |
OpenSearch — BM25 and k-NN vectors fused, filters in query context |
Open source |
Elasticsearch; pgvector on PostgreSQL; a vector-only store |
Executive questions mix concepts with exact identifiers, and the security filter must run before scoring. |
ADR-12 |
| Embeddings and reranking |
BGE-M3 and a cross-encoder reranker on Text Embeddings Inference |
Open source |
A smaller embedding model; a domain-tuned one |
Served on the same accelerators as everything else, so there is no separate residency argument to make. |
ADR-12 |
| Guardrails and grounding |
Llama Guard 3 for input shields, an NLI entailment verifier for groundedness, Presidio for PII |
Open source |
A second large model as judge; a commercial moderation service |
Versioned separately from the generating model, which is what makes the check independent. |
ADR-04 |
| Document processing |
Docling and Apache Tika with an OCR pass |
Open source |
A commercial document-understanding appliance |
Layout and table extraction from PDFs and board papers without a document leaving the building. |
ADR-13 |
| Object storage |
MinIO, erasure coded, with object lock |
Open source |
Ceph object gateway; an enterprise NAS with S3 emulation |
S3 semantics on the customer’s own disks, and immutability enforced by the store rather than the application. |
ADR-15 |
| Analytical foundation |
Apache Iceberg tables on MinIO, queried by Trino, built by Spark |
Open source |
A traditional relational warehouse; a Spark-centric platform |
One storage layer and one catalogue, and the customer’s existing lake is read in place rather than copied. |
ADR-15 |
| Transformation and orchestration |
Apache Airflow with dbt |
Open source |
Dagster; scheduled scripts |
Declared dependencies, per-source watermarks and a lineage event the catalogue can consume. |
ADR-20 |
| KPI definitions |
Cube semantic layer over the gold tables, defined as version-controlled files |
Open source |
dbt metrics; measures defined in the BI tool alone |
The finance team owns one definition, and the platform and the BI tool cannot disagree about a number. |
ADR-17 |
| Business intelligence |
Apache Superset reading the same semantic layer |
Open source |
Metabase; the customer’s existing BI estate |
The platform does not build a parallel definition of a KPI the customer already owns. |
ADR-17 |
| Cross-domain relationships |
Neo4j causal cluster, rebuilt from the gold layer |
Open source |
Apache AGE on PostgreSQL; recursive SQL; no graph at all |
The flagship question is a multi-hop traversal over supplier, contract, purchase order and project. |
ADR-18 |
| Forecasting and anomaly detection |
MLflow registry with KServe endpoints on CPU nodes |
Open source |
Asking the language model; notebooks on a schedule |
A forecast needs a registered, versioned, testable artefact with an interval — three things a prompt cannot provide. |
ADR-19 |
| Decision and audit store |
PostgreSQL under Patroni, synchronous replicas across racks |
Open source |
A document store; a commercial RDBMS the customer already licenses |
The decision record is relational and transactional, and needs row-level security and point-in-time restore. |
ADR-01 |
| Evidence custody |
MinIO object lock in compliance mode, with legal hold |
Open source |
Keeping evidence in the database; a WORM tape archive |
Immutability enforced by the storage layer, so an application compromise cannot rewrite history. |
ADR-31 |
| Conversation state and semantic cache |
Redis |
Open source |
State in the decision store; no cache |
Turn state is ephemeral and hot; the cache key includes the caller’s permission fingerprint, which is what makes it safe. |
ADR-14 |
| Change-data capture |
Debezium into Kafka |
Open source |
Nightly full extracts everywhere; trigger-based capture |
Low-latency finance data without polling a production ERP, where the source supports a log reader. |
ADR-20 |
| Event backbone |
Apache Kafka (Strimzi on Kubernetes) |
Open source |
RabbitMQ; NATS |
High-throughput, replayable, and it lands in the same lake as everything else. |
ADR-20 |
| Action execution |
Temporal sagas with a lease and an idempotency key |
Open source |
A queue with dead-lettering; a database-backed outbox |
An approved action must survive a crash exactly once, and be re-authorised on resume. |
ADR-21 |
| Approval workflow |
Camunda 8 for approval, escalation, delegation and SLA |
Enterprise on-prem |
Approval logic in the decision service; the customer’s existing BPM engine |
Thresholds, escalation paths and delegation are business rules that change without a release. |
ADR-21 |
| Execution connectors |
Apache Camel routes, one connector identity per target system |
Open source |
Direct API clients per system; calls from the agent itself |
Hundreds of enterprise integration patterns, and a blast radius bounded to one system per identity. |
ADR-21 |
| Identity |
Keycloak federated to Active Directory, RFC 8693 token exchange |
Open source |
A privileged service account with application-side filtering |
The AI must inherit the caller’s authority; a read-everything identity makes every bug a data breach. |
ADR-28 |
| Keys and secrets |
HashiCorp Vault fronting the customer’s HSM over PKCS#11, per-tenant keys |
Open source |
Secrets in the cluster’s own store; keys held by the platform team |
The customer holding the key makes revocation a real control rather than a contractual promise. |
ADR-27 |
| Catalogue, classification and lineage |
OpenMetadata with OpenLineage events from the pipelines |
Open source |
DataHub; lineage inferred from pipeline metadata |
Sensitivity labels captured at ingestion are what the retrieval filter and the egress controls both act on. |
ADR-13 |
| Network segmentation and egress |
Calico default-deny policy, one egress firewall with an FQDN allow-list |
Open source |
Flat network with host firewalls; segmentation at the switch only |
One controlled egress path is what makes an exfiltration claim defensible — and makes air-gapping a configuration. |
ADR-27 |
| Admission and policy as code |
OPA Gatekeeper for admission, OPA for authorisation decisions |
Open source |
Kyverno; policy asserted in review rather than enforced |
Residency and isolation are enforced at the cluster boundary, so a developer cannot deploy around them. |
ADR-27 |
| Observability |
Prometheus, Grafana, Loki, Tempo and OpenTelemetry, with Langfuse for turn-level AI traces |
Open source |
A commercial APM installed on-premise; logs only |
A turn must be readable end to end — plan, tool calls, model version, grounding verdict — without leaving the boundary. |
ADR-32 |
| Runtime security and SIEM |
Falco and Trivy for posture, an OpenSearch cluster for security analytics |
Open source |
Wazuh; Elastic Security; the customer’s existing SIEM with log forwarding |
Native signal from the AI and data services, and reading a decision record is itself an audited event. |
ADR-31 |
| Supply chain and registry |
Harbor registry with Cosign signatures, mirrored package feeds |
Open source |
Pulling images and packages from the internet at build time |
Nothing is fetched from outside the boundary, so the air-gapped deployment is the same deployment. |
ADR-34 |
| Delivery |
Self-hosted GitLab pipelines with Argo CD reconciling from Git |
Open source |
Jenkins; deployment by hand at a change window |
A cluster rebuild is a reconciliation rather than a runbook, which is what makes the restore RTO credible. |
ADR-30 |
| Infrastructure as code |
Terraform, Helm and Ansible, with the isolation tier as a parameter |
Open source |
Manual provisioning; a per-tenant repository fork |
A tier is a deployment parameter. Onboarding tenant twelve must not cost what tenant two cost. |
ADR-25 |
| Backup and restore |
Velero for cluster state, WAL archive for PostgreSQL, MinIO replication for objects |
Open source |
Storage-array snapshots alone; an enterprise backup product |
Three stores with three different recovery shapes; only the operational estate carries a real objective. |
ADR-32 |
| Tool plane |
First-party MCP servers behind the gateway, tools resolved per role |
This design |
Bespoke REST tool contracts; direct database access from the agent |
The one door between the model and the data, and therefore the one place authorisation can be audited. |
ADR-02 |
| Model-to-data contract |
One MCP server per domain, tool set pinned at start-up |
This design |
Run-time tool discovery; one server for everything |
A capability set known only at run time cannot be reviewed by security or asserted in an audit. |
ADR-33 |
| Decision engine |
Situation → evidence → root cause → forecast → options → recommendation, as a service |
This design |
Prompting the model to produce a recommendation directly |
Options with cost, risk and delay are what let an executive decide. A single recommendation asks them to trust instead. |
ADR-22 |
| Proactive detection |
Scheduled deterministic detectors over gold-layer measures and the graph |
This design |
An agent that continuously monitors the business |
Repeatable, affordable and explainable. A model that watches is a model you cannot test. |
ADR-24 |
| Tenant configuration |
Versioned, schema-checked configuration artefacts in Git, promoted through rings |
This design |
Configuration rows in a database edited through an admin UI |
"Configuration, not custom code" only holds if the configuration is engineered, reviewable and reversible. |
ADR-26 |
| Evaluation |
Golden-question suites per tenant scored by Ragas, run as a release gate |
This design |
Manual spot checks; published benchmark scores |
Retrieval and generation are scored separately so a regression has a stage rather than a shrug. |
ADR-30 |