Skip to main content

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).

SubjectStateFinding
Manager architectureexistingFastAPI 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 agentsexistingGo 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 inventoryexistingone list of nodes, four ways of adding them (command, SSH, cloud instance, image), facts (CPU, memory, disks, GPU, platform), preflight checks
Service catalogueexistingschema catalog/schema/service.schema.json, modes, components, follower components, named instances, bindings between services, TLS, high availability blocks, consoles, commands, backups
Methodsexistingbinary, podman, python and package; a method can be limited per mode; a package missing for an OS family is refused (packages_unavailable)
Clustersexistingclusters per environment (production, preproduction, test, development, sandbox) and installation profiles (standard, banking-secure, air-gapped)
High availabilityexistingHA 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 managementexistingversions, diff, restore, groups, rolling or full apply, consumers marked to apply when a provider changes
Supervisionexistinghealth checks by the agents, service checks, Prometheus discovery (/clusters/{id}/sd/prometheus), alerts, dashboard per service
Backup and restoreexistingbackups per service, verified restore, disaster recovery
Offline installationexistingoffline bundle with the OS package repository and the image mirror, hub of signed artefacts
Telephonymissingno Asterisk, Kamailio, RTPengine, LiveKit SIP, Egress, Ingress or agent workers in the catalogue
SubjectStateFinding
Control PlaneexistingFastAPI and PostgreSQL (services/control-plane, schema eai, migrations sql/postgres), domains per brick, API texts in French and English (eai.apitext)
Tenancyexistingtenants, projects, organisations and units (eai.domains.tenancy), tenant_id on the business tables
Long operationsexistingasynchronous operations and worker (V188__operations.sql)
Auditexistingaudit outbox, partitioned events, sealing, legal hold: reused, no audit table of its own for telephony
Bridge to the Managerexistingdomain 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 voicepartialLiveKit room tokens signed by the Control Plane, WebSocket event protocol, consent, transcripts and session recordings (V145); no telephony
PortalexistingNext.js 15, React 19, Tailwind, Radix, React Query, i18next (French and English), Recharts, livekit-client already there; navigation by sections and roles
Telephonymissingno telephony tenants, extensions, trunks, numbers, routing, IVR, queues, agents, CDR, recordings or screens

Storage, databases and cache​

SubjectStateFinding
SeaweedFSexistingcatalogue service in single and distributed modes (masters, volumes, filer, S3 gateway, admin console), configurable replication
Storage in the Control PlaneexistingS3 storage profiles (SeaweedFS included), capability discovery, presigned URLs, WORM audit exports (eai.domains.storage)
Layout of telephony objectsmissingno bucket or prefix per tenant and category (recordings, voicemail, IVR prompts)
MinIOexcludedAGPL-3.0, refused by ADR-0101 and test_platform_no_agpl.py; SeaweedFS stays the only object store
PostgreSQLexistingstandalone and ha modes (Patroni 4.1.5 with etcd), TLS, pgvector, pg_basebackup backups, named instances
Redisexistingstandalone, replication, sentinel and cluster modes, TLS, ACL users; already bound to LiveKit in distributed mode

Security, secrets, identity and certificates​

SubjectStateFinding
Control Plane secretsexistingwrite only API, encrypted values (OpenBao or local AES-GCM), read on the server side only (read_secret)
Manager secretsexistingManager vault and synchronisation with OpenBao; secrets generated at installation, never shown
AuthenticationexistingKeycloak (OIDC) and local accounts for the portal; local accounts, LDAP, OIDC and second factor for the Manager
AuthorisationexistingControl Plane roles (eai.auth, completed by V161), OpenFGA relations (eai.domains.authz), OPA policies
CertificatesexistingManager authority, certificates installed by the agents (key 0640, copy for the containers), rotation, agent mTLS
Network egressexistingegress guard of the Control Plane (eai.security.egress): every host reached is declared
Telephony securitymissingno anti-fraud, CPS limit, destination restrictions or SIP anti-bruteforce

Observability​

SubjectStateFinding
Metrics and alertsexistingPrometheus and Alertmanager of the catalogue, targets discovered by the Manager
LogsexistingAlloy to OpenSearch, OpenSearch Dashboards
TracesexistingOpenTelemetry Collector and Jaeger
Grafana and LokiexcludedAGPL-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 metricsmissingno Asterisk or Kamailio metrics, no alert rules, no business call indicators

What is built​

  1. In the Manager catalogue: asterisk, kamailio, rtpengine (optional), livekit-sip, livekit-egress, livekit-ingress (optional) and livekit-agents, with their ports, health checks, backups, HA modes and metrics; livekit completed without changing its default behaviour.
  2. 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).
  3. In the portal: the Telephony section, the IVR Builder and the WebRTC softphone.
  4. The alert rules, the documentation, the licence matrix and the software bill of materials.