Quattro programmi su un computer: l'app, il backend che capisce il linguaggio, ONTO che conserva e calcola, il nodo di rete che li porta agli altri. Nessun server centrale: ogni installazione è un nodo alla pari (decisione 70).
Dentro un'installazione, app, backend e ONTO parlano in chiaro sullo stesso computer; il nodo di rete (tf-rete) è l'unico che esce, e solo su I2P, con una chiave di nodo sua, senza legame con il wallet (decisione 70). Non c'è un server: ogni installazione è identica alle altre e parla con loro da sé.
Chi fa che cosa
| Programma | Fa | Non fa |
|---|---|---|
| App | Inserimento, elenco delle teorie, forma esplosa, valori, alternative, esplorazione, richieste, circuito | Nessuna analisi e nessun calcolo: chiede tutto al backend |
| Backend | Correzione ortografica locale; analisi grammaticale; divisione in proposizioni; forma esplosa; teorie grammaticali; regole su C, alternative ed esplorazione; scrive e legge in ONTO | Nessun archivio proprio; nessuna tavola di verità; nessun servizio esterno |
| ONTO | Conserva teorie, proprietà e aggregazioni; calcola con le tavole a tre valori; cerca per proprietà | Non conosce il linguaggio naturale |
| Nodo di rete (tf-rete) | Porta da un nodo all'altro, su I2P con i crate di IOP, le voci firmate delle catene pubbliche e le presenze dei nodi; si presenta con una chiave di nodo sua (decisioni 70–72) | Non legge né calcola le teorie: verifica firme e catene e le inoltra; non parla mai in chiaro |
Che cosa viene salvato
| Che cosa | Contenuto |
|---|---|
| Teoria | Testo, impronta SHA-256, provenienza (scritta a mano o generata, e da che cosa), data |
| Proposizione | La teoria a cui appartiene, la posizione, l'operatore che la lega alla successiva |
| Proprietà | La parola in minuscolo (decisione 36). Una sola volta in tutto il sistema |
| Aggregazione elementare | Concetto, proprietà, proposizione, se è sostenuta come vera o come falsa |
| Valutazione | Aggregazione, valore, motivo se N, modo (nascita, derivazione, esclusione), teorie da cui dipende, data |
| Teoria di alternative | Le teorie rivali che elenca, chi l'ha confermata |
Le valutazioni non si sovrascrivono: ogni cambio è una riga nuova, così la storia di un valore resta leggibile.
Lo stato C in ONTO (decisione 34). ONTO ha tre valori nativi, V, F e N, e per le sue ricerche una proprietà assente vale N. Per questo una parte C non riceve in ONTO alcun valore di verità: lo stato e il motivo sono campi di testo, le dipendenze sono relazioni, ogni valutazione è un elemento con data e modo. Il backend applica la regola delle congetture e chiede a ONTO di calcolare solo sulle parti che hanno un valore.
Come è fatto oggi (tappe dalla 2 alla 6). Le teorie stanno in quattro tabelle di ONTO, create dal backend all'avvio: teorie, proposizioni, proprieta e aggregazioni, legate da riferimenti che ONTO controlla. Ogni teoria porta la sua lingua (oggi solo l'italiano, decisione 39), le sue parti affermate, scritte come formule sulle proposizioni (P0 ^ P1), e la provenienza: scritta a mano, implicita (da «ma», «affinché»), citata (da «Marco dice che…», con a chi è attribuita) o grammaticale (da una forma flessa). Una teoria entra con la chiamata POST /teorie in un'unica transazione, insieme alle teorie che porta con sé: o entra tutto o non entra niente. POST /teorie/anteprima mostra la mappatura senza salvare, con le parole che non è riuscita a usare e le parole nuove, mai viste dal modello: queste vanno confermate o corrette prima di salvare (decisione 41). L'analisi delle frasi usa il modello italiano di TheoryFlow (decisione 40). Dalla tappa 4 i valori stanno nelle tabelle valutazioni e dipendenze: dopo ogni inserimento, cancellazione o conferma di alternative il backend ricalcola tutte le teorie e aggiunge una riga solo dove il valore è cambiato, con motivo, modo, parti mancanti e data. Le teorie di alternative confermate stanno in alternative e membri_alternative. Il valore V, F, C o N è un testo: ONTO calcola con le sue tavole le espressioni che il backend gli manda, uno scenario per riga. Due prove automatiche controllano l'archivio: test/archivio_onto.py avvia un ONTO di prova, inserisce alcune teorie, lo riavvia e controlla che si ritrovino già mappate, identiche; test/analisi_frasi.py segnala se il modello di spaCy legge le frasi di prova in modo diverso da com'è registrato. Dalla tappa 5 l'app usa solo le chiamate della tabella qui sotto e non fa calcoli propri; non ha account (decisione 13). Dalla tappa 14 scrivere richiede il wallet della persona, sbloccato nel backend (decisione 67), e ogni scrittura entra nella tabella registro come voce firmata, nella stessa transazione delle righe (decisione 68). Il circuito arriva già composto da GET /circuito (decisione 43); l'app sceglie solo dove mettere i punti sullo schermo. Dalla tappa 6 una frase scritta nell'app passa prima da POST /richieste/riconosci: le regole della lingua o, se nessuna decide, un classificatore dicono se è una richiesta o un'immissione, e l'utente può cambiare la scelta (decisione 44). Il correttore ortografico usa il vocabolario del modello e, se il sistema lo ha, il dizionario Hunspell della lingua, che TheoryFlow non distribuisce (decisione 45). Backend, app e ONTO stanno come sottomoduli nel repository d'insieme theoryflow: lì ./avvia.sh accende tutto e prepara ciò che manca (ONTO compilato, ambiente Python), chiudendo l'app li ferma, e ./prove.sh esegue tutte le prove del backend e dell'app; con gli hook di git in strumenti/hook le prove girano da sole prima di ogni commit. Prima di salvare, una frase si confronta con le teorie esistenti: ciò che c'è già non si salva una seconda volta, e ogni inserimento entra nello storico (decisione 51). Il circuito è a semivettori (decisione 52) e l'app segue il percorso della teoria (decisione 53).
L'interfaccia tra app e backend
Il prototipo faceva fare all'app cinque chiamate in sequenza per ogni teoria. Dalla tappa 5 l'app usa poche chiamate, ciascuna completa.
| Chiamata | Che cosa fa |
|---|---|
POST /teorie/anteprima | Riceve il testo. Restituisce correzioni proposte (decisione 45), parole nuove, forma esplosa e formula logica, da confermare. Non salva nulla |
POST /teorie | Riceve il testo confermato. Salva, valuta e restituisce la teoria completa |
GET /teorie | Elenco delle teorie con il loro valore |
GET /teorie/{impronta} | Una teoria: proposizioni, forma esplosa, valori e loro storia |
DELETE /teorie/{impronta} | Cancella una teoria e ricalcola ciò che ne dipendeva |
POST /richieste/riconosci | Dice se un testo è una richiesta o un'immissione, e chi lo ha deciso (decisione 44). Non salva nulla |
POST /richieste | Riceve una domanda. Restituisce le teorie che condividono le proprietà cercate, con il loro valore, e il loro circuito (decisione 46) |
GET /alternative/{impronta} | Le teorie rivali proposte dal sistema |
GET /alternative | Le teorie di alternative confermate, con i membri e il loro valore |
POST /alternative | Conferma un elenco di alternative, o aggiunge teorie a una teoria di alternative già confermata |
POST /esplora | Calcola gli scenari «se fosse V» e «se fosse F» per una congettura. Non salva nulla |
GET /contraddizioni | Le coppie di teorie che non possono stare insieme |
GET /circuito | Il circuito a semivettori di alcune teorie o di tutte: punti, tratti con il valore dell'aggregazione, incroci e punti condivisi (decisione 52) |
GET /teorie/storico | Lo storico degli inserimenti, con l'esito di ognuno (decisione 51) |
GET /teorie/{impronta}/previsione | La previsione proposta per una teoria, da completare e confermare (decisione 47) |
POST /previsioni | Registra una previsione: una quota, una differenza di quote o di medie tra due gruppi, una differenza appaiata (decisione 56); se è incompleta resta N · non apofantica. Non si modifica |
POST /piani | Registra il piano di prova di una previsione completa, prima dei dati, con le colonne che il tipo della previsione richiede; la procedura dipende dal tipo e non si sceglie (decisioni 48 e 56). Non si modifica |
POST /piani/{impronta}/dataset | Carica un dataset CSV con la scheda di provenienza; entra solo se scheda e file passano i controlli, altrimenti l'elenco dei problemi (decisione 50). Non si modifica |
POST /dataset/{impronta}/calcolo | Rifà il calcolo del dataset, dopo aver verificato che i dati siano quelli registrati, e aggiunge il fatto statistico ai precedenti; la teoria riceve il motivo (decisione 54). Al caricamento il calcolo parte da solo; se lo stesso file è analizzato da più piani, li rifà tutti al livello diviso per il loro numero, e segnala i metodi non applicabili e la fragilità (decisione 57) |
GET /dataset/domande | Le tre domande sì o no del caricamento sulle spiegazioni rivali (decisione 61) |
POST /dataset/{impronta}/verifica | Manda a un nodo, anche lo stesso, il pacchetto dell'ultimo calcolo, confronta le cifre e registra la verifica: con le stesse cifre il fatto resta V, con cifre diverse diventa N (decisioni 62 e 69) |
GET /dataset/{impronta}/pacchetto | Previsione, piano, righe con la loro impronta e numero delle analisi sullo stesso file: ciò che serve a un altro nodo |
POST /verifica | Il lavoro di chi verifica: rifà il calcolo dal pacchetto, senza salvare nulla |
GET /nodo | Il nome del nodo (TF_NODO) e la sua implementazione del calcolo |
GET /identita | Se c'è il wallet, se è sbloccato, indirizzo e nome (decisione 67) |
POST /identita/crea, /importa | Crea il wallet, e solo qui restituisce le 24 parole; oppure lo ricava dalle 24 parole, con una parola d'ordine nuova |
POST /identita/sblocca, /blocca, /esci | Sblocca o blocca la chiave nel backend; toglie il wallet dall'installazione, con la parola d'ordine |
GET /registro | Le voci del registro firmato, dalla più recente (decisione 68) |
GET /registro/controllo | Rifà la catena e confronta l'archivio con il registro: i problemi, con la voce che riguardano |
GET /teorie/{impronta}/pubblicazione | Che cosa andrebbe in rete pubblicando la teoria, con gli avvisi sulle teorie non pubblicate (decisione 71) |
POST /teorie/{impronta}/pubblica, /ritratta | Una voce firmata della catena pubblica del wallet; la ritrattazione (decisione 74) |
GET /rete | Il nodo di rete, i nodi noti con quando sono stati visti, gli autori che hanno pubblicato (decisione 72) |
POST /rete/contatti, /giro, /sincronizza | Il primo contatto; un giro subito; le voci mandate al nodo e quelle arrivate importate (decisione 73) |
Licenze
Il codice del backend e dell'app è pubblicato sotto licenza AGPL-3.0. I testi della documentazione e degli articoli sotto licenza CC BY-SA 4.0.
Aggiornato il 12 ottobre 2026.