Separazione motore Compila e interfaccia — 12 settembre 2026¶
Il template V3 corrente usa un contratto dati condiviso e un client indipendente dal DOM. Una seconda interfaccia può usare lo stesso documento e gli stessi endpoint senza caricare il template V3.
Confini implementati¶
services/compila_engine.py: apertura documento, lettura sezioni, validazione e salvataggio risposte; identità e permessi espliciti, errori tipizzati. Nessuna importazione Flask/Jinja o rendering.services/compila_answer_repository.py: adattatore per le tabelle risposte esistenti, con commit/rollback.services/compila_contract.py: configurazione versionatacompila.v3/1, condivisa tra pagina e bootstrap JSON.GET /api/compila/v3/documents/<id>/bootstrap: configurazione autenticata, soggetta a visibilità documento e abilitazione pilot; risposta privata non memorizzabile in cache.static/ras/compila_v3_engine.js: istanza per documento, stato, apertura, notifiche di apertura e operazioni API. Nessuna dipendenza dal DOM o da un renderer.- La pagina corrente e l'anteprima Easy Builder ricevono il contratto dal backend. La pagina usa il client Engine per le chiamate API e aggiorna i permessi con la risposta di apertura. Una cache offline non può elevare i permessi forniti dalla pagina.
L'adattatore backend conserva il runtime storico per schema, controlli, lease, non conformità e revisioni. Foto, OCR, libretto e stampa mantengono i servizi HTTP esistenti. Questa separazione riguarda l'interfaccia grafica: non è una migrazione a un microservizio autonomo e non elimina tutte le dipendenze dal backend legacy.
Utilizzo da un'altra interfaccia¶
Caricare compila_v3_state.js, compila_v3_api.js, compila_v3_engine.js in quest'ordine; gli eventuali moduli offline sono opzionali. Nella stessa sessione autenticata:
const engine = await CompilaV3.Engine.connect(documentId, {
deviceId: "identificativo-dispositivo",
deviceLabel: "Postazione tecnico"
});
await engine.open();
const result = await engine.readSection(sectionId);
// L'interfaccia presenta result.data usando i propri componenti.
// engine.saveAnswers([{question_id: questionId, value: valore}]);
Le operazioni conservano firme e risultati di CompilaV3.Api, senza il primo parametro di configurazione. Il server continua a verificare autorizzazioni e lease per le scritture; cambiare interfaccia non concede permessi. Il contratto include gli URL di generazione/apertura PDF, utilizzabili con i metodi e le protezioni delle route esistenti.
Non sono ancora introdotti il template Classica, il selettore dell'interfaccia o la revisione responsive. I modelli di domande e i template PDF sono distinti dal template grafico di compilazione e mantengono il loro ruolo.
Verifiche¶
- 116 test Python superati: motore isolato, controlli accesso e lease, salvataggio parziale, rollback, revisioni, bootstrap HTTP, rendering del contratto e regressioni V3/mobile/incarico unico.
- 13 suite JavaScript superate, incluse esecuzione senza DOM, istanze indipendenti, contratto bootstrap e permessi offline.
- Test applicativi eseguiti con SQLite temporaneo e bootstrap applicativo disabilitato, senza salvataggi sui documenti di produzione.
- Backup dei tre file applicativi preesistenti modificati in
/home/safeops/tmp/compila_engine_20260912/. Ripristinare solo le modifiche di questo intervento: la working tree contiene altri lavori.
Governance¶
change_summary: separazione nucleo Compila, contratto JSON e client dal template grafico V3
user_impact: interfaccia corrente mantenuta; predisposizione per interfacce alternative sugli stessi dati
roles_impacted: tecnici e altri profili gia autorizzati a Compila
surfaces_impacted: Compila V3, API Compila/RAS, anteprima Easy Builder
behavior_change: aggiornamento dei controlli client con i permessi di apertura del server
permission_change: nessuna nuova autorizzazione; controlli server preservati
operator_action_required: nessuna
helper_impact: no_helper_impact
helper_content_type: micro_note
release_severity: L1
helper_ready_for_release: true
block_release: false
block_reason: nessuno; refactor senza nuovo workflow per il tecnico