- .claude/agents/fn-orquestador/SKILL.md - .claude/commands/fn_claude.md - .claude/rules/INDEX.md - .claude/rules/cpp_apps.md - .claude/rules/ids_naming.md - CHANGELOG.md - apps/dag_engine/README.md - apps/dag_engine/api.go - apps/dag_engine/dags_migrated/example.yaml - apps/dag_engine/dags_migrated/example_lineage_tracking.yaml - ... Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
34 KiB
Changelog
Todos los cambios notables de fn_registry se documentan aquí.
Formato basado en Keep a Changelog. Al no haber releases semver formales, las entradas se ordenan por fecha.
Para contexto detallado del trabajo diario ver docs/diary/. Para decisiones arquitecturales ver docs/adr/.
[Unreleased]
2026-05-16
Added
-
Iconos
.icoWindows para apps C++ — 11 apps GUI (chart_demo,dag_engine_ui,data_factory,graph_explorer,navegator_dashboard,odr_console,primitives_gallery,registry_dashboard,shaders_lab,text_editor_smoke,altsnap_jitter_test) ahora tienen icono propio en el.exey en<exe_dir>desplegado.- Glyphs: Phosphor Icons (
fillweight), clonado ensources/phosphor-core/(1512 SVGs disponibles). Cada app usa unaccent_hexdistinto (Tailwind 500-700) para distinguirse en taskbar/desktop. - Mapping inicial en
dev/gen_app_icons.py(script reproducible). Cada.icomulti-resolucion (16/24/32/48/64/128/256). - Wiring CMake:
cpp/CMakeLists.txt:1-5declaraLANGUAGES C CXX RCen WIN32;add_imgui_appmacro detecta<app_dir>/appicon.icoy genera<target>_appicon.rcenlazado viawindres(toolchaincpp/toolchains/mingw-w64.cmake). - Nueva funcion del registry:
generate_app_icon_py_infra(python/functions/infra/generate_app_icon.{py,md}). Tomaphosphor_icon_name + accent_hex + out_ico_pathy exporta.icomulti-res. Tags:cpp-windows,icon,phosphor. - Convencion documentada en
.claude/rules/cpp_apps.md §11.
- Glyphs: Phosphor Icons (
-
C++ framework — Alt+RMB resize / Alt+LMB move anywhere (
cpp/framework/app_base.cpp). WndProc subclass detectaWM_RBUTTONDOWN/WM_LBUTTONDOWNconGetAsyncKeyState(VK_MENU) & 0x8000,ReleaseCapture+PostMessage(WM_SYSCOMMAND, SC_SIZE|dir | SC_MOVE|HTCAPTION). Modal nativo, cero jitter automatico via gate sizemove existente. Aplica a main + cada viewport flotante (subclass per-frame). -
C++ framework — multi-HWND subclass para anti-jitter.
g_subclassedahoraunordered_map<HWND, WNDPROC>, scan per-frame enpio.Viewportsinstala subclass en cada HWND nuevo,prune_dead_subclassed()conIsWindow,uninstall_sizemove_subclass_all()al exit. Fix del temblor en paneles flotantes (no solo el main HWND). -
C++ framework — iconified survival de paneles flotantes. Antes
glfwWaitEvents+continueparaba el frame loop entero al minimizar el main → secondary viewports congelados/ocultos. Ahora detecta secondary viewports y fall-through al frame normal si existen; solo duerme cuando no hay flotantes. -
C++ framework —
fn::internal::*test observability.sizemove_enter_count(),alt_rmb_resize_count(),alt_lmb_move_count(),rbuttondown_seen_count(),set_force_alt_for_test(bool). Counters monotonicos zero-cost, modo test saltaPostMessage SC_SIZE/SC_MOVEpara no atrapar al harness en modal. -
apps/altsnap_jitter_test/— extendido a 6 phases (p1 sync, p2 main HWND modal, p3 secondary HWND modal, p4 iconify+restore preserva floating, p5 Alt+RMB consumed, p6 Alt+LMB consumed). Todas PASS en Windows. -
redeploy_all_cpp_apps_bash_pipelines— pipeline nuevobash/functions/pipelines/redeploy_all_cpp_apps.shque cross-compila todo el arbolcpp/en un solo cmake pass + redeploy de cada.exeal Desktop. Filtro opcional por substring de nombre. Tolerante a fallos (build best-effort, summary OK/SKIPPED/FAILED). Tags:cpp, windows, deploy, redeploy, bulk, cpp-windows. Composicion:build_cpp_windows_bash_infra+ looptaskkill.exe+deploy_cpp_exe_to_windows_bash_infra.
Changed
io.ConfigWindowsMoveFromTitleBarOnly = trueenfn::run_app. Floating panels (viewport secundario = OS window borderless con UNA ventana ImGui rellenandolo) ahora respetan "solo header arrastra" como las decoradas. Fix del drag-anywhere-sin-alt en panel flotante. Alt+LMB anywhere sigue funcionando (subclass consume antes que ImGui).resolve_cpp_app_dir_bash_infrav1.1.0 — ahora busca apps tambien enapps/<X>/(canonical issue 0096) ademas decpp/apps/<X>/(legacy) yprojects/*/apps/<X>/. Fix retroactivo:./fn run compile_cpp_app <name>fallaba para apps en el layout canonical (ej.dag_engine_ui). Deduccion desde CWD tambien actualizada. Helper interno_list_cpp_apps.
Notes
- Apps C++ redesplegadas via
redeploy_all_cpp_apps: 12 OK / 1 SKIP (data_factorysin .exe target) / 0 FAILED. Todas tienen los fixes del framework activos. - ImGui_ImplGlfw subclassea el HWND DESPUES que nuestro framework. ImGui captura nuestro WndProc como
PrevWndProcy chainea viaCallWindowProc, asi que el subclass nuestro sigue recibiendo TODOS los mensajes en el orden correcto. NO re-subclassear despues de ImGui init (provoca recursion infinita por cycle:our_proc -> orig=imgui_proc -> imgui_proc -> prev=our_proc -> ...). - Pre-existing build break en
cpp/tests/test_llm_anthropic.cpp+cpp/tests/test_graph_icons.cpppor uso desetenv()que no existe en mingw-w64. NO bloquearedeploy_all_cpp_apps(build best-effort). Candidato a guard#ifdef _WIN32con_putenv_so skip cross-compile. No introducido por esta sesion.
2026-05-14
Added
- Issue 0086 — Monitor tab del
registry_dashboard(sub-repodataforge/registry_dashboard). PestañaMonitorprimera y por defecto del TabBar, landing del bucle reactivo construir->ejecutar->recopilar->analizar->mejorar.- 7 KPIs (Calls / MCP / Reg % / Errors / Violations / Copies / Versions) filtradas por ventana temporal (1h/24h/7d/30d/All).
- Sub-tab
Recent Executionscon columnas When/Function/Tool/ms/OK/Error. Columna Function muestra$ <snippet>en gris cuandofunction_idvacio, hover tooltip con comando completo. CheckboxOnly registry functionsfiltra porfunction_id != ''. - Sub-tab
Failed Functions(5a) — subset filtrado a registry-functions fallidas, columnas When/Function/Tool/Error class/Error snippet, function_id en rojo. - Live scatter
duracion (ms)vstime: eje X auto-scroll anow, ventana configurable (1m/5m/15m/1h/6h) independiente del filtro de KPIs, eje Y dinamico0..max(visible)+500ms. Hora local (UseLocalTime). Series ok/error en verde/rojo. Hover sobre punto = tooltip Function/Tool/Duration/Error. - Indicador
live/offlinecon timestamp del ultimo evento WS.
- WebSocket live stream sqlite_api -> registry_dashboard (sub-repo
dataforge/sqlite_api). EndpointGET /api/events/call_monitor. Hub global con subscribers; ticker arranca solo con >=1 subscriber (cero overhead si nadie mira). Cliente recibe snapshot inicial (KPIs + 100 ultimas filas + watermark) y luego deltasid > watermark. Cliente puede mandar{watermark: N}para resumir tras reconexion. - WS client C++ hand-rolled RFC6455 en
ws_client.{h,cpp}(~330 LOC) en el dashboard. Localhost-only (no TLS). Thread propio, reconnect exponencial 0.5s->8s, FIN/text/ping/pong/close handling, queue thread-safe drenada cada frame. - Migration 007
command_snippetencalls(projects/fn_monitoring/apps/call_monitor/migrations/007_calls_command_snippet.sql). Aditiva, idempotente. Llena por hookhook_call_monitor.shsolo cuandofunction_id == ''. Redactado depassword=/token=/secret=/api_key=/bearer=. Truncado 200 chars. - Issue 0087 — Capability Discovery Acceleration. Modelo 5 capas + 7 piezas (ver
dev/issues/0087-*.md).fn match(cmd/fn/match.go) — subcommand fuzzy-FTS5 que dado un comando devuelve top-N funciones del registry candidates. Latencia 6-7ms. Output JSON conscore(normalizado top=1.0) +raw_score(absoluto pre-normalizacion) +high_confidencegate (raw_score >= 4.0 AND top1.raw/top2.raw > 1.5).fn doctor capabilities --emit-claude-md(cmd/fn/doctor.go+functions/infra/emit_capabilities_md.go) — emite bloque markdown con secciones TOP 20 (porcalls_total), Fresh 7d, Pipelines top 5. Fallback sicall_monitor.operations.dbausente.call_monitor sequences --detect [--propose](projects/fn_monitoring/apps/call_monitor/sequences.go+migrations/006_function_sequences.sql). Detecta secuencias A->B(->C) encalls(same session, gap < 30s, occ >= 5, sess >= 2, success_rate >= 0.9) y abre proposalsnew_pipelineautomaticamente.- Hook
PreToolUsehook_fn_match.sh— denylist +fn matchcon timeout 0.2s. Inyecta<system-reminder>FUZZY-MATCH: USE ./fn run <id>cuando confidence alta. Latencia 113ms trigger / 32ms denylist. Registrado en.claude/settings.local.json(Bash matcher). - Hook
UserPromptSubmithook_capabilities_inject.sh— cache 1h en~/.cache/fn_registry/capabilities.txt. Emite JSONhookSpecificOutput.additionalContextcon linea compactaCAPABILITIES: TOP / FRESH / PIPELINES. Latencia cold 33ms / warm 18ms. - Timer systemd user
call_monitor_sequences.timer(OnCalendar 0/6h) +.serviceoneshot ejecutandocall_monitor sequences --detect --propose --report. Versionado enprojects/fn_monitoring/apps/call_monitor/systemd/.
- 3 funciones nuevas grupo
cpp-windows+ pagina madredocs/capabilities/cpp-windows.md:launch_cpp_app_windows_bash_infra—cmd.exe/PowerShell Start-Processpara lanzar exe en Windows desde WSL2.is_cpp_app_running_windows_bash_infra—tasklist.exe /FIcon exit code 0/1 + stdoutRUNNING: PID=N MEM=KoNOT_RUNNING.redeploy_cpp_app_windows_bash_pipelines— pipeline build? + deploy + launch + verify en 1 invocacion. Reemplaza ~6 commands manuales.
- ADR 0004
docs/adr/0004-telemetry-driven-capability-growth.md— formaliza el bucle telemetria -> proposal -> capability group -> discovery acceleration como motor de crecimiento del registry. - Regla
.claude/rules/function_growth_and_self_docs.md(entry #30 enINDEX.md) — contrato.mdautosuficiente (Ejemplo + Cuando usarla + Gotchas + Growth log) + crecimiento del registry por promocion de composiciones, NO por inflado de funciones individuales.
Changed
.claude/CLAUDE.mdNorte ampliado — 4o objetivoPROMOVER COMPOSICIONES A PIPELINES(el registry crece por composicion, no por inflado). Linea sobre auto-discovery zero-second-lookup..claude/rules/registry_calls.md— clausula nueva: hooks e infraestructura de telemetria (fn_match,fn doctor,call_monitor) pueden leerregistry.dbdirecto con conexion read-only. NO sujeto a regla MCP-first (no son acciones del agente)./fn_claudecommand mejorado con objetivos del Monitor + interpretacion deFUZZY-MATCHhint +CAPABILITIESline + threshold semantica.
Fixed
launch_cpp_app_windowsquoting bug —cmd.exe /c "cd /d \"$dir\" && start ..."rompia con paths Windows (el\"final se interpretaba como escape de comilla -> string sin cerrar -> "Windows cannot find \"). Fix: reescribir apowershell.exe -Command "Start-Process -FilePath ... -WorkingDirectory ..."(single-quote PowerShell es literal, sin procesar\ni$).fn match high_confidencesiempre true — debido a normalizaciontop=1.0. Fix: añadirraw_scorepreservado pre-normalizacion + gate dualraw_score >= 4.0 AND top1.raw/top2.raw > 1.5. Threshold 4.0 tuneado contra 14 patrones del analysisdomain_coverage_gaps(~93% precision).
2026-05-07
Added
fn doctorCLI (cmd/fn/doctor.go) — entrypoint unico read-only para diagnostico del registry y artefactos. Subcomandos:artefacts(git/venv/app.md/upstream),services(apps tag service + systemctl + puerto),sync(driftpc_locationsBD vs disco),uses-functions(imports reales vs declarados enapp.md),unused(funciones sin consumidores). Flag--jsonpara agentes/scripts. Cada subcomando es wrapper fino sobre una funcion del registry..claude/rules/fn_doctor.md— regla 23 enINDEX.md. Documenta cuando usar, mapeo subcomando → funcion del registry, y acciones derivadas (que hacer cuando reporta un drift).bash/functions/infra/backup_sqlite_db(backup_sqlite_db_bash_infra, impure) — snapshot atomico de SQLite viaVACUUM INTO. Mas seguro quecpcon escrituras concurrentes.bash/functions/infra/rotate_backups(rotate_backups_bash_infra, impure) — retention rsnapshot-styledaily.N/weekly.M/monthly.K.bash/functions/infra/wait_for_http(wait_for_http_bash_infra, impure) — poll URL hasta 2xx con timeout, util en deploys/smoke tests.bash/functions/infra/wait_for_port(wait_for_port_bash_infra, impure) — poll TCP host:puerto. Usanco/dev/tcpbuiltin (sin deps).bash/functions/infra/port_kill(port_kill_bash_infra, impure) — mata proceso(s) escuchando un puerto. Idempotente, fallbackKILLtrasTERM.bash/functions/infra/tail_journal(tail_journal_bash_infra, impure) — wrapperjournalctlcon auto-deteccion--uservs sistema, prioridad y--since.bash/functions/infra/pre_commit_hook_install(pre_commit_hook_install_bash_infra, impure) — instala hook que llamascan_secrets_in_dirty_bash_cybersecurityantes de cada commit. Idempotente con marcafn_registry-pre-commit-v1.functions/infra/notify_telegram(notify_telegram_go_infra, impure) — envia mensaje a chat Telegram via Bot API. Trunca >4096 chars.functions/infra/artefact_doctor(artefact_doctor_go_infra, impure) — audita salud de cada app/analysis: dir existe,.gitpresente, manifest parseable,.venvvalido (analyses), upstream configurado.functions/infra/services_status(services_status_go_infra, impure) — apps con tagservice+systemctl is-active(user/system) + puerto declarado en notes/description + check TCP localhost.functions/infra/pc_locations_drift(pc_locations_drift_go_infra, impure) — detecta driftpc_locationsBD vs disco para el PC actual (~/.fn_pc). Tres tipos:missing_on_disk,untracked_on_disk,status_should_be_active.functions/infra/audit_uses_functions(audit_uses_functions_go_infra, impure) — para cada app Go/Py compara imports reales contrauses_functionsdelapp.md. Reportamissing_in_app_mdyunused_in_app_md. Heuristica documentada (puede dar falsos positivos enunused).functions/infra/find_unused_functions(find_unused_functions_go_infra, impure) — funciones del registry sin consumidores en otras funciones, apps o analyses. Pipelines sin taglaunchertambien aparecen.bash/functions/pipelines/backup_all(backup_all_bash_pipelines, impure, taglauncher) — orquestabackup_sqlite_db+rotate_backupssobreregistry.db, cadaapps/*/operations.db, y rsync--link-destpara vaults declarados enprojects/*/vaults/vault.yaml.
Changed
.claude/CLAUDE.md— seccion CLI ampliada con comandosfn doctor [subcommand] [--json]y enlace a la regla..claude/rules/INDEX.md— anadida fila 23 parafn_doctor.md.
Fixed
functions/infra/pc_locations_drift.go—filepath.Join(absoluto, absoluto)producia paths corruptos cuandodir_pathya era absoluto (caso comun: filaspc_locationstraen path absoluto al disco del PC). Fix: chequearfilepath.IsAbsantes de unir. Sintoma previo: todos los artefactos reportados comomissing_on_diskaunque existieran.go.mod—golang.org/x/netmovido a deps directas (go mod tidytras anadirnotify_telegram).
Notes
- Hallazgo de la primera ejecucion
fn doctor uses-functions: 7/12 apps con drift real (auto_metabase,dag_engine,deploy_server,docker_tui,kanban,metabase_registry,script_navegador). Pendiente sincronizar susapp.mdcon los imports reales en sesion futura. fn doctor unusedmuestra muchas funciones core sin consumidores aun (compose2_go_core,curry2_go_core, etc.). Esperado: el registry crece antes que las apps que las consuman.
2026-05-04
Added
cpp/functions/viz/graph_labels_select(graph_labels_select_cpp_viz, pure) — TU separado degraph_labelscon los helpers purosgraph_compute_degreesygraph_labels_select(frustum cull + always_for_* + top-N porsize * (degree+1)). Vive en su propio archivo para que los tests unitarios lo cubran sin abrir ImGui.cpp/functions/viz/graph_viewport_selection(graph_viewport_selection_cpp_viz, pure) — TU separado degraph_viewportconclear_selection,is_selected,add_to_selection,toggle_selection. Mantienen sincronizadosstate.selectionynodes[i].flags & NF_SELECTED.cpp/functions/viz/graph_types(graph_types_cpp_viz, pure) — TU de implementacion deGraphData::update_bounds()yGraphData::find_node_by_user_data(). Pareja obligatoria del header del tipo (graph_types.hindexado entypes/viz/).cpp/apps/chart_demo/app.md— la demo de primitivos viz (line/scatter/bar/heatmap) ahora aparece en el registry comochart_demo_cpp_viz.cpp/apps/shaders_lab/app.md— el live GLSL playground con DAG ahora tieneapp.mdpropio (antes solo existia entrada legacy en BD sin.mden disco).
Changed
registry/indexer.go— el indexer ahora escanea tambien<lang>/apps/*/app.md(mismo patron que ya usaba para<lang>/functions/y<lang>/types/). Antes solo veiaapps/yprojects/*/apps/— las apps encpp/apps/quedaban invisibles../fn indexreporta 17 apps (antes 15).cpp/functions/viz/graph_labels.md—signaturereducida agraph_labels_drawygraph_labels_draw_at(los helpers puros pasan a entrada propia).uses_functionsapunta a la nueva entradagraph_labels_select_cpp_viz.cpp/functions/viz/graph_viewport.md—uses_functionsañadegraph_viewport_selection_cpp_viz.projects/osint_graph/apps/graph_explorer/app.md—uses_functionssincronizado conCMakeLists.txt: ahora declara las 23 funciones del registry que enlaza (antes 15). Añadidas:graph_viewport_selection,graph_labels_select,graph_types,graph_spatial_hash,button,icon_button,badge,empty_state.projects/fn_monitoring/apps/registry_dashboard/app.md—uses_functionssincronizado conCMakeLists.txt(21 deps, antes 9). Añadidas:badge,button,empty_state,icon_button,modal_dialog,page_header,process_runner,process_state_machine,select,text_input,toast,toolbar,tree_view. Removido:fps_overlay(vive enfn_framework, no se declara).
Decisions
- ADR
0003-orphan-tu-as-separate-function-entry.md— cuando una funcion del registry necesita partir su.cppen varios TUs por testabilidad o separacion ImGui-vs-puro, cada TU adicional se registra como entrada propia con su.mden lugar de extenderfile_pathpara listar varios archivos. El parent declara la nueva entrada enuses_functions. Razon: el indexer asume1 .cpp = 1 .md; unfile_pathmulti-archivo rompe la convencion y deja apps nuevas sin saber que TUs enlazar.
Added — sesion NER+RE para graph_explorer (tarde, 980 → 990 funciones)
18 funciones nuevas sobre el ecosistema NER+RE, en dos rondas de fn-constructor:
Ronda 1 — extraccion de relaciones (mREBEL/REBEL/MarianMT):
python/functions/datascience/parse_rebel_output.py(pure) — parser wire<triplet>REBEL/mREBEL.python/functions/datascience/align_relations_to_entities.py(pure) — string-match aligner.python/functions/datascience/mrebel_load_model.py(impure, CC BY-NC-SA 4.0 — NO comercial).python/functions/datascience/mrebel_base_load_model.py(impure, misma licencia).python/functions/datascience/rebel_load_model.py(impure, Apache 2.0, EN-only).python/functions/datascience/marianmt_es_en_load_model.py(impure) — Helsinki-NLP/opus-mt-es-en.python/functions/datascience/translate_es_to_en.py(impure) — wrapper traduccion frase a frase.python/functions/datascience/extract_relations_mrebel.py(impure) — pipeline mREBEL frase-a-frase + alineamiento.- 21 tests pytest verdes.
Ronda 2 — pipeline GLiNER2 + OpenIE schema-less + composicion (tarde):
python/functions/core/clean_pdf_text.py(pure) — limpia artefactos PyPDF2.python/functions/core/chunk_with_overlap.py(pure) — sliding window con avance forzado.python/functions/core/merge_entity_aliases.py(pure) — coreferencia normalize+substring.python/functions/core/filter_relations_by_entity_types.py(pure) — post-filter typed.python/functions/core/aggregate_extraction_results.py(pure) — dedupe + Counter sobre N chunks.python/functions/datascience/gliner2_load_model.py(impure, Apache 2.0) —fastino/gliner2-large-v1.python/functions/datascience/extract_graph_gliner2.py(impure) — wrapper schema + threshold + include_confidence.python/functions/datascience/spacy_es_load_model.py(impure) —es_core_news_mdcacheado.python/functions/datascience/extract_triples_spacy_es.py(impure) — OpenIE schema-less ES por reglas de dependencia (verbo del texto = predicado).python/functions/pipelines/extract_graph_from_text.py(impure pipeline) — composicion E2E: chunk → extract_graph_gliner2 (×N) → aggregate → filter typed → merge aliases → grafo final.- 39 tests pytest verdes.
Added — analysis gliner_glirel_tuning
projects/osint_graph/analysis/gliner_glirel_tuning/ — investigacion empirica de modelos NER/RE. 9 notebooks ejecutados:
| # | Notebook | Hallazgo clave |
|---|---|---|
| 01 | 01_gliner_glirel_tuning.ipynb |
Calibracion de thresholds GLiNER+GLiREL |
| 02 | 02_e2e_spanish_graph.ipynb |
E2E texto ES — descubrimiento del fail de GLiREL en castellano |
| 03 | 03_mrebel_vs_glirel.ipynb |
mREBEL gana a GLiREL pero CC BY-NC-SA |
| 04 | 04_gliner2_winner.ipynb ⭐ |
GLiNER2 (Apache 2.0, NER+RE joint, 340M) elegido como motor principal |
| 05 | 05_long_text_and_pdf.ipynb |
Pipeline PDF E2E sobre politica_proteccion_datos.pdf (BBVA, 89.882 chars) |
| 06 | 06_improvements.ipynb |
Threshold 0.3 (vs default 0.5) → +187% relaciones; coref reduce 18% aislados |
| 07 | 07_nuextract_vs_gliner2.ipynb |
NuExtract GPU 2.6× mas lento, calidad similar — descartado por defecto |
| 08 | 08_improving_gliner2.ipynb |
snake_case verbal labels + post-filter typed = mejor combo |
| 09 | 09_spacy_es_openie.ipynb |
spaCy ES dep-rules: schema-less, predicado = verbo del texto |
Added — vault osint_nlp_models
projects/osint_graph/vaults/osint_nlp_models (symlink a ~/vaults/osint_nlp_models/):
models/— fichas de gliner, glirel, mrebel, gliner2, candidates a probar.decisions/— 3 ADRs cortos del 2026-05-04 (mrebel-over-glirel mañana, gliner2-over-mrebel tarde, license-constraint).benchmarks/corpus_v1.md+results_log.csv(15 filas de experimentos).test_documents/politica_proteccion_datos.pdf(PDF de BBVA copiado para reproducibilidad).
Added — playground HTML
projects/osint_graph/analysis/gliner_glirel_tuning/playground/:
server.py— FastAPI con GLiNER2 cacheado, endpointsGET /(HTML) yPOST /extract(texto → grafo).index.html— UI: textarea, KPIs (nodos/aristas/tiempo), grafo Sigma.js, JSON exportable.static/sigma.min.js+graphology.umd.min.js(servidos localmente para evitar bloqueo CDN por extensiones tipo MetaMask/SES).
Stack aplicado por el server:
- snake_case verbal labels (
works_at,ceo_of,headquartered_in,agreement_with...) - threshold 0.3 (configurable)
- chunking automatico > 1500 chars
- post-filter typed (
(person, organization)validos por relacion) - coreferencia normalize+substring
- layout server-side via
networkx.spring_layout - render Sigma.js (sin fisica → sin loops de ResizeObserver)
Added — issues
dev/issues/0050-jupyter-exec-collab-client-failure.md— bugjupyter_execcon cliente colaborativo + workaround documentado.projects/osint_graph/apps/graph_explorer/issues/0041-split-confidence-thresholds.md— splitconfidence_thresholdenentity_threshold+relation_threshold.projects/osint_graph/apps/graph_explorer/issues/0042-gliner2-unified-extractor.md⭐ — sustituir GLiREL por GLiNER2 enextract_graph_hybrid. Reemplaza 0042-mrebel.projects/osint_graph/apps/graph_explorer/issues/0042-mrebel-relation-extractor.md.superseded— version mREBEL del 0042 archivada al ganar GLiNER2.
Changed
cpp/CMakeLists.txt—_GE_DIRy_DASH_DIRsobreescribibles via-D<...>=<path>para builds en worktrees (commite72d6364). Habilitaparallel-fix-issuessobre apps C++.python/functions/datascience/glirel_load_model.py— workaround compathuggingface_hub1.x: classmethod monkey-patch idempotente para inyectarproxies/resume_downloadque el HF nuevo dejo de pasar (commit3b3378cf).- Sub-repo
dataforge/graph_explorermaster local: merges--no-ffdeissue/0035e-polish-and-tests(commitf614a51) +issue/0013-paste-extract-panel(commit2a49c2b). 125/125 tests pytest verdes. Sin push aun — pendiente confirmacion + validacion Windows.
Fixed (bugs encontrados + raiz + fix)
| Bug | Raiz | Fix |
|---|---|---|
chunk_with_overlap bucle infinito |
Frase mas larga que max_chars, no avanzaba i, OOM-killed por overlap acumulado |
Avance forzado: meter al menos UNA frase aunque exceda max_chars |
| NuExtract degenera en texto largo | Sin repetition_penalty, decoder entra en bucle de tokens repetidos hasta agotar 2048 max_new_tokens |
repetition_penalty=1.15 + chunking obligatorio (179/179 chunks parsed OK tras fix) |
NuExtract AutoProcessor.from_pretrained rota en transformers 5.x |
Sub-processor de video tira TypeError: argument of type 'NoneType' is not iterable (Qwen2-VL) |
Bypass: AutoTokenizer + AutoModelForImageTextToText directamente |
| Vis-network ResizeObserver loop spam (en SES/MetaMask) | Vis-network usa physics simulation → ResizeObserver dispara warnings amplificados por SES | Migrar a Sigma.js + layout server-side via networkx.spring_layout (sin fisica frontend) |
jupyter_exec append HTTP 405 |
jupyter_nbmodel_client espera collab WebSocket Y.js, no soportado al 100% por jupyter-collaboration nuevo |
Documentado en issue 0050; workaround actual: build_notebook scripts con nbformat + nbconvert --execute |
| Kernel startup shadows pip packages | 00_fn_registry.py añade cada subdir de python/functions/ a sys.path top-level → bigquery/datasets.py shadows HF datasets package needed by transformers |
Workaround per-notebook: sys.path = [p for p in sys.path if not p.startswith(_pf+'/')] + añadir solo el padre. Issue futuro pendiente. |
Decisions — vault ADRs
| Decision | Razon |
|---|---|
GLiNER2 (Apache 2.0) sustituye a GLiREL en extract_graph_hybrid |
6/8 relaciones correctas vs 0/1 de GLiREL en es_corporate_short, 1.18s vs 22s de mREBEL, NER+RE en una pasada |
| mREBEL queda como fallback (no comercial) | 4/5 correctas pero CC BY-NC-SA 4.0 + 25× mas lento |
| spaCy ES dep-rules para OpenIE schema-less | Predicado = verbo del texto (querer, abrazar), 5ms/frase, sin alucinaciones |
Threshold 0.3 (vs default 0.5) sweet spot |
+187% relaciones manteniendo precision; 0.2 mete +22% entidades dudosas |
| Coreferencia normalize+substring + post-filter typed = gratis y decisivos | Coref −18% aislados; post-filter elimina Madrid president_of Persona |
| Translate ES→EN + triplet-extract EN NO vale la pena | Pierdes verbos del texto (querer → loves), +500ms-1s, +300MB MarianMT, riesgo nombres propios |
2026-04-28
Added
cpp/functions/core/app_about(app_about_cpp_core) — ventana flotante About conabout_window_set_info(project, version, description),about_window_menu_item("About...")yabout_window_render(). Render automatico viafn::run_app(cableado encpp/framework/app_base.cpp).bash/functions/infra/ensure_repo_synced(ensure_repo_synced_bash_infra) — pipeline idempotente que componegitea_create_repo+gitea_push_directory: crea repo Gitea si falta, inicializa.gitlocal si falta, commitea cambios pendientes y pushea. Defaults: ownerdataforge, branchmaster.analysis.mdpara 6 analyses que estaban en disco pero sin indexar:agent_coding_eval,estudio_embeddings,estudio_mercados,ontology_graph,pruebas_jupyter,retrieving_graphs. Ahora./fn indexreporta 8 analyses (antes 2).- Repos
dataforge/<name>creados en Gitea para apps y analyses que no estaban subidos:agents_and_robots,element_matrix_chat,deploy_server,shaders_lab,voice_guide,agent_coding_eval,ontology_graph,turismo_spain. Cada uno con.gitignoreapropiado para excluir binarios,.venv/,node_modules/,.jupyter*,operations.db*.
Changed
cpp/functions/core/app_menubar: el item top-levelSettings...pasa a ser unBeginMenu("Settings")con dos subitems:Settings...(ventana deapp_settings) yAbout...(nuevo, ventana deapp_about). Las apps que usanfn_ui::app_menubar(nullptr, 0, nullptr)heredan el cambio sin tocar nada.projects/fn_monitoring/apps/registry_dashboard/main.cpp: cableafn_ui::about_window_set_info("fn_registry Dashboard", "0.2.0", "...")antes defn::run_app. TablaAppsgana columnaGitcon valoresremote(repo_url poblado),local(.git/ presente) o-.data.h/data.cpp/data_http.cppdel dashboard:AppRowextendido conrepo_urlydir_path.- 10 repos migrados de branch
mainamasterpara unificar convencion:apps/{docker_tui,fuzzygraph,metabase_registry,pipeline_launcher,rapid_dashboards,script_navegador},analysis/{estudio_embeddings,estudio_mercados,pruebas_jupyter,retrieving_graphs}. Default branch en Gitea actualizado via API (PATCH /repos/{owner}/{repo}con{"default_branch":"master"}), branchmainremota borrada. git config --global init.defaultBranch masterpara que los proximosgit initsean consistentes./full-git-push: descubre apps/analyses sin.gity ofrece inicializarlos conensure_repo_syncedautomaticamente. Excluyesubrepos/para evitar duplicacion (mirrors upstream)./full-git-pull: trasfn sync, segunda pasada que clona losdataforge/<name>registrados enapps/analysisque no existan localmente — soluciona el "no pude recuperar la app en el otro PC".bash/functions/infra/ensure_repo_synced.sh: localiza dependencias viaFN_REGISTRY_INFRA_DIRoFN_REGISTRY_ROOT, robusto a sourcing desde zsh/bash.
Fixed
projects/fn_monitoring/apps/sqlite_api/handlers.go|main.go|handlers_test.go+ nuevoshandlers_mutations.goyhandlers_projects.go: cableados endpointsPOST /add_app|add_analysis|add_vault|reindexyGET /projectspara que el dashboard pueda crear artefactos y navegar projects desde la actions bar (estado pendiente de varios dias en uncommitted, ahora versionado endataforge/sqlite_api).- Bug operativo en
sqlite_api(Windows):SO_RCVTIMEOse pasaba comostruct timevalcuando Windows esperaDWORD ms→ timeout efectivo de 5 ms. Ya documentado enapp.mddel dashboard.
2026-04-24
Added
- 6 funciones
bash/infra/systemd_local_*(install_unit, enable, start, restart, status, uninstall) para gestionar servicios systemd del sistema desde el registry (complementa las versiones remotas SSH ya existentes). - Pipeline
install_systemd_service_bash_pipelinesque compone las anteriores: genera unit file + install + enable + start + status. - Servicio systemd
sqlite_api.serviceinstalado y habilitado en aurgi-pc — arranque automático al iniciar WSL en127.0.0.1:8484. projects/fn_monitoring/launcher.sh— launcher del dashboard (arranca API si no está + lanza ventana + cleanup).- Regla
.claude/rules/kiss.md— filosofía KISS para proyectos y apps. - Documentación ADR en
docs/adr/con plantilla y ADR 0001 (experimento GitButler). - Diario en
docs/diary/+ slash command/entrada_diariopara añadir entradas. CHANGELOG.md(este archivo).- Submódulo
cpp/vendor/glfwre-registrado con path limpio (antes heredado con path absoluto/home/lucas/...). - aurgi-pc registrado en el server centralizado (
registry.organic-machine.com) con 18 pc_locations.
Changed
registry.dbahora está gitignorada. Es regenerable confn index+ completable confn sync. Evita conflictos entre ramas y PCs.sqlite_apiahora se distribuye como binario compilado (projects/fn_monitoring/apps/sqlite_api/sqlite_api) en lugar dego runal vuelo.
Fixed
http_client.cppdel dashboard: añadido#include <cstdint>requerido por mingw-w64 para cross-compile Windows (g++ Linux lo incluía transitivamente).registry_dashboard.exe(Windows) ya no abre ventana de consola al lanzarse — enlazado como GUI app (WIN32_EXECUTABLE TRUE/-mwindows).
Added (design system C++)
cpp/functions/core/tokens— design tokens para dashboards ImGui (colors, spacing, radius, font_size) inspirados en@fn_library(Mantine v9). Paleta dark + indigo primary.apply_dark_theme()aplica los tokens alImGuiStyleglobal.cpp/functions/core/badge— etiqueta inline con 6 variantes (Default/Success/Warning/Error/Info/Outline). Equivalente a<Badge>de@fn_library.cpp/functions/core/empty_state— placeholder centrado para tablas/listas vacías.cpp/functions/core/page_header— header de página con título/subtítulo + hueco para acciones + separator.registry_dashboardmigrado a los nuevos componentes:page_header_begin/enden el header,empty_stateen las 4 tablas cuando están vacías,apply_dark_theme()al primer frame. Sin hardcode de colores disperso.systemd_local_{enable,start,restart}: stdout desystemctlredirigido a stderr para no contaminar el JSON capturado por el pipeline..gitmodules: entry fantasmacpp/vendor/glfwcon path absoluto/home/lucas/...que bloqueabagit submodule statusy el cross-compile Windows.
Removed
- Integración de GitButler de Claude Code — binario
~/.local/bin/but, plugingitbutler-tools, skill.claude/skills/gitbutler/, hooks ensettings.json, ramasgitbutler/*+e-branch-*, estado interno.git/gitbutler/. Ver ADR 0001 para motivos.