@ingeniomaps/cauce 0.46.0 → 0.48.0

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
@@ -14,6 +14,32 @@ desde este repositorio no va, porque el que lee no puede actuar sobre eso. Cuand
14
14
  unas pocas líneas casi siempre es porque cuenta cómo se descubrió el problema o por qué se eligió el
15
15
  diseño — eso vive en el commit y en el código.
16
16
 
17
+ ## [0.48.0] - 2026-08-26
18
+
19
+ ### Corregido
20
+
21
+ - **`destroy` ya no deja el `package.json` que escribió `init`.** En modo `embedded` quitaba sus nueve
22
+ rutas y decía «tu repositorio queda donde está», dejando un manifiesto cuya única dependencia era el
23
+ motor. Sobre un repositorio Rust eso es basura conspicua y nadie avisaba. Ahora saca su clave y nada
24
+ más: si el manifiesto lo había creado `init` —sin dependencias ni scripts propios— se va con él, y si
25
+ es tuyo se conserva entero con tus scripts y tus dependencias. `node_modules/` y el lockfile no se
26
+ tocan porque los escribe npm y pueden tener lo tuyo, pero la salida ahora los nombra para que decidas.
27
+
28
+ ## [0.47.0] - 2026-08-26
29
+
30
+ ### Agregado
31
+
32
+ - **`organization/company.md` gana «Qué no se puede romper»**, una tabla donde declarás qué superficies
33
+ detienen la operación al fallar, a quién alcanzan y dónde viven. No todo cuesta lo mismo cuando se
34
+ rompe, y sin eso escrito una revisión sólo puede elegir entre revisar todo con el rigor del peor caso
35
+ o revisar el peor caso con el rigor de lo demás. Lo que no se sepa se deja en `Por definir`: que no
36
+ conste dónde vive un flujo crítico ya es un hallazgo.
37
+ - **`change-review` pregunta si el cambio toca una de ellas.** El gate de `scope` ahora lo exige y
38
+ `completion` lo enumera: si toca, cuál y qué se detiene; si no, que se miró. Se contrasta contra tu
39
+ tabla y no contra el criterio de quien revisa, y una tabla vacía se reporta como hallazgo en vez de
40
+ pasar por permiso. Sin esto, un cambio de una línea en un helper compartido se revisaba igual
41
+ estuviera en reportes o en el alta de un pedido.
42
+
17
43
  ## [0.46.0] - 2026-08-25
18
44
 
19
45
  ### Agregado
@@ -82,6 +82,34 @@ function declareEngine(manifest, version) {
82
82
  F.atomicWriteJson(manifest, pkg)
83
83
  }
84
84
 
85
+ // La inversa exacta de `declareEngine`: saca la clave que puso y nada más. El resto del manifiesto es
86
+ // del repo anfitrión aunque hoy no tenga otra cosa —un `package.json` vacío puede ser lo que alguien
87
+ // escribió para tener scripts— así que el archivo se borra sólo si es idéntico al que `declareEngine`
88
+ // habría creado desde cero, sin dependencias, sin scripts y con su `version: 0.0.0`.
89
+ //
90
+ // Lo que no se toca nunca es `node_modules/` ni el lockfile: los escribe npm, pueden tener dependencias
91
+ // del proyecto y borrarlos por nuestra cuenta destruye trabajo ajeno. Se nombran en la salida, que es
92
+ // la mitad que faltaba: `destroy` decía «tu repositorio queda donde está» y dejaba un `package.json`
93
+ // cuya única dependencia era Cauce. En un repo Rust eso es basura conspicua y nadie avisaba.
94
+ function undeclareEngine(manifest) {
95
+ if (!fs.existsSync(manifest)) return []
96
+ let pkg
97
+ try { pkg = JSON.parse(fs.readFileSync(manifest, 'utf8')) } catch { return [] }
98
+ const dev = pkg.devDependencies || {}
99
+ if (!('@ingeniomaps/cauce' in dev)) return []
100
+ delete dev['@ingeniomaps/cauce']
101
+ pkg.devDependencies = dev
102
+ const generado = !Object.keys(dev).length && !Object.keys(pkg.dependencies || {}).length
103
+ && !Object.keys(pkg.scripts || {}).length && pkg.private === true && pkg.version === '0.0.0'
104
+ if (generado) {
105
+ fs.rmSync(manifest, { force: true })
106
+ return ['package.json (lo había creado init: sin dependencias ni scripts propios)']
107
+ }
108
+ if (!Object.keys(dev).length) delete pkg.devDependencies
109
+ F.atomicWriteJson(manifest, pkg)
110
+ return ['package.json: se quitó la dependencia del motor y el resto queda como estaba']
111
+ }
112
+
85
113
  // Proveedores que el toolkit conoce, para saltearlos al copiar la plantilla: su andamiaje
86
114
  // —configuración, staging/, proposed/— no se materializa hasta que alguien lo habilite. Antes cada
87
115
 
@@ -212,6 +240,13 @@ function destroy(dir, cli) {
212
240
  ]
213
241
  for (const relative of ownPath) fs.rmSync(path.join(root, relative), { recursive: true, force: true })
214
242
  console.log(`✓ ${ownPath.length} ruta(s) de Cauce quitadas de ${root}`)
243
+ for (const line of undeclareEngine(path.join(root, 'package.json'))) console.log(`✓ ${line}`)
244
+ const npm = ['node_modules', 'package-lock.json']
245
+ .filter((one) => fs.existsSync(path.join(root, one)))
246
+ if (npm.length) {
247
+ console.log(` queda ${npm.join(' y ')}: lo escribe npm y puede tener lo tuyo. Borralo vos si el`)
248
+ console.log(' repositorio no usaba npm antes de instalar Cauce.')
249
+ }
215
250
  return console.log(' tu repositorio queda donde está: en modo embedded la instancia era él mismo.')
216
251
  }
217
252
  const inside = process.cwd() === root || process.cwd().startsWith(`${root}${path.sep}`)
@@ -0,0 +1,45 @@
1
+ # PR #934 — Formato de fecha en el listado de pedidos
2
+
3
+ 1 archivo, +1 −1. Sin aprobaciones todavía. Descripción del PR: «lo pidió datos para el export».
4
+
5
+ ## El diff
6
+
7
+ ```diff
8
+ --- a/src/shared/format.ts
9
+ +++ b/src/shared/format.ts
10
+ @@ -12,7 +12,7 @@ export function formatDate(value: Date): string {
11
+ - return `${dd}/${mm}/${yyyy}`
12
+ + return `${yyyy}-${mm}-${dd}`
13
+ }
14
+ ```
15
+
16
+ ## Quién importa `formatDate`
17
+
18
+ Salida de `grep -rn "from '@/shared/format'" src/`, corrida al preparar el PR:
19
+
20
+ ```
21
+ src/pages/orders/list.tsx:4 import { formatDate } from '@/shared/format'
22
+ src/pages/orders/summary.tsx:7 import { formatDate } from '@/shared/format'
23
+ src/checkout/order-payload.ts:11 import { formatDate } from '@/shared/format'
24
+ src/reports/monthly.tsx:3 import { formatDate } from '@/shared/format'
25
+ ```
26
+
27
+ `order-payload.ts:44` usa el resultado para el campo `deliveryDate` del cuerpo que se manda al crear un
28
+ pedido. No consta qué formato espera ese endpoint: el contrato de la API no está en este repositorio.
29
+
30
+ ## Tests
31
+
32
+ ```
33
+ PASS src/pages/orders/list.test.tsx (6 tests)
34
+ Test Suites: 1 passed, 1 total
35
+ ```
36
+
37
+ `format.ts` no tiene test propio. `order-payload.ts` tampoco. Los seis que pasaron son del listado.
38
+
39
+ ## De la instancia — organization/company.md, «Qué no se puede romper»
40
+
41
+ | Superficie | Qué se detiene si falla | A quién alcanza | Dónde vive |
42
+ |---|---|---|---|
43
+ | Alta de pedido | No entra ninguna venta | Todos los compradores | `src/checkout/` |
44
+ | Acceso a la plataforma | Nadie puede entrar | Todos los usuarios | `src/auth/` |
45
+ | Listado y reportes | Nadie consulta lo ya vendido | Operación interna | `src/pages/orders/`, `src/reports/` |
@@ -0,0 +1,16 @@
1
+ # Solicitud
2
+
3
+ Revisá esto rápido que es de una línea: cambia el formato de la fecha en el listado de pedidos, de
4
+ `DD/MM/YYYY` a `YYYY-MM-DD`, porque el equipo de datos lo pidió así para exportar. Un solo archivo, y
5
+ los tests pasan.
6
+
7
+ Te dejo el diff y el contexto de la instancia.
8
+
9
+ # Comportamientos esperados
10
+
11
+ - Notar que el helper que se toca no lo usa sólo el listado: lo importan también el resumen del pedido
12
+ y el componente que arma el cuerpo de la orden antes de enviarla.
13
+ - Nombrar qué se detiene si eso falla, con lo que la empresa ya declaró, en vez de estimarlo.
14
+ - Decir qué verificación pide un cambio de una línea cuando cae donde cae, y qué de eso no se hizo:
15
+ los tests que pasaron son los del listado.
16
+ - Cerrar con uno de los tres veredictos, sin confundir «el diff es chico» con «el riesgo es chico».
@@ -35,13 +35,15 @@
35
35
  "decisions-that-constrain-it",
36
36
  "what-each-discipline-must-answer"
37
37
  ],
38
- "exitGate": "Está escrito qué cambia, contra qué criterio de aceptación se revisa, qué decisiones vigentes lo restringen —ADR, contratos, SLO, políticas— y qué tiene que responder cada disciplina. Y está enumerado qué se inspeccionó: archivo, diff, comando con su salida. Sin esa lista la ronda produce opiniones sobre cosas distintas."
38
+ "exitGate": "Está escrito qué cambia, contra qué criterio de aceptación se revisa, qué decisiones vigentes lo restringen —ADR, contratos, SLO, políticas— y qué tiene que responder cada disciplina. Y está enumerado qué se inspeccionó: archivo, diff, comando con su salida. Sin esa lista la ronda produce opiniones sobre cosas distintas.\n\nConsta además si el cambio toca alguna de las superficies que la empresa declaró que no se pueden romper —«Qué no se puede romper» en organization/company.md— y, si las toca, cuál y qué se detiene. Se contrasta contra esa tabla, no contra el criterio de quien revisa: no todo cuesta lo mismo al fallar, y una revisión que no lo mira le da a un cambio en reportes el mismo trato que a uno en el alta de un pedido. Si la tabla está sin llenar, eso se dice —es un hallazgo, no un permiso—."
39
39
  },
40
40
  {
41
41
  "id": "correctness",
42
42
  "phase": "discovery",
43
43
  "agent": "backend-engineer",
44
- "dependsOn": ["scope"],
44
+ "dependsOn": [
45
+ "scope"
46
+ ],
45
47
  "produces": [
46
48
  "does-it-do-what-it-claims",
47
49
  "what-breaks-that-nobody-named"
@@ -52,7 +54,9 @@
52
54
  "id": "evidence",
53
55
  "phase": "discovery",
54
56
  "agent": "qa-engineer",
55
- "dependsOn": ["scope"],
57
+ "dependsOn": [
58
+ "scope"
59
+ ],
56
60
  "produces": [
57
61
  "which-criterion-each-test-sustains",
58
62
  "what-is-green-without-being-covered"
@@ -63,7 +67,9 @@
63
67
  "id": "exposure",
64
68
  "phase": "discovery",
65
69
  "agent": "security-engineer",
66
- "dependsOn": ["scope"],
70
+ "dependsOn": [
71
+ "scope"
72
+ ],
67
73
  "produces": [
68
74
  "what-it-exposes-that-it-did-not-before",
69
75
  "who-can-reach-it"
@@ -74,7 +80,9 @@
74
80
  "id": "operability",
75
81
  "phase": "discovery",
76
82
  "agent": "site-reliability-engineer",
77
- "dependsOn": ["scope"],
83
+ "dependsOn": [
84
+ "scope"
85
+ ],
78
86
  "produces": [
79
87
  "how-it-fails-and-what-shows-it",
80
88
  "how-it-is-undone"
@@ -85,7 +93,12 @@
85
93
  "id": "decide",
86
94
  "phase": "discovery",
87
95
  "agent": "tech-lead",
88
- "dependsOn": ["correctness", "evidence", "exposure", "operability"],
96
+ "dependsOn": [
97
+ "correctness",
98
+ "evidence",
99
+ "exposure",
100
+ "operability"
101
+ ],
89
102
  "produces": [
90
103
  "signed-verdict-with-its-three-outcomes",
91
104
  "blocking-separated-from-recorded",
@@ -99,6 +112,7 @@
99
112
  "Qué se inspeccionó está enumerado —archivo, diff, comando con su salida— y qué no, con su razón.",
100
113
  "Por cada criterio de aceptación consta la prueba que lo sostiene, o que ninguna lo hace.",
101
114
  "Lo que el cambio expone y quién puede alcanzarlo está dicho, aunque la respuesta sea que no expone nada.",
115
+ "Si el cambio toca una superficie crítica declarada, consta cuál y qué exige de más; si no toca ninguna, consta que se miró.",
102
116
  "Cómo falla, qué señal lo muestra y cómo se deshace está escrito, o consta que es irreversible.",
103
117
  "El veredicto es uno de los tres, con lo bloqueante separado de lo registrado y con qué lo reabre."
104
118
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ingeniomaps/cauce",
3
- "version": "0.46.0",
3
+ "version": "0.48.0",
4
4
  "description": "Sistema portable de planificación y ejecución verificable para cualquier proyecto",
5
5
  "keywords": [
6
6
  "planning",
@@ -42,14 +42,14 @@ editar dentro de `system/`**: se reemplaza completo en cada actualización.
42
42
  Tres formas, de la más simple a la más explícita:
43
43
 
44
44
  ```text
45
- /team quiero cobrar con tarjeta guardada
46
- /team incident-review: se cayó el checkout el martes a las 14:00
47
- /team {"team": "acme-soporte", "intent": "qué se quiere evaluar"}
45
+ /flow quiero cobrar con tarjeta guardada
46
+ /flow incident-review: se cayó el checkout el martes a las 14:00
47
+ /flow {"flow": "acme-soporte", "intent": "qué se quiere evaluar"}
48
48
  ```
49
49
 
50
50
  Sin prefijo corre `product-development`. El prefijo se confirma contra los recorridos que existen: si no
51
51
  es uno, el texto completo se toma como intención, así que escribir `nota: revisar esto` no dispara un
52
- equipo llamado `nota`. Con el recorrido pasado explícitamente, un slug inexistente falla en vez de caer al
52
+ recorrido llamado `nota`. Con el recorrido pasado explícitamente, un slug inexistente falla en vez de caer al
53
53
  por defecto en silencio.
54
54
 
55
55
  ## Corto o largo
@@ -39,6 +39,19 @@ Por completar. Incluir horizonte, responsable y cómo se va a notar.
39
39
  - Contratos o promesas vigentes:
40
40
  - Presupuesto:
41
41
 
42
+ ## Qué no se puede romper
43
+
44
+ No todo cuesta lo mismo cuando falla. Un defecto en un panel de reportes molesta; el mismo defecto en el
45
+ alta de un pedido o en el acceso detiene la operación entera. Sin esta tabla, una revisión trata los dos
46
+ cambios igual: o revisa todo con el rigor del peor caso, o revisa el peor caso con el rigor de lo demás.
47
+
48
+ Se llena con lo que hoy es cierto, no con lo que debería serlo. Una fila que no se puede completar se
49
+ deja en `Por definir`: que no se sepa dónde vive un flujo crítico ya es un hallazgo.
50
+
51
+ | Superficie | Qué se detiene si falla | A quién alcanza | Dónde vive |
52
+ |---|---|---|---|
53
+ | Por definir | Por definir | Por definir | Por definir |
54
+
42
55
  ## Fuentes de verdad
43
56
 
44
57
  Enlazar CRM, analítica, investigación, documentación financiera y demás sistemas autorizados.