@ingeniomaps/cauce 0.32.0 → 0.34.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,49 @@ 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.34.0] - 2026-08-19
|
|
18
|
+
|
|
19
|
+
### Añadido
|
|
20
|
+
|
|
21
|
+
- **R16: el costo es el contexto, no las palabras.** Regla nueva del sistema, en
|
|
22
|
+
`planning/rules/system/process.md`, así que rige en cada tarea la haga quien la haga. Cada llamada
|
|
23
|
+
reenvía el contexto entero: gasta más quien da más vueltas que quien escribe más. Comandos
|
|
24
|
+
independientes en una sola invocación, el CLI antes que el archivo, el fragmento antes que el archivo
|
|
25
|
+
entero, un subagente sólo cuando el trabajo no entra en la corrida actual, y un archivo se lee una vez
|
|
26
|
+
y se escribe entero en vez de releerlo para confirmar.
|
|
27
|
+
|
|
28
|
+
Cierra con la parte que la hace segura y que una regla de eficiencia escrita a las apuras suele
|
|
29
|
+
omitir: **verificar es la excepción y no se negocia**. Ahorrar una llamada nunca justifica afirmar sin
|
|
30
|
+
haber comprobado —R14 no admite descuentos— ni dar por terminado lo que no se corrió.
|
|
31
|
+
|
|
32
|
+
No nombra precios, ventanas de caché ni cuándo limpiar una conversación: eso lo fija el runner, y una
|
|
33
|
+
regla del sistema que lo nombrara envejecería con su próxima versión en todas las instancias a la vez.
|
|
34
|
+
|
|
35
|
+
### Cambiado
|
|
36
|
+
|
|
37
|
+
- **El arranque acota las vueltas dentro de cada fase, no sólo cuántas fases hay.** El techo de tres
|
|
38
|
+
agentes limitaba cuántos contextos se cargan, no cuántas veces se reenvía cada uno. Medido en una
|
|
39
|
+
corrida real: la fase que escribe gastó veinte vueltas —seis lecturas y tres ediciones— para producir
|
|
40
|
+
cuatro archivos, y los tres agentes sumaron tres millones de tokens de caché, un cuarto de la sesión.
|
|
41
|
+
Ahora cada fase sabe qué cuesta: leer una vez y sólo para escribir, escribir entero de una, no releer
|
|
42
|
+
para comprobar, y correr `check` una sola vez.
|
|
43
|
+
|
|
44
|
+
## [0.33.0] - 2026-08-19
|
|
45
|
+
|
|
46
|
+
### Corregido
|
|
47
|
+
|
|
48
|
+
- **Con varias raíces declaradas, ningún servicio tenía nombre.** Cada repositorio es la raíz de su
|
|
49
|
+
propio escaneo, así que su proyecto principal volvía como `.`: tres servicios llamados igual y nada que
|
|
50
|
+
los distinga. Una credencial no se podía atribuir a un servicio porque ningún servicio era nombrable, y
|
|
51
|
+
una corrida real terminó pidiéndole a una persona que declarara variables que su propio repositorio ya
|
|
52
|
+
declaraba. Ahora cada candidato lleva el nombre de su raíz, y donde hay una sola el proyecto de arriba
|
|
53
|
+
se nombra por su carpeta en vez de aparecer como `.` a secas.
|
|
54
|
+
|
|
55
|
+
- **El arranque podía negar lo que el inventario le entregó.** Se le dice explícitamente que un nombre
|
|
56
|
+
que el inventario trae está declarado, así que pedir que se declare de nuevo contradice al repositorio.
|
|
57
|
+
La mitad de la corrección anterior que tocaba el recorrido —la que le hace copiar los nombres de
|
|
58
|
+
variable por servicio— no había llegado a publicarse.
|
|
59
|
+
|
|
17
60
|
## [0.32.0] - 2026-08-19
|
|
18
61
|
|
|
19
62
|
### Corregido
|
|
@@ -50,6 +50,11 @@ const BASE = `Nunca inventes clientes, métricas, ingresos, plazos ni responsabl
|
|
|
50
50
|
`recorras directorios, no leas código fuente y no abras más archivos que los que vas a escribir. Esto ` +
|
|
51
51
|
`es un arranque de cinco minutos, no una auditoría: lo que no esté a la vista se marca como supuesto o ` +
|
|
52
52
|
`queda como pregunta abierta, que es más barato y más honesto que averiguarlo.\n\n` +
|
|
53
|
+
`Lo que cuesta no son las palabras que escribís sino las vueltas que das: cada llamada arrastra tu ` +
|
|
54
|
+
`contexto entero. Leé un archivo una sola vez y sólo si vas a escribirlo; escribilo completo de una, sin ` +
|
|
55
|
+
`editarlo después; no lo releas para comprobar que quedó —si la escritura falla, te enterás—. Medido en ` +
|
|
56
|
+
`una corrida real: la fase que escribe gastó veinte vueltas con seis lecturas y tres ediciones para ` +
|
|
57
|
+
`producir cuatro archivos.\n\n` +
|
|
53
58
|
`El arranque tiene tres objetivos y ninguno más: entender qué es este proyecto, dejar la instancia ` +
|
|
54
59
|
`correcta para él —contexto, mapa, raíces, lo que espera a una persona— y que la primera tarea pueda ` +
|
|
55
60
|
`empezar. El análisis profundo llega después, cuando alguien pida algo concreto; adelantarlo acá ` +
|
|
@@ -85,6 +90,10 @@ const SCAN = {
|
|
|
85
90
|
required: ['kind', 'command', 'source'], properties: {
|
|
86
91
|
kind: { type: 'string' }, command: { type: 'string' }, source: { type: 'string' },
|
|
87
92
|
} } },
|
|
93
|
+
// Los nombres de variable que ese servicio espera, copiados del inventario. En un multirepo cada
|
|
94
|
+
// repositorio trae su propio ejemplo, y sin esto las credenciales de tres repos no existían para
|
|
95
|
+
// el arranque: las filas terminaban diciendo «la credencial del proveedor» sin nombrarla.
|
|
96
|
+
env: { type: 'array', items: { type: 'string' } },
|
|
88
97
|
} } },
|
|
89
98
|
externals: { type: 'array', items: { type: 'string' } },
|
|
90
99
|
secrets: { type: 'array', items: { type: 'string' } },
|
|
@@ -110,11 +119,12 @@ const state = await agent(
|
|
|
110
119
|
`else and open no file other than .env.example at the workspace root.\n` +
|
|
111
120
|
`1. "node tools/ops.js onboard --json": the instance state, the workspace inventory, the opening ` +
|
|
112
121
|
`question and the dimensions still uncovered. Copy fresh, opening, followUps, the "need" of each ` +
|
|
113
|
-
`dimension, and every service with its path, its runtimes
|
|
114
|
-
`file each command came from. Add nothing it did not print.\n` +
|
|
122
|
+
`dimension, and every service with its path, its runtimes, its declared commands keeping the source ` +
|
|
123
|
+
`file each command came from, and the variable names its "env" carries. Add nothing it did not print.\n` +
|
|
115
124
|
`2. "node tools/ops.js check planning".\n` +
|
|
116
|
-
`
|
|
117
|
-
`the
|
|
125
|
+
`The inventory already names every credential each service expects: never open a .env file to look for ` +
|
|
126
|
+
`more. Report those names in secrets and the services they point at in externals. A name the inventory ` +
|
|
127
|
+
`carries is declared, and saying otherwise is a claim the repository contradicts.`,
|
|
118
128
|
{ schema: SCAN, label: 'inventario' },
|
|
119
129
|
)
|
|
120
130
|
if (!state) return stop('scan-unavailable', 'no se pudo leer el estado del workspace')
|
|
@@ -167,9 +177,10 @@ const drafted = await agent(
|
|
|
167
177
|
'completa.\n'}` +
|
|
168
178
|
`4. ${HUMAN}: una fila por cada cosa que necesita a una persona, con la tarea, el estado pendiente, el ` +
|
|
169
179
|
`origen "onboard" y la acción concreta que la desbloquea. Como mínimo, una por cada credencial que el ` +
|
|
170
|
-
`inventario nombra, diciendo la variable y el servicio que la espera
|
|
171
|
-
`
|
|
172
|
-
`
|
|
180
|
+
`inventario nombra, diciendo la variable y el servicio que la espera. El nombre ya está declarado, así ` +
|
|
181
|
+
`que no pidas declararlo de nuevo: lo que falta es dónde se carga el valor y quién lo hace, y ningún ` +
|
|
182
|
+
`valor se propone acá. Además, una por cada sistema externo o MCP a conectar, y una por la autoridad ` +
|
|
183
|
+
`del runner, que hoy declara runner.allowPush=false.\n` +
|
|
173
184
|
`5. Las preguntas que queden abiertas, en la sección Ideas de ${INBOX}, sin promover.\n` +
|
|
174
185
|
`Devolvé en files cada archivo que tocaste y en assumptions cada supuesto que dejaste marcado.`,
|
|
175
186
|
{ schema: WRITTEN, label: 'contexto' },
|
|
@@ -194,8 +205,11 @@ const epic = await agent(
|
|
|
194
205
|
: 'La primera historia es traer los repos y declararlos en workspaceRoots.'} ` +
|
|
195
206
|
`En "## Riesgos y decisiones humanas" citá las filas que quedaron en HUMAN_ACTIONS. No toques ` +
|
|
196
207
|
`BACKLOG.md.\n\n` +
|
|
208
|
+
`El contrato de una épica está en ${P}/PROTOCOL.md; si necesitás verlo, leé esa sección y no el archivo ` +
|
|
209
|
+
`entero, y escribí la épica de una sola vez.\n\n` +
|
|
197
210
|
`Cerrá corriendo "node tools/ops.js check planning" desde ${ROOT} y, si falla, reparando sólo lo que ` +
|
|
198
|
-
`esta corrida escribió; nunca debilites un criterio para forzar el verde
|
|
211
|
+
`esta corrida escribió; nunca debilites un criterio para forzar el verde. Una sola corrida de check: si ` +
|
|
212
|
+
`pasó, terminaste.`,
|
|
199
213
|
{ schema: { type: 'object', additionalProperties: false, required: ['file', 'passed'],
|
|
200
214
|
properties: {
|
|
201
215
|
file: { type: 'string' }, passed: { type: 'boolean' }, details: { type: 'string' },
|
package/engine/cli/ops.js
CHANGED
|
@@ -363,8 +363,16 @@ function candidates(workspace, skip = '') {
|
|
|
363
363
|
return [...found, ...result.services.map((service) => ({ ...service, root: workspace }))]
|
|
364
364
|
}
|
|
365
365
|
|
|
366
|
+
// Con varias raíces, cada repositorio es la raíz de su propio escaneo y su candidato principal se llama
|
|
367
|
+
// `.`: tres servicios con el mismo nombre y nada que los distinga. El prefijo los vuelve nombrables, que
|
|
368
|
+
// es la única forma de que una credencial pueda atribuirse a un servicio en vez de quedar suelta.
|
|
366
369
|
function inventory(root) {
|
|
367
|
-
|
|
370
|
+
const roots = workspaceRoots(root)
|
|
371
|
+
if (roots.length === 1) return candidates(roots[0], root)
|
|
372
|
+
return roots.flatMap((workspace) => candidates(workspace, root).map((service) => ({
|
|
373
|
+
...service,
|
|
374
|
+
path: service.path === '.' ? path.basename(workspace) : `${path.basename(workspace)}/${service.path}`,
|
|
375
|
+
})))
|
|
368
376
|
}
|
|
369
377
|
|
|
370
378
|
function scan(target, cli) {
|
|
@@ -374,10 +382,11 @@ function scan(target, cli) {
|
|
|
374
382
|
// Un monorepo de sesenta paquetes no se lee en pantalla. Se recorta, y se dice cuánto: un corte que no
|
|
375
383
|
// se anuncia hace pasar lo listado por todo lo que hay.
|
|
376
384
|
for (const service of result.services.slice(0, LISTA)) {
|
|
377
|
-
|
|
385
|
+
// El proyecto que vive en la raíz se nombra por su carpeta: `.` a secas no dice de cuál se habla.
|
|
386
|
+
const nombre = service.path === '.' ? `. (${path.basename(service.root || result.root)})` : service.path
|
|
378
387
|
const espera = service.env ? `\n espera ${service.env.names.join(', ')} (${service.env.file})` : ''
|
|
379
388
|
console.log(
|
|
380
|
-
`${
|
|
389
|
+
`${nombre} [${(service.runtimes || []).join(', ')}]${comandos(service.commands)}${espera}`,
|
|
381
390
|
)
|
|
382
391
|
}
|
|
383
392
|
if (result.services.length > LISTA) {
|
package/package.json
CHANGED
|
@@ -15,3 +15,15 @@ Buscar fallos de corrección, seguridad, compatibilidad y operabilidad antes de
|
|
|
15
15
|
## R4 — Sincronización de estados
|
|
16
16
|
|
|
17
17
|
El estado se mueve de forma atómica entre contratos; nunca se copia para representar progreso.
|
|
18
|
+
|
|
19
|
+
## R16 — El costo es el contexto, no las palabras
|
|
20
|
+
|
|
21
|
+
Cada llamada reenvía el contexto entero, así que gasta más quien da más vueltas que quien escribe más.
|
|
22
|
+
Los comandos independientes van en una sola invocación; el CLI antes que el archivo; el fragmento antes
|
|
23
|
+
que el archivo entero; un subagente o un workflow sólo cuando el trabajo no entra en la corrida actual.
|
|
24
|
+
|
|
25
|
+
Se lee para escribir, no para confirmar: un archivo se lee una vez y se escribe entero. Releerlo para
|
|
26
|
+
comprobar que quedó no comprueba nada que un error no hubiera dicho.
|
|
27
|
+
|
|
28
|
+
Verificar es la excepción, y no se negocia. Ahorrar una llamada nunca justifica afirmar sin haber
|
|
29
|
+
comprobado —R14 no admite descuentos— ni dar por terminado lo que no se corrió.
|