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 puntatore VERSION del 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. --check informa solo; --force reinstalla comunque. Riusa curl/sh, senza nuove dipendenze.
  • Release notes sul web: /docs/changelog.html (4 lingue) generato da questo CHANGELOG.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 in brain_save, e resources pinky://entry/….
  • Hook: session-start con delta e top reali, pre-* registrano l'uso con session_id, post-bash («hai già calpestato questa mina»), stop estrae 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 sync v2: auto-commit senza versionare brain.db, rebase con auto-risoluzione dei conflitti di diary e frontmatter.
  • pinky bench: benchmark riproducibili (1k→8.7ms · 10k→53ms · 100k→495ms p95); vedi docs/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); vedi docs/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, tabella link); pinky search --links applica un boost 1-hop opt-in; pinky lint segnala 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.sh per tagliare release senza GitHub Actions.

[0.1.3] — 2026-07-03

Aggiunto

  • pinky init integra davvero Claude Code: installa la regola use-pinky-brain.md in .claude/rules/ e la aggancia via @import in CLAUDE.md (--global per ~/.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 primo reindex è istantaneo (--no-model per saltarlo). Nuovi flag: --force, --global, --hooks, --no-hooks, --no-model.

Corretto

  • pinky-hooks stop: l'evento Stop di Claude Code non invia author/summary (l'hook li leggeva e il diary usciva sempre vuoto/inutile). Ora legge transcript_path ed 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): pinky localizza l'intero --help e tutti i messaggi/errori. La lingua si risolve tramite PINKY_LANG~/.config/pinky/config → locale di sistema (LANG) → es.
  • install.sh chiede la lingua della CLI durante l'installazione (o la prende da PINKY_LANG) e la salva in ~/.config/pinky/config.
  • Documentazione web multilingue (pinkybrain.dev/docs, ES/EN/IT/PT) generata dai .md con make 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 contatto contact@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'id deriva da stable_id(scope, path) e c'è UNIQUE(scope, path): lo stesso percorso relativo in due scope (es. diary/2026-06-30.md globale 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).
  • type coerente in lettura↔scrittura: normalizzato (trim + minuscolo) sia all'indicizzazione che al filtro, e nello scope di brain_search un nome nudo si interpreta come project:<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 (usage non lascia più righe orfane che distorcono la potatura).
  • Limite di dimensione file all'indicizzazione (5 MB): un .md gigante viene saltato con un warning invece di un OOM (difesa in reindex/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).
  • fetch deriva dal limit: chiedere un limit alto non tronca più il recall in silenzio.
  • chunk_body misura in caratteri (non byte): chunking coerente con testo accentato ES/IT.
  • Frontmatter YAML non valido non viene più scartato in silenzio: emette un warn (e pinky lint lo cattura).

DX e prodotto

  • --version nei tre binari e in pinky doctor.
  • --json in tutti i comandi con output su stdout (reindex, eval, dedup, stale, telemetry, save, backlinks); in search disattiva anche la telemetria (uso programmatico).
  • PINKY_DB/PINKY_HASH_EMBED rispettate 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 type contro il set canonico in save/brain_save (normalizza le maiuscole; rifiuta typo che creerebbero voci non filtrabili).
  • pinky completions {bash,zsh,fish} (autocompletamento) e cap sull'input in brain_search (limit clamp 1..100), filtro scope, brain_stats arricchito (modello + ripartizione per tipo).
  • brain_save non lascia .md orfani se l'indicizzazione fallisce; una richiesta JSON-RPC illeggibile risponde parse 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 + tabella meta); 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 in pinky search --project/--type/--tag e in brain_search.
  • Operabilità (P1): logging con tracing su stderr (PINKY_LOG); CI su GitHub Actions (fmt + clippy -D warnings + test + E2E reali).
  • Hook veloci (P1): search::lexical (BM25) per pre-read/pre-write senza caricare il modello; FastEmbedder::new() riprova in caso di contesa del lock della cache; telemetria d'uso anche da brain_search.
  • Prodotto (P2): pinky init (scaffolding + registrazione MCP rilocabile in .mcp.json); pinky lint (valida il frontmatter, exit ≠0 in caso di errori); --json in search/stats/doctor; pinky doctor rafforzato (schema, modello dell'indice vs attivo); cap sull'input nel server MCP; LICENSE (MIT).

Corretto

  • brain_save indicizzava con lo scope del server e ignorava il project dell'argomento (non filtrabile); ora è coerente con pinky save.
  • pinky stats caricava 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).