Audit of the existing platform before telephony
This audit was carried out on 3 November 2026 on the code of the repository (branch main), before any telephony code
was written. It sets what is reused as is, what is completed and what is missing, so that nothing is implemented
twice. The decisions that follow from it are in ADR-0173.
Legend: existing (works, reused), partial (present but to be completed for telephony), missing (to be built), excluded (absent on purpose).
Navin Platform Manager and its agents
| Subject | State | Finding |
|---|---|---|
| Manager architecture | existing | FastAPI and PostgreSQL server (navin-manager/server), operation engine in stages and tasks, React console (navin-manager/ui), API described by OpenAPI and four SDKs |
| Host agents | existing | Go agent shipped to the hosts (the Python agent stays a reference): files, dnf, apt and pacman packages, systemd units, Podman, firewalld and ufw firewalls, certificates, facts, metrics, signed update |
| Discovery and inventory | existing | one list of nodes, four ways of adding them (command, SSH, cloud instance, image), facts (CPU, memory, disks, GPU, platform), preflight checks |
| Service catalogue | existing | schema catalog/schema/service.schema.json, modes, components, follower components, named instances, bindings between services, TLS, high availability blocks, consoles, commands, backups |
| Methods | existing | binary, podman, python and package; a method can be limited per mode; a package missing for an OS family is refused (packages_unavailable) |
| Clusters | existing | clusters per environment (production, preproduction, test, development, sandbox) and installation profiles (standard, banking-secure, air-gapped) |
| High availability | existing | HA modes declared per service (Patroni for PostgreSQL, Sentinel and Cluster for Redis, Raft for OpenBao), HA groups with failover tests, guarantees described per service (ADR-0166) |
| Configuration management | existing | versions, diff, restore, groups, rolling or full apply, consumers marked to apply when a provider changes |
| Supervision | existing | health checks by the agents, service checks, Prometheus discovery (/clusters/{id}/sd/prometheus), alerts, dashboard per service |
| Backup and restore | existing | backups per service, verified restore, disaster recovery |
| Offline installation | existing | offline bundle with the OS package repository and the image mirror, hub of signed artefacts |
| Telephony | missing | no Asterisk, Kamailio, RTPengine, LiveKit SIP, Egress, Ingress or agent workers in the catalogue |
Navin Enterprise AI Platform
| Subject | State | Finding |
|---|---|---|
| Control Plane | existing | FastAPI and PostgreSQL (services/control-plane, schema eai, migrations sql/postgres), domains per brick, API texts in French and English (eai.apitext) |
| Tenancy | existing | tenants, projects, organisations and units (eai.domains.tenancy), tenant_id on the business tables |
| Long operations | existing | asynchronous operations and worker (V188__operations.sql) |
| Audit | existing | audit outbox, partitioned events, sealing, legal hold: reused, no audit table of its own for telephony |
| Bridge to the Manager | existing | domain platform_manager: reads the services, nodes, clusters and operations of the Manager, requests operations on behalf of the user (X-NM-On-Behalf-Of), Manager token kept in the vault |
| Realtime voice | partial | LiveKit room tokens signed by the Control Plane, WebSocket event protocol, consent, transcripts and session recordings (V145); no telephony |
| Portal | existing | Next.js 15, React 19, Tailwind, Radix, React Query, i18next (French and English), Recharts, livekit-client already there; navigation by sections and roles |
| Telephony | missing | no telephony tenants, extensions, trunks, numbers, routing, IVR, queues, agents, CDR, recordings or screens |
Storage, databases and cache
| Subject | State | Finding |
|---|---|---|
| SeaweedFS | existing | catalogue service in single and distributed modes (masters, volumes, filer, S3 gateway, admin console), configurable replication |
| Storage in the Control Plane | existing | S3 storage profiles (SeaweedFS included), capability discovery, presigned URLs, WORM audit exports (eai.domains.storage) |
| Layout of telephony objects | missing | no bucket or prefix per tenant and category (recordings, voicemail, IVR prompts) |
| MinIO | excluded | AGPL-3.0, refused by ADR-0101 and test_platform_no_agpl.py; SeaweedFS stays the only object store |
| PostgreSQL | existing | standalone and ha modes (Patroni 4.1.5 with etcd), TLS, pgvector, pg_basebackup backups, named instances |
| Redis | existing | standalone, replication, sentinel and cluster modes, TLS, ACL users; already bound to LiveKit in distributed mode |
Security, secrets, identity and certificates
| Subject | State | Finding |
|---|---|---|
| Control Plane secrets | existing | write only API, encrypted values (OpenBao or local AES-GCM), read on the server side only (read_secret) |
| Manager secrets | existing | Manager vault and synchronisation with OpenBao; secrets generated at installation, never shown |
| Authentication | existing | Keycloak (OIDC) and local accounts for the portal; local accounts, LDAP, OIDC and second factor for the Manager |
| Authorisation | existing | Control Plane roles (eai.auth, completed by V161), OpenFGA relations (eai.domains.authz), OPA policies |
| Certificates | existing | Manager authority, certificates installed by the agents (key 0640, copy for the containers), rotation, agent mTLS |
| Network egress | existing | egress guard of the Control Plane (eai.security.egress): every host reached is declared |
| Telephony security | missing | no anti-fraud, CPS limit, destination restrictions or SIP anti-bruteforce |
Observability
| Subject | State | Finding |
|---|---|---|
| Metrics and alerts | existing | Prometheus and Alertmanager of the catalogue, targets discovered by the Manager |
| Logs | existing | Alloy to OpenSearch, OpenSearch Dashboards |
| Traces | existing | OpenTelemetry Collector and Jaeger |
| Grafana and Loki | excluded | AGPL-3.0, refused by ADR-0101 and test_platform_no_agpl.py: telephony uses the Prometheus, Alertmanager, Alloy, OpenSearch and OpenTelemetry already in place |
| Telephony metrics | missing | no Asterisk or Kamailio metrics, no alert rules, no business call indicators |
What is built
- In the Manager catalogue:
asterisk,kamailio,rtpengine(optional),livekit-sip,livekit-egress,livekit-ingress(optional) andlivekit-agents, with their ports, health checks, backups, HA modes and metrics;livekitcompleted without changing its default behaviour. - In the Control Plane: the domain
eai.domains.telephony(data, API, compilers, publication through AMI, JSONRPC and the LiveKit API, calls, CDR, recordings in SeaweedFS, voice AI agents). - In the portal: the Telephony section, the IVR Builder and the WebRTC softphone.
- The alert rules, the documentation, the licence matrix and the software bill of materials.