# 2026-05-04

## 01:26 — Auditoria FP de apps C++, estandarizacion de mds y extension del indexer a `<lang>/apps/`

Sesion para verificar que las 5 apps C++ del registry usan programacion funcional limpia y que las funciones que enlazan estan correctamente registradas para que apps nuevas puedan reusar todo. Tres hallazgos: 3 `.cpp` huerfanos sin `.md` (rompen reuso), drift entre `CMakeLists.txt` y `app.md` en las 2 apps con `app.md`, y 2 apps sin `app.md` (`chart_demo`, `shaders_lab`).

- Hecho: auditoria FP de los 5 mains C++. Resultado: `chart_demo`, `text_editor_smoke`, `registry_dashboard` limpios; `shaders_lab` borderline (16 globales, justificado por retained-mode); `graph_explorer` fuera de convencion (2471 lineas, 24 globales, 23 helpers en `main.cpp` — split parcial pero `main` sigue siendo saco). Helpers candidatos a extraer al registry documentados pero no extraidos en esta sesion.
- Hecho: 3 `.md` nuevos para TUs huerfanos del registry — `cpp/functions/viz/{graph_labels_select,graph_viewport_selection,graph_types}.md`. Todos `purity: pure`. `graph_labels.md` y `graph_viewport.md` recortan su `signature` y declaran las nuevas entradas en `uses_functions`.
- Hecho: `cpp/apps/chart_demo/app.md` creado (`chart_demo_cpp_viz`, 4 deps).
- Hecho: `cpp/apps/shaders_lab/app.md` creado (`shaders_lab_cpp_gfx`, 19 deps). Antes habia entrada legacy en BD sin `.md` en disco.
- Hecho: `projects/osint_graph/apps/graph_explorer/app.md` `uses_functions` sincronizado con `CMakeLists.txt`. De 15 a 23 deps. Añadidas: `graph_viewport_selection`, `graph_labels_select`, `graph_types`, `graph_spatial_hash`, `button`, `icon_button`, `badge`, `empty_state`.
- Hecho: `projects/fn_monitoring/apps/registry_dashboard/app.md` `uses_functions` sincronizado. De 9 a 21 deps. Removido `fps_overlay` (vive en `fn_framework`).
- Bug + fix: `./fn index` no recogia `chart_demo` ni `shaders_lab` aunque tenian `app.md` correcto. Raiz: `registry/indexer.go` solo escaneaba `apps/*/app.md` y `projects/*/apps/*/app.md`, NO `<lang>/apps/`. Fix: añadir loop sobre `<lang>/apps/*/app.md` reusando el mismo `entries` de `os.ReadDir(root)` que ya usa para `<lang>/functions/` y `<lang>/types/`. Diff ~12 lineas. `./fn index` pasa de 15 a 17 apps.
- Bug + fix: `chart_demo/app.md` declaraba inicialmente `logger_cpp_core` en `uses_functions` aunque `CMakeLists.txt` no lo enlaza directo. Raiz: `logger.cpp` esta bundled en `fn_framework` static lib (junto con `tokens`, `app_menubar`, `fps_overlay`, etc.). Fix: removido del `app.md` con comentario explicito. Convencion documentada en `.claude/rules/uses_functions.md`.
- Decision: ADR 0003 (`docs/adr/0003-orphan-tu-as-separate-function-entry.md`) — TUs adicionales de un parent function se registran como entrada propia con su `.md`. El parent declara la nueva entrada en `uses_functions`. Alternativas descartadas: `file_path` multi-path (rompe convencion), `notes:` con instruccion (frágil), macro con flags (acopla tests a ImGui).
- Hecho: `.claude/rules/uses_functions.md` ampliada — lista explicita de funciones bundled en `fn_framework` (no se declaran en apps), comportamiento de TUs split (ADR 0003), apps como leaves del grafo.
- Hecho: `.claude/CLAUDE.md` raiz añade `cpp/apps/` a la seccion Estructura como ubicacion valida tras la extension del indexer.
- Hecho: `CHANGELOG.md` entrada 2026-05-04 con 3 nuevas funciones, 2 apps registradas, 2 apps sincronizadas, indexer extendido, ADR 0003.
- Hecho: build `cpp` verde para los 4 targets (`chart_demo`, `shaders_lab`, `registry_dashboard`, `graph_explorer`). `./fn index` reporta 952 functions / 17 apps / 8 analyses.
- Hecho: cross-check final `CMakeLists.txt` ↔ `app.md` con script Python — los 4 apps a 0 missing / 0 extra.
- Pendiente: extraer helpers de `graph_explorer/main.cpp` al registry (algoritmos de layout `layout_no_collision`, `find_collision_free_slot`, `place_orphans_near_neighbors`; persistencia `panel_state_*`; utilities `detect_wsl_distro`, `resolve_registry_root`, `json_escape_str`).
- Pendiente: `primitives_gallery` no tiene `app.md`. Decidir si registrarla (showcase visual estable) o dejarla como scaffolding/demo (etiqueta del rule `uses_functions.md`).
- Pendiente: commit + push de los cambios (binary `fn` rebuilt no commiteado, .md y `registry/indexer.go` modificados).

Refs: ADR [0003](../adr/0003-orphan-tu-as-separate-function-entry.md), funciones `graph_labels_select_cpp_viz`, `graph_viewport_selection_cpp_viz`, `graph_types_cpp_viz`, apps `chart_demo_cpp_viz`, `shaders_lab_cpp_gfx`. Cambio en indexer: `registry/indexer.go` lineas ~87-122.

## 22:50 — Pipeline NER+RE para graph_explorer: 18 funciones nuevas + analysis + playground + vault

- Hecho: investigacion empirica completa de modelos NER/RE en `projects/osint_graph/analysis/gliner_glirel_tuning/`. **9 notebooks** ejecutados (01-09), cada uno con su `build_notebook_*.py` y, los pesados, su `run_*.py` que vuelca a JSON. Los notebooks viven listos para abrir desde Jupyter Lab (`localhost:8888`).
- Hecho: dos rondas de `fn-constructor` el mismo dia. Ronda 1 (mañana): 8 funciones para mREBEL/REBEL/MarianMT (`parse_rebel_output`, `align_relations_to_entities`, `mrebel_load_model`, `mrebel_base_load_model`, `rebel_load_model`, `marianmt_es_en_load_model`, `translate_es_to_en`, `extract_relations_mrebel`). Ronda 2 (tarde): 10 funciones para GLiNER2 + OpenIE ES + composicion (`clean_pdf_text`, `chunk_with_overlap`, `merge_entity_aliases`, `filter_relations_by_entity_types`, `aggregate_extraction_results`, `gliner2_load_model`, `extract_graph_gliner2`, `spacy_es_load_model`, `extract_triples_spacy_es`, `extract_graph_from_text` pipeline). **Total registry: 980 → 990 funciones, 60 tests pytest verdes.**
- Hecho: 3 ADRs cortos en `vaults/osint_nlp_models/decisions/` registrando la cadena de decisiones: mañana `mrebel-over-glirel.md`, tarde `gliner2-over-mrebel.md` (decision final), `license-constraint.md`. Vault con 5 fichas `.md` por modelo (gliner, glirel, mrebel, gliner2, candidates).
- Hecho: PDF `politica_proteccion_datos.pdf` (BBVA, 89.882 chars) copiado a `~/vaults/osint_nlp_models/test_documents/` para reproducibilidad cross-PC. Procesado por todos los pipelines: GLiNER2 t=0.3+coref → 440 nodos / 166 aristas / 139s; NuExtract GPU → 80 nodos / 10 aristas / 361s.
- Hecho: playground HTML en `projects/osint_graph/analysis/gliner_glirel_tuning/playground/`. FastAPI server con GLiNER2 cacheado, frontend Sigma.js con layout server-side via `networkx.spring_layout` (sin fisica frontend → sin loops ResizeObserver). Sirviendo en `localhost:7878` con chunking automatico, post-filter typed, coref, KPIs, JSON exportable.
- Hecho: 4 issues nuevos: `dev/issues/0050-jupyter-exec-collab-client-failure.md` (bug + workaround), `dev/issues/0051-extraction-pipeline-followups.md` (5 funciones aun por construir), `graph_explorer/issues/0041-split-confidence-thresholds.md`, `graph_explorer/issues/0042-gliner2-unified-extractor.md`. Issue `0042-mrebel-relation-extractor.md.superseded` archivado al ganar GLiNER2.
- Hecho: `cpp/CMakeLists.txt` patcheado (commit `e72d6364`) para que `_GE_DIR` y `_DASH_DIR` se sobreescriban via `-D...=<path>` — habilita `parallel-fix-issues` sobre apps C++ con worktrees.
- Hecho: workaround compat `huggingface_hub` 1.x en `glirel_load_model.py` (commit `3b3378cf`) — classmethod monkey-patch idempotente para `_from_pretrained` con kwargs `proxies`/`resume_download`.
- Hecho: dos issues del sub-repo `dataforge/graph_explorer` mergeados local en master con `--no-ff` (`issue/0035e-polish-and-tests` commit `f614a51`, `issue/0013-paste-extract-panel` commit `2a49c2b`). 125/125 tests pytest verdes.
- Hecho: `CHANGELOG.md` actualizado con seccion completa NER+RE (funciones, analysis, vault, playground, issues, decisiones, bugs+fixes).
- Hecho: `analysis.md` de `gliner_glirel_tuning` reescrito con tabla de 9 notebooks + stack final + decisiones del vault + comandos para reproducir.
- Hecho: `app.md` de `graph_explorer` añade seccion "Pipeline NER+RE disponible en el registry" — el stack completo listo para cablear en `extract_graph_hybrid_py_pipelines` y panel `paste_extract`.
- Pendiente: validacion Windows del binario `graph_explorer` con los merges de hoy (issues 0013 + 0035e).
- Pendiente: push de los 3 commits no pusheados (`fn_registry` master commits e72d6364 + 3b3378cf, `dataforge/graph_explorer` master commits f614a51 + 2a49c2b).
- Pendiente: **issue 0051** — 5 funciones aun por construir (NuExtract loader/extractor, `extract_graph_from_pdf` pipeline, `extract_triples_spacy_es_v2` con pasiva refleja+copulares+coref, fix kernel startup que sombrea pip packages, `extract_relations_rebel` EN-only). Brief listo en el issue para proxima ronda fn-constructor.
- Pendiente: implementar issues 0041 + 0042 del `graph_explorer` (paralelizables con `/parallel-fix-issues`). El registry tiene **todas** las funciones necesarias.

Refs: notebooks `01-09_*.ipynb` en `projects/osint_graph/analysis/gliner_glirel_tuning/notebooks/`. Funciones nuevas en `python/functions/{core,datascience,pipelines}/`. Decisiones en `vaults/osint_nlp_models/decisions/`. Issues 0050, 0051 en `dev/issues/`. Issues 0041, 0042 en `projects/osint_graph/apps/graph_explorer/issues/`.
