# Propuesta e2e_checks para apps/services_monitor
# Generado por fn-recopilador modo design-e2e
# Fecha: 2026-05-19
# Issue: 0121a wave 3
#
# Diagnostico:
#   app_id=services_monitor, lang=cpp, framework=imgui (fn::run_app)
#   domain=tools, version=0.1.0
#   modulos: main.cpp + http_client.cpp (TCP raw, no libcurl)
#   deps externas: fn_module_data_table (issue 0097), ws2_32 (WIN32)
#   vendor: vendor/nlohmann/json.hpp (header-only, bundled)
#   HTTP client: HttpClient propio sobre sockets POSIX/WIN32
#   target API: services_api en 127.0.0.1:8485 — GET /api/services, POST /api/check
#   tag 'service': NO (es frontend GUI, no daemon)
#   operations.db: NO usa (ops_audit: OMITIDO)
#   tests/: NO (directorio ausente, check tests: OMITIDO)
#   --self-test: fn::run_app no parsea argv (piloto 0120 confirmado)
#   appicon.ico: PRESENTE (phosphor=pulse, accent=#10b981)
#   integration check: services_api en :8485 — dependencia externa; severity=warning
#
# Patron: C++ ImGui — checks estructurales sin lanzar GUI ni GPU.
# El check de integracion (integration_api) es warning porque services_api
# puede estar parada en el entorno de CI y no debe bloquear el gate.

app_id: services_monitor

e2e_checks:
  # Build: compila el target services_monitor via cmake.
  # Valida main.cpp + http_client.cpp + enlace con fn_module_data_table
  # (data_table::render, issue 0097) y ws2_32 en WIN32.
  # Detecta regresiones de API en data_table o cambios de firma en http_client.h.
  - id: build
    cmd: "cmake --build /home/lucas/fn_registry/cpp/build/windows --target services_monitor -j"
    timeout_s: 300
    severity: critical

  # Verifica que el .exe existe tras el build.
  # Detecta casos donde cmake sale con exit 0 pero el linker fallo silenciosamente
  # (ha ocurrido con fn_module_data_table cuando el target es condicional via
  # if(TARGET fn_module_data_table) sin hacer REQUIRED).
  - id: binary_exists
    cmd: "test -f /home/lucas/fn_registry/cpp/build/windows/apps/services_monitor/services_monitor.exe"
    timeout_s: 5
    severity: critical

  # Verifica que el .ico esta presente junto al fuente de la app.
  # add_imgui_app genera services_monitor_appicon.rc que windres embebe en el .exe;
  # si el .ico falta el build pasa pero el .exe queda sin icono (phosphor=pulse
  # accent=#10b981 segun app.md). Visible al copiar a Desktop/apps/.
  - id: icon_exists
    cmd: "test -f /home/lucas/fn_registry/apps/services_monitor/appicon.ico"
    timeout_s: 5
    severity: warning

  # Integration check: si services_api esta corriendo en :8485, GET /api/services
  # debe responder 200 con un JSON que contenga la clave "services".
  # Severity WARNING: services_api puede no estar activa en CI. Este check sirve
  # como smoke de conectividad y parseo de respuesta, no como gate de merge.
  # Para activarlo en entornos donde services_api siempre corre, escalar a critical.
  - id: integration_api
    cmd: >
      curl -sf --max-time 5 http://127.0.0.1:8485/api/services
      | python3 -c "import sys,json; d=json.load(sys.stdin); assert 'services' in d, 'key services missing'"
    timeout_s: 10
    severity: warning

# Justificacion de checks incluidos / omitidos:
#
# | check           | razon |
# |-----------------|-------|
# | build           | valida compilacion de main.cpp + http_client.cpp + linkado data_table |
# | binary_exists   | detecta linker silencioso cuando fn_module_data_table es condicional |
# | icon_exists     | app.md declara phosphor+accent; .ico debe existir para windres |
# | integration_api | app es un cliente HTTP puro; sin conexion a services_api no hay datos |
# | ops_audit       | OMITIDO — no usa operations.db |
# | tests           | OMITIDO — sin directorio tests/ ni *_test.* detectados |
# | self_test       | OMITIDO — fn::run_app no parsea argv (confirmado piloto 0120) |
# | smoke (GUI)     | OMITIDO — app GUI, requiere display + GPU, no viable en CI headless |
