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 punteroVERSIONdel 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.--checksólo informa;--forcereinstala. Reusacurl/sh, sin dependencias nuevas.- Release notes en la web:
/docs/changelog.html(4 idiomas) generado desde esteCHANGELOG.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 enbrain_save, y resourcespinky://entry/…. - Hooks:
session-startcon delta + top real,pre-*registran uso consession_id,post-bash(«ya pisaste esta mina»),stopextrae 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 syncv2: auto-commit sin versionarbrain.db, rebase con auto-resolución de diaries y frontmatter.pinky bench: benchmarks reproducibles (1k→8.7ms · 10k→53ms · 100k→495ms p95); verdocs/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); verdocs/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, tablalink);pinky search --linksaplica un boost 1-hop opt-in;pinky lintreporta 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.shpara cortar releases sin GitHub Actions.
[0.1.3] — 2026-07-03
Agregado
pinky initintegra Claude Code de verdad: instala la reglause-pinky-brain.mden.claude/rules/y la engancha vía@importenCLAUDE.md(--globalpara~/.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 primerreindexsea instantáneo (--no-modelpara saltarlo). Flags nuevos:--force,--global,--hooks,--no-hooks,--no-model.
Corregido
pinky-hooks stop: el eventoStopde Claude Code no mandaauthor/summary(el hook los leía y el diary siempre salía vacío/inútil). Ahora leetranscript_pathy 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):
pinkylocaliza el--helpcompleto y todos los mensajes/errores. El idioma se resuelve porPINKY_LANG→~/.config/pinky/config→ locale del sistema (LANG) →es. install.shpregunta el idioma del CLI al instalar (o lo toma dePINKY_LANG) y lo guarda en~/.config/pinky/config.- Documentación web multi-idioma (
pinkybrain.dev/docs, ES/EN/IT/PT) generada desde los.mdconmake 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 contactocontact@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). Elidderiva destable_id(scope, path)y hayUNIQUE(scope, path): la misma ruta relativa en dos scopes (p. ej.diary/2026-06-30.mdglobal 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). typeconsistente read↔write: se normaliza (trim + minúsculas) tanto al indexar como al filtrar, y en el scope debrain_searchun nombre pelado se interpreta comoproject:<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 (
usageya no deja filas huérfanas que sesguen la poda). - Límite de tamaño de archivo al indexar (5 MB): un
.mdgigante se salta con warning en vez de OOM (defensa enreindex/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).
fetchderiva dellimit: pedirlimitalto ya no trunca el recall en silencio.chunk_bodymide en chars (no bytes): chunking consistente con texto acentuado ES/IT.- Frontmatter YAML inválido ya no se descarta en silencio: emite
warn(ypinky lintlo caza).
DX y producto
--versionen los tres binarios y enpinky doctor.--jsonen todos los comandos con salida a stdout (reindex, eval, dedup, stale, telemetry, save, backlinks); ensearchademás desactiva la telemetría (uso programático).PINKY_DB/PINKY_HASH_EMBEDrespetadas 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
typecontra el set canónico ensave/brain_save(normaliza mayúsculas; rechaza typos que crearían entradas no filtrables). pinky completions {bash,zsh,fish}(autocompletado) e input caps enbrain_search(limitclamp 1..100), filtroscope,brain_statsenriquecido (modelo + desglose por tipo).brain_saveno deja.mdhuérfano si falla la indexación; JSON-RPC ilegible respondeparse 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+ tablameta); guard del modelo de embeddings (Embedder::model_id()+reconcile_model/check_model) que evita mezclar vectores de modelos distintos;busy_timeoutpara concurrencia CLI + MCP + hooks. - Multi-proyecto (P0): filtros de metadata (
scope/project/type/tags) en la búsqueda, expuestos enpinky search --project/--type/--tagy enbrain_search. - Operabilidad (P1): logging con
tracinga stderr (PINKY_LOG); CI en GitHub Actions (fmt + clippy-D warnings+ tests + E2E reales). - Hooks rápidos (P1):
search::lexical(BM25) parapre-read/pre-writesin cargar el modelo;FastEmbedder::new()reintenta ante contención del lock del cache; telemetría de uso también desdebrain_search. - Producto (P2):
pinky init(scaffolding + registro MCP relocatable en.mcp.json);pinky lint(valida frontmatter, exit ≠0 ante errores);--jsonensearch/stats/doctor;pinky doctorreforzado (schema, modelo del índice vs activo); caps de input en el MCP;LICENSE(MIT).
Corregido
brain_saveindexaba con el scope del server e ignoraba elprojectdel argumento (no era filtrable); ahora es consistente conpinky save.pinky statscargaba el modelo de embeddings sin necesitarlo.- Contención de
saveal 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).