Vai al contenuto

Manuale Tecnico Easy Builder

Questo documento descrive l'architettura tecnica dell'ecosistema Easy Builder, Prompt Builder e delle estensioni collegate al runtime compila.

L'obiettivo non e' solo elencare componenti, ma chiarire tre cose: - come e' costruito il sistema - quali parti sono davvero centrali - dove si puo' intervenire senza rompere la compatibilita'

1. Decisione architetturale di base

La decisione piu' importante e' questa:

Easy Builder non introduce un secondo runtime.

E' un layer di authoring sopra il motore legacy dynamic / RAS gia' esistente.

Questo significa: - stesso formato schema del dynamic esistente - stessa tabella risposte - stesso pack frontend compila - stessa gestione media/MinIO

In altre parole: - cambia il modo di costruire il template - non cambia il motore finale che lo esegue

Questa e' la ragione per cui il sistema resta compatibile con tutto il flusso gia' in produzione.

2. Obiettivo tecnico

L'obiettivo del layer easy e' rendere costruibile e governabile un template dynamic senza chiedere all'utente di lavorare direttamente su: - JSON schema - meta - detail_fields - codici interni - configurazioni di basso livello

Il livello tecnico avanzato resta comunque disponibile tramite Expert Builder / editor schema, ma non e' il percorso standard.

3. Componenti principali

View centrale

La classe principale e': - EasyBuilderView

File: - app/modules/documentale/views.py

Responsabilita' principali: - CRUD builder - gestione tipi builder - gestione preset - libreria domande - libreria prompt - preview sandbox - audit - import/export builder - prompt parsing/apply - integrazione document_check

Questa classe e' il punto di orchestrazione del sistema.

Template HTML principali

Interfacce principali: - easy_builder_admin.html - easy_builder_edit.html - easy_builder_import.html - easy_builder_import_builder.html - easy_builder_compila_preview.html - easy_builder_catalog_types.html - easy_builder_catalog_presets.html - easy_builder_catalog_library.html - easy_builder_catalog_audit.html - easy_builder_prompt_builder.html

In pratica: - admin e edit sono il cuore del lavoro quotidiano - i catalog_* sono il layer di governance - compila_preview e' il ponte verso il runtime reale - prompt_builder e' il layer di authoring testuale

Frontend runtime

Il runtime finale continua a usare: - app/static/ras/ras_pack_hotfix35_finalize_zip.html

Questa e' un'altra scelta architetturale centrale: - non esiste un pack frontend separato per easy builder - l'easy produce configurazioni che il pack RAS gia' sa leggere

Le estensioni introdotte nel pack sono additive: - document_check - conditional_document_check - preview sandbox - gestione immagini compatibile con object key MinIO

4. Modello dati

Tabelle del layer easy

Tabelle applicative: - easy_builder_template - easy_builder_type - easy_builder_question_preset - easy_builder_question_library - easy_builder_prompt_library - easy_builder_audit

Ruolo delle tabelle:

easy_builder_template

Contiene la testata del builder: - tenant - tipo - nome - versione - stato - link al legacy_model_id

easy_builder_type

Contiene i tipi builder attivi: - ras - dvr - checklist - eventuali estensioni future

easy_builder_question_preset

Contiene i preset domanda disponibili per tipo builder.

easy_builder_question_library

Contiene le domande riusabili lato tenant/tipo builder.

easy_builder_prompt_library

Contiene template prompt seed e custom.

easy_builder_audit

Traccia le azioni principali sul sistema.

Tabelle runtime riusate

Il layer easy salva e legge dal motore runtime esistente: - legacy_dynamic_template - legacy_dynamic_template_schema - legacy_dynamic_template_question - legacy_dynamic_answer - legacy_dynamic_draft

Questo e' il cuore della compatibilita'.

Se si rompe questo mapping, si rompe il contratto con compila.

5. Mapping concettuale

Dal builder allo schema dynamic

Il mapping logico e' questo: - scheda principale -> sezione root - sottoscheda -> sezione child - domanda -> field - preset -> type/options/meta

Questo significa che l'easy non salva una struttura separata da quella runtime. La traduce in schema dynamic compatibile.

Dalla domanda alla risposta

Lato pack, la risposta viene normalizzata in un payload del tipo:

{
  "value": "Si",
  "detail": {
    "note": "testo"
  },
  "images": ["tenant/object/key.jpg"],
  "image_meta": {},
  "_ts": 1740000000
}

Questo payload viene poi salvato in: - legacy_dynamic_answer.valore_json

Questa forma va considerata il contratto di fatto tra editor, runtime e backend.

6. Preset domanda

I preset sono il modo con cui il sistema standardizza il comportamento delle domande.

Un preset definisce tipicamente: - type - choices - meta - detail_fields - eventuale question_mode

Ci sono due modalita' di authoring preset: - guidata - avanzata JSON

La GUI espone anche: - preview JSON - preview visuale - preview standard / In attesa

Questa parte e' molto importante perche' evita di dover dedurre il comportamento solo leggendo il JSON.

7. Prompt Builder

Il Prompt Builder e' un layer sopra il builder, non un motore a parte.

La pipeline corretta e': 1. input testo 2. traduzione assistita opzionale a DSL 3. parsing in operazioni 4. validazione 5. diff preview 6. apply su payload builder

Supporta: - DSL guidata - testo naturale assistito - libreria prompt

La scelta architetturale corretta qui e' stata: - non salvare direttamente da testo libero allo schema finale - passare sempre da operazioni e preview

Questo riduce molto il rischio.

8. Preview compila

La preview draft e' uno dei punti piu' importanti del sistema.

Usa endpoint sandbox dedicati per: - export - section - progress - save - bulk_save - draft_load - draft_save - upload_blob - image_url

Caratteristiche: - usa il pack reale - non tocca le risposte ufficiali - conserva stato in sessione - permette upload immagini temporanei

Questa parte e' importante perche' permette di validare il comportamento del builder senza pubblicarlo e senza sporcare dati veri.

9. Document check

Il document_check e' una capability trasversale al builder.

Modalita' presenti: - document_check diretto - conditional_document_check

Parametri tipici: - categoria - selection mode - validity field - warning days - grace days - no expiry policy

Il runtime interroga il backend e rende lo stato nel pack.

Il caso conditional_document_check e' importante perche' dimostra il confine tra: - logica easy/preset - logica runtime/frontend

10. Validazioni

La pubblicazione non e' un semplice cambio stato.

Prima del publish il sistema verifica almeno: - presenza schede - presenza sottoschede - presenza domande - preset obbligatorio - completezza document_check

Questo e' un punto di hardening, non solo una comodita' UI.

11. Audit e governance

Le azioni principali vengono registrate in: - easy_builder_audit

Ambiti tipici: - builder - preset - libreria domande - prompt library - import/export

L'audit non e' solo storico: e' un supporto di governance quando il sistema cresce.

12. Ruoli

Admin tenant

Può: - creare e gestire builder - usare prompt builder - pubblicare bozze

Super admin

Può in piu': - gestire tipi builder - gestire preset globali - governare il layer piu' avanzato

Questa separazione e' importante per mantenere la disciplina easy come standard, expert come eccezione.

13. Punti delicati da non rompere

Chi modifica il sistema deve tenere fissi questi vincoli:

1. Compatibilita' col pack compila

Il layer easy non deve introdurre un contratto alternativo casuale.

2. Compatibilita' col payload risposta

La forma delle answer deve restare coerente col pack e col backend.

3. Compatibilita' con media/MinIO

Le immagini devono continuare a usare object key e facade backend esistenti.

4. Compatibilita' con schema legacy/dynamic

Il valore dell'easy builder e' proprio il riuso del motore esistente.

14. Import legacy RAS JSON

Per la famiglia legacy RAS la direzione corretta e': - 1 template dynamic dedicato - N documenti importati - allegati storici conservati

Riferimenti: - docs/legacy_ras_json_import_strategy.md - comando CLI flask --app app legacy_ras_json_import ...

Questo e' coerente con tutta l'architettura appena descritta: si importa nel motore dynamic, non si crea un sottosistema separato.

15. Cosa fare quando arriva una nuova esigenza

La domanda corretta non e': - "dove riesco a infilarla?"

La domanda corretta e': - "questa esigenza va in preset, libreria, prompt capability o richiede davvero expert?"

Ordine corretto di valutazione: 1. preset 2. libreria domanda 3. estensione easy 4. expert

Se si salta subito all'ultimo livello, il sistema perde governabilita'.

16. Conclusione

Easy Builder non e' una pagina admin in piu'.

E' una piattaforma di authoring guidato costruita sopra il motore dynamic esistente, con: - governance - preview runtime - librerie - prompt - audit - compatibilita' piena col flusso in produzione

Chi lo mantiene deve proteggere soprattutto questo equilibrio: - semplificazione in authoring - compatibilita' a runtime - controllo delle eccezioni tramite expert