fix(#54)+qa: cluster campos, QA-018/029, refactor 4A/4B parcial#60
Merged
Conversation
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>
This was referenced Apr 8, 2026
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
canvas.red: añadidoscluster-control/cluster-indicatoral handler dbl-clickmodel.red:cluster-in-portsincluyecluster-indicator;cluster-out-portsincluyecluster-controlpanel.red:cluster-indicatorahora editable desde el FPwire-port-in-used?enmodel.red+ 3 guardas encanvas.redsave-panel-to-diagramserializaitem/value(valor actual) en lugar deitem/defaultload-panel-from-diagrammovida afile-io.red;apply-*-valueencanvas.redusanset-configTest plan
cluster-control/cluster-indicatorpuertos,wire-port-in-used?, QA-029 round-trip🤖 Generated with Claude Code