{{ theme.skipToContentLabel || 'Skip to content' }}

Linting — Catalogo regole

Disponibile da v0.3.0. 11 regole su 14 dello spec implementate.

L'editor del prompt mostra un pannello Diagnosi che segnala problemi (errori, warning, info) sul body del prompt, in tempo reale mentre scrivi. Tutto avviene localmente — nessuna chiamata esterna, nessun salvataggio dei risultati nel vault.

Severità

LivelloEffetto UIEsempi
ErrorRosso, blocca salvataggio in casi graviCarta di credito, ciclo di import
WarningGiallo, non bloccaBody troppo lungo, email PII
InfoGrigio, suggerimentoBody troppo corto, ripetizione n-gram

Lunghezza body

CodiceSeveritàQuando scatta
LEN001WarningBody > 4 000 caratteri (spreco token)
LEN002InfoBody < 30 caratteri (probabilmente incompleto)

Segnaposti

CodiceSeveritàQuando scatta
PH001ErrorSingola graffa: {nome} invece di {{nome}}
PH003WarningCaratteri non consentiti nel nome: {{nome con spazi}}, {{nome-con-trattini}}

PH002 (segnaposto dichiarato non usato) non è implementato: il modello dati non distingue dichiarazione da uso.

Privacy / PII

CodiceSeveritàQuando scatta
PII001WarningEmail rilevata (mario.rossi@example.com)
PII003ErrorNumero carta di credito Luhn-valido (13–19 cifre)
PII004ErrorAPI key di provider noti (OpenAI sk-…, Anthropic sk-ant-…, AWS AKIA…, GitHub ghp_… / github_pat_…, Google AIza…)

PII002 (codice fiscale italiano) non è implementato — la regex è complessa e il rapporto costo/beneficio è basso.

Stile

CodiceSeveritàQuando scatta
STY001InfoStesso n-gram (3 parole) ripetuto ≥ 4 volte nel body

STY002 (mancanza di istruzioni chiare) non è implementato — richiederebbe NLP IT/EN, troppo fragile a regex.

Import (prompt componibili)

CodiceSeveritàQuando scatta
IMP001Error{{import "path"}} con path che non risolve a nessun prompt
IMP002ErrorCiclo di import (self-loop o catena A→B→A multi-hop)
IMP003WarningProfondità di import > 5 livelli

Le regole IMP* funzionano solo sui prompt già salvati nel vault. Su un prompt nuovo (mai salvato) il controllo del ciclo che parte dal root non è possibile, ma cicli interni alla catena vengono comunque rilevati.

Esempi pratici

Errori bloccanti

La carta da rimuovere è 4111 1111 1111 1111 grazie.
                        ^^^^^^^^^^^^^^^^^^^
                        PII003 — Luhn valido
{{import "ricetta-segreta-ma-non-esiste"}}
                                          ^
                                          IMP001 — non risolto

Warning (revisione consigliata)

Manda un messaggio a mario.rossi@example.com appena puoi.
                     ^^^^^^^^^^^^^^^^^^^^^^^
                     PII001 — possibile email

Info (suggerimenti)

ciao
^^^^
LEN002 — body corto (<30 caratteri)

Disabilitare il linting

Il pannello Diagnosi è collassabile (chevron in alto a destra). Quando chiuso non ricarica le diagnosi al cambio body, ma riapre con i risultati dell'ultimo run.

Non c'è (ancora) un toggle globale per disattivare il linter — è sempre attivo lato backend. Le regole che ti danno fastidio si possono ignorare guardando la severità.

Performance

Il lint gira lato backend Rust con regex pre-compilati (cached in OnceLock). Costo tipico:

  • Body 1 000 caratteri: ~0.1 ms
  • Body 10 000 caratteri: ~1 ms
  • Body con 50 import (IMP* attivi): ~5 ms (DFS sul grafo)

Il debounce frontend è 600 ms, quindi non vedi il pannello "flickerare" mentre digiti.

Riferimenti

  • Spec completa nello spec roadmap: fase-3-intelligence.md Step 5
  • Implementazione: apps/client/src-tauri/src/linting.rs
  • Test: 28 unit test sulla logica di lint (vedi cargo test --lib linting::)

Rilasciato sotto licenza AGPL-3.0-only.