Skip to content

fix(#54)+qa: cluster campos, QA-018/029, refactor 4A/4B parcial#60

Merged
anlaco merged 13 commits into
mainfrom
refactor/fase4-estructural
Apr 8, 2026
Merged

fix(#54)+qa: cluster campos, QA-018/029, refactor 4A/4B parcial#60
anlaco merged 13 commits into
mainfrom
refactor/fase4-estructural

Conversation

@anlaco
Copy link
Copy Markdown
Owner

@anlaco anlaco commented Apr 8, 2026

Summary

  • Bug bug: Cluster — elementos no persisten y no aparecen puertos al añadir campos #54 — Cluster-control/indicator no persistían campos ni mostraban puertos en el BD:
    • canvas.red: añadidos cluster-control/cluster-indicator al handler dbl-click
    • model.red: cluster-in-ports incluye cluster-indicator; cluster-out-ports incluye cluster-control
    • panel.red: cluster-indicator ahora editable desde el FP
  • QA-018 — Protección contra múltiples wires al mismo puerto entrada: helper wire-port-in-used? en model.red + 3 guardas en canvas.red
  • QA-029save-panel-to-diagram serializa item/value (valor actual) en lugar de item/default
  • Refactor 4A/4B parcial (iniciativa del agente opencode): load-panel-from-diagram movida a file-io.red; apply-*-value en canvas.red usan set-config

Test plan

  • 465 tests PASS (450 anteriores + 15 nuevos)
  • Tests nuevos: cluster-control/cluster-indicator puertos, wire-port-in-used?, QA-029 round-trip
  • Prueba manual: crear cluster-ctrl en FP, dbl-click en BD, añadir campos, cerrar, verificar puertos y persistencia

🤖 Generated with Claude Code

OpenCodeMCP-BetaTest and others added 13 commits April 8, 2026 09:03
Bug #54 — Cluster no persiste campos:
- canvas.red: cluster-control/cluster-indicator en dbl-click handler
- model.red: cluster-in-ports incluye cluster-indicator, cluster-out-ports incluye cluster-control
- panel.red: cluster-indicator con editor en FP (on-down + on-dbl-click)

QA-018 — Protección múltiples wires al mismo puerto entrada:
- model.red: helper wire-port-in-used?
- canvas.red: 3 guardas al crear wires

QA-029 — save-panel-to-diagram serializa item/value en lugar de item/default

Refactor 4A/4B (parcial, por agente):
- load-panel-from-diagram movida de panel.red → file-io.red
- apply-const/str/arr-value en canvas.red usan set-config

Tests: 450 → 465 PASS (15 nuevos: cluster-control/indicator ports, wire-port-in-used?, QA-029 round-trip)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…headless prints

#48 — cluster-control/indicator renderizan con puertos dinámicos:
- canvas.red: in-ports/out-ports delegan en cluster-in/out-ports para cluster-control/indicator
- canvas.red: node-height y render loop incluyen cluster-control/cluster-indicator
- canvas.red: render-cluster-node muestra etiqueta CLU-CTRL / CLU-IND

#51 — Nodos creados desde FP ya no se apilan:
- panel.red: bd-y calculado buscando máximo y de nodos existentes en lugar de length?*75
- panel.red: x inicial cambiado a 40 (evita borde izquierdo)

#50 — Modo headless imprime valores de indicadores:
- compiler.red: compile-body añade print statements al final del bloque headless
  para cada nodo output conectado por wire

(#49 descartado — comportamiento GTK, no accionable en Red)

Tests: 465/465 PASS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…m a módulos correctos

model.red:
- Añadidos fp-cluster-fields, fp-default-label, make-fp-item (desde panel.red)
- make-diagram-model: campos canvas-ref y size añadidos

compiler.red:
- Añadidos gen-panel-var-name, gen-indicator-var-name, compile-panel, gen-standalone-code (desde panel.red)

file-io.red:
- Añadido save-panel-to-diagram (desde panel.red)

panel.red:
- Eliminadas las 8 funciones movidas, sustituidas por comentarios de referencia

tests/test-blocks.red:
- Actualizado para cargar model.red en lugar de blocks.red directamente (make-fp-item ahora en model.red)

Tests: 465/465 PASS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
canvas.red (2524 líneas) dividido en 3 ficheros:
- canvas-render.red (932): constantes visuales, geometría, render Draw puro
- canvas-dialogs.red (397): diálogos de edición, paleta de bloques, SR helpers
- canvas.red (1226): hit-test, CRUD, actor render-diagram, demo standalone

Order de includes: canvas.red → canvas-render.red → canvas-dialogs.red → panel.red

Tests: 465/465 PASS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
panel.red (933 líneas) dividido en 2 ficheros:
- panel-render.red (411): constantes visuales, helpers de tipo, render Draw puro
  (fp-color?, fp-border-color?, render-fp-grid, render-fp-item, render-fp-panel, etc.)
- panel.red (535): hit-test, diálogos FP, paleta FP, actor render-panel, demo

Order de includes: panel.red → panel-render.red

Tests: 465/465 PASS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Estructura de ficheros: canvas-render.red, canvas-dialogs.red, panel-render.red
- Tamaños actuales: canvas.red 1226, panel.red 535, compiler.red 1029, model.red 635
- Estado Fase 2: COMPLETADA (pendiente merge PR #60)
- Problemas de arquitectura: actualizada tabla de responsabilidades (4A ✅)
- task_plan.md: fases 4D y 4E marcadas como completadas
- progress.md: log de sesión actualizado

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
QA-018 (canvas.red on-down): la protección contra múltiples wires al mismo
puerto de entrada solo estaba en on-up (drag-to-connect). Se añade la misma
guarda en on-down (click-click), que es el modo de conexión principal.

Label FP (panel.red open-edit-dialog): el campo "Label" del diálogo se
mostraba pero nunca se guardaba al pulsar OK. Se añade persistencia de
`item/label/text` al confirmar el diálogo.

Tests: 465/465 PASS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
4F.1 — Colores de puertos (canvas-render.red):
- port-out-type: añadido caso cluster-control (igual que unbundle)
- port-in-type: añadido caso cluster-indicator (igual que bundle)
- Los puertos ahora muestran el color del tipo de dato del campo

4F.2 — Edición desde FP (panel.red):
- open-cluster-fp-edit-dialog: cambiado de "campo:valor" a "campo:tipo"
  Ahora define la estructura del cluster (nombre:tipo por línea)
  Al confirmar sincroniza el nodo cluster-control/indicator del BD

4F.3 — Sincronización BD→FP (canvas-dialogs.red):
- cluster-apply-and-refresh: si el nodo es cluster-control/cluster-indicator,
  actualiza también el item FP correspondiente (config/fields + redraw)

Tests: 465/465 PASS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
cluster-control y cluster-indicator ahora tienen 1 solo puerto estático
(out/in de tipo 'cluster). Los puertos dinámicos por campo solo existen
en bundle/unbundle, que es el mecanismo correcto según el modelo LabVIEW.

- blocks.red: definiciones estáticas de cluster-control/indicator con 1 puerto
- model.red: cluster-in/out-ports limitados a bundle/unbundle respectivamente
- canvas-render.red: in-ports/out-ports/render reflejando el nuevo modelo
- compiler.red: emit-cluster-control/indicator (UI + headless) + casos en
  compile-body y compile-diagram run-body
- tests: conteo actualizado a 40 bloques, tests de cluster-control/indicator
  actualizados al nuevo modelo de 1 puerto estático

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ETADA

- 40 bloques (era 34, se añadieron cluster-control/indicator + waveform)
- Conteos de líneas reales para todos los módulos
- Fase 2 marcada completada (#13 waveform ✅, #28 pospuesto)
- task_plan.md: 4F cluster bugs marcados como completados

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
El `to-float` genérico antes del switch de tipos rompía indicadores
string, cluster y booleanos cuyo valor ya era del tipo correcto.
La conversión se mueve dentro del bloque waveform-chart exclusivamente,
donde sí se necesita un float, con fallback a 0.0 si falla el parse.

Fixes: str-indicator + unbundle → "cannot MAKE/TO float!"

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
compile-body ahora tiene refinement /with-prints — los prints de indicadores
solo se generan para el .qvi standalone (compile-diagram/with-prints).
El runner en memoria (runner.red, qtorres.red btn-run) no produce salida
por consola al ejecutar el diagrama desde la UI.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@anlaco anlaco merged commit 46141f0 into main Apr 8, 2026
1 check passed
@anlaco anlaco deleted the refactor/fase4-estructural branch April 8, 2026 17:16
anlaco added a commit that referenced this pull request Apr 9, 2026
* fix(#54)+qa: cluster persiste campos, QA-018/029, refactor 4A/4B parcial

Bug #54 — Cluster no persiste campos:
- canvas.red: cluster-control/cluster-indicator en dbl-click handler
- model.red: cluster-in-ports incluye cluster-indicator, cluster-out-ports incluye cluster-control
- panel.red: cluster-indicator con editor en FP (on-down + on-dbl-click)

QA-018 — Protección múltiples wires al mismo puerto entrada:
- model.red: helper wire-port-in-used?
- canvas.red: 3 guardas al crear wires

QA-029 — save-panel-to-diagram serializa item/value en lugar de item/default

Refactor 4A/4B (parcial, por agente):
- load-panel-from-diagram movida de panel.red → file-io.red
- apply-const/str/arr-value en canvas.red usan set-config

Tests: 450 → 465 PASS (15 nuevos: cluster-control/indicator ports, wire-port-in-used?, QA-029 round-trip)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: bugs menores Fase 2 — #48 cluster render, #51 nodos apilados, #50 headless prints

#48 — cluster-control/indicator renderizan con puertos dinámicos:
- canvas.red: in-ports/out-ports delegan en cluster-in/out-ports para cluster-control/indicator
- canvas.red: node-height y render loop incluyen cluster-control/cluster-indicator
- canvas.red: render-cluster-node muestra etiqueta CLU-CTRL / CLU-IND

#51 — Nodos creados desde FP ya no se apilan:
- panel.red: bd-y calculado buscando máximo y de nodos existentes en lugar de length?*75
- panel.red: x inicial cambiado a 40 (evita borde izquierdo)

#50 — Modo headless imprime valores de indicadores:
- compiler.red: compile-body añade print statements al final del bloque headless
  para cada nodo output conectado por wire

(#49 descartado — comportamiento GTK, no accionable en Red)

Tests: 465/465 PASS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* refactor(4A): mover compile-panel, make-fp-item, save-panel-to-diagram a módulos correctos

model.red:
- Añadidos fp-cluster-fields, fp-default-label, make-fp-item (desde panel.red)
- make-diagram-model: campos canvas-ref y size añadidos

compiler.red:
- Añadidos gen-panel-var-name, gen-indicator-var-name, compile-panel, gen-standalone-code (desde panel.red)

file-io.red:
- Añadido save-panel-to-diagram (desde panel.red)

panel.red:
- Eliminadas las 8 funciones movidas, sustituidas por comentarios de referencia

tests/test-blocks.red:
- Actualizado para cargar model.red en lugar de blocks.red directamente (make-fp-item ahora en model.red)

Tests: 465/465 PASS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* refactor(4D): split conservador canvas.red — render, diálogos, núcleo

canvas.red (2524 líneas) dividido en 3 ficheros:
- canvas-render.red (932): constantes visuales, geometría, render Draw puro
- canvas-dialogs.red (397): diálogos de edición, paleta de bloques, SR helpers
- canvas.red (1226): hit-test, CRUD, actor render-diagram, demo standalone

Order de includes: canvas.red → canvas-render.red → canvas-dialogs.red → panel.red

Tests: 465/465 PASS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* refactor(4E): split conservador panel.red — render y núcleo

panel.red (933 líneas) dividido en 2 ficheros:
- panel-render.red (411): constantes visuales, helpers de tipo, render Draw puro
  (fp-color?, fp-border-color?, render-fp-grid, render-fp-item, render-fp-panel, etc.)
- panel.red (535): hit-test, diálogos FP, paleta FP, actor render-panel, demo

Order de includes: panel.red → panel-render.red

Tests: 465/465 PASS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs: actualizar CLAUDE.md con estructura real post-refactor 4A-4E

- Estructura de ficheros: canvas-render.red, canvas-dialogs.red, panel-render.red
- Tamaños actuales: canvas.red 1226, panel.red 535, compiler.red 1029, model.red 635
- Estado Fase 2: COMPLETADA (pendiente merge PR #60)
- Problemas de arquitectura: actualizada tabla de responsabilidades (4A ✅)
- task_plan.md: fases 4D y 4E marcadas como completadas
- progress.md: log de sesión actualizado

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(qa): dos bugs detectados en revisión manual

QA-018 (canvas.red on-down): la protección contra múltiples wires al mismo
puerto de entrada solo estaba en on-up (drag-to-connect). Se añade la misma
guarda en on-down (click-click), que es el modo de conexión principal.

Label FP (panel.red open-edit-dialog): el campo "Label" del diálogo se
mostraba pero nunca se guardaba al pulsar OK. Se añade persistencia de
`item/label/text` al confirmar el diálogo.

Tests: 465/465 PASS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(cluster): colores de puertos, sincronización BD↔FP, edición desde FP

4F.1 — Colores de puertos (canvas-render.red):
- port-out-type: añadido caso cluster-control (igual que unbundle)
- port-in-type: añadido caso cluster-indicator (igual que bundle)
- Los puertos ahora muestran el color del tipo de dato del campo

4F.2 — Edición desde FP (panel.red):
- open-cluster-fp-edit-dialog: cambiado de "campo:valor" a "campo:tipo"
  Ahora define la estructura del cluster (nombre:tipo por línea)
  Al confirmar sincroniza el nodo cluster-control/indicator del BD

4F.3 — Sincronización BD→FP (canvas-dialogs.red):
- cluster-apply-and-refresh: si el nodo es cluster-control/cluster-indicator,
  actualiza también el item FP correspondiente (config/fields + redraw)

Tests: 465/465 PASS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* refactor(cluster): modelo 1 cable tipo 'cluster para control/indicator

cluster-control y cluster-indicator ahora tienen 1 solo puerto estático
(out/in de tipo 'cluster). Los puertos dinámicos por campo solo existen
en bundle/unbundle, que es el mecanismo correcto según el modelo LabVIEW.

- blocks.red: definiciones estáticas de cluster-control/indicator con 1 puerto
- model.red: cluster-in/out-ports limitados a bundle/unbundle respectivamente
- canvas-render.red: in-ports/out-ports/render reflejando el nuevo modelo
- compiler.red: emit-cluster-control/indicator (UI + headless) + casos en
  compile-body y compile-diagram run-body
- tests: conteo actualizado a 40 bloques, tests de cluster-control/indicator
  actualizados al nuevo modelo de 1 puerto estático

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs: actualizar CLAUDE.md — 40 bloques, conteos reales, Fase 2 COMPLETADA

- 40 bloques (era 34, se añadieron cluster-control/indicator + waveform)
- Conteos de líneas reales para todos los módulos
- Fase 2 marcada completada (#13 waveform ✅, #28 pospuesto)
- task_plan.md: 4F cluster bugs marcados como completados

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: actualizar progress.md — sesión cierre Fase 2 completada

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: to-float solo para waveform-chart, no para todos los indicadores

El `to-float` genérico antes del switch de tipos rompía indicadores
string, cluster y booleanos cuyo valor ya era del tipo correcto.
La conversión se mueve dentro del bloque waveform-chart exclusivamente,
donde sí se necesita un float, con fallback a 0.0 si falla el parse.

Fixes: str-indicator + unbundle → "cannot MAKE/TO float!"

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: suprimir prints de indicadores en ejecución UI (runner + btn-run)

compile-body ahora tiene refinement /with-prints — los prints de indicadores
solo se generan para el .qvi standalone (compile-diagram/with-prints).
El runner en memoria (runner.red, qtorres.red btn-run) no produce salida
por consola al ejecutar el diagrama desde la UI.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore: versión 0.2.0, limpieza de ficheros temporales

- Version: 0.0.1 → 0.2.0 en qtorres.red (Fase 2 completa)
- README.md: badge de versión y estado actualizado
- Eliminados 9 .bak/.bak2, 6 .qvi temporales, binarios y dirs de prueba

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: OpenCodeMCP-BetaTest <beta@opencode.ai>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant