Software · gestione dei team di sviluppo
Analisi dell'attività di sviluppo: flusso di consegna e metriche DORA da dati GitLab e del tracker, in sola lettura e con audit
Un sistema di analisi interno che legge GitLab e l'issue tracker dell'azienda con un connettore in sola lettura e mostra al management tecnico flusso di consegna, metriche DORA e qualità dei processi, con MFA e log di audit append-only.
- Settore
- Software · gestione dei team di sviluppo
- Tecnologie
- Python 3.12 · FastAPI · SQLAlchemy 2 + Alembic
La sfida
Il management tecnico voleva una visione basata sui fatti dell'attività di sviluppo, del flusso di consegna e della qualità dei processi, su un grande GitLab self-hosted e su un issue tracker. Due vincoli hanno plasmato l'intero sistema. Non doveva poter modificare nulla in GitLab, qualunque token venisse configurato. E doveva supportare le decisioni del management senza trasformarsi in una valutazione automatica delle persone, quindi ogni numero aveva bisogno del suo contesto, della dimensione del campione e di un'indicazione chiara quando mancavano dati.
La soluzione
Abbiamo costruito un unico connettore da cui passano tutte le chiamate a GitLab. Nega tutto per impostazione predefinita, consente solo richieste GET e HEAD, accetta GraphQL solo come documenti di query fissi, protegge da SSRF e redirect, e rifiuta i token di amministratore, con permessi di scrittura o di maintainer prima che vengano salvati. Le importazioni sono upsert idempotenti, con aggregati giornalieri ricalcolati dopo ogni esecuzione. Gli autori dei commit vengono associati alle persone tramite query limitate ed eventi di push, e circa il 98% dei commit viene attribuito. Il codice calcola ogni metrica; il modello linguistico si limita a mettere in parole gli aggregati già calcolati.
Come si collega
- 01 Acquisizione in sola lettura
- 02 Risoluzione delle identità
- 03 Normalizzazione e aggregazione
- 04 Metriche e DORA
- 05 Dashboard e domande
Cosa abbiamo realizzato
- Importazione di gruppi, progetti, commit, merge request, commenti e pipeline
- Risoluzione delle identità dall'indirizzo e-mail del commit all'account
- Confronto tra periodi che tiene conto della copertura dei dati e dei giorni lavorativi, con la dimensione del campione indicata su ogni rapporto
- Metriche di consegna DORA: frequenza di deploy, lead time, change failure rate e rilavorazioni; un livello DORA compare solo quando tutti i dati di partenza sono disponibili
- Collegamento con l'issue tracker: attività collegate alle merge request, incidenti, tempo di ripristino e quota di lavoro non pianificato
- Ruoli e assenze dall'API di un sistema HR o da un'esportazione CSV
- Dashboard con viste per team, per progetto e per autori non associati, più esportazioni
- Un server MCP e un pannello «chiedi ai dati»
- Circa 630 test automatizzati
Funzionalità
- Connettore che nega tutto per impostazione predefinita: solo GET e HEAD, documenti GraphQL fissi, mutazioni rifiutate
- Controllo del token prima del salvataggio: i token di amministratore, con permessi di scrittura o di maintainer vengono rifiutati
- Accesso obbligatorio con autenticazione a più fattori TOTP, senza registrazione pubblica
- Log di audit append-only, imposto direttamente in PostgreSQL
- Segreti cifrati con Fernet e oscurati nei log
- Prompt versionati; al modello vengono inviati solo aggregati
Integrazioni
- API REST e GraphQL di GitLab, in sola lettura
- API dell'issue tracker
- API del sistema HR o esportazione CSV
- API Google Gemini
Tecnologie
Risultato
In funzione sui dati reali dell'azienda, con un anno intero importato. Le sincronizzazioni vengono avviate su richiesta.
Perché il modello si limita a mettere i numeri in parole?
Il management prende decisioni su queste cifre, quindi ogni cifra deve essere riproducibile. Il codice calcola ogni metrica dai dati salvati, con il suo periodo, la copertura e la dimensione del campione. Il modello linguistico riceve solo questi aggregati, con un prompt versionato, e li trasforma in una sintesi leggibile o nella risposta a una domanda. Non vede mai commit o commenti grezzi e non produce mai un numero proprio. Se i dati di un periodo sono incompleti, la dashboard lo dice invece di mostrare una cifra dall’aria sicura.
Parliamo del tuo progetto
Raccontaci il tuo progetto