Files
fn_registry/docs/architecture.md
egutierrez 2a3d780347 feat(doctor): add fn doctor CLI + 14 functions for system management
Adds `fn doctor` read-only diagnostic command with subcommands artefacts,
services, sync, uses-functions, unused, and --json flag for agents.
Each subcommand wraps a registry function in functions/infra/.

New functions:
- artefact_doctor, services_status, pc_locations_drift,
  audit_uses_functions, find_unused_functions (Go diagnostics)
- backup_sqlite_db, rotate_backups, wait_for_http, wait_for_port,
  port_kill, tail_journal, pre_commit_hook_install (bash utilities)
- notify_telegram (Go HTTP)
- backup_all pipeline (tag launcher)

Plus prior session leftovers (scan_secrets_in_dirty, append_diary_entry,
git utilities, http_session_cookie_middleware, compile/full-git pipelines).

Fixes pc_locations_drift filepath.Join bug with absolute dir_path.
Documents fn doctor in CLAUDE.md, .claude/rules/fn_doctor.md (rule 23),
docs/architecture.md, CHANGELOG.md (2026-05-07), and diary entry.

First fn doctor uses-functions run found drift in 7/12 apps (deuda
para sincronizar app.md con imports reales).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 01:42:10 +02:00

5.1 KiB

Arquitectura del sistema


Dos bases de datos, dos propósitos

Registry (esta BBDD) Operacional (por proyecto)
Qué almacena Lo que sabes hacer Lo que has hecho y cómo fluye
Naturaleza Conocimiento estático Conocimiento dinámico
Cuándo cambia Solo al añadir código En cada proyecto activo
Scope Compartida entre todos los proyectos Local a cada proyecto
Tablas functions, types entities, relations

Registry — estructura de directorios

fn-registry/
  functions/
    core/
      filter_slice.go
      filter_slice.md
    finance/
      parse_ohlcv.go
      parse_ohlcv.md
    io/
      fetch_ticks.go
      fetch_ticks.md
    pipelines/
      tick_to_ohlcv.go
      tick_to_ohlcv.md
    components/
      DataTable.tsx
      DataTable.md
  types/
    core/
      result.go
      result.md
    finance/
      ohlcv.go
      ohlcv.md
  registry.db       ← SQLite, solo índice FTS. Regenerable siempre.
  fn                ← binario CLI

Los archivos .go / .tsx son la fuente de verdad del código. Los archivos .md son la fuente de verdad de la documentación. registry.db es solo el índice — si se borra, fn index lo regenera en segundos.


CLI — comandos

fn search "filter predicate sin mutar"   # búsqueda FTS sobre nombre, descripción, tags, signature
fn search -k function -p pure "slice"    # filtrar por kind y purity
fn search -l go -d finance "ohlcv"       # filtrar por lang y domain
fn search -k component "tabla datos"     # buscar componentes React

fn add                                   # abre $EDITOR con template según kind
fn show filter_slice_go_core             # imprime entrada completa
fn index                                 # regenera registry.db desde los .md

fn list                                  # lista todas las entradas
fn list -d finance                       # lista por dominio
fn list -k pipeline                      # lista solo pipelines

Operacional — tablas por proyecto

Cada proyecto tiene su propia BBDD operacional que referencia IDs del registry.

Entities

Instancias concretas de tipos registrados dentro de un contexto de ejecución.

Campo Tipo Descripción
id string Identificador único
name string Nombre semántico (ticks_btcusdt)
type_ref string Referencia al types.id del registry
description text Qué representa en este dominio concreto
tags []string Etiquetas

Relations

Cómo las entidades se conectan a través de funciones o pipelines.

Campo Tipo Descripción
id string Identificador único
from_entity string Entidad origen
to_entity string Entidad destino
via string functions.id que transforma
description text Qué ocurre en esta transformación
purity enum pure | impure

El agente y el registry

El agente consulta el registry para:

  1. Descubrir qué funciones y tipos existen en un dominio
  2. Razonar sobre composabilidad comparando returns con uses_types
  3. Priorizar funciones puras para el núcleo del pipeline
  4. Aislar impuras en los bordes
  5. Verificar que los contratos no están rotos comparando version

El agente consulta la operacional para:

  1. Entender qué entidades fluyen en este proyecto concreto
  2. Ver qué transformaciones ya están modeladas
  3. Detectar patrones de uso frecuentes

Capa diagnostica: fn doctor

Sobre el modelo registry+operations existe el comando fn doctor (read-only) que reporta estado del sistema:

  • artefacts — salud por artefacto (git/venv/manifest/upstream).
  • services — apps tag service + systemctl + puerto.
  • sync — drift pc_locations BD vs disco del PC actual.
  • uses-functions — drift entre imports reales en codigo de apps y uses_functions declarado en app.md.
  • unused — funciones del registry sin consumidores.

Cada subcomando es wrapper fino sobre una funcion del registry (functions/infra/{artefact_doctor,services_status,pc_locations_drift,audit_uses_functions,find_unused_functions}.go). La logica vive en el registry; el CLI solo formatea. --json produce salida estructurada para agentes. Detalle en .claude/rules/fn_doctor.md.

Util tras deploys, fn sync, git pull masivos o como gate antes de evaluar metricas del bucle reactivo.


Mejoras incorporadas al schema v1.0

Problema Solución
IDs frágiles con colisiones Formato {name}_{lang}_{domain} + UUID interno
lang libre fragmenta el índice Enum controlado, normalizado al indexar
Sin versionado Campo version semver en functions y types
file_path absoluta se rompe al mover Siempre relativa a la raíz del registry
Sin contexto de dominio Campo domain obligatorio
Sin trazabilidad temporal created_at / updated_at automáticos
signature ambigua en lenguajes dinámicos Convención formal definida para Python/SQL
Pura que devuelve opcional mal modelada Regla: modelar como tipo suma, no returns_optional: true