Files
fn_registry/dev/proposals_e2e_checks_0121/primitives_gallery.yaml
T
egutierrez fc4180cbb3 chore: auto-commit (129 archivos)
- .claude/agents/fn-analizador/SKILL.md
- .claude/agents/fn-constructor/SKILL.md
- .claude/agents/fn-executor/SKILL.md
- .claude/agents/fn-mejorador/SKILL.md
- .claude/agents/fn-orquestador/SKILL.md
- .claude/agents/fn-recopilador/SKILL.md
- .claude/commands/app.md
- .claude/commands/compile.md
- .claude/commands/cpp-app.md
- .claude/commands/create_functions.md
- ...

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-01 22:23:12 +02:00

149 lines
8.1 KiB
YAML

# Propuesta e2e_checks para apps/primitives_gallery
# Generado por fn-recopilador modo design-e2e
# Issue: 0121a wave 2
# Fecha: 2026-05-19
#
# Diagnostico:
# lang=cpp, framework=imgui (fn::run_app), domain=gfx
# toolchain: mingw-w64 (cross-compile Windows desde WSL)
# modulos: main.cpp + capture.cpp + demo.cpp + 12 demos_*.cpp
# + 44 .cpp del registry (core + viz + gfx — el set mas grande del ecosistema)
# demos catalogadas: 43 entradas en k_demos[] (k_demo_count = 43)
# Core (20): button, icon_button, toolbar, modal_dialog, text_input, select, toast,
# tree_view, badge, empty_state, page_header, dashboard_panel, kpi_card,
# text_editor, file_watcher, process_runner, tween, bezier_editor,
# timeline, sql_workbench
# Viz (20): bar_chart, pie_chart, line_plot, scatter_plot, histogram, sparkline,
# graph_viewport, graph_styles, candlestick, gauge, heatmap, table_view,
# surface_plot_3d, scatter_3d, mesh_viewer, treemap, sankey, chord,
# contour, voronoi
# Gfx (3): shader_canvas, gl_texture, gl_info
# deps externas: SQLite::SQLite3, stb (vendor), imgui_text_edit (vendor)
# persistencia propia: ninguna (no BD, no state files)
# sin tests/ ni tests_*.py
# sin tag 'service': no expone HTTP (smoke con health: OMITIDO)
# operations.db: NO usa (ops_audit: OMITIDO)
#
# FLAG --capture:
# Confirmado en main.cpp (L186-215): rama headless que crea ventana GLFW
# GLFW_VISIBLE=FALSE + GL 3.3 core (deliberadamente baja para WSL Mesa/llvmpipe).
# Requiere contexto OpenGL real. En WSL sin GPU: LIBGL_ALWAYS_SOFTWARE=1 (Mesa).
# En WSL sin display (headless puro): GLFW requiere $DISPLAY o EGL offscreen.
# La severidad de capture_mode se marca WARNING (no critical) porque WSL2 sin
# libGL Mesa puede no entregar contexto GL valido — el check diagnostica pero
# no bloquea el build gate si el entorno no tiene driver GL.
#
# FLAG --list-demos: NO existe. main.cpp no tiene subcomando de listado.
# demos_count: OMITIDO — no hay forma de obtener el conteo sin invocar GL.
# Alternativa implementada: demos_count_static verifica el conteo en fuente.
#
# Patron: C++ ImGui app con modo --capture headless-GL
app_id: primitives_gallery
e2e_checks:
# Build del target completo para Windows via mingw-w64.
# primitives_gallery es el artefacto con mayor numero de .cpp del registry
# enlazados (44 archivos: core + viz + gfx). Si cualquier funcion del registry
# rompe su API de compilacion, este check lo detecta antes de que otro app falle.
# Actua como build gate del registry de funciones C++.
- id: build
cmd: "cmake --build $HOME/fn_registry/cpp/build/windows --target primitives_gallery -j"
timeout_s: 300
severity: critical
# Verifica que el artefacto .exe existe tras el build.
# El build puede reportar exit 0 con -j en builds parciales sin producir binario.
# Sin este check, capture_mode fallaria con un mensaje de error menos claro.
- id: binary_exists
cmd: "test -f $HOME/fn_registry/cpp/build/windows/apps/primitives_gallery/primitives_gallery.exe"
timeout_s: 5
severity: critical
# Modo --capture headless: crea ventana GLFW VISIBLE=FALSE + GL 3.3 core,
# renderiza las 43 demos en offscreen framebuffer y guarda PNG en /tmp/.
# Confirma que: (a) todas las demos compilan y se ejecutan sin crash,
# (b) el pipeline capture.cpp funciona hasta stbi_write_png,
# (c) ninguna demo provoca SIGSEGV/assertion al primer frame (warmup=3).
#
# Requiere contexto OpenGL real. En WSL sin GPU usar:
# LIBGL_ALWAYS_SOFTWARE=1 (Mesa/llvmpipe) — disponible si mesa-utils instalado.
# Si el entorno no puede entregar GL context, glfwCreateWindow retorna NULL y
# el binario sale con exit 1 (ver capture.cpp L62-68).
# Marcado WARNING porque la disponibilidad de GL en CI/WSL headless no esta
# garantizada sin configuracion extra del entorno.
#
# El check verifica que se genero al menos un PNG (button.png es el primero).
# Una suite completa de 43 PNGs indica que todas las demos son estables.
- id: capture_mode
cmd: >
mkdir -p /tmp/primitives_gallery_e2e &&
$HOME/fn_registry/cpp/build/windows/apps/primitives_gallery/primitives_gallery.exe
--capture /tmp/primitives_gallery_e2e
timeout_s: 120
severity: warning
# Nota: en WSL2 sin GPU puede necesitar LIBGL_ALWAYS_SOFTWARE=1 prefijado.
# Si el entorno tiene Mesa: prepend "LIBGL_ALWAYS_SOFTWARE=1" al cmd.
# Sin GL disponible, la demo gl_info y shader_canvas pueden fallar pero
# las demas (Core/Viz) deben seguir siendo capturadas si GL 3.3 esta disponible.
# Verifica que el capture produjo PNGs para las 43 demos catalogadas en k_demos[].
# Cada demo debe generar un PNG nombrado por su id (ej. button.png, bar_chart.png).
# Este check distingue "capture arranco y capturo algo" (capture_mode) de
# "capture completo todas las demos sin skip". Se puede ejecutar solo si
# capture_mode paso.
# Cuenta archivos .png en el dir de salida y compara con k_demo_count=43.
- id: capture_completeness
cmd: >
count=$(ls /tmp/primitives_gallery_e2e/*.png 2>/dev/null | wc -l);
echo "PNG count: $count";
test "$count" -ge 43
timeout_s: 10
severity: warning
# Nota: depende de capture_mode. Si capture_mode fallo por falta de GL,
# este check tambien fallara (warning, no bloquea gate).
# Verifica que el .ico esta presente junto al fuente de la app.
# add_imgui_app genera primitives_gallery_appicon.rc que windres incluye
# como recurso (.rsrc) en el .exe. Si appicon.ico falta, el build pasa
# pero el .exe queda sin icono embebido (visible en Explorer + taskbar).
- id: icon_exists
cmd: "test -f $HOME/fn_registry/apps/primitives_gallery/appicon.ico"
timeout_s: 5
severity: warning
# Verifica estaticamente que el conteo de demos en fuente es consistente.
# k_demo_count se deriva de sizeof(k_demos)/sizeof(k_demos[0]) en main.cpp.
# Cuenta las entradas de DemoEntry en k_demos[] usando grep en main.cpp
# como proxy — detecta si se añadio una demo al array pero no al modulo
# demos_*.cpp (lo que provocaria un linker error en build, pero este check
# da feedback mas temprano en el ciclo).
# Referencia esperada: 43 entradas (conteo manual de k_demos[] en main.cpp L37-84).
- id: demos_count_static
cmd: >
count=$(grep -c '^\s*{"' $HOME/fn_registry/apps/primitives_gallery/main.cpp);
echo "DemoEntry count in source: $count";
test "$count" -ge 43
timeout_s: 5
severity: warning
# Nota: el grep cuenta lineas con '{"' en main.cpp — patron exclusivo de las
# entradas de k_demos[]. Si el formato de k_demos[] cambia, revisar el patron.
# Justificacion por check:
# | check | razon |
# |----------------------|----------------------------------------------------------------------------|
# | build | 44 .cpp del registry enlazados — build gate de API C++ del registry entero |
# | binary_exists | confirma que cmake produjo .exe (no solo exit 0) |
# | capture_mode | --capture es headless-GL (GLFW invisible + GL 3.3); confirma no-crash 43 |
# | capture_completeness | distingue "algo capturado" de "todas las demos completas" |
# | icon_exists | .ico requerido para windres embeds — faltante no rompe build pero si deploy |
# | demos_count_static | detecta drift entre k_demos[] en fuente y modulos demos_*.cpp |
#
# checks OMITIDOS y razon:
# | check | razon de omision |
# |-------------|-----------------------------------------------------------------------------|
# | ops_audit | no usa operations.db |
# | smoke/health | no es service, no expone HTTP |
# | demos_count | --list-demos no existe en el binario; no hay forma headless sin GL |
# | self_test | fn::run_app no parsea --self-test; no implementado en main.cpp |