Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
a1975e9
feat(section): the non-principal-axes rule, and one warning instead o…
Batuis Aug 22, 2026
fe82146
docs: 120f15cc validated independently, and the axes notice as a full…
Batuis Aug 22, 2026
04019c9
fix(section): the lip is measured from the outer face, as both drawin…
Batuis Aug 22, 2026
8ba26a8
fix(cold-formed): mirror the outer-face lip convention, and close the…
Batuis Aug 22, 2026
999147c
docs: metallic visualisation study, and the connection-design audit i…
Batuis Aug 22, 2026
81c2728
test(viewport): measure node picking, and refute two explanations of …
Batuis Aug 22, 2026
03f68f5
docs: reorder M2 around the CIRSOC 301 workflow, and audit the nine p…
Batuis Aug 22, 2026
94dfd0d
feat(steel): the metallic design workflow, and three of the verifier'…
Batuis Aug 22, 2026
170064c
feat(pro): mount the metallic workflow, and open the two stages that …
Batuis Aug 22, 2026
ad919ec
feat(steel): per-member detail for the grade and section stages
Batuis Aug 22, 2026
61cd706
docs(steel): the CIRSOC 301 clause map, cited from the shipped text
Batuis Aug 22, 2026
6df7d89
feat(steel): stages 5 and 7, and three assumptions the app no longer …
Batuis Aug 22, 2026
f4d0cf2
docs: the QA handoff, and M2 stops here
Batuis Aug 22, 2026
154f76f
test(e2e): the percent ban was wrong, and the full suite is what foun…
Batuis Aug 23, 2026
61eb2fb
docs(qa): classify the four suite failures, each after an isolated re…
Batuis Aug 23, 2026
0a20636
feat(steel): implement what the shipped CIRSOC 301 text actually defines
Batuis Aug 23, 2026
8094555
docs: the normative audit, and the QA handoff caught up to it
Batuis Aug 23, 2026
bb15c29
feat(steel): compute Cb from the moment diagram, per F.1.1
Batuis Aug 23, 2026
e2e3dc1
feat(steel): §E.4 and §F.6.2 audited — one blocked on a datum, one ha…
Batuis Aug 23, 2026
6ba83e1
docs(qa): record the three audited clauses in the handoff
Batuis Aug 23, 2026
d5f8648
docs(m2): Phase 0 — audit the ground before rebuilding the PRO selectors
Batuis Aug 25, 2026
842cb5a
feat(section): give the composition vocabulary a home outside the gen…
Batuis Aug 25, 2026
367fe52
fix(generators): every Pratt truss this app built was a Howe
Batuis Aug 25, 2026
646c958
test(generators): reach the three web patterns from the browser
Batuis Aug 25, 2026
9567636
feat(section): the PRO section selector, and what CIRSOC actually say…
Batuis Aug 25, 2026
9ef17d8
feat(material): the PRO material selector, and the grade it was throw…
Batuis Aug 25, 2026
7f8c870
feat(generators): dock the preview, unclutter the inputs, and stop ha…
Batuis Aug 25, 2026
c7e87fb
fix(joints): the shed had 226 joints and no material the app could cl…
Batuis Aug 25, 2026
1935b83
feat(connection): bolt-layout geometry from chapter J, and where it s…
Batuis Aug 25, 2026
74241e2
feat(steel): the workflow as a route, not as a list of the pieces
Batuis Aug 25, 2026
a47d620
feat(3d): size the node markers to the model, and sync the joint both…
Batuis Aug 25, 2026
1f95f42
feat(connection): design a joint, from the demands to the plate
Batuis Aug 25, 2026
f9eb1fe
feat(connection): make welds reachable from the joint panel
Batuis Aug 25, 2026
09fa763
feat(connection): battens from the panel, and zero as a value
Batuis Aug 25, 2026
ff921c0
fix(e2e,3d): name the renderer crash, and release the GL context
Batuis Aug 25, 2026
dc0a332
test(m1): drive the arrangement where M2 moved it
Batuis Aug 25, 2026
c7dc7e2
fix(solver-pool): do not start cold workers together
Batuis Aug 25, 2026
e5c8b2a
fix(section): show the centroid the resolver already had
Batuis Aug 25, 2026
ca20995
fix(section): give the dialog its keyboard back
Batuis Aug 26, 2026
5f13d51
docs: the integrated M1 + M2 audit
Batuis Aug 26, 2026
9e749fc
Merge branch 'feat/pro-steel-m1' into feat/pro-steel-m2
Batuis Aug 26, 2026
db57dbf
docs: proposals for the three open M1/M2 findings
Batuis Aug 26, 2026
cf99f65
fix(connections): restore the joint count the merge dropped
Batuis Aug 26, 2026
836b419
docs: branch synchronisation and the conflicts M1 still reported
Batuis Aug 26, 2026
806e128
fix(section): a section built through the modal had no geometry
Batuis Aug 26, 2026
4a458b3
feat(pro): one catalogue for a profile, not two
Batuis Aug 26, 2026
8e53863
fix(connections): the auxiliary calculation stops giving a verdict
Batuis Aug 26, 2026
4b0afd2
style(section): the figure joins the token system it was the only exc…
Batuis Aug 26, 2026
8e6cc46
docs: the CI audit, the three decisions, and what is deliberately lef…
Batuis Aug 26, 2026
03fbe4f
docs: the five E2E failures classified against clean main, and the CI…
Batuis Aug 26, 2026
bef07ef
docs: why #156 looked red, and what it actually was
Batuis Aug 27, 2026
73a6491
merge: bring the ratio-badge removal down from M1
Batuis Aug 27, 2026
6e8702e
docs: the two remaining findings, audited to their cause
Batuis Aug 27, 2026
bd9764f
merge: bring the corrected ratio-badge guard down from M1
Batuis Aug 27, 2026
77001a1
docs: the third guard was written wrong, and why that is the same fac…
Batuis Aug 27, 2026
7ccd9d6
merge: bring the corrected assertion down from M1
Batuis Aug 27, 2026
33699b9
docs: the third guard, and the two ways it was wrong
Batuis Aug 27, 2026
cdb6a57
docs: the QA inventory of M1 + M2, and the two findings it produced
Batuis Aug 27, 2026
9ed7124
feat(materials): B-01 — the modal is the only way to add a material
Batuis Aug 27, 2026
d12ad5c
feat(connections): I-06 and I-07 — joint designs persist, and stay wi…
Batuis Aug 27, 2026
4ead9ec
Merge branch 'feat/pro-steel-m1' into feat/pro-steel-m2
Batuis Aug 27, 2026
9c9f950
feat(share): I-08 — the designed joints travel on the link, and stay …
Batuis Aug 27, 2026
c2a3f26
docs: A-01 in product language, and the open list brought up to date
Batuis Aug 27, 2026
7028f68
Merge branch 'feat/pro-steel-m1' into feat/pro-steel-m2
Batuis Aug 27, 2026
b692cc6
Merge branch 'feat/pro-steel-m1' into feat/pro-steel-m2
Batuis Aug 27, 2026
13086a9
docs: the red e2e job of #164, located rather than patched
Batuis Aug 27, 2026
c7478be
docs: correct the addendum — the e2e test is intermittent, and green …
Batuis Aug 27, 2026
48dd427
docs: retract the walkthrough diagnosis — it was false, and narrowing…
Batuis Aug 27, 2026
14c10a2
docs: name the sharp edge in coupling the URL container version to th…
Batuis Aug 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
123 changes: 123 additions & 0 deletions docs/handoffs/a-01-decision.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
# A-01 — el botón único de alta de secciones: qué cambió para el usuario, y qué falta decidir

**Estado: decisión pendiente. No se implementó nada.** Cambia comportamiento visible, así que el
criterio es del dueño del producto y no una corrección técnica que se pueda hacer y reportar.

**Origen:** `m1-m2-qa-manual-inventory.md` § A-01, prioridad **3** de su tabla final.
**Rama:** M2 (#164), commit `4a458b39`. **Propuesta escrita:**
`m1-m2-open-findings-proposals.md` § 1.

---

## 1 · Qué ve el usuario

**Hoy, en M2.** PRO → cinta **Modelo** → *Propiedades* → pestaña **Secciones**. Hay **un** control
que da de alta una sección: el botón *Agregar sección*, que abre un diálogo centrado y modal. El
diálogo tiene dos divisiones: **Elegir sección estándar** (el catálogo de las quince familias, con
filtros de organismo, código de diseño y altura, comparación y ficha de procedencia) y
**construcción** (las plantillas paramétricas). Debajo del botón queda la tabla de secciones del
modelo, que es de **lectura y borrado**.

**Antes, en `main`.** La misma pestaña mostraba, sin abrir nada:

- una tira de quince botones de familia, un buscador y una **tabla de perfiles cuyas filas
agregaban la sección al hacer clic**;
- un **formulario de construcción paramétrica inline**, con sus propias pestañas de categoría y su
grilla de parámetros;
- y, al lado de todo eso, el botón que abre el diálogo.

O sea: eran **tres** vías de alta y ahora es **una**. El panel pasó de 724 a 205 líneas.

## 2 · Qué comportamiento afecta

Afecta **por dónde se entra**, y una de las tres vías no era equivalente:

| Vía retirada | ¿Era equivalente a lo que quedó? |
|---|---|
| **Tabla de perfiles inline** | **No.** Llamaba a `modelStore.addSection` directo: la sección entraba sin disposición, sin huelgo y sin rotación, y no construía `ProfileSpec` — así que un doble ángulo elegido acá y uno elegido en un generador **no eran el mismo objeto**. La fila era `<tr onclick>`: sin tab stop, sin Enter, sin rol. Y no ofrecía organismo, código ni filtro de altura, con lo cual el catálogo **parecía más chico de lo que es**. |
| **Formulario de construcción inline** | **Sí.** Leía las mismas listas (`SECTION_SHAPES`, `THIN_SHAPES`, `SOLID_SHAPES`), calculaba con la misma `computeSectionProperties` y escribía el mismo registro `built`. El que sobrevive, `BuiltSectionPanel`, además acepta `initial` — o sea **una sección construida se puede volver a abrir y editar**, cosa que el inline no hacía — y es el único de los dos que tenía tests. |

Entonces, en términos de comportamiento:

- **se corrigió** el camino que producía una sección no componible y no operable por teclado;
- **se conservó** la capacidad de construir una sección paramétrica, con una capacidad **de más**
(poder editarla después);
- **se movió** esa capacidad de «siempre visible en el panel» a «segunda división del diálogo»:
**un clic más**.

La divergencia con la propuesta escrita es exactamente ese tercer punto. La propuesta mínima decía
«que la pestaña muestre sólo el botón, con la tabla removida; **no se toca** el modal, ni
`ProfilePicker`, ni el builder». Se tocó el builder, porque la instrucción de ejecución fue que el
modal quedara como única fuente de **creación** y dejar el formulario inline habría dejado una
segunda fuente de alta.

`ColdFormedPanel` **no** se tocó: el catálogo paramétrico C/Z no es una de las quince familias y no
tiene equivalente en el diálogo, así que sigue siendo un tercer camino de alta a propósito.

## 3 · ¿Implica pérdida o confusión de datos?

**Pérdida de datos: no.** Ningún formato cambió, ningún proyecto guardado se lee distinto, ninguna
sección existente pierde un campo. El prerrequisito que la decisión destapó —que una sección
construida **por el diálogo** descartaba `tw`, `tf`, `t` y `tl`, y quedaba `properties-only` sin
dibujo— **se arregló antes de borrar nada** (`806e1289`). Borrar el camino que funcionaba antes de
arreglar el que quedaba habría cambiado un duplicado por una rotura; no fue lo que pasó.

**Confusión: se redujo, y queda un resto.** Lo que se fue era la confusión seria: dos «IPE 200»
distintas según por dónde entraran, una componible y una no, sin que nada en pantalla lo dijera. Lo
que queda es **hábito**: quien conocía la tabla inline no la va a encontrar, y **no hay ningún
cartel que diga dónde fue**. Es una molestia de descubribilidad, no una ambigüedad sobre el dato.

## 4 · ¿Es visible en QA?

**Sí, y es de las primeras cosas que se ven.** A-01 está marcado **QA obligatorio** y su chequeo es
literalmente «contar cuántos controles del panel dan de alta una sección; esperado: exactamente
uno». Un pase manual sobre la pestaña Secciones lo detecta en el primer paso, sin modelo cargado.

## 5 · ¿Bloquea el merge?

**Por lo técnico, no.** No rompe nada, no perdió capacidad, el prerrequisito está arreglado, y las
compuertas pasan. Tres regresiones de contrato afirman la **ausencia de la maquinaria** —que la
pestaña no importe el catálogo, que escriba al modelo exactamente una vez y a través del tipo de
elección, y que su vía de entrada sea un botón y no una fila— y un E2E afirma que el disparador es
alcanzable sin gesto previo.

**Por lo de producto, es lo único que conviene resolver antes.** No porque esté mal, sino por el
**costo de revertir**: la pestaña se reescribió de 724 a 205 líneas, tres tests ahora afirman que la
maquinaria no está, y el `<details>` que la envolvía se retiró. Revertir hoy es deshacer un commit;
revertir después del merge es reconstruir una superficie y aflojar tres guardas. Por eso el
inventario la pone en prioridad 3 y la llama «la divergencia de mayor alcance de M2».

## 6 · La corrección mínima

**Sólo si el criterio era conservar el builder.** No traer nada de vuelta: **montar el que ya
existe en un segundo lugar.** `BuiltSectionPanel` es un componente con `onApply`; ponerlo también en
la pestaña Secciones, debajo del botón, deja **un** componente con **dos** puntos de montaje, sigue
escribiendo por `toSectionFields` y conserva la edición de una sección ya construida.

Qué **no** hace la corrección mínima: no devuelve la tabla de perfiles. Ésa era el defecto real —la
sección no componible, la fila sin teclado, el catálogo aparentemente más chico— y ninguna de esas
tres cosas mejora por tenerla a mano.

Costo: un componente renderizado en un segundo lugar, y las tres regresiones de ausencia pasan de
«ninguna maquinaria de alta» a «ningún segundo **catálogo**». La regla de QA pasa de «exactamente un
control de alta» a «exactamente un control de alta **de catálogo**».

## 7 · Las alternativas, con lo que cuesta cada una

| # | Alternativa | A favor | En contra |
|---|---|---|---|
| **1** | **Dejarlo como está.** Una sola vía de alta. | Es lo que la instrucción de ejecución pedía; una superficie que probar; el catálogo profundo y la ficha de procedencia son lo que el usuario encuentra al primer clic. | Un clic más para construir; el corte de hábito no tiene cartel. |
| **2** | **Corrección mínima (§6).** Builder inline otra vez, catálogo sólo en el diálogo. | Honra la propuesta escrita al pie de la letra; cero clics para construir. | Dos superficies de alta en la pestaña otra vez —aunque **no** dos catálogos—; hay que aflojar tres guardas y reescribir la regla de QA. |
| **3** | **Dejarlo como está + un cartel.** Sin cambio funcional: que se pueda llegar a la división de construcción desde la pestaña —un segundo botón *Construir una sección* que abre el diálogo ya en esa división. | Contesta el corte de hábito sin agregar una segunda vía de alta: dos botones, **un** diálogo, **un** camino de creación. Es el cambio más chico que responde al problema real. | Dos botones donde había uno; hay que decidir el texto y su i18n en tres idiomas. |
| **4** | **Revertir la decisión 1 completa**, con tabla inline incluida. | Vuelve exactamente a lo que había antes de M2. | Restituye la sección no componible y la fila sin teclado, y vuelve a mostrar un catálogo sin filtros. Es el defecto que la decisión existía para cerrar. **No recomendada.** |

## 8 · Recomendación, y qué necesito de vos

**Mi recomendación es la 3** si lo que preocupa es que la construcción paramétrica quedó menos a
mano, y la **1** si no preocupa. La **2** sólo si el «no se toca el builder» de la propuesta escrita
era un requisito duro y no una nota de alcance. La **4** no la recomiendo por ningún criterio.

**La decisión que necesito**: ¿el builder inline se conserva, se señaliza, o se deja donde está?
Hasta que eso esté contestado, A-01 queda como está y este documento es su registro — no como
sorpresa después del merge, sino como decisión a la vista, que es para lo que se escribió
`m1-m2-open-findings-proposals.md`.
Loading
Loading