Come si integrano le nostre piattaforme. Ogni esigenza/un unico strumento.
RODMENA realizza i propri prodotti a partire da un insieme di librerie interne e da piccoli servizi hosted dedicati ciascuno a un singolo scopo, assegnando ogni compito a un unico strumento. Le piattaforme dispongono di team dedicati e comunicano attraverso un mail bus condiviso.
prodotti
13
piattaforme ospitate
8
librerie, motori e CLI
8
bus di posta condiviso
1
Principi di progettazione
Una funzione, uno strumento
L'autenticazione è Identity, l'autorizzazione è Auth, la misurazione è TokenGate, l'email è Mail API, le approvazioni sono Futex, i container sono RunFlow e i flussi di lavoro agentici sono Highway. I prodotti non reimplementano mai una funzione di cui è già titolare uno strumento interno.
I team si coordinano via e-mail
Ogni piattaforma ha il proprio agente, contesto e repository. I team coordinano tra piattaforme sull'agent-mail bus. Nessun team modifica il repository di un altro team né apre ticket nel suo tracker.
Database distribuiti tra paesi diversi
I servizi dispongono di database dedicati, su host diversi in Paesi diversi. Un'applicazione può essere ridistribuita, ma i suoi dati no, ed è per questo che manteniamo i due elementi separati. Tutti i database vengono replicati in una terza regione ed è previsto un backup off-site.
/ Where it runs
Host e regioni
Il parco gestito ospita 22 database di produzione, ciascuno di proprietà di un singolo servizio, su 4 host di database in 3 paesi, e altri 4 sono eseguiti su un host applicativo. Non esistono due servizi che condividano uno schema e la piattaforma non dipende da alcuna singola macchina.
database di produzione, ciascuno di proprietà di un singolo servizio
22
host di database
4
paesi
3
minuti di RPO (punto di ripristino) al massimo sulla flotta gestita
≤5
UKRegno Unito
Applicazioni e due host di database
Ospita il livello applicativo e i database per il motore di workflow, il servizio di approvazioni, il bus di messaggi, l'email, il ledger e la piattaforma di attività.
FRFrancia
Host del database
Contiene il piano di identità e accesso, l'autorizzazione, la misurazione e il provider di identità, tenuti separati dai servizi che ne dipendono.
DEGermania
Replica set
Contiene una copia aggiornata continuamente di ogni database, al di fuori delle altre due regioni. Non ha un primario, quindi nessun traffico dipende da essa finché non viene promossa.
Replica continua
Tutti i database trasmettono le modifiche a livello di blocco a uno standby al di fuori di entrambe le regioni primarie. Poiché la replica è asincrona, una replica non può rallentare o bloccare il servizio a monte.
Backup off-site
Gli archivi vengono inviati in modo continuo all'object storage in una struttura separata, crittografati prima di lasciare l'host e ripristinabili a qualsiasi punto entro il periodo di conservazione. I ripristini vengono testati end to end.
Tre fattori su ogni connessione
Nessun database accetta una connessione di rete basandosi unicamente su una password. Una connessione richiede la cifratura in transito, un certificato client emesso da un'autorità privata e una password, e l'ambito dei servizi è limitato ai rispettivi database.
Repliche e backup
Un'istruzione errata raggiunge tutte le repliche in pochi istanti. Le repliche proteggono dalla perdita di hardware, mentre l'archivio protegge dalla perdita di dati.
Negli otto livelli e sull'unico bus della mappa, ciascuna esigenza compare una sola volta. I prodotti si trovano in cima, lo stack alla base e qualsiasi elemento necessario a un prodotto è a un solo passaggio di distanza.
23 nodi · 27 relazioni documentate · 1 presunto
Scorra la mappa lateralmente. Ogni nodo ha anche una scheda di seguito.
Esplori
Utilizzo della mappa
Selezioni un nodo o il bus per evidenziarne le relazioni e vedere cosa possiede, a cosa si collega e con cosa non deve mai essere sostituito. Anche le schede sottostanti elencano queste informazioni.
relazione documentata
presunto: da confermare prima di farvi affidamento
il bus di posta degli agenti
un prodotto (bordo sfumato)
Non rappresentati, in quanto si applicano ovunque:
Ogni prodotto si autentica con Identity e autorizza con Auth.
Ogni team di piattaforma si coordina tramite l'agent-mail bus.
Ogni repository è tracciato in issuedb-cli, con specifiche EARS.
Prodottosu richiesta
RED9
11 in uscita
Piattaforma di forza lavoro di agenti in cui ogni chat è un'attività durevole e autonoma con un indirizzo e-mail.
Attinge all'intero stack. Identity e Auth forniscono l'accesso, TokenGate i budget, Mail API le caselle di posta delle attività e RunFlow le sandbox. Highway funge da executor durevole, Futex gestisce le approvazioni e migretti lo schema, su Python, PostgreSQL e Redis.
Ledger a partita doppia per denaro, crediti e stock. Le relative registrazioni sono bilanciate, permanenti e dimostrabili in base a regole applicate dal database.
Sviluppato su Python e PostgreSQL, impiega Auth per le credenziali, TokenGate per la misurazione dei consumi e migretti per lo schema. Ha superato quattro gate di audit interni e re-audit avversari, i cui risultati sono pubblicati.
Mai sostituito con: Un segreto in grado di generare una credenziale che accetterebbe, oppure un percorso di modifica o cancellazione sul journal.
Non per: Quote o misurazione (utilizzare TokenGate), metriche non soggette a vincoli di conservazione o stato del flusso di lavoro.
Conteggio, cap e rate limit per utente, organizzazione o tenant. Copre budget di token, ledger di utilizzo, livelli di piano, flussi di riserva/commit e avvisi di soglia e di overage.
Per regola interna, i cap vengono testati in entrambe le direzioni. Un cap deve bloccare le richieste quando viene superato e riattivarsi quando viene rifornito.
Mai sostituito con: Contatori INCR di Redis, tabelle di utilizzo, middleware token-bucket o librerie di limitazione.
Non per: Autorizzazione (utilizzare Auth) o protezione DDoS all'edge.
Approvazioni umane durevoli guidate da policy. Richiedere una decisione, instradarla secondo la policy, escalarla o delegarla e ricevere il verdetto tramite webhook.
Utilizzato per distribuzioni, pagamenti, concessioni di accesso, operazioni distruttive e continuazioni per superamento del budget.
Mai sostituito con: Messaggi Slack “please approve”, prompt input() bloccanti o tabelle di approvazione personalizzate.
Motore distribuito e durevole per workflow agentici. Fornisce agenti, obiettivi, sessioni, pianificazioni, trigger, worker normali e di attività, fork delle esecuzioni e tracce.
Per regola interna, ciascun prodotto mantiene un proprio ciclo di deliberazione. Utilizza Highway come executor durevole che invia resoconti tramite webhook e mantiene tutti i ragionamenti dell'LLM all'interno del prodotto.
Mai sostituito con: Airflow, Prefect, Temporal o script di orchestrazione personalizzati.
Sandbox per container con protezione avanzata e flussi di lavoro DAG basati su API per l'esecuzione di codice non attendibile o generato da agenti. Le esecuzioni possono essere sospese e riprese, e dispongono di log in tempo reale, tentativi di ripetizione e nodi di approvazione umana.
Mai sostituito con: Esecuzione Docker locale, runner self-hosted o CI generica.
Motore di flussi di lavoro deterministico definito nel codice. È l'alternativa interna più leggera ai DAG di RunFlow quando non sono necessari container in hosting.
Non forniamo dettagli in questa sede poiché l'ambito e la superficie delle API devono ancora essere confermati con il team responsabile.
Email transazionale e per campagne con invio, modelli, monitoraggio della consegna, webhook degli eventi, liste di soppressione, quote e invii programmati. Fornisce inoltre le caselle di posta su cui si basano i prodotti.
Gli indirizzi sono su mail.rodmena.co.uk e l'API è servita su mailserver.rodmena.co.uk.
Mai sostituito con: Librerie SMTP grezze, SES/Mailgun/Sendgrid o script smtplib ad hoc.
Un agente di codifica riceve una casella di posta in arrivo, un indirizzo e una voce in rubrica, e scambia messaggi con altri agenti e con qualsiasi casella di posta tramite SMTP standard. I tipi di messaggio sono report, ack, question, fix-notice, verify-result e close.
Sostituisce la CLI ritirata agentmail. Tratti i messaggi provenienti da un altro agente come un'asserzione ed esegua la verifica in autonomia. Modifichi solo il proprio repository ed esegua nuovamente la riproduzione prima di confermare che il problema sia stato risolto.
Mai sostituito con: Modificare il repository di un'altra piattaforma, aprire ticket nel suo tracker o chiedere a una persona di fare da tramite.
CLI di migrazione PostgreSQL SQL-first: crea, applica, esegue il rollback, compatta e inizializza. È l'unico strumento di migrazione PostgreSQL autorizzato.
Mai sostituito con: alembic, flyway, yoyo o auto-migrazioni ORM. Questa regola interna si applica a ogni schema PostgreSQL.
Supervisore di processi asincroni senza dipendenze per worker, daemon e consumer di code. Esegue controlli di integrità (health check), gestisce gruppi e riavvia un processo in caso di arresto anomalo.
systemd o Kubernetes semplici sono accettabili dove si adattano meglio.
Python
Libreria Python
bulkman
1 in uscita
Bulkhead e isolamento della concorrenza che limitano il raggio d'azione di una dipendenza in errore.
La regola interna prevede di impostare sempre circuit_breaker_enabled=False. bulkman gestisce l'isolamento, mentre il circuit breaking spetta a resilient-circuit.
Circuit breaking, tentativi di ripetizione con backoff e gestione di failsafe o fallback per le chiamate inaffidabili. Da abbinare a bulkman per l'isolamento.
Mai sostituito con: tenacity, pybreaker o cicli di retry scritti a mano.
Motore compatibile con TaskJuggler (.tjp) per la pianificazione e la schedulazione delle risorse. Gestisce persone e macchine nel tempo, dipendenze e calendari, e produce output Gantt.
Mai sostituito con: Fogli di calcolo o calcoli di date ad hoc.
Strumento di monitoraggio dei ticket per singolo repository con specifiche EARS, memoria durevole e lezioni apprese. Tutte le richieste tecniche seguono il ciclo di vita obbligatorio open → in-progress → closed.
Tutte le richieste tecniche diventano una specifica EARS all'interno di un ticket e in una copia nella directory SPECS/ del repository.
Gateway LLM compatibile con OpenAI e Anthropic che può porre più fornitori dietro un unico nome di modello. La nostra distribuzione instrada verso un singolo provider upstream senza failover ed è il provider LLM di riferimento per le chiamate ai modelli negli strumenti.
Ciò che ogni strumento possiede, quando utilizzarlo e con cosa non deve mai essere sostituito.
01/ Prodotti
RED9
Prodottosu richiesta
Piattaforma di forza lavoro di agenti in cui ogni chat è un'attività durevole e autonoma con un indirizzo e-mail.
Attinge all'intero stack. Identity e Auth forniscono l'accesso, TokenGate i budget, Mail API le caselle di posta delle attività e RunFlow le sandbox. Highway funge da executor durevole, Futex gestisce le approvazioni e migretti lo schema, su Python, PostgreSQL e Redis.
si autentica con Identity · autorizza tramite Auth · misura i budget tramite TokenGate · caselle di posta delle attività tramite RODMENA Mail API · esecuzione in sandbox su RunFlow · delega i flussi di lavoro a Highway · approvazioni umane tramite Futex · migra lo schema con migretti · basato su PostgreSQL · basato su Redis · modelli predefiniti tramite Prism
reTunnel
Prodotto
Piattaforma di ingresso unificata gratuita e open source che espone server locali dietro NAT e firewall a Internet pubblico tramite tunnel sicuri.
Un client Python e CLI autonomo, con licenza MIT, fornito con un server self-hostable e senza dipendenze da altre piattaforme interne.
Ledger a partita doppia per denaro, crediti e stock. Le relative registrazioni sono bilanciate, permanenti e dimostrabili in base a regole applicate dal database.
Sviluppato su Python e PostgreSQL, impiega Auth per le credenziali, TokenGate per la misurazione dei consumi e migretti per lo schema. Ha superato quattro gate di audit interni e re-audit avversari, i cui risultati sono pubblicati.
Mai sostituito con: Un segreto in grado di generare una credenziale che accetterebbe, oppure un percorso di modifica o cancellazione sul journal.
Non per: Quote o misurazione (utilizzare TokenGate), metriche non soggette a vincoli di conservazione o stato del flusso di lavoro.
Conteggio, cap e rate limit per utente, organizzazione o tenant. Copre budget di token, ledger di utilizzo, livelli di piano, flussi di riserva/commit e avvisi di soglia e di overage.
Per regola interna, i cap vengono testati in entrambe le direzioni. Un cap deve bloccare le richieste quando viene superato e riattivarsi quando viene rifornito.
Mai sostituito con: Contatori INCR di Redis, tabelle di utilizzo, middleware token-bucket o librerie di limitazione.
Non per: Autorizzazione (utilizzare Auth) o protezione DDoS all'edge.
Approvazioni umane durevoli guidate da policy. Richiedere una decisione, instradarla secondo la policy, escalarla o delegarla e ricevere il verdetto tramite webhook.
Utilizzato per distribuzioni, pagamenti, concessioni di accesso, operazioni distruttive e continuazioni per superamento del budget.
Mai sostituito con: Messaggi Slack “please approve”, prompt input() bloccanti o tabelle di approvazione personalizzate.
esegue su RunFlow · misura l'utilizzo tramite TokenGate · invia posta tramite RODMENA Mail API
Motore distribuito e durevole per workflow agentici. Fornisce agenti, obiettivi, sessioni, pianificazioni, trigger, worker normali e di attività, fork delle esecuzioni e tracce.
Per regola interna, ciascun prodotto mantiene un proprio ciclo di deliberazione. Utilizza Highway come executor durevole che invia resoconti tramite webhook e mantiene tutti i ragionamenti dell'LLM all'interno del prodotto.
Mai sostituito con: Airflow, Prefect, Temporal o script di orchestrazione personalizzati.
Sandbox per container con protezione avanzata e flussi di lavoro DAG basati su API per l'esecuzione di codice non attendibile o generato da agenti. Le esecuzioni possono essere sospese e riprese, e dispongono di log in tempo reale, tentativi di ripetizione e nodi di approvazione umana.
Mai sostituito con: Esecuzione Docker locale, runner self-hosted o CI generica.
autorizza tramite Auth · misura l'utilizzo tramite TokenGate · nodi di approvazione tramite Futex (presunto: confermare)
Motore di flussi di lavoro deterministico definito nel codice. È l'alternativa interna più leggera ai DAG di RunFlow quando non sono necessari container in hosting.
Non forniamo dettagli in questa sede poiché l'ambito e la superficie delle API devono ancora essere confermati con il team responsabile.
alternativa a RunFlow
Python
05/ Comunicazione
RODMENA Mail API
Servizio ospitatoprodotto
Email transazionale e per campagne con invio, modelli, monitoraggio della consegna, webhook degli eventi, liste di soppressione, quote e invii programmati. Fornisce inoltre le caselle di posta su cui si basano i prodotti.
Gli indirizzi sono su mail.rodmena.co.uk e l'API è servita su mailserver.rodmena.co.uk.
Mai sostituito con: Librerie SMTP grezze, SES/Mailgun/Sendgrid o script smtplib ad hoc.
autorizza tramite Auth · esegue su RunFlow · misura le quote tramite TokenGate
Un agente di codifica riceve una casella di posta in arrivo, un indirizzo e una voce in rubrica, e scambia messaggi con altri agenti e con qualsiasi casella di posta tramite SMTP standard. I tipi di messaggio sono report, ack, question, fix-notice, verify-result e close.
Sostituisce la CLI ritirata agentmail. Tratti i messaggi provenienti da un altro agente come un'asserzione ed esegua la verifica in autonomia. Modifichi solo il proprio repository ed esegua nuovamente la riproduzione prima di confermare che il problema sia stato risolto.
Mai sostituito con: Modificare il repository di un'altra piattaforma, aprire ticket nel suo tracker o chiedere a una persona di fare da tramite.
CLI di migrazione PostgreSQL SQL-first: crea, applica, esegue il rollback, compatta e inizializza. È l'unico strumento di migrazione PostgreSQL autorizzato.
Mai sostituito con: alembic, flyway, yoyo o auto-migrazioni ORM. Questa regola interna si applica a ogni schema PostgreSQL.
Supervisore di processi asincroni senza dipendenze per worker, daemon e consumer di code. Esegue controlli di integrità (health check), gestisce gruppi e riavvia un processo in caso di arresto anomalo.
systemd o Kubernetes semplici sono accettabili dove si adattano meglio.
Python
bulkman
Libreria Python
Bulkhead e isolamento della concorrenza che limitano il raggio d'azione di una dipendenza in errore.
La regola interna prevede di impostare sempre circuit_breaker_enabled=False. bulkman gestisce l'isolamento, mentre il circuit breaking spetta a resilient-circuit.
integra resilient-circuit
Python
resilient-circuit
Libreria Python
Circuit breaking, tentativi di ripetizione con backoff e gestione di failsafe o fallback per le chiamate inaffidabili. Da abbinare a bulkman per l'isolamento.
Mai sostituito con: tenacity, pybreaker o cicli di retry scritti a mano.
Python
scriptplan
Motore + CLIprodotto
Motore compatibile con TaskJuggler (.tjp) per la pianificazione e la schedulazione delle risorse. Gestisce persone e macchine nel tempo, dipendenze e calendari, e produce output Gantt.
Mai sostituito con: Fogli di calcolo o calcoli di date ad hoc.
Strumento di monitoraggio dei ticket per singolo repository con specifiche EARS, memoria durevole e lezioni apprese. Tutte le richieste tecniche seguono il ciclo di vita obbligatorio open → in-progress → closed.
Tutte le richieste tecniche diventano una specifica EARS all'interno di un ticket e in una copia nella directory SPECS/ del repository.
Mai sostituito con: TODO non tracciati.
CLI
08/ Preferenze dello stack
Prism
Servizio ospitatoprodotto
Gateway LLM compatibile con OpenAI e Anthropic che può porre più fornitori dietro un unico nome di modello. La nostra distribuzione instrada verso un singolo provider upstream senza failover ed è il provider LLM di riferimento per le chiamate ai modelli negli strumenti.
Individui il bisogno, utilizzi lo strumento che lo possiede e non reimplementi una funzione già coperta da uno strumento interno.
Quale strumento utilizzare per ogni esigenza di ingegneria e cosa non usare mai al suo posto
Esigenza
Utilizzare
Non utilizzare mai
Login / OAuth / “chi è?”
Identity
Scrivere la propria autenticazione
Ruoli, autorizzazioni, “X può fare Y?”
Auth
Tabelle RBAC, Casbin, OPA
Quote, limiti di frequenza, budget, livelli, misurazione
TokenGate
Contatori Redis, librerie di limitazione
Invio di email, template, campagne
Mail API
smtplib, SES/Mailgun
Comunicare con il team di un'altra piattaforma
agent-mail
Modificare il repository o il tracker dell'altro team
Esecuzione di codice non attendibile o generato
RunFlow
Docker locale, runner CI
Pipeline deterministica / DAG / ETL
RunFlow o stabilize
Airflow, Prefect
Flusso di lavoro agentico (guidato da LLM)
Highway
Temporal, cicli personalizzati
Approvazione umana / sign-off
Futex
Richieste su Slack, tabelle di approvazione
Migrazioni dello schema PostgreSQL
migretti
alembic, flyway, yoyo
Dataset, blob, registrazioni, Parquet
datashard
dump pickle/CSV, un DB come blob store
Supervisione dei processi worker
supervice
nohup, respawn scritto a mano
Bulkhead / isolamento della concorrenza
bulkman (breaker OFF)
Semafori ad hoc
Circuit breaking / retry / fallback
resilient-circuit
tenacity, pybreaker
Pianificazione di risorse / progetti
scriptplan
Fogli di calcolo
Ticket, specifiche, requisiti
issuedb-cli + EARS
TODO non tracciati
chiamate LLM all'interno degli strumenti
Prism
SDK e chiavi specifici per fornitore distribuiti tra gli strumenti
Metodo di ingegneria
Tre metodologie si applicano a ogni repository, qualunque cosa costruisca.
Flusso di lavoro EARS + issuedb
Tutte le richieste di ingegneria diventano una specifica EARS e un ticket issuedb, e la specifica viene copiata nella directory SPECS/ del repository. I ticket passano da aperti a in corso fino a chiusi.
TRUST5
Generazione di codice LLM guidata da specifiche e con controllo di qualità, con auto-riparazione, cicli di validazione/riparazione limitati, gate ponderati e mitigazione del problema dell'Oracolo.
Audit mission-critical
Audit per falsificazione: i controlli vengono eseguiti tramite l'interfaccia del prodotto stesso, i risultati sono riprodotti dal vivo e ogni prova è conservata come baseline eseguibile per il ciclo successivo.
Regole che si applicano a ogni strumento.
Verificare tramite l'interfaccia del prodotto stesso. Leggere lo stato tramite la sua API o CLI e non interrogare né scrivere nel database per verificarlo o correggerlo.
Prima di fidarsi di un risultato negativo di una sonda, verificare che ogni sonda punti a un caso positivo noto.
Dichiarare pronto solo ciò che è stato effettivamente messo alla prova e indicare i percorsi non testati.
Verificare ogni limite in entrambe le direzioni: deve bloccare quando viene superato e riprendere quando deve.
Prodotti basati su queste piattaforme
Queste piattaforme sono alla base di tutto ciò che forniamo: Highway, MailApi, RunFlow, Futex, reTunnel, Ledger, RODMENA L10n, TokenGate, AgentBus, RODMENA ID, Auth, Prism, pdfapi, Container Registry, RODMENA CI, Uptime.Systems, Trust5, RED9, Graphviz Provider, Steward, Tollgate, Haven, RODMENA LRS, RODMENA cmi5, Vellum, supervice, datashard, ScriptPlan, Stabilize, Trace, Provenance e Knowledge base. Gestiscono anche l'azienda.