Files
fn_registry/dev/issues/completed/0109b-skill-tree-rings.md
egutierrez b9716a7cd6 chore: snapshot WIP previo + flow 0008 + 7 sub-issues (0112-0119)
Snapshot de WIP acumulado de sesiones previas antes de merge wave 1
del flow 0008 (kanban_cpp + agent_runner_api + DoD schema).

Incluye:
- dev/flows/0008-kanban-cpp-and-agent-workflows.md
- dev/issues/0112-0119*.md (7 sub-issues)
- WIP previo en cmd/fn/doctor.go, registry/*, modules/, cpp/, etc.

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

3.3 KiB

id, title, status, type, domain, scope, priority, depends, blocks, related, created, updated, tags
id title status type domain scope priority depends blocks related created updated tags
0109b skill_tree layout anillos + render canvas ImDrawList con cards completado feature
meta
cpp-stack
app-scoped media
0109a
0109c
0109
2026-05-17 2026-05-17
skill-tree
cpp
imgui
layout
canvas

0109b — skill_tree layout anillos + render canvas

Segundo slice del epic 0109. Reemplaza la lista textual del Tree por un canvas interactivo basado en ImDrawList. Pivote desde graph_renderer_cpp_viz (GPU) → ImDrawList (CPU) para mantener simplicidad: 166 nodos no justifican el pipeline GPU.

Decisiones tomadas durante la implementacion

  • Stack: ImGui::ImDrawList, NO graph_renderer_cpp_viz. Razon: 166 nodos cabian de sobra en CPU; graph_renderer exige init_gl_loader=true, build de GraphData con tipos OSINT, shaders, FBO + texture flip-Y. Diferencia ~120 LOC + un monton de rebuilds para cero beneficio observable.
  • Sin fisicas (el usuario lo pidio explicito). Layout deterministico via compute_ring_layout_cpp_core.
  • 5 rings: done (0), in-progress (1), unlocked (2), locked (3), deferred/bloqueado (4).
  • 18 sectores radiales = 18 dominios canonicos (dev/TAXONOMY.md). Labels en el aro exterior.
  • Lock derivation: pendiente se subdivide en pendiente_unlocked (todos los depends[] en done) vs pendiente_locked (algun depends sin completar). Set de done IDs se computa al cargar y se cruza con cada depends[].
  • Animacion lerp 1s entre prev y current position cuando un nodo cambia de status_eff entre dos reload_scan()s. Ease-in-out cuadratica.
  • Cards con texto: cada nodo muestra su ID en blanco con sombra negra para legibilidad sobre cualquier color de ring.
  • Diferencial visual flows vs issues: issues = circulos, flows = rombos.
  • Pan: drag con boton derecho o medio.
  • Zoom: rueda del raton, centrado en cursor (re-anchora coordenadas mundo bajo el puntero).
  • Picking: O(N) radius check (166 nodos = trivial; spatial hash innecesario).

Tareas

  1. Crear funcion del registry compute_ring_layout_cpp_core (pure, 10 tests Catch2, FNV-1a determinista para sub-jitter angular).
  2. Reescribir main.cpp::draw_tree() como canvas con ImGui::InvisibleButton + ImDrawList.
  3. Implementar derive_status_eff() para lock/unlock.
  4. Implementar apply_layout() con preservacion de prev_x/prev_y para animacion.
  5. Render: aristas curvas Bezier (depends + related) + nodos con outline + label ID + tooltip on hover.
  6. HUD strip con LV/XP/contadores.
  7. Self-test 0-exit cuando parse_errors == 0 && unmapped == 0.
  8. Build Linux + deploy Windows.

DoD

  • compute_ring_layout_cpp_core indexada (10/10 tests, 142 assertions).
  • apps/skill_tree/main.cpp usa parse_md_frontmatter_cpp_core + compute_ring_layout_cpp_core.
  • app.md uses_functions actualizado con ambas.
  • Self-test imprime breakdown por ring: done=77 in-progress=2 unlocked=64 locked=22 deferred=1 unmapped=0.
  • Linux build OK.
  • Windows deploy OK (PID corriendo).
  • Tarjeta visible en app_hub_launcher.
  • fn doctor cpp-apps limpio.

Sigue

0109c: Inspector evolucionado con DoD parseado de la seccion ## DoD del .md (checkboxes interactivos read-only) + lista de uses_functions del registry para esa issue.