Politica di compatibilità
A partire dalla versione 1.0.0, Canopy si impegna a garantire una compatibilità con le versioni precedenti documentata all'interno di una linea di versione maggiore. Questa pagina è il contratto: descrive cosa rimane stabile, cosa può cambiare e come funzionano le deprecazioni, in modo che gli operatori possano pianificare gli aggiornamenti senza sorprese.
La politica si applica a 1.x. Una futura linea 2.x potrebbe rivederla; in tal caso, una guida alla migrazione verrà pubblicata insieme alle note di rilascio di 2.0.0.
Cosa è coperto
Schema del database (migrazioni Alembic)
All'interno di 1.x:
- Le migrazioni sono additive o compatibili con le versioni precedenti all'aggiornamento.
- Nuove colonne possono essere aggiunte in qualsiasi momento.
- Le colonne esistenti non verranno eliminate senza passare attraverso un ciclo di deprecazione.
- Le colonne esistenti non verranno rinominate senza un ciclo di deprecazione (un cambio di nome viene implementato come aggiungi-nuova-colonna → backfill → depreca-colonna-vecchia → elimina-nella-prossima-maggiore).
- Le modifiche al tipo sono limitate all'ampliamento (ad es.
varchar(80)→varchar(255)); le modifiche di riduzione passano attraverso la deprecazione. - I vincoli di chiave esterna non diventeranno più restrittivi (ad es.
ON DELETE SET NULLche diventaON DELETE CASCADE) senza un ciclo di deprecazione.
Gli operatori possono aggiornare con fiducia; la migrazione automatica all'avvio del backend è sicura da eseguire sui dati di produzione.
Metamodello integrato
All'interno di 1.x, il metamodello distribuito in backend/app/services/seed.py è stabile:
- Le chiavi dei tipi di scheda integrati (
Application,Initiative,BusinessCapability, ecc.) non verranno rinominate o rimosse. - Le chiavi di campo integrate su quei tipi non verranno rimosse senza un ciclo di deprecazione.
- Le chiavi dei tipi di relazione integrati non verranno rinominate o rimosse senza un ciclo di deprecazione.
- I sottotipi predefiniti distribuiti con i tipi integrati sono stabili.
Le personalizzazioni degli operatori (tipi di scheda personalizzati, campi personalizzati aggiunti tramite l'interfaccia di amministrazione, tipi di relazione personalizzati) sono di proprietà dell'operatore e non sono coperti da questa politica.
API REST (/api/v1/)
All'interno di 1.x:
- Gli endpoint sotto
/api/v1/non verranno rimossi senza un ciclo di deprecazione. - I nomi dei campi di richiesta e risposta esistenti non verranno rinominati senza un ciclo di deprecazione.
- I tipi di campo non cambieranno in modo incompatibile (ad es. stringa → array).
- I nuovi campi di richiesta opzionali e i nuovi campi di risposta non sono modifiche incompatibili e possono essere introdotti in qualsiasi versione minore.
- I nuovi endpoint non sono modifiche incompatibili e possono essere introdotti in qualsiasi versione minore.
- La semantica di autenticazione (JWT
Bearer, la forma del payload di/auth/login) è stabile. - La semantica dei codici di stato HTTP è stabile per i percorsi di successo ed errore documentati.
Il comportamento al di là della superficie documentata (intestazioni non documentate, testo dei messaggi di errore interni, ordinamento quando non è specificato sort_by) non è coperto.
Chiavi di permesso
Le chiavi di permesso definite in backend/app/core/permissions.py sono stabili all'interno di 1.x. Nuove chiavi possono essere aggiunte; le chiavi esistenti non verranno rinominate o rimosse senza un ciclo di deprecazione.
L'insieme dei permessi concessi per impostazione predefinita ai ruoli predefiniti (admin, bpm_admin, member, viewer) può cambiare tra versioni minori, con una nota nel CHANGELOG. Gli operatori che hanno personalizzato i permessi dei ruoli nella propria distribuzione non sono interessati.
Configurazione (variabili di ambiente)
Le variabili di ambiente esistenti documentate in CLAUDE.md e README.md sono stabili all'interno di 1.x. Nuove variabili possono essere aggiunte con valori predefiniti ragionevoli. I valori predefiniti possono cambiare con una nota nel CHANGELOG quando la modifica è rilevante per l'operatore (ad es. una nuova porta predefinita).
Segreti cifrati a riposo
Il marcatore di prefisso enc: e la chiave derivata da Fernet in backend/app/core/encryption.py sono stabili all'interno di 1.x. Gli operatori non hanno bisogno di ri-cifrare i segreti tra aggiornamenti minori.
Ciclo di deprecazione
Quando qualcosa coperto da questa politica deve essere rimosso:
- Contrassegnare come deprecato nella versione minore
N. La voce del CHANGELOG include una sezioneDeprecatedche descrive la modifica. Per gli endpoint API, la rotta deprecata emette un'intestazione di rispostaDeprecation: true(RFC 8594) e un'intestazioneSunsetche indica l'obiettivo di rimozione più precoce. - Continuare a supportare nella versione minore
N+1. La rimozione non può avvenire nella stessa versione minore della deprecazione. La forma deprecata continua a funzionare. - Rimozione più precoce nella versione minore
N+2o in2.0(a seconda di quale arriva prima). La rimozione avviene con una sezioneRemovednel CHANGELOG e una nota di migrazione.
Per le modifiche alla forma dei dati (migrazioni Alembic), si applica la stessa cadenza N → N+1, espressa come aggiungi-nuovo → backfill → elimina-vecchio.
Cosa non è coperto
Questi elementi sono esplicitamente fuori ambito e possono cambiare in qualsiasi momento:
- La struttura interna dei moduli Python sotto
backend/app/. Le importazioni diapp.models,app.services, ecc. non fanno parte dell'API pubblica. I plugin o gli script che dipendono da importazioni interne devono fissare una versione specifica di Canopy. - La struttura dei blob JSONB memorizzati nelle tabelle integrate (
fields_schema,section_config,attributes,lifecycle) al di là di ciò che viene letto dall'API REST documentata. La forma JSON su disco può evolversi per supportare nuove funzionalità. - Componenti interni del frontend: percorsi dei file dei componenti, firme delle proprietà dei componenti in
frontend/src/, il contenuto difrontend/src/types/index.tse lo stile dei componenti MUI. Gli operatori che utilizzano il frontend incluso sono protetti; chiunque incorpori componenti dall'albero sorgente lo fa a proprio rischio. - Personalizzazioni del metamodello introdotte dagli operatori. Se si aggiunge un tipo di scheda o un campo personalizzato tramite l'interfaccia di amministrazione, si è responsabili della storia di migrazione quando lo si modifica.
- Dati dimostrativi e di seed (
SEED_DEMO=true). Il dataset dimostrativo può evolversi liberamente tra i rilasci. - Servizi di terze parti inclusi: versione DrawIO, immagine Ollama inclusa, versione swagger-ui-dist incorporata. Questi possono essere aggiornati in qualsiasi momento.
- Comportamento con configurazioni non predefinite che sono esplicitamente contrassegnate come sperimentali nelle voci del CHANGELOG.
Cosa cambia effettivamente con «1.0.0»
Rispetto alla serie 0.x, 1.0.0 in sé non è un rilascio di funzionalità — è il punto in cui iniziano ad applicarsi gli impegni sopra descritti. Il codice distribuito in 1.0.0 è lo stesso distribuito in 0.71.0, più il rafforzamento della catena di fornitura e le modifiche al flusso dei collaboratori documentate nella voce del CHANGELOG di 1.0.0.
I rilasci precedenti a 1.0 non erano coperti da questa politica. Le migrazioni tra versioni 0.x potevano e includevano eliminazioni di schemi, rinominazioni e modifiche incompatibili al metamodello. A partire da 1.0.0, tali modifiche passano attraverso il ciclo di deprecazione.