---
id: "0044"
title: "Auditar 52 funciones C++ huerfanas y poblar uses_functions"
status: completado
type: chore
domain:
  - cpp-stack
scope: multi-app
priority: media
depends: []
blocks: []
related: []
created: 2026-05-17
updated: 2026-05-17
tags: []
---
# 0044 — Auditar 52 funciones C++ huerfanas y poblar uses_functions

## Metadata

| Campo | Valor |
|-------|-------|
| **ID** | 0044 |
| **Estado** | pendiente |
| **Prioridad** | media |
| **Tipo** | chore — registry hygiene |

## Dependencias

Ninguna.

---

## Objetivo

Resolver las 52 funciones C++ que aparecen sin `uses_functions` en `registry.db`: o son legitimamente independientes, o se usan pero no se registra la dependencia (caso `fps_overlay` que se invoca desde `app_base.cpp` pero no aparece). Resultado: `uses_functions` reflejando la verdad.

## Contexto

Ejemplos detectados:
- `fps_overlay` — usado por `app_base.cpp`, no registrado.
- `tokens` — usado por 16+ componentes, ya registrado bien.
- `tween_curves`, `orbit_camera`, `time_series_buffer`, `graph_force_layout`, `plot_theme` — sin consumidores visibles. Verificar si estan en gallery/chart_demo o son scaffolding.
- `app_settings`, `app_about`, `app_menubar`, `icon_font` — usados por `app_base.cpp`, no registrados.

## Arquitectura

Este issue NO modifica codigo C++. Solo modifica:

- Frontmatter `.md` de funciones huerfanas para anadir `uses_functions: [...]` reflejando llamadas reales.
- Eventualmente borrar funciones que se confirmen sin uso real ni plan de uso (con el OK del usuario via comment en el issue).

## Tareas

### Fase 1 — Lista exacta

1.1 Generar la lista actual:
```bash
sqlite3 registry.db "SELECT id FROM functions WHERE lang='cpp' AND uses_functions = '[]' ORDER BY id;"
```
1.2 Para cada id, hacer `grep -rn "<name>" cpp/ projects/*/apps/*/` y ver donde se invoca.

### Fase 2 — Categorizar

Para cada huerfana, asignar uno de estos estados (anotar en una tabla en este issue):
- **USED** — se invoca desde otra funcion/app. Anadir el caller a `uses_functions` del consumidor (no del huerfano).
- **DEMO_ONLY** — solo en `primitives_gallery` o demos. OK como esta. Documentar en `.md` como `# scaffolding/demo only`.
- **PLANNED** — sin uso pero hay issue/plan futuro. Anotar en `.md` con referencia.
- **DEAD** — sin uso real ni plan. Candidato a borrar (preguntar al usuario antes).

### Fase 3 — Actualizar frontmatter

3.1 Para cada **USED**: editar el `.md` del CONSUMIDOR para anadir el huerfano a su `uses_functions`. Ejemplo: `app_base.cpp` consume `fps_overlay_cpp_core`, `app_settings_cpp_core`, `app_about_cpp_core`, `app_menubar_cpp_core`, `icon_font_cpp_core`, `tokens_cpp_core`. Pero `app_base` NO esta en functions/ del registry — es un .cpp del framework. **Corregir**: si `app_base.cpp` no esta indexado, registrar como funcion en `cpp/framework/` o documentar la convencion en notes.
3.2 Para **DEMO_ONLY**: anadir nota en frontmatter `notes: "demo en primitives_gallery, scaffolding"`.
3.3 Para **PLANNED**: anadir `notes: "planned use in issue NNNN"`.
3.4 Para **DEAD**: listar en este issue y abrir un sub-issue de delete (no borrar de oficio).

### Fase 4 — Reindex

4.1 `./fn index` para regenerar `registry.db`.
4.2 Verificar:
```bash
sqlite3 registry.db "SELECT COUNT(*) FROM functions WHERE lang='cpp' AND uses_functions = '[]';"
```
La cifra debe bajar significativamente (objetivo: <20 huerfanas reales).

### Fase 5 — Documentar la convencion

5.1 Anadir a `.claude/rules/uses_functions.md` (NEW) la regla: cada vez que un .cpp llama a otra funcion del registry, el `.md` del CONSUMIDOR debe listar la dependencia en `uses_functions`. El indexer no lo deduce automaticamente (el codigo C++ no es trivial de parsear).

## Decisiones

- No borrar funciones sin OK explicito.
- `app_base.cpp` no esta hoy indexado como funcion del registry (es framework). Si decidimos indexarlo, eso es 0048 — ahora solo registramos en uses_functions de los CONSUMIDORES que si esten indexados (gallery, dashboard, etc.).

## Validacion

- `uses_functions` poblados para los casos reales (verificable por SQL).
- `cpp/PATTERNS.md` (de 0041) referencia esta convencion.
- Nada compilado se rompe (este issue NO toca .cpp/.h).
