Files
fn_registry/dev/proposals_e2e_checks_0121/fn_match.yaml
T
egutierrez 1d3d2f43b3 feat(0121a): wave 2 e2e_checks proposals (8 apps) + README updated
8 fn-recopilador design-e2e paralelos:
- services_api      (Go service, schema custom operations.db)
- registry_mcp      (Go stdio MCP, JSON-RPC handshake test)
- sqlite_api        (Go service read-only HTTP, query_endpoint)
- registry_dashboard (C++ ImGui, NO Go+React como yo supuse)
- primitives_gallery (C++ build gate de toda API C++ del registry, 44 .cpp)
- pipeline_launcher (Go TUI bubbletea)
- docker_tui        (Go TUI + go-duckdb)
- fn_match          (subcmd ./fn, hook helper, fuzzy match)

13/26 apps cubiertas. README documenta:
- 6 bugs/drift descubiertos lateral (dag_engine x3, deploy_server,
  pipeline_launcher, docker_tui).
- 3 correcciones de mi prompt (yo asumi stacks incorrectos).
- Hallazgos arquitectonicos (primitives_gallery = build gate C++).

Pendiente wave 3 (13 apps) + 0121b + 0121c.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 00:43:09 +02:00

128 lines
6.7 KiB
YAML

# e2e_checks proposal — fn_match
#
# app_id: fn_match
# lang: go
# stack: hook helper — subcomando de fn CLI (cmd/fn/match.go), CGO+FTS5,
# reads registry.db read-write-open (WAL visibility), no service,
# invocado por PreToolUse hook en cada comando Bash interceptado
# date: 2026-05-19
# issue: 0121a wave 2 (design-e2e fn-recopilador)
#
# Diagnostico del stack:
# - entry_point: cmd/fn/match.go — NO es un binario separado. Es el subcomando
# `fn match` del CLI principal compilado con `CGO_ENABLED=1 go build -tags fts5`.
# El binario resultante vive en la raiz del repo como `./fn`.
# - sin framework: proceso one-shot, sin servidor HTTP, sin health endpoint.
# - CGO_ENABLED=1 obligatorio (mattn/go-sqlite3 + FTS5 virtual table).
# - Lee registry.db abriendo conexion normal (no ?mode=ro) porque bm25() con
# WAL no checkpointed falla con "missing row from content table" en modo ro.
# Gotcha documentado en app.md.
# - no hay *_test.go especifico para match.go — solo cmd_vault_test.go en el
# mismo package. Check "tests" incluye vault tests (go test ./cmd/fn/...).
# - sin operations.db ni e2e_runs history => ops_audit omitido.
# - Performance critica: hook llama `fn match` en cada Bash command del agente.
# Latencia medida: 7-9ms en WSL2 (1255 funciones indexadas). Objetivo: <200ms.
# - high_confidence gate real del hook: raw_score >= 4.0 Y gap top1/top2 > 1.5
# en raw scores. El normalizado siempre devuelve 1.0 para el top — no sirve
# como gate de confianza absoluto.
#
# Instrucciones de adopcion:
# 1. Copiar el bloque "e2e_checks:" al frontmatter de apps/fn_match/app.md
# (despues del bloque de params/output y antes de "## Ejemplo").
# 2. Los checks asumen que ./fn existe en la raiz del repo. Si no:
# ejecutar primero el check "build" manualmente.
# 3. El check "latency_under_200ms" puede variar en CI (disco lento, cold start).
# Si falla consistentemente en CI pero pasa local, bajar a severity: warning.
# 4. El check "match_known_pattern" usa una consulta que produce deploy_cpp_exe_to_windows_bash_infra
# como top hit. Si esa funcion se renombra o borra, el check falla — actualizar
# expect_stdout_contains con el nuevo ID.
#
# Verificacion previa de las queries usadas en los checks (2026-05-19):
# $ ./fn match "taskkill.exe /IM registry_dashboard.exe /F" --format text
# [1.000] deploy_cpp_exe_to_windows_bash_infra raw=4.06 high_confidence=false
# $ ./fn match "echo hola"
# top: 3 hits, todos raw ~0.208 (< 4.0), high_confidence=false
# $ ./fn match "echo hola" | latency: 7-9ms
#
# NOTA: NO escribir directo al app.md — propuesta para revision humana.
e2e_checks:
# --- build ---
# Compila el subcomando fn match (y todo el CLI) con CGO+FTS5.
# fn match no es binario separado: vive en cmd/fn/ junto al resto del CLI.
# El binario resultante es ./fn en la raiz del repo.
- id: build
cmd: "CGO_ENABLED=1 go build -tags fts5 -o fn ./cmd/fn/"
timeout_s: 120
severity: critical
# por que: match.go usa go-sqlite3 (CGO) y FTS5 virtual tables. Sin -tags fts5
# el indice FTS5 de registry.db no esta disponible y bm25() falla en runtime.
# Fallo de build indica dep rota o cambio de API en cmd/fn/main.go.
# --- tests ---
# Corre el unico test suite del package cmd/fn (cmd_vault_test.go).
# No hay match_test.go dedicado — los tests de integracion del subcomando
# match estan cubiertos por match_known_pattern y match_no_false_positive abajo.
- id: tests
cmd: "CGO_ENABLED=1 go test -tags fts5 -count=1 ./cmd/fn/..."
timeout_s: 120
severity: warning
# por que: los vault tests validan la plomeria del CLI (build, flags, JSON output).
# Severity warning porque no hay test unitario de match.go; si se anade
# match_test.go en el futuro, ascender a critical.
# --- match_known_pattern ---
# Ejecuta fn match con un patron conocido que debe producir un hit de alta
# confianza. Usa "taskkill.exe /IM registry_dashboard.exe /F" porque:
# - token "taskkill" es un bashMarker (penaliza hits Python/bash cruzados)
# - "dashboard" y "exe" son tokens especificos con matches en el registry
# - resultado esperado top[0] = deploy_cpp_exe_to_windows_bash_infra (raw=4.06)
# Verifica que el pipeline de tokenize + FTS5 + scoring funciona end-to-end.
- id: match_known_pattern
cmd: "./fn match \"taskkill.exe /IM registry_dashboard.exe /F\""
expect_stdout_contains: "deploy_cpp_exe_to_windows_bash_infra"
timeout_s: 15
severity: critical
# por que: si este check falla, el hook PreToolUse no puede sugerir alternativas
# del registry para comandos taskkill — uno de los patrones mas comunes en
# sesiones de deploy C++. Indica regresion en tokenizer, FTS5 query builder,
# o scoring. También detecta si la funcion fue renombrada/borrada del registry.
# --- match_no_false_positive ---
# Verifica que un comando trivial sin equivalente en el registry NO produce
# un hit de alta confianza. "echo hola" devuelve 3 hits con raw_score ~0.208
# (todos < 4.0, threshold de high_confidence) y high_confidence=false.
# El hook solo inyecta un hint cuando high_confidence=true — esto valida que
# no hay spam de sugerencias para comandos inocuos.
- id: match_no_false_positive
cmd: "./fn match \"echo hola\""
expect_stdout_contains: '"high_confidence": false'
timeout_s: 10
severity: warning
# por que: un false positive en el hook interrumpe el flujo del agente con
# sugerencias irrelevantes. Severity warning porque la penalizacion es UX,
# no correctitud. Si el registro crece con funciones de "echo" / logging
# y el raw_score sube por encima de 4.0, revisar umbral minRawForHighConf
# en cmd/fn/match.go (actualmente 4.0).
# --- latency_under_200ms ---
# Mide que una invocacion de fn match completa en < 200ms (proceso fresh,
# sin daemon). El objetivo documentado es < 50ms (medido 7-9ms en WSL2).
# El threshold de 200ms da margen para CI mas lento y disco frio.
# Se usa el patron known (taskkill) para medir un caso real con FTS5 activo.
- id: latency_under_200ms
cmd: >
START=$(date +%s%3N) &&
./fn match "taskkill.exe /IM registry_dashboard.exe /F" > /dev/null &&
END=$(date +%s%3N) &&
MS=$((END - START)) &&
echo "latency=${MS}ms" &&
[ "$MS" -lt 200 ]
timeout_s: 10
severity: warning
# por que: fn match es llamado por el hook PreToolUse en CADA comando Bash
# del agente. Si la latencia supera 200ms, el hook se convierte en friccion
# perceptible (~40% del round-trip tipico de 500ms). Severity warning porque
# el threshold es conservador (10x el valor medido); solo alarma si hay
# regresion grave (disco frio, WAL grande no checkpointed, CGO rebuild).