# 2026-05-04 ## 01:26 — Auditoria FP de apps C++, estandarizacion de mds y extension del indexer a `/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 `/apps/`. Fix: añadir loop sobre `/apps/*/app.md` reusando el mismo `entries` de `os.ReadDir(root)` que ya usa para `/functions/` y `/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...=` — 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/`.