← Documentazione

Documentazione · 4 di 10

Architettura

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

un'installazione (un computer) App Flutter desktop Linux Backend Python FastAPI · spaCy, solo linguaggio ONTO (Rust) archivio e calcolo Nodo di rete tf-rete (Rust) HTTP sorgente ONTO · SQL I2P TheoryFlow altro nodo TheoryFlow altro nodo

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

ProgrammaFaNon fa
AppInserimento, elenco delle teorie, forma esplosa, valori, alternative, esplorazione, richieste, circuitoNessuna analisi e nessun calcolo: chiede tutto al backend
BackendCorrezione ortografica locale; analisi grammaticale; divisione in proposizioni; forma esplosa; teorie grammaticali; regole su C, alternative ed esplorazione; scrive e legge in ONTONessun archivio proprio; nessuna tavola di verità; nessun servizio esterno
ONTOConserva 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 cosaContenuto
TeoriaTesto, impronta SHA-256, provenienza (scritta a mano o generata, e da che cosa), data
ProposizioneLa 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 elementareConcetto, proprietà, proposizione, se è sostenuta come vera o come falsa
ValutazioneAggregazione, valore, motivo se N, modo (nascita, derivazione, esclusione), teorie da cui dipende, data
Teoria di alternativeLe 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.

ChiamataChe cosa fa
POST /teorie/anteprimaRiceve il testo. Restituisce correzioni proposte (decisione 45), parole nuove, forma esplosa e formula logica, da confermare. Non salva nulla
POST /teorieRiceve il testo confermato. Salva, valuta e restituisce la teoria completa
GET /teorieElenco 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/riconosciDice se un testo è una richiesta o un'immissione, e chi lo ha deciso (decisione 44). Non salva nulla
POST /richiesteRiceve 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 /alternativeLe teorie di alternative confermate, con i membri e il loro valore
POST /alternativeConferma un elenco di alternative, o aggiunge teorie a una teoria di alternative già confermata
POST /esploraCalcola gli scenari «se fosse V» e «se fosse F» per una congettura. Non salva nulla
GET /contraddizioniLe coppie di teorie che non possono stare insieme
GET /circuitoIl circuito a semivettori di alcune teorie o di tutte: punti, tratti con il valore dell'aggregazione, incroci e punti condivisi (decisione 52)
GET /teorie/storicoLo storico degli inserimenti, con l'esito di ognuno (decisione 51)
GET /teorie/{impronta}/previsioneLa previsione proposta per una teoria, da completare e confermare (decisione 47)
POST /previsioniRegistra 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 /pianiRegistra 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}/datasetCarica 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}/calcoloRifà 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/domandeLe tre domande sì o no del caricamento sulle spiegazioni rivali (decisione 61)
POST /dataset/{impronta}/verificaManda 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}/pacchettoPrevisione, piano, righe con la loro impronta e numero delle analisi sullo stesso file: ciò che serve a un altro nodo
POST /verificaIl lavoro di chi verifica: rifà il calcolo dal pacchetto, senza salvare nulla
GET /nodoIl nome del nodo (TF_NODO) e la sua implementazione del calcolo
GET /identitaSe c'è il wallet, se è sbloccato, indirizzo e nome (decisione 67)
POST /identita/crea, /importaCrea 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, /esciSblocca o blocca la chiave nel backend; toglie il wallet dall'installazione, con la parola d'ordine
GET /registroLe voci del registro firmato, dalla più recente (decisione 68)
GET /registro/controlloRifà la catena e confronta l'archivio con il registro: i problemi, con la voce che riguardano
GET /teorie/{impronta}/pubblicazioneChe cosa andrebbe in rete pubblicando la teoria, con gli avvisi sulle teorie non pubblicate (decisione 71)
POST /teorie/{impronta}/pubblica, /ritrattaUna voce firmata della catena pubblica del wallet; la ritrattazione (decisione 74)
GET /reteIl nodo di rete, i nodi noti con quando sono stati visti, gli autori che hanno pubblicato (decisione 72)
POST /rete/contatti, /giro, /sincronizzaIl 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.