@ingeniomaps/cauce 0.14.0 → 0.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -8,6 +8,27 @@ esa operación sea confiable en vez de sólo cómoda: acá se lee qué cambió a
8
8
  un cambio en el protocolo, en las reglas del sistema o en un guard es visible para el usuario y sube
9
9
  minor aunque no toque una sola línea de código.
10
10
 
11
+ ## [0.14.2] - 2026-08-16
12
+
13
+ ### Corregido
14
+
15
+ - **Un comportamiento esperado partido en varias líneas contaba como varios.** El parser de casos leía
16
+ líneas en vez de viñetas, así que un caso con cuatro comportamientos declaraba siete — y ese número
17
+ es el denominador de toda la evaluación: ninguno podía pasar. No se veía en el catálogo del sistema,
18
+ donde todas las viñetas entran en una línea; apareció en el primer caso escrito por una empresa.
19
+
20
+ ## [0.14.1] - 2026-08-16
21
+
22
+ ### Corregido
23
+
24
+ - **Un recorrido de equipo que frena en una etapa tiraba el trabajo de las anteriores.** Los handoffs
25
+ vivían sólo en memoria: si la etapa 3 no cerraba su gate, lo que las dos primeras habían establecido
26
+ —con su evidencia y su cita— desaparecía. Ahora viaja con el bloqueo, para que quien lea la acción
27
+ humana no vuelva a discutir lo ya resuelto.
28
+
29
+ Lo encontró el ciclo de aprendizaje de un cargo propio de una empresa: buscaba sus propios veredictos
30
+ para aprender de ellos y no existían en ninguna parte, porque nunca se habían escrito.
31
+
11
32
  ## [0.14.0] - 2026-08-16
12
33
 
13
34
  ### Cambiado
@@ -181,10 +181,20 @@ for (const stage of discovery) {
181
181
  }
182
182
 
183
183
  if (blocked.length) {
184
+ // Lo que las etapas anteriores sí resolvieron viaja con el bloqueo. Sin esto se perdía: un recorrido
185
+ // que frena en la etapa 3 tiraba el trabajo de las dos primeras, que vivía sólo en memoria. Quien lea
186
+ // la acción humana necesita saber qué quedó establecido para no volver a discutirlo, y el cargo que
187
+ // aprende de sus propias decisiones no tiene de dónde leerlas si nunca se escribieron.
188
+ const cerradas = handoffs.filter((entry) => entry.gatePassed)
189
+ const previo = cerradas.length
190
+ ? `Lo que ya quedó establecido y no hay que volver a discutir:\n${cerradas
191
+ .map((entry) => `- ${entry.id} (${entry.agent}): ${entry.findings}`).join('\n')}`
192
+ : 'Ninguna etapa anterior cerró: el bloqueo es de la primera.'
184
193
  await agent(
185
194
  `${RULES}\n\nRegistrá en ${HUMAN} una fila por cada bloqueo, con la tarea, el estado pendiente, el ` +
186
195
  `origen (etapa ${blocked[0].stage}) y la acción humana exacta que lo desbloquea. No inventes ` +
187
- `responsables ni fechas. Bloqueos: ${JSON.stringify(blocked)}`,
196
+ `responsables ni fechas. Bloqueos: ${JSON.stringify(blocked)}\n\n${previo}\n\nIncluí en la fila un ` +
197
+ `resumen de lo establecido, con la etapa y el cargo que lo decidió: es el trabajo que ya se pagó.`,
188
198
  { label: 'human-actions' },
189
199
  )
190
200
  return stop('gate-no-cumplido', `${blocked[0].stage}: ${blocked[0].missing}`)
@@ -30,9 +30,17 @@ function caseFiles(dir) {
30
30
  function parseCase(text) {
31
31
  const request = (text.match(/#\s*Solicitud\s*\n([\s\S]*?)(?=\n#\s|$)/) || [])[1] || ''
32
32
  const block = (text.match(/#\s*Comportamientos esperados\s*\n([\s\S]*?)(?=\n#\s|$)/) || [])[1] || ''
33
- const expected = block.split('\n')
34
- .map((line) => line.replace(/^\s*-\s*/, '').trim())
35
- .filter(Boolean)
33
+ // Una viñeta puede ocupar varias líneas. Contar líneas en vez de viñetas hacía que un caso con
34
+ // cuatro comportamientos declarara siete, y ese número es el denominador de toda la evaluación.
35
+ // No se veía en el catálogo del sistema porque ahí las viñetas entran en una línea.
36
+ const expected = []
37
+ for (const line of block.split('\n')) {
38
+ const bullet = line.match(/^\s*-\s+(.*)$/)
39
+ if (bullet) expected.push(bullet[1].trim())
40
+ else if (expected.length && line.trim()) {
41
+ expected[expected.length - 1] = `${expected[expected.length - 1]} ${line.trim()}`
42
+ }
43
+ }
36
44
  return { request: request.trim(), expected }
37
45
  }
38
46
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ingeniomaps/cauce",
3
- "version": "0.14.0",
3
+ "version": "0.14.2",
4
4
  "description": "Sistema portable de planificación y ejecución verificable para cualquier proyecto",
5
5
  "type": "commonjs",
6
6
  "bin": {