Changelog
Tutte le modifiche rilevanti di Pinky Brain. Formato basato su Keep a Changelog; versionamento SemVer.
[Non pubblicato]
Niente ancora.
[0.1.5] — 2026-07-05
Aggiunto
pinky update [--check] [--force]— auto-aggiornamento: confronta la versione locale con il puntatoreVERSIONdel CDN (confronto numerico) e, se ne esiste una più nuova, esegue l'installer ufficiale (firma minisign + checksum SHA-256) sostituendo il binario nella sua cartella attuale.--checkinforma solo;--forcereinstalla comunque. Riusacurl/sh, senza nuove dipendenze.- Release notes sul web:
/docs/changelog.html(4 lingue) generato da questoCHANGELOG.md, più un badge di versione nella landing che ci rimanda.
Sito
- Landing con sezione "memoria intelligente" (conoscenza temporale, segnale di utilità implicita, grafo Obsidian, sync, 7 tool MCP, qualità protetta in CI), franja di metriche misurate (binario, RAM, p95, nDCG) e tab Documenti.
- Correzioni di veridicità: la landing mostrava 3 tool MCP (sono 7) e il modello come ~100 MB (misurato: ~450 MB, opzionale).
[0.1.4] — 2026-07-04
Tre tornate del piano evolutivo (P5–P8, PR #16–#47). Schema dell'indice: v8 (migrazione distruttiva delle tabelle derivate; reindicizza dopo l'aggiornamento — i file .md non vengono toccati).
Qualità del retrieval
- Eval v2: matrice di varianti (lessicale/ibrido/±rerank/±decay), metriche hit@k + MRR + nDCG, e
pinky eval --mine(propone casi dorati dalla telemetria reale). Gate CI: 0.9/0.85 con hash-embed, 0.95/0.9 con il modello. - FTS multi-colonna (titolo/tag/testo con pesi BM25) +
snippet()nativo. - Chunking heading-aware: l'embedding porta il contesto «titolo > heading»; corregge anche il bug di RRF cumulativo (max-passage per voce).
- Stemming Snowball ES/EN/IT/PT in colonna ombra.
- Decay per anzianità con half-life per tipo (gotcha 90g, diary 30g, decision/pattern 365g, guide esente).
supersedes+search --as-of: fatti temporali; «cosa sapevamo allora».
Ciclo dell'agente
- MCP:
brain_feedback,brain_update,brain_delete(archivia in.archive/),brain_similar, anti-duplicato inbrain_save, e resourcespinky://entry/…. - Hook:
session-startcon delta e top reali,pre-*registrano l'uso consession_id,post-bash(«hai già calpestato questa mina»),stopestrae decisioni/commit dal transcript e correla l'utilità implicita (ciò che l'agente ha davvero riletto →useful=1). pinky stats --value: report di valore (uso reale, utilità confermata, rumore).pinky new(template per tipo),pinky review(triage in blocco), dedup v2 (centroide + MinHash lessicale).
Prodotto e operatività
pinky snapshot/restore: backup verificabile (tar.gz + manifest SHA-256, verify-then-write, destinazione fuori dall'albero di lavoro).pinky syncv2: auto-commit senza versionarebrain.db, rebase con auto-risoluzione dei conflitti di diary e frontmatter.pinky bench: benchmark riproducibili (1k→8.7ms · 10k→53ms · 100k→495ms p95); vedidocs/BENCHMARKS.md.pinky doctor --airgap: verifica il funzionamento 100% offline (fallisce se qualcosa richiederebbe la rete).docs/VERSIONING.md+ rifiuto del downgrade: un binario vecchio su un indice con schema più nuovo ora fallisce chiaramente invece di operare in silenzio.- Config centrale
~/.pinky/config.toml(livello sottile);pinky init --demo. - i18n completa (ES/EN/IT/PT) anche in MCP e hook; catalogo condiviso.
Sicurezza e supply chain
- Cifratura dell'indice opt-in (
encrypted-index, SQLCipher +PINKY_INDEX_KEY); vedidocs/SECURITY.md. - cargo-deny (
deny.toml) in CI, binari auditabili (`cargo auditable), **SBOM CycloneDX** per release, **actions fissate per SHA**,publish = false`. - Build riproducibili:
rust-toolchain.toml(1.96.1) +remap-path-prefix+ un job CI che compila 2× e confronta lo sha256.
Interop
- Obsidian: i
[[wikilinks]]vengono analizzati all'indicizzazione (schema v8, tabellalink);pinky search --linksapplica un boost 1-hop opt-in;pinky lintsegnala i wikilink rotti come warning (tollerante).
Infra di release
- CI per il deploy del sito + pubblicazione firmata (minisign) su R2, monitoraggio del CDN, e
scripts/release-local.shper tagliare release senza GitHub Actions.
[0.1.3] — 2026-07-03
Aggiunto
pinky initintegra davvero Claude Code: installa la regolause-pinky-brain.mdin.claude/rules/e la aggancia via@importinCLAUDE.md(--globalper~/.claude/); fa il merge degli hook in.claude/settings.json(con conferma;--hooks/--no-hooks); e scarica il modello di embedding durante l'init così il primoreindexè istantaneo (--no-modelper saltarlo). Nuovi flag:--force,--global,--hooks,--no-hooks,--no-model.
Corretto
pinky-hooks stop: l'eventoStopdi Claude Code non inviaauthor/summary(l'hook li leggeva e il diary usciva sempre vuoto/inutile). Ora leggetranscript_pathed estrae il riassunto dall'ultimo messaggio dell'assistente.- Landing: gli esempi di comandi (query dell'hero, righe di risultato, esempio di
pinky search) ora cambiano con la lingua scelta (ES/EN/IT/PT).
[0.1.2] — 2026-07-03
Aggiunto
- CLI multilingue (ES/EN/IT/PT):
pinkylocalizza l'intero--helpe tutti i messaggi/errori. La lingua si risolve tramitePINKY_LANG→~/.config/pinky/config→ locale di sistema (LANG) →es. install.shchiede la lingua della CLI durante l'installazione (o la prende daPINKY_LANG) e la salva in~/.config/pinky/config.- Documentazione web multilingue (
pinkybrain.dev/docs, ES/EN/IT/PT) generata dai.mdconmake docs.
[0.1.1] — 2026-07-03
Solo web/branding — il codice dei binari non è cambiato rispetto alla 0.1.0.
- Landing pubblica su
pinkybrain.dev(Cloudflare Pages), multilingue (ES/EN/IT/PT) con selettore, logo proprio (griglia di chunk), banda di metriche sui token misurate, sezione benefici e contattocontact@pinkybrain.dev.
[0.1.0] — 2026-07-03
Primo release. Motore di conoscenza locale (Fasi 0–3 + P0–P4). Vedi docs/PROD-ROADMAP.md per il dettaglio per fase.
Integrità dei dati (P4)
- Identità della voce per
(scope, path)(schema v2). L'idderiva dastable_id(scope, path)e c'èUNIQUE(scope, path): lo stesso percorso relativo in due scope (es.diary/2026-06-30.mdglobale e di progetto) non collide né si sovrascrive più nella PK. Migrazione v1→v2 automatica (ricostruisce le tabelle derivate) con avviso visibile che chiede di reindicizzare (il brain non resta mai "vuoto" in silenzio), e sigillo di versione solo in avanti (un binario vecchio non degrada un indice più nuovo). typecoerente in lettura↔scrittura: normalizzato (trim + minuscolo) sia all'indicizzazione che al filtro, e nello scope dibrain_searchun nome nudo si interpreta comeproject:<name>. Cap assoluto sui candidati di ricerca.- Reindicizzazione incrementale per
(scope, path): l'hash non si incrocia più tra scope (prima saltava o sovrascriveva voci omonime di un altro scope). - Pulizia della telemetria alla cancellazione/riscrittura di una voce (
usagenon lascia più righe orfane che distorcono la potatura). - Limite di dimensione file all'indicizzazione (5 MB): un
.mdgigante viene saltato con un warning invece di un OOM (difesa inreindex/watch/sync).
Retrieval
- Guardia per query senza termini: una query fatta solo di punteggiatura/simboli ora restituisce vuoto invece di rumore (il vettore zero portava chunk arbitrari con score > 0).
fetchderiva dallimit: chiedere unlimitalto non tronca più il recall in silenzio.chunk_bodymisura in caratteri (non byte): chunking coerente con testo accentato ES/IT.- Frontmatter YAML non valido non viene più scartato in silenzio: emette un
warn(epinky lintlo cattura).
DX e prodotto
--versionnei tre binari e inpinky doctor.--jsonin tutti i comandi con output su stdout (reindex, eval, dedup, stale, telemetry, save, backlinks); insearchdisattiva anche la telemetria (uso programmatico).PINKY_DB/PINKY_HASH_EMBEDrispettate dalla CLI (prima le ignorava): la CLI e l'agente vedono la stessa base. Precedenza: flag > env > default.- I comandi di sola lettura falliscono chiaramente se l'indice non esiste (prima ne creavano uno vuoto e riportavano "0 voci").
- Errori azionabili al primo avvio (modello non caricato → suggerisce
--hash-embed). - Validazione del
typecontro il set canonico insave/brain_save(normalizza le maiuscole; rifiuta typo che creerebbero voci non filtrabili). pinky completions {bash,zsh,fish}(autocompletamento) e cap sull'input inbrain_search(limitclamp 1..100), filtroscope,brain_statsarricchito (modello + ripartizione per tipo).brain_savenon lascia.mdorfani se l'indicizzazione fallisce; una richiesta JSON-RPC illeggibile rispondeparse error(-32700) invece di essere ignorata.
Hook
- Budget di tempo (800 ms) in
pre-read/pre-write: degradano a no-op invece di bloccare uno strumento di Claude Code. - Non creano DB fantasma: se non c'è indice, l'hook è un no-op (prima sporcava ogni repo).
- Append atomico del diary (
O_APPEND): stop concorrenti non si sovrascrivono più. - Esempio di registrazione versionata in
hooks/settings.example.json.
Qualità, CI e packaging
- La CI esegue l'eval come gate di rilevanza (fa fallire la build su una regressione di ranking), con golden set ampliato a 13 casi (ES + IT, parafrasi) e matrice di OS (Linux + macOS).
- Release con
--locked(riproducibile) + checksum SHA256 per artefatto. install.sh(curl | sh): rileva OS/arch, verifica il checksum e installa i 3 binari.- Documentazione di prodotto: README orientato alla conversione,
docs/INSTALL.md,docs/CONFIGURATION.md. - Nuova copertura: migrazione di schema, reindex multi-scope, validazione del
type,rerank.
Aggiunto (core)
- Integrità dei dati (P0): versionamento dello schema (`PRAGMA user_version
+ tabellameta); guardia del modello di embedding (Embedder::model_id()+reconcile_model/check_model) che evita di mescolare vettori di modelli diversi;busy_timeout` per la concorrenza CLI + MCP + hook. - Multi-progetto (P0): filtri di metadati (
scope/project/type/tags) nella ricerca, esposti inpinky search --project/--type/--tage inbrain_search. - Operabilità (P1): logging con
tracingsu stderr (PINKY_LOG); CI su GitHub Actions (fmt + clippy-D warnings+ test + E2E reali). - Hook veloci (P1):
search::lexical(BM25) perpre-read/pre-writesenza caricare il modello;FastEmbedder::new()riprova in caso di contesa del lock della cache; telemetria d'uso anche dabrain_search. - Prodotto (P2):
pinky init(scaffolding + registrazione MCP rilocabile in.mcp.json);pinky lint(valida il frontmatter, exit ≠0 in caso di errori);--jsoninsearch/stats/doctor;pinky doctorrafforzato (schema, modello dell'indice vs attivo); cap sull'input nel server MCP;LICENSE(MIT).
Corretto
brain_saveindicizzava con lo scope del server e ignorava ilprojectdell'argomento (non filtrabile); ora è coerente conpinky save.pinky statscaricava il modello di embedding senza bisogno.- Contenimento del percorso root in
save(difesa in profondità).
Base (nucleo iniziale)
Indice SQLite ibrido (FTS5 + sqlite-vec, RRF), CLI pinky, server MCP, hook di Claude Code, e manutenzione (dedup, staleness, backlinks, rollup, eval).