Document d'architecture · C4 + déploiement

Everythink Studio
Architecture globale du système

Un système d'exploitation IA no-code qui transforme une organisation — entreprise, gouvernement ou communauté — en un réseau géospatial vivant : des communautés et des salles sur la carte, des assistants IA qui répondent, vendent et mettent les gens en relation, sous votre propre marque, sur le web, iOS et Android. En production depuis 2016.

Rust 2026 · workspace de 17 crates Postgres + Timescale + pgvector Dragonfly (Redis) Next.js 16 · monorepo pnpm Moteur HAI · 13 types de questions
Version initiale · téléchargement progressif Ce document est la version initiale de l'architecture et ne contient pas l'architecture complète. L'incomplétude est attendue et voulue : l'architecture sera téléchargée progressivement depuis le template aap-human-agent — le package de patterns d'interaction humain-agent (escalade, délégation, agents mandataires, limites d'autorité). Les agents exécutent le téléchargement ; l'autorité reste à l'humain.

CONFIDENTIEL — Carlos Matias Baglieri 2026 · en production depuis 2016

Sommaire

Six sections, un seul système

De la vision produit à l'implémentation réelle : backend Rust, frontend Next.js, déploiement et feuille de route.

1 · Produit et vision

Topologie · moteur HAI · gouvernance

L'espace est le routeur ; 13 types de questions ; isolation, fédération, agentique, proactif.

2 · Backend

Rust 2026 · 17 crates · hexagonal

Domaine ZERO-I/O, ports & adaptateurs, 3 régimes d'authentification, un seul Postgres, temps réel.

3 · Frontend

Next.js 16 · FSD + MVVM

4 apps, 13 packages, façades SDK, RBAC can(), connexion unique, design system.

4 · Déploiement / CI

docker-compose · CI à 2 niveaux

7 services, TLS au niveau de l'ALB, déploiements préprod directs, gate d'intégrité sur main.

5 · Feuille de route

BYOK · ancrage · self-hosted · DAO

direction v2, explicitement non implémentée.

6 · Clôture

Bilan honnête

Ce qui est en production, ce qui est conçu, ce qui est projeté.

Vision · Topologie

L'espace est le routeur

Chaque personne possède sa propre organisation personnelle et souscrit à n organisations. Chaque organisation — entreprise · gouvernement · syndicat · communauté — contient n réseaux ; chaque réseau contient n communautés ; chaque communauté contient n salles. Chaque nœud a son propre multipolygone : l'inclusion s'applique vers l'intérieur (communautés fragmentées à l'intérieur du polygone du réseau) ou vers l'extérieur (communautés en dehors du polygone). La topologie est fractale au sens mathématique : chaque niveau est une copie auto-similaire du précédent — S = ⋃ fᵢ(S), l'attracteur de l'opérateur de Hutchinson (théorème du point fixe de Banach). Les réseaux interopèrent entre eux (fédération) : un réseau se connecte à un autre en ne partageant que ce qui est public. Quand une personne rejoint une organisation, elle accède à ses n communautés et n salles. Le travail qu'elle y accomplit est suivi dans l'organisation et refléchi dans son organisation personnelle : il génère une réputation par personne, se distille en problèmes résolus, et ceux-ci sont copiés dans son réseau personnel, qui les suit. À partir des réponses accumulées, HAI construit une couche de contexte par utilisateur.

Zoom : 100%
Topologie : réseau → communauté → salle → persona
organisation personnelle / organisationréseaucommunautésalle
Vision · Ontologie

Les quatre couches de la plateforme

Chaque couche supérieure compose les garanties des couches inférieures sur des interfaces typées. Produits (modules v1) : HAI, Matchmaking, Chat, Calendar, Market, Social. Au-dessus des 4 couches, 10 instanciations sectorielles.

Zoom : 100%
Ontologie : 4 couches + 10 instanciations sectorielles
Vision · Principes

Trois principes qui gouvernent l'architecture

Chaque principe est une garantie vérifiable, pas une déclaration d'intention. Ensemble, ils établissent la règle de composition (de bout en bout), la règle de multiplication sectorielle (héritage sans modification) et la règle d'honnêteté (implémenté et mesuré = garantie).

Principe 1 · Composition des couchesRègle de composition de bout en bout. Si chaque couche L₁…L₄ établit sa garantie et que chaque interface inter-couches ne fait passer que des valeurs typées et validées (Zod à la frontière, mapper DTO → domaine), alors la propriété de bout en bout tient : recueillir de façon fiable (couche 3, P-A3) → exécuter dans une enveloppe bornée et terminale (couche 3, P-A4) → router vers la bonne destination (couche 1, topologie) → livrer exactement une fois (couche 2, P-A7) → dans une autorité bornée, auditable et isolée par tenant (couche 4, P-A6/P-A8).
Principe 2 · Instanciation sectorielleRègle de multiplication sans friction. Tout déploiement sectoriel (P-C1…P-C10) qui instancie les couches 1–4 sans les modifier hérite de leurs garanties et n'ajoute que des propriétés propres au secteur. La plateforme est un seul produit ; les secteurs sont des vues sur le même cœur. Il n'existe pas de fork par secteur — il existe une composition typée sur des interfaces stables.
Principe 3 · Bilan honnêteRègle d'honnêteté. Les garanties déclarées correspondent exactement aux propriétés impliquées par les mécanismes implémentés et mesurés. Les capacités conçues/projetées ne comptent pas comme une garantie tant que leur mécanisme n'est pas implémenté. Invariant : pas de métrique, pas de garantie. S'il existe une garantie, il existe un dashboard.
Couche 1 · Topologie & moteur

Moteur HAI — 13 types de questions

En production depuis 2016. Une prémisse volontairement étroite et composable : une interaction est un workflow de questions typées, et la plateforme est une topologie géolocalisée pour que chaque réponse atterrisse dans un contexte bien défini. En v2, le moteur s'exécute sur deux couches d'inférence : le réseau appris (déterministe, sans LLM) et l'inférence A2A, qui complète les nœuds qui n'existent pas et effondre le réseau.

Zoom : 100%
Moteur HAI : questions typées → routage → contexte
Produit · modules v1 → v2

Calendar — vendre des services et gérer l'agenda

Un vendeur propose des services (type_event) avec prix, catégorie et disponibilité ; les clients réservent (event) avec participant, date et lieu. En mode white-label, tout vendeur du même réseau est visible et commandable — « d'autres vendent dans mon réseau ». Le paiement crée un marchand dans le réseau et retrouve les produits par product_key.

Zoom : 100%
Calendar : vendre des services dans le réseau
vendeur · organisation personnelleréseau = frontière de visibilitépaiements · marchand dans le réseau
Produit · modules v1 → v2

Market — vendre des produits et laisser les autres vendre dans mon réseau

Le vendeur liste des produits (market_product) avec marchand, fournisseur et prix, et leur attache des offres/coupons. Le client construit le panier (market_item) et paie (merchant_tx) avec la clé du réseau estampillée dans json_data. Litiges et évaluations des deux côtés. Les marchands sont liés au réseau par merchant.network — « d'autres vendent dans mon réseau ».

Zoom : 100%
Market : vendre des produits dans le réseau
vendeur · marchandclé du réseau dans la txlitiges + évaluations
Produit · modules v1 → v2

HAI + matchmaking + chat — le réseau personnel de chaque utilisateur

HAI remplit le réseau personnel de chaque utilisateur en comprenant ce qu'il cherche : les réseaux sont peuplés automatiquement depuis le site web ou la doc de l'entreprise/gouvernement/communauté/syndicat, les flux de questions sont générés, tout comme les liens croisés entre matchings de salles différentes (même communauté ou non). Le matchmaking automatise des processus : une intention utilisateur → un bon de commande dans le canal de dispatch de la communauté, géolocalisé dans la salle cible. Chat en temps réel sur socket + FCM. Les flux sont transverses (ils traversent les salles) et s'exécutent sur les deux couches d'inférence : le réseau appris + A2A, qui complète et effondre.

Zoom : 100%
HAI + matchmaking + chat : le réseau personnel
HAI · 13 types de questionssalles · cuisine · dispatchchat en temps réelinter-communautés
Produit · modules v1 → v2

Social — promotions du réseau et interaction utilisateur

Le réseau lance des promotions dans son espace et les utilisateurs interagissent dans un module social : news/stories avec likes et commentaires, catégories définies par l'admin. Le feed social vit dans la topologie — le réseau publie, la communauté fragmente, la salle reçoit.

Zoom : 100%
Social : promotions et interaction
réseau · publie et fait la promotionnews/stories · like · commentaire
Produit · modules v1 → v2

Deux couches d'inférence — le réseau neuronal qui s'effondre

Tous les modules vivent dans les salles d'un réseau et sont transverses : un dataflow (HAI) depuis une salle d'invités avec du pré-vente se connecte à celui d'un client avec du support technique. Contrairement à v1 (graphes statiques), ici il y a des réseaux de neurones : si le nœud suivant n'existe pas, A2A détermine les étapes suivantes, les enregistre, et le réseau s'effondre. Le périmètre est fini — ce qu'un utilisateur demande dans un réseau est enregistré pour tous — et la consommation LLM via A2A diminue avec le temps, elle n'augmente jamais.

Zoom : 100%
Deux couches d'inférence : réseau appris + A2A, effondrement fini
salles · dataflows transversescouche 1 · réseau appris · sans LLMcouche 2 · A2A · uniquement les trouspérimètre fini · la consommation diminue
Couche 2 · Plateforme

Isolation multi-tenant vérifiable

Entreprises, gouvernements, ONG et communautés partagent un seul substrat IA depuis 2016, en gardant ce qui est privé provablement privé. Médiation complète par le Reference Monitor ; le seul canal autorisé = les périmètres publics.

Zoom : 100%
Isolation multi-tenant
privé, ne franchit jamaispublic, le seul canal
Couche 2 · Plateforme

Réseaux fédérés et matchmaking stable

Les réseaux se fédèrent via leurs projections publiques. Le matchmaking opère uniquement sur les périmètres publics dans un rayon de proximité ; acceptation différée → appariement stable.

Zoom : 100%
Fédération : projections publiques entre réseaux
Couche 3 · Interaction

Recueil typé — apprendre en quelques questions

Le système pose la question, l'utilisateur répond, et la réponse devient du contexte. Le recueil est typé (le moteur calcule sans surprises), fidèle et efficace. Il s'exécute sur la couche 1 (réseau appris, déterministe) ; quand un nœud n'existe pas, la couche 2 (A2A) détermine les étapes, les persiste, et le réseau s'effondre — apprentissage en quelques questions, et chaque nouvelle question est enregistrée pour tous.

Zoom : 100%
Recueil typé
Couche 3 · Interaction

Workflows agentiques — l'enveloppe

Certains nœuds exigent du travail ouvert : un agent LLM qui entrelace raisonnement et appels d'outils (style ReAct) jusqu'à obtenir une réponse du bon type. C'est la couche d'inférence 2 (A2A) : quand le nœud suivant n'existe pas dans le réseau appris, l'agent détermine les étapes suivantes, les persiste, et le réseau s'effondre — la consommation LLM diminue avec le temps, elle n'augmente jamais. L'enveloppe borne les trois modes de défaillance.

Zoom : 100%
Nœud agentique : raisonnement + outils bornés

Non garanti : la correction sémantique de la valeur. Un agent peut terminer, rester dans le périmètre et émettre une réponse bien typée mais fausse — cela est traité par l'évaluation et une validation humaine, pas par l'enveloppe.

Couche 3 · Interaction

Assistance proactive — la valeur de l'information

L'inverse d'un chatbot réactif : il initie au lieu d'attendre. Le difficile est la retenue — ne parler que lorsque la valeur nette attendue du passage à l'action dépasse celle du silence.

Zoom : 100%
Boucle proactive : observer → évaluer → agir
Couche 4 · Gouvernance

Autorité bornée et provenance

Un agent capable d'agir — dépenser de l'argent, contacter des tiers, déplacer des données — doit être borné par ce à quoi l'utilisateur a consenti, n'utiliser l'information que pour la finalité donnée, et laisser une trace qui permette d'expliquer et d'annuler.

Zoom : 100%
Pile de gouvernance : consentement → capacité → journal
Couche 4 · Gouvernance

Réseaux autonomes au service des réseaux humains

Délégation bornée, allocation contract-net (annonce → enchère → attribution), et la limite honnête de la coordination : la vivacité uniquement sous synchronie partielle.

Zoom : 100%
Réseau autonome au service du réseau humain
Transversal

Sécurité et protocole de preuve

Sécurité

Principes de Saltzer–Schroeder

Médiation complète, économie de mécanisme, défauts sûrs (fail-safe). La dette de sécurité conditionne plusieurs garanties de la plateforme.

Preuve

Déclaration soutenue par le déploiement

Une déclaration C est soutenue en déploiement ssi (i) bien typée, (ii) chaque prémisse a une preuve validée issue du pipeline de production, (iii) les prémisses satisfont la conclusion. Sans cela, C est une déclaration de conception.

Zoom : 100%
Ontologie de sécurité
Ontologie de sécurité : périmètres, confiance, menaces.
Zoom : 100%
Pipeline de preuves
Pipeline : instrumenter → stocker → valider → auditer.
Secteurs

Dix instanciations sectorielles

Chaque déploiement sectoriel instancie les couches 1–4 sans les modifier et hérite de leurs garanties.

Secteur 1

Entreprise multi-sites

Livraison exactement une fois, loi de Little, non-interférence entre sites.

Secteur 2

Gouvernement

Égalité de traitement, auditabilité, impossibilité de l'équité.

Secteur 3

Humanitaire

Triage leximin, transport optimal, confidentialité des personnes vulnérables.

Secteur 4

Communautés

Coopération soutenue, réputation, principes d'Ostrom.

Secteur 5

Santé

Topologie des soins avec confidentialité clinique.

Secteur 6

Éducation

Parcours d'apprentissage sur la topologie.

Secteur 7

Finance

Pipeline de sélection et courbe de puissance.

Secteur 8

Logistique

Mouvement des marchandises, équité des prix.

Secteur 9

Défensif

Périmètre civil-défensif explicite.

Secteur 10

Crédit communautaire

Réputation et gouvernance sur les biens communs.

Bilan honnête

Production / conception / projeté

État projeté
Carte de l'état projeté — auto-évaluation, pas un audit externe.
En production depuis 2016

Topologie · moteur · plateforme · recueil · gouvernance

Les mécanismes cœur sont déployés depuis 2016.

Conception 2026

Agentique · proactif · fédération · autonome

Capacités largement en conception 2026 ; autonome est en conception sur tout son périmètre.

Projeté

Toute évaluation quantitative

Chaque chiffre quantitatif est projeté, dans l'attente de mesures sur la plateforme réelle.

Backend · Rust 2026

17 crates, hexagonal, un seul Postgres

Racine de composition (api) → cas d'usage ×10 → adaptateurs (ledger, a2a, courier) → domaine (core, ZERO I/O). Un seul Postgres (Timescale pg17 + pgvector) pour tout : ledger, événements, embeddings, geo-cache jobs/whisper. SQL vérifié à la compilation (cache offline .sqlx/, 107 requêtes).

Zoom : 100%
Backend : api → use-cases → adaptateurs → core → Postgres
api · racine de compositionuse-cases ×10adaptateurscore · ZERO I/OPostgres · Timescale pg17 + pgvector.sqlx/ · 107 requêtes offline
Backend · Hexagonal

Ports & adaptateurs — le domaine au centre

Le domaine (everythink-core) ne connaît aucun I/O. Les adaptateurs implémentent les ports pour la DB, l'email, A2A. Les cas d'usage orchestrent. La racine de composition (everythink-api) câble tout.

Zoom : 100%
Hexagonal : le domaine au centre
domaine (ZERO I/O)adaptateurs (sqlx, Brevo, A2A)cas d'usage
Backend · 17 crates

Pourquoi tant de crates — un rôle explicite par crate

Chaque crate a un rôle : racine de composition (api), client (sdk, cli), cas d'usage ×10, adaptateur d'infra (a2a, courier), ports + persistance (ledger), domaine (core).

Zoom : 100%
Taxonomie des rôles des crates
Backend · Workspace

17 crates convergent vers core

everythink-api est le hub ; tout dépend de core (ZERO I/O). Le SDK vit à l'intérieur du workspace (backend/crates/everythink-sdk) car il est couplé à core.

Zoom : 100%
Graphe de dépendances : 17 crates → core

Note : libs/ contient les SDK dans d'autres langages (références vendored, code externe).

Backend · Flux de requête

De l'authentification à la persistance — une requête complète

Client → api (auth + rate-limit + validation) → loom (exécution) → ledger (résout le profil via le trait de repo) → sisters (fan-out) → oracle (merge → Ensemble normalisé) → ledger (persistance) → 200 OK.

Zoom : 100%
Cycle de vie d'une requête
Backend · Cas d'usage

Six cas d'usage : orchestration, authentification et données

loom — orchestration : persiste via le port LoomStore / l'adaptateur LoomPersistence. ingest — pipeline de signaux : traite les signaux entrants. scry — sentiment : le port de référence SentimentReader / PgSentimentReader. eval — harnais de régression : évaluation continue. warden — auth : JWT access/refresh, Google OAuth, binding IP. whisper — webhooks signés HMAC avec livraison exactement une fois.

Zoom : 100%
Cas d'usage : loom · ingest · scry · eval · warden · whisper
Backend · Sécurité

Chaîne de middleware — trace → timeout → CORS → routage

Requête entrante → Trace + request_id → Timeout 60s → 408 → CORS + compression → sous-arbre de routes à 5 branches.

Zoom : 100%
Chaîne de middleware
Backend · Sécurité

Trois régimes d'authentification coexistent sur un seul routeur

Public (probes/register/login/refresh) · Eye-Key (HMAC, rate limit glissant de 60s) · user-JWT (warden, Console) · Atlas WS (auto-authentifié, plafonds par utilisateur).

Zoom : 100%
Trois régimes d'authentification
Backend · Sécurité

RBAC sans héritage — une seule fonction, une matrice explicite

can(role, action) en const fn : Owner → true ; Profile Read/Write Self → true ; match explicite sur (role, action) ; le reste → Owner uniquement. AUTHORIZE dans le handler → 403 en cas de refus.

Zoom : 100%
RBAC can(role, action)
Backend · Données

Un seul datastore pour tout

timescale/timescaledb-ha:pg17 + pgvector (vector(1024) + HNSW). Un seul pool. Six domaines de données : Ledger, Simulations, Users, Embeddings, geo_signals, Jobs. Health check : pg_isready dans docker-compose (service_healthy).

Zoom : 100%
Un seul Postgres
Backend · Données

Persistance via un port, jamais via un concret

TRAIT de repository · Pg*Repository (tout le SQL vit ici) · MockRepository (tests sans DB) · AppState : Arc<dyn Repository> · les cas d'usage appellent le TRAIT.

Zoom : 100%
Contrat trait ↔ adaptateur
Backend · Données

SQL vérifié à la compilation, migrations réversibles

Éditer .up.sql + .down.sql (appariés) → just sqlx-prepare → committer .sqlx/*.json (107 requêtes) → build/CI avec SQLX_OFFLINE=true et sans DB vivante.

Zoom : 100%
Cache offline sqlx
Backend · Spécificités de déploiement

Health checks + SQLX offline — déploiements précis

docker-compose : postgres (pg_isready, 10s/5s/10) → dragonfly (redis-cli ping, 10s/3s/10) → api (service_healthy). app/admin : health check désactivé (distroless/static). CI : SQLX_OFFLINE=true avec le cache .sqlx/ committé.

Zoom : 100%
Déploiement backend : chaîne de health checks + workflow SQLX
postgres · pg_isready · intervalle 10s / timeout 5s / 10 tentativesdragonfly · redis-cli ping · intervalle 10s / timeout 3s / 10 tentativesapi · depends_on service_healthySQLX_OFFLINE=true · .sqlx/ 107 requêtes
Backend · Temps réel

SSE (Tide) + WebSocket (GeoHub) — fan-out par tuile

TideBroker : SSE avec sujets composites, broadcast 256, keep-alive 15s, reconnexion Last-Event-ID. GeoHub : WS avec DashMap[Tile → broadcast 64], pilotage du viewport, gzip opt-in.

Zoom : 100%
Temps réel : SSE + WS par tuile
Backend · Cas d'usage

Six cas d'usage d'orchestration et de données

loom

Orchestration

Persiste via le port LoomStore / l'adaptateur LoomPersistence.

ingest

Pipeline de signaux

Traite les signaux entrants vers le système.

scry

Sentiment

Le port de référence SentimentReader / PgSentimentReader.

eval

Harnais de régression

Évaluation continue de la qualité.

warden

Auth utilisateur

JWT access/refresh, Google OAuth, binding IP.

whisper

Webhooks HMAC

Livraison durable, exactement une fois.

Backend · Cas d'usage

everythink-warden — authentification utilisateur

warden

JWT access/refresh

Hachage de mots de passe (bcrypt), JWT access/refresh rotatifs, Google OAuth, sessions avec binding IP pour la détection d'anomalies.

/api/v1/auth/*

register · login · refresh · me · google · sessions

La frontière user-JWT pour Console + Atlas WS. Le token est écrit dans localStorage('everythink:auth') après une connexion unique à /auth.

Zoom : 100%
Warden : flux d'authentification
Backend · Cas d'usage

everythink-whisper — webhooks signés et livraison durable

whisper

Webhooks signés HMAC

Worker de livraison avec le port WhisperStore / l'adaptateur PgWhisperStore. Signature HMAC pour la vérification du payload côté récepteur.

jobs

File durable dans Postgres

Nouvelles tentatives exponentielles, sémantique exactement une fois, dead-letter queue pour les échecs persistants.

Zoom : 100%
Whisper : flux de livraison des webhooks
Backend · Adaptateurs

A2A (protocole) et Courier (email)

everythink-a2a

Protocole Google A2A

JSON-RPC sur HTTP avec une enveloppe de tâche d'agent, polling de statut et récupération du résultat. Permet à une Sister de sortir du process sans changer les appelants.

everythink-courier

Email transactionnel

Adaptateur Brevo ou no-op de logging. Rendu de templates + suivi de livraison pour les notifications système.

Zoom : 100%
Adaptateurs : A2A + Courier
Backend · Clients

everythink-cli et everythink-sdk

everythink-cli

Outil d'exploitation

new-key bootstrap-mint des Eye Keys : génère une paire Ed25519 locale, fingerprint → Postgres, plaintext affiché une seule fois en mémoire, HMAC pour l'auth.

everythink-sdk

SDK Rust in-workspace

backend/crates/everythink-sdk : couplé à everythink-core, ne dépend que de core (ZERO I/O), pour les consommateurs du domaine.

Zoom : 100%
Clients : CLI + SDK
Backend · Invariants

Six invariants jamais violés

1

Probabilités normalisées

En exactement un endroit : everythink-oracle::ensemble. sum(prob) ≈ 1.0, scénarios triés par ordre décroissant, entropie en nats.

2

Le plaintext de l'Eye Key ne touche jamais le disque

Seuls le HMAC + le fingerprint vont dans Postgres. Le plaintext est affiché une fois, en mémoire.

3

Les Sisters n'écrivent jamais dans Postgres

Elles retournent SisterOutput ; le Loom persiste. Une séparation nette entre génération et stockage.

4

Migrations réversibles

Chaque .up.sql a son .down.sql. just migrate-add NAME crée les deux.

5

AppState repositories Arc<dyn Trait>

Les tests utilisent des mocks. Dépendez du trait, jamais de l'adaptateur concret.

6

Persistance via un port

Jamais un Pg* concret hors de son adaptateur. Ports possédés par la slice pour les tables privées.

Zoom : 100%
Six invariants
Frontend · Next.js 16

4 apps, 13 packages, une seule identité

web (:3000) · app (:3001) · admin (:3002) · mobile (Expo). Packages : types, sdk-core + façades, domain, ui, auth, api-client, telemetry, config.

Zoom : 100%
Frontend : 4 apps + 13 packages
apps · Next.js 16 + Expotypes · domain · configsdk-core + façadesui · auth · api-client · telemetry
Frontend · C4 niveau 1

Quatre surfaces, un backend, trois acteurs

Acteurs : utilisateur final (invité → authentifié) · développeur (Eye-Key) · admin/opérateur (staff). Surfaces : web/app/admin/mobile. API backend (REST + SSE sous /api/v1).

Zoom : 100%
Contexte C4
Frontend · C4 niveau 2

Conteneurs — le monorepo complet

4 apps + couche SDK (6 façades) + services (4) + design system + tooling + types (feuille). Utilisez le zoom pour explorer.

Zoom : 100%
Conteneurs C4 : monorepo complet
Frontend · Apps

web, app, admin, mobile — une par audience

Zoom : 100%
Les 4 apps
Frontend · SDK

Six façades, un cœur, zéro endpoint dans le cœur

sdk-core (HttpClient, consumeSSE, TokenProvider) · sdk-guest · sdk-auth · sdk-atlas · sdk-eye · sdk-admin.

Zoom : 100%
Couche SDK : façades à périmètre de confiance
Frontend · Packages

Services applicatifs, UI et build

domain (mappers) · telemetry (outbox) · api-client (legacy) · auth (NextAuth v5 + RBAC) · ui (kit + tokens) · config (presets eslint) · types (Zod, feuille).

Zoom : 100%
Services + design + tooling
Frontend · SDK

sdk-core sait le COMMENT, jamais le QUOI

Les endpoints vivent UNIQUEMENT dans les façades ; sdk-core valide chaque réponse avec Zod contre @everythink/types ; un arbre SdkError avec ContractViolation en cas de dérive.

Zoom : 100%
Façades SDK : endpoints uniquement dans les façades
Frontend · FSD + MVVM

Feature-Sliced Design + MVVM — les imports descendent

Screen (View) → hook view-model → feature.repository.ts (LA seule porte vers le SDK). Frontière ESLint no-restricted-imports (INV-1). Couches FSD : shared → entities → features → widgets → app.

Zoom : 100%
Frontière repository FSD + MVVM
Frontend · Identité

Une connexion, une origine, quatre surfaces

apps/web /auth (une seule origine) → cookie httpOnly 'everythink_at' → token en mémoire + seed localStorage → EverythinkAuthGuard + resolveMe (GET /api/v1/auth/me) → gate basée sur le rôle.

Zoom : 100%
Connexion partagée
Frontend · Identité

can(role, action) — matrice explicite, sans héritage

3 couches : (1) auth.ts allowedRoles par app → (2) middleware → (3) can() dans l'UI + les server actions. Reflète everythink_core::rbac du backend.

Zoom : 100%
RBAC frontend
Frontend · UI

Une seule stylesheet, tokens sémantiques, Tailwind v4

Une source unique de vérité pour le design : tokens CSS dans :root, mapping sémantique via @theme (Tailwind v4), et NativeWind pour le mobile avec des tokens miroirs. Les apps consomment des composants sémantiques (bg-accent, text-foreground, font-display/mono), jamais de hex bruts. Palette cosmic-purple : --gold: #d9ab5c, --violet: #9d7df5, --emerald: #10B981.

Zoom : 100%
Architecture UI/theme : tokens → Tailwind → composants
:root · CSS custom properties@theme · Tailwind v4 sémantique@everythink/ui · kit de composantsMobile · NativeWind miroir
Frontend · Types

Zod à la frontière réseau — un contrat unique

Les types wire sont définis une seule fois dans @everythink/types avec Zod. Le SDK valide chaque réponse du backend (z.parse(response)) ; un payload invalide lève ApiError, jamais un crash. Les composants ne voient jamais le JSON brut : *.repository.ts parse, @everythink/domain mappe DTO → modèle, et le view-model expose un état typé à la View.

Zoom : 100%
Frontière de validation Zod : API → SDK → repository → domaine → view-model
API backend · JSONsdk-core · valide avec Zod*.repository.ts · la seule frontièreApiError · typé, jamais un crash
Frontend · Mobile

apps/mobile — Expo, expo-router, NativeWind

React Native avec expo-router (routage par fichiers) et NativeWind (Tailwind pour RN). Le système de thème reflète les tokens du design system web (tailwind.config.js + src/theme/index.ts). Il consomme sdk-guest, sdk-auth, sdk-atlas, domain et telemetry. Exclu de la CI web : --filter=!@everythink/mobile.

Zoom : 100%
Structure de l'app mobile : Expo + NativeWind + thème
expo-router · routage par fichiersNativeWind · Tailwind RNsrc/theme · tokens miroirsCI · exclue du turbo web
Frontend · Règles

Quatre règles appliquées mécaniquement

Des règles vérifiables par ESLint + TypeScript, pas des conventions : (1) INV-1 : seul *.repository.ts importe un SDK (no-restricted-imports) ; (2) couches FSD : les imports descendent (shared → entities → features → widgets → app), le cross-feature passe uniquement par le barrel public ; (3) connexion partagée : web + app partagent localStorage('everythink:auth') + resolveMe() ; (4) RBAC 3 couches : auth.ts allowedRoles → middleware → can(role, action) dans l'UI + les server actions.

Zoom : 100%
Couches FSD + INV-1 + connexion + RBAC
INV-1 · seul repository.ts importe un SDKFSD · imports vers le BASConnexion · localStorage + resolveMeRBAC · 3 couches, sans héritage
Déploiement · docker-compose.prod.yml

7 services, TLS à l'ALB, secrets dans .env

ALB → nginx :80 → api/web/app/admin + postgres + dragonfly. Un seul Postgres pour tout (TimescaleDB pg17 + pgvector). Dragonfly pour le cache, les jobs et le fan-out SSE.

TLS à l'ALB AWS déploiement direct préprod CI/CD à 2 niveaux
api · migrations au démarrageweb · Next.js standalonepostgres · pg17 + pgvectorapp/admin · static distroless
Déploiement · Stack

docker-compose.prod.yml — la stack complète

ALB (TLS) → nginx :80 → api (:18081, migrations au démarrage) · web (Next standalone) · app/admin (static distroless) · postgres (timescale/timescaledb-ha:pg17 + pgvector) · dragonfly (compatible Redis). 7 services : postgres · dragonfly · api · web · app · admin · nginx.

Zoom : 100%
Stack de production · 7 services
postgres · timescaledb-ha:pg17 + pgvectordragonfly · compatible Redisapi · migrations au démarrageweb · Next.js standaloneapp/admin · static distroless
Déploiement · Réseau

nginx comme point d'entrée unique

nginx :80 est le seul point d'entrée interne. Il route /api/v1/* → api:18081, / → web:3000, /app/* → static, /admin/* → static. web parle à api via EVERYTHINK_API_INTERNAL_URL (http://api:18081). api dépend de postgres et dragonfly avec condition : service_healthy.

Zoom : 100%
Diagramme de routage nginx
nginx · point d'entrée uniqueweb → api · INTERNAL_URLhealth checks · service_healthy
Déploiement · Secrets

backend/.env — le seul endroit pour les secrets

docker-compose.prod.yml monte backend/.env via env_file sur les services api et web. api détient tous les secrets (JWT_SECRET, EYE_KEY_HMAC_SECRET, GOOGLE_CLIENT_ID, BREVO_API_KEY). web ne reçoit que les variables NEXT_PUBLIC_* — il ne détient jamais BREVO_API_KEY. app/admin sont static distroless sans secrets dans le build.

Zoom : 100%
Diagramme de la frontière des secrets
api · tous les secretsweb · NEXT_PUBLIC_* uniquementrègle · web ne détient PAS Brevo
Déploiement · Flux

Préprod directe vs la gate CI/CD

Deux chemins de déploiement : la préprod se déploie directement depuis l'arbre de travail (sans passer par main) ; la prod exige un merge vers main et la gate d'intégrité. La règle est critique : n'utilisez PAS le workflow deploy pour la préprod, car il tire le :latest de main et écrase le déploiement direct.

Zoom : 100%
Flux de déploiement préprod vs prod
préprod · arbre de travail → scriptprod · main → :latest → workflowrègle · AUCUN workflow deploy pour la préprod
CI/CD · GitHub Actions

affected sur les PR, intégrité sur main

Un pipeline à 2 niveaux : le niveau PR n'exécute que ce qui est affecté (backend : ci-affected-crates.sh ; frontend : turbo --affected), le niveau main exécute l'intégrité complète (backend + frontend/mobile complets + E2E + sécurité). main reste vert et déployable.

Zoom : 100%
Pipeline CI/CD à 2 niveaux
just ci · fmt · lint · check · testpnpm ci · turbo lint · typecheck · buildintégrité main · complet + E2E + sécurité
Feuille de route · 🔵 Non implémenté

Nœuds self-hosted fédérés · BYOK · DAO par réseau

Direction de la feuille de route pour v2. Rien de ce qui suit n'est une capacité existante. Flux : l'opérateur génère une paire Ed25519 locale → seul le fingerprint va au contrôleur (BYOK) → nœud self-hosted → ancrage du ledger → fédération sur les projections publiques uniquement → DAO du réseau.

Zoom : 100%
Feuille de route v2 : self-hosted · BYOK · DAO
Feuille de route · Phases

Cinq phases vers v2

PhaseÉlémentDépend deLivrable
1BYOKcrate everythink-byok · table node_keys · identité Ed25519 + webhooks · le contrôleur ne détient que les fingerprints
2Ancrage du ledgerPhase 1crate everythink-anchor · table anchor_commitments · job de notarisation · chaîne = décision de l'opérateur
3Nœuds self-hosted fédérésPhases 1–2image Docker du nœud (postgres, dragonfly, api, web, app, admin, nginx) · protocole de fédération
4DAO par réseauPhase 2crate everythink-dao · network_proposals/network_votes/provenance_log append-only
5Wallet + gouvernancecrate everythink-wallet · wallets/network_memberships · personas salarié/entrepreneur/indépendant

Chaque phase : une migration .up.sql + .down.sql, un rafraîchissement du cache offline .sqlx, TDD (80%+), just ci vert. La structure des types d'organisation est implémentée (OrgKind à 5 valeurs, CHECK en DB, onboarding de 7 structures juridiques).

Feuille de route · Ancrage

Architecture de référence de la chaîne candidate

Architecture de référence pour la notarisation des engagements de hash du ledger Postgres : Solana v0.8.13 (Yakovenko) — PoH comme horloge cryptographique, consensus PoS avec bonds/slashing, PoRep pour le stockage. Le choix de la chaîne est une décision explicite de l'opérateur ; ceci est une référence, pas une implémentation.

Zoom : 100%
Moteurs de la chaîne candidate
PoH · pas de temps vérifiablePoS · bonds · slashing · super-majorité ⅔PoRep · streaming · stockageLeader → Verifiers · confirmations = votes~710k TPS · finalité sub-secondeCAP : cohérence plutôt que disponibilité
Clôture

Everythink Studio — architecture complète

De la vision à l'implémentation : la topologie et le moteur HAI (en production depuis 2016), un backend Rust de 17 crates hexagonaux, un frontend Next.js 16 en FSD/MVVM, Postgres + pgvector, une CI/CD à 2 niveaux, le déploiement. Note de périmètre : le moteur de prévision (sisters/oracle/loom) est un autre produit du même auteur, présent dans le workspace.

Rust 2026 · 17 crates Postgres + pgvector · sqlx Next.js 16 · pnpm · FSD 3 régimes d'auth · RBAC can() World Monitor · geo-signals CI/CD 2 niveaux · préprod directe
Version initiale · téléchargement progressif Ce document est la version initiale de l'architecture et ne contient pas l'architecture complète. L'incomplétude est attendue et voulue : l'architecture sera téléchargée progressivement depuis le template aap-human-agent — le package de patterns d'interaction humain-agent (escalade, délégation, agents mandataires, limites d'autorité). Les agents exécutent le téléchargement ; l'autorité reste à l'humain.

Everythink Studio · Carlos Matias Baglieri 2026 · docs/architecture.md · backend/README.md · frontend/README.md · COLLABORATION.md · cto.md

Everythink Studio · Architecture
1 / 64 ← →