Changelog

Todos los cambios notables de Pinky Brain. Formato basado en Keep a Changelog; versionado SemVer.

[Sin publicar]

Nada todavía.

[0.1.5] — 2026-07-05

Agregado

  • pinky update [--check] [--force] — auto-actualización: compara la versión local con el puntero VERSION del CDN (comparación numérica) y, si hay una más nueva, corre el instalador oficial (firma minisign + checksum SHA-256) reemplazando el binario en su carpeta actual. --check sólo informa; --force reinstala. Reusa curl/sh, sin dependencias nuevas.
  • Release notes en la web: /docs/changelog.html (4 idiomas) generado desde este CHANGELOG.md, más un badge de versión en la landing linkeado ahí.

Sitio

  • Landing con sección "memoria inteligente" (conocimiento temporal, señal de utilidad implícita, grafo Obsidian, sync, 7 tools MCP, calidad en CI), franja de métricas medidas (binario, RAM, p95, nDCG) y tab de Documentación.
  • Correcciones de veracidad: la landing mostraba 3 tools MCP (son 7) y el modelo como ~100 MB (medido: ~450 MB, opcional).

[0.1.4] — 2026-07-04

Tres tandas del plan evolutivo (P5–P8, PRs #16–#47). Esquema del índice: v8 (migración destructiva de las tablas derivadas; reindexá tras actualizar — los .md no se tocan).

Calidad del retrieval

  • Eval v2: matriz de variantes (léxico/híbrido/±rerank/±decay), métricas hit@k + MRR + nDCG, y pinky eval --mine (propone casos dorados desde la telemetría real). Gates de CI: 0.9/0.85 con hash-embed, 0.95/0.9 con el modelo.
  • FTS multi-columna (título/tags/texto con pesos BM25) + snippet() nativo.
  • Chunking heading-aware: el embedding lleva contexto «título > heading»; corrige de paso el bug de RRF acumulativo (max-passage por entrada).
  • Stemming Snowball ES/EN/IT/PT en columna sombra.
  • Decay por antigüedad con half-life por tipo (gotcha 90d, diary 30d, decision/pattern 365d, guide exenta).
  • supersedes + search --as-of: hechos temporales; «qué sabíamos entonces».

Ciclo del agente

  • MCP: brain_feedback, brain_update, brain_delete (archiva a .archive/), brain_similar, anti-duplicado en brain_save, y resources pinky://entry/….
  • Hooks: session-start con delta + top real, pre-* registran uso con session_id, post-bash («ya pisaste esta mina»), stop extrae decisiones/ commits del transcript y correlaciona utilidad implícita (lo que el agente releyó → useful=1).
  • pinky stats --value: reporte de valor (uso real, utilidad confirmada, ruido).
  • pinky new (plantillas por tipo), pinky review (triage en lote), dedup v2 (centroide + MinHash léxico).

Producto y operación

  • pinky snapshot/restore: backup verificable (tar.gz + manifest SHA-256, verify-then-write, destino fuera del árbol de trabajo).
  • pinky sync v2: auto-commit sin versionar brain.db, rebase con auto-resolución de diaries y frontmatter.
  • pinky bench: benchmarks reproducibles (1k→8.7ms · 10k→53ms · 100k→495ms p95); ver docs/BENCHMARKS.md.
  • pinky doctor --airgap: verifica operación 100% offline (falla si algo necesitaría red).
  • docs/VERSIONING.md + rechazo de downgrade: un binario viejo sobre un índice de esquema futuro falla claro en vez de operar en silencio.
  • Config central ~/.pinky/config.toml (capa fina); pinky init --demo.
  • i18n completa (ES/EN/IT/PT) también en MCP y hooks; catálogo compartido.

Seguridad y cadena de suministro

  • Cifrado del índice opt-in (encrypted-index, SQLCipher + PINKY_INDEX_KEY); ver docs/SECURITY.md.
  • cargo-deny (deny.toml) en CI, binarios auditables (cargo auditable), SBOM CycloneDX por release, actions pinneadas por SHA, publish = false.
  • Builds reproducibles: rust-toolchain.toml (1.96.1) + remap-path-prefix + job de CI que compila 2× y compara sha256.

Interop

  • Obsidian: se parsean los [[wikilinks]] al indexar (esquema v8, tabla link); pinky search --links aplica un boost 1-hop opt-in; pinky lint reporta wikilinks rotos como warning (tolerante).

Infra de release

  • CI de deploy del sitio + publicación firmada (minisign) a R2, monitoreo del CDN, y scripts/release-local.sh para cortar releases sin GitHub Actions.

[0.1.3] — 2026-07-03

Agregado

  • pinky init integra Claude Code de verdad: instala la regla use-pinky-brain.md en .claude/rules/ y la engancha vía @import en CLAUDE.md (--global para ~/.claude/); hace merge de los hooks en .claude/settings.json (con confirmación; --hooks/--no-hooks); y descarga el modelo de embeddings durante el init para que el primer reindex sea instantáneo (--no-model para saltarlo). Flags nuevos: --force, --global, --hooks, --no-hooks, --no-model.

Corregido

  • pinky-hooks stop: el evento Stop de Claude Code no manda author/summary (el hook los leía y el diary siempre salía vacío/inútil). Ahora lee transcript_path y extrae el resumen del último mensaje del asistente.
  • Landing: los ejemplos de comandos (query del hero, filas de resultado, ejemplo de pinky search) ahora cambian con el idioma elegido (ES/EN/IT/PT).

[0.1.2] — 2026-07-03

Agregado

  • CLI multi-idioma (ES/EN/IT/PT): pinky localiza el --help completo y todos los mensajes/errores. El idioma se resuelve por PINKY_LANG~/.config/pinky/config → locale del sistema (LANG) → es.
  • install.sh pregunta el idioma del CLI al instalar (o lo toma de PINKY_LANG) y lo guarda en ~/.config/pinky/config.
  • Documentación web multi-idioma (pinkybrain.dev/docs, ES/EN/IT/PT) generada desde los .md con make docs.

[0.1.1] — 2026-07-03

Sólo web/branding — el código de los binarios no cambió respecto de 0.1.0.

  • Landing pública en pinkybrain.dev (Cloudflare Pages), multi-idioma (ES/EN/IT/PT) con switcher, logo propio (grilla de chunks), banda de métricas de tokens medidas, sección de beneficios y contacto contact@pinkybrain.dev.

[0.1.0] — 2026-07-03

Primer release. Motor de conocimiento local (Fases 0–3 + P0–P4). Ver docs/PROD-ROADMAP.md para el detalle por fase.

Integridad de datos (P4)

  • Identidad de entrada por (scope, path) (schema v2). El id deriva de stable_id(scope, path) y hay UNIQUE(scope, path): la misma ruta relativa en dos scopes (p. ej. diary/2026-06-30.md global y de proyecto) ya no colisiona ni se pisa en la PK. Migración v1→v2 automática (reconstruye tablas derivadas) con aviso visible que pide reindexar (no queda el brain "vacío" en silencio), y sello de versión sólo hacia arriba (un binario viejo no degrada un índice nuevo).
  • type consistente read↔write: se normaliza (trim + minúsculas) tanto al indexar como al filtrar, y en el scope de brain_search un nombre pelado se interpreta como project:<name>. Cap absoluto de candidatos en la búsqueda.
  • Reindex incremental por (scope, path): el hash ya no se cruza entre scopes (antes saltaba o pisaba entradas homónimas de otro scope).
  • Cleanup de telemetría al borrar/reescribir una entrada (usage ya no deja filas huérfanas que sesguen la poda).
  • Límite de tamaño de archivo al indexar (5 MB): un .md gigante se salta con warning en vez de OOM (defensa en reindex/watch/sync).

Retrieval

  • Guard de query sin términos: una consulta de sólo puntuación/símbolos devuelve vacío en vez de ruido (antes el vector cero traía chunks arbitrarios con score>0).
  • fetch deriva del limit: pedir limit alto ya no trunca el recall en silencio.
  • chunk_body mide en chars (no bytes): chunking consistente con texto acentuado ES/IT.
  • Frontmatter YAML inválido ya no se descarta en silencio: emite warn (y pinky lint lo caza).

DX y producto

  • --version en los tres binarios y en pinky doctor.
  • --json en todos los comandos con salida a stdout (reindex, eval, dedup, stale, telemetry, save, backlinks); en search además desactiva la telemetría (uso programático).
  • PINKY_DB/PINKY_HASH_EMBED respetadas por el CLI (antes las ignoraba): el CLI y el agente ven la misma base. Precedencia flag > env > default.
  • Comandos de sólo-lectura fallan claro si el índice no existe (antes creaban uno vacío y reportaban "0 entradas").
  • Errores de primer arranque accionables (modelo no cargó → sugiere --hash-embed).
  • Validación de type contra el set canónico en save/brain_save (normaliza mayúsculas; rechaza typos que crearían entradas no filtrables).
  • pinky completions {bash,zsh,fish} (autocompletado) e input caps en brain_search (limit clamp 1..100), filtro scope, brain_stats enriquecido (modelo + desglose por tipo).
  • brain_save no deja .md huérfano si falla la indexación; JSON-RPC ilegible responde parse error (-32700) en vez de ignorarse.

Hooks

  • Presupuesto de tiempo (800 ms) en pre-read/pre-write: degradan a no-op en vez de bloquear una tool de Claude Code.
  • No crean DB fantasma: si no hay índice, el hook es no-op (antes ensuciaba cada repo).
  • Diary append atómico (O_APPEND): stops concurrentes ya no se pisan.
  • Ejemplo de registro versionado en hooks/settings.example.json.

Calidad, CI y empaquetado

  • CI corre el eval como gate de relevancia (falla el build ante regresión de ranking), con golden ampliado a 13 casos (ES + IT, paráfrasis) y matrix de OS (Linux + macOS).
  • Release con --locked (reproducible) + checksums SHA256 por artefacto.
  • install.sh (curl | sh): detecta OS/arch, verifica checksum e instala los 3 binarios.
  • Documentación de producto: README orientado a conversión, docs/INSTALL.md, docs/CONFIGURATION.md.
  • Cobertura nueva: migración de schema, reindex multi-scope, validación de type, rerank.

Añadido

  • Integridad de datos (P0): versionado de schema (PRAGMA user_version + tabla meta); guard del modelo de embeddings (Embedder::model_id() + reconcile_model/check_model) que evita mezclar vectores de modelos distintos; busy_timeout para concurrencia CLI + MCP + hooks.
  • Multi-proyecto (P0): filtros de metadata (scope/project/type/tags) en la búsqueda, expuestos en pinky search --project/--type/--tag y en brain_search.
  • Operabilidad (P1): logging con tracing a stderr (PINKY_LOG); CI en GitHub Actions (fmt + clippy -D warnings + tests + E2E reales).
  • Hooks rápidos (P1): search::lexical (BM25) para pre-read/pre-write sin cargar el modelo; FastEmbedder::new() reintenta ante contención del lock del cache; telemetría de uso también desde brain_search.
  • Producto (P2): pinky init (scaffolding + registro MCP relocatable en .mcp.json); pinky lint (valida frontmatter, exit ≠0 ante errores); --json en search/stats/doctor; pinky doctor reforzado (schema, modelo del índice vs activo); caps de input en el MCP; LICENSE (MIT).

Corregido

  • brain_save indexaba con el scope del server e ignoraba el project del argumento (no era filtrable); ahora es consistente con pinky save.
  • pinky stats cargaba el modelo de embeddings sin necesitarlo.
  • Contención de save al root (defensa en profundidad).

Base (núcleo inicial)

Índice SQLite híbrido (FTS5 + sqlite-vec, RRF), CLI pinky, servidor MCP, hooks de Claude Code, y mantenimiento (dedup, staleness, backlinks, rollups, eval).