# e2e_checks proposal for apps/registry_mcp # # Generado por fn-recopilador en modo design-e2e. # NO modifica app.md directamente — propuesta para revision humana. # Copiar el bloque e2e_checks al frontmatter de apps/registry_mcp/app.md # tras aprobar. # # Diagnostico: # lang=go, framework=mcp (github.com/mark3labs/mcp-go) # tag service → runtime=stdio (no puerto HTTP, no health endpoint) # entry_point=main.go, build requiere CGO_ENABLED=1 -tags fts5 (sqlite + FTS5) # tests: naming_test.go (TestValidateName/TestValidateDomain) # fts_test.go (TestSanitizeFTS5/TestIsSnakeCase) # format_test.go (TestRenderFunctionMarkdown/TestLangFence/TestTruncate) # integration_test.go (TestIntegration_StdioListSearchShow/TestIntegration_SearchByTag) # -> los integration tests arrancan el servidor en-proceso con pipes, NO # requieren binario compilado, pero SI requieren registry.db accesible. # operations.db: NO presente — la app no usa operations.db propia. # frontend: NO. # migrations/: NO (lee registry.db en modo ro, no escribe schema). # gating flags: --enable-run y --enable-write — NO se testean aqui (requieren # credenciales/estado externo). Solo se validan los tools read-only. # # Checks propuestos: # build -> compilar con CGO+fts5. Gate critico: si no compila, nada mas importa. # tests_unit -> go test ./... (unit tests puros: naming, fts, format). # Los integration tests necesitan registry.db; se corre todo porque # integration_test.go hace findRegistryRoot(t) y hace t.Skip si # no lo encuentra. En el entorno de dev hay registry.db en la raiz, # por tanto los integration tests CORREN. # naming_reject -> smoke del validador de nombres: input invalido debe salir con # exit != 0 o stdout/stderr con "naming:" / "action verb". # Se implementa via go test -run TestValidateName directamente # (mas simple y determinista que un binario auxiliar). # mcp_handshake -> arranca el binario en modo stdio, envia initialize JSON-RPC # por stdin, espera respuesta JSON valida con "result" en stdout. # Usa FN_REGISTRY_ROOT explicito y timeout de 5s con bash+kill. # Es el smoke mas util: prueba que el binario abre la BD, # registra tools y responde al protocolo MCP correctamente. app_id: registry_mcp dir_path: apps/registry_mcp generated_by: fn-recopilador generated_at: "2026-05-19" e2e_checks: # ------------------------------------------------------------------- # 1. BUILD — compilar con CGO + FTS5. Sin esto el resto no sirve. # CGO_ENABLED=1 es obligatorio para go-sqlite3 (FTS5 tag lo exige). # ------------------------------------------------------------------- - id: build cmd: > cd /home/lucas/fn_registry/apps/registry_mcp && CGO_ENABLED=1 go build -tags fts5 -o registry_mcp . timeout_s: 120 severity: critical # por que: gate fundamental. Build roto = binario inexistente = nada funciona. # ------------------------------------------------------------------- # 2. TESTS — unit + integration. Los integration_tests arrancan el # servidor con pipes en-proceso; no necesitan binario pero si # registry.db en la raiz del repo (findRegistryRoot hace t.Skip si # no la encuentra). En dev siempre esta disponible. # ------------------------------------------------------------------- - id: tests cmd: > cd /home/lucas/fn_registry/apps/registry_mcp && CGO_ENABLED=1 go test -tags fts5 -count=1 -timeout 60s ./... timeout_s: 90 severity: critical # por que: cubre naming validator, FTS5 sanitizer, markdown renderer # y el handshake stdio completo (tools/list + fn_search + fn_show) # via TestIntegration_StdioListSearchShow. # ------------------------------------------------------------------- # 3. NAMING_REJECT — el validator de nombres (naming.go) debe rechazar # input invalido. Valida que la regla ids_naming.md esta codificada # y activa. Se ejercita directamente via go test -run. # Expected: PASS (el test Table case "Slice" espera err != nil). # ------------------------------------------------------------------- - id: naming_reject cmd: > cd /home/lucas/fn_registry/apps/registry_mcp && CGO_ENABLED=1 go test -tags fts5 -count=1 -run TestValidateName -v 2>&1 | grep -q "PASS" timeout_s: 30 severity: critical # por que: fn_create_function llama al validator antes de escribir archivos. # Si el validator acepta nombres invalidos (PascalCase, bare nouns), # el registry se corrompe con IDs no-canonicos. Este check lo detecta. # ------------------------------------------------------------------- # 4. MCP_HANDSHAKE_STDIO — smoke del protocolo JSON-RPC 2.0 real. # Arranca el binario compilado en modo stdio, envia 'initialize', # verifica que la respuesta tiene "result" (MCP ServerInfo valido). # Usa timeout con kill para que no quede colgado. # FN_REGISTRY_ROOT apunta a la raiz del repo donde esta registry.db. # ------------------------------------------------------------------- - id: mcp_handshake_stdio cmd: | BINARY=/home/lucas/fn_registry/apps/registry_mcp/registry_mcp PAYLOAD='{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"e2e_probe","version":"0"}}}' RESPONSE=$(echo "$PAYLOAD" | timeout 5 "$BINARY" \ --registry-root /home/lucas/fn_registry \ --log-level error \ 2>/dev/null | head -n1) echo "response: $RESPONSE" echo "$RESPONSE" | python3 -c " import sys, json r = json.load(sys.stdin) assert 'result' in r, f'missing result key: {r}' assert 'serverInfo' in r['result'] or 'protocolVersion' in r['result'], f'unexpected result: {r[\"result\"]}' print('OK: MCP initialize handshake passed') " timeout_s: 15 severity: critical # por que: es el smoke mas real posible — el mismo protocolo que # Claude Code usa al arrancar la sesion. Detecta regressions # en: apertura de BD, registro de tools, serialization JSON-RPC. # HTTP no se testea aqui (requiere --enable-run/--enable-write config). # ------------------------------------------------------------------- # 5. OPS_AUDIT — auditoria de operations.db. # registry_mcp no tiene operations.db propia (servicio stdio puro, # no usa el ciclo reactivo). Este check queda como WARNING para # documentar la decision y detectar si en el futuro se crea una BD. # ------------------------------------------------------------------- - id: ops_audit ref: "fn-recopilador:apps/registry_mcp" severity: warning # por que: registry_mcp no usa operations.db hoy (runtime stdio sin # entities/executions propias). Check WARNING para detectar # si se anade en el futuro sin actualizar estos checks.