@ingeniomaps/cauce 0.18.0 → 0.20.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.
Files changed (106) hide show
  1. package/.github/workflows/agent-learning.yml +103 -13
  2. package/.github/workflows/ci.yml +2 -2
  3. package/CHANGELOG.md +107 -0
  4. package/README.md +21 -0
  5. package/agents/roles/system/security-engineer/learning/reports/2026-08-16.md +313 -0
  6. package/automatization/hooks/README.md +27 -0
  7. package/engine/agents/fork.js +23 -5
  8. package/engine/agents/learning.js +13 -1
  9. package/engine/automation/index.js +3 -0
  10. package/engine/cli/ops.js +6 -1
  11. package/engine/hooks/run.js +28 -1
  12. package/package.json +1 -1
  13. package/agents/roles/system/ai-governance-lead/learning/proposals/_template.md +0 -11
  14. package/agents/roles/system/ai-governance-lead/learning/reports/_template.md +0 -11
  15. package/agents/roles/system/ai-product-manager/learning/proposals/_template.md +0 -9
  16. package/agents/roles/system/ai-product-manager/learning/reports/_template.md +0 -9
  17. package/agents/roles/system/analytics-engineer/learning/proposals/_template.md +0 -9
  18. package/agents/roles/system/analytics-engineer/learning/reports/_template.md +0 -9
  19. package/agents/roles/system/backend-engineer/learning/proposals/_template.md +0 -15
  20. package/agents/roles/system/backend-engineer/learning/reports/_template.md +0 -14
  21. package/agents/roles/system/business-operations-manager/learning/proposals/_template.md +0 -13
  22. package/agents/roles/system/business-operations-manager/learning/reports/_template.md +0 -12
  23. package/agents/roles/system/business-strategist/learning/proposals/_template.md +0 -15
  24. package/agents/roles/system/business-strategist/learning/reports/_template.md +0 -14
  25. package/agents/roles/system/cloud-architect/learning/proposals/_template.md +0 -9
  26. package/agents/roles/system/cloud-architect/learning/reports/_template.md +0 -9
  27. package/agents/roles/system/community-manager/learning/proposals/_template.md +0 -11
  28. package/agents/roles/system/community-manager/learning/reports/_template.md +0 -10
  29. package/agents/roles/system/content-specialist/learning/proposals/_template.md +0 -15
  30. package/agents/roles/system/content-specialist/learning/reports/_template.md +0 -14
  31. package/agents/roles/system/customer-success-manager/learning/proposals/_template.md +0 -15
  32. package/agents/roles/system/customer-success-manager/learning/reports/_template.md +0 -14
  33. package/agents/roles/system/customer-support-specialist/learning/proposals/_template.md +0 -15
  34. package/agents/roles/system/customer-support-specialist/learning/reports/_template.md +0 -14
  35. package/agents/roles/system/data-analyst/learning/proposals/_template.md +0 -15
  36. package/agents/roles/system/data-analyst/learning/reports/_template.md +0 -14
  37. package/agents/roles/system/data-engineer/learning/proposals/_template.md +0 -11
  38. package/agents/roles/system/data-engineer/learning/reports/_template.md +0 -10
  39. package/agents/roles/system/data-scientist/learning/proposals/_template.md +0 -11
  40. package/agents/roles/system/data-scientist/learning/reports/_template.md +0 -10
  41. package/agents/roles/system/database-administrator/learning/proposals/_template.md +0 -9
  42. package/agents/roles/system/database-administrator/learning/reports/_template.md +0 -9
  43. package/agents/roles/system/developer-relations-engineer/learning/proposals/_template.md +0 -11
  44. package/agents/roles/system/developer-relations-engineer/learning/reports/_template.md +0 -10
  45. package/agents/roles/system/devops-engineer/learning/proposals/_template.md +0 -15
  46. package/agents/roles/system/devops-engineer/learning/reports/_template.md +0 -14
  47. package/agents/roles/system/engineering-manager/learning/proposals/_template.md +0 -13
  48. package/agents/roles/system/engineering-manager/learning/reports/_template.md +0 -12
  49. package/agents/roles/system/financial-controller/learning/proposals/_template.md +0 -15
  50. package/agents/roles/system/financial-controller/learning/reports/_template.md +0 -14
  51. package/agents/roles/system/finops-engineer/learning/proposals/_template.md +0 -15
  52. package/agents/roles/system/finops-engineer/learning/reports/_template.md +0 -14
  53. package/agents/roles/system/frontend-engineer/learning/proposals/_template.md +0 -15
  54. package/agents/roles/system/frontend-engineer/learning/reports/_template.md +0 -14
  55. package/agents/roles/system/growth-marketer/learning/proposals/_template.md +0 -15
  56. package/agents/roles/system/growth-marketer/learning/reports/_template.md +0 -14
  57. package/agents/roles/system/implementation-manager/learning/proposals/_template.md +0 -11
  58. package/agents/roles/system/implementation-manager/learning/reports/_template.md +0 -12
  59. package/agents/roles/system/legal-counsel/learning/proposals/_template.md +0 -14
  60. package/agents/roles/system/legal-counsel/learning/reports/_template.md +0 -14
  61. package/agents/roles/system/machine-learning-engineer/learning/proposals/_template.md +0 -11
  62. package/agents/roles/system/machine-learning-engineer/learning/reports/_template.md +0 -10
  63. package/agents/roles/system/mlops-engineer/learning/proposals/_template.md +0 -9
  64. package/agents/roles/system/mlops-engineer/learning/reports/_template.md +0 -9
  65. package/agents/roles/system/mobile-engineer/learning/proposals/_template.md +0 -15
  66. package/agents/roles/system/mobile-engineer/learning/reports/_template.md +0 -14
  67. package/agents/roles/system/partnerships-manager/learning/proposals/_template.md +0 -11
  68. package/agents/roles/system/partnerships-manager/learning/reports/_template.md +0 -10
  69. package/agents/roles/system/people-operations-manager/learning/proposals/_template.md +0 -14
  70. package/agents/roles/system/people-operations-manager/learning/reports/_template.md +0 -14
  71. package/agents/roles/system/privacy-compliance-specialist/learning/proposals/_template.md +0 -15
  72. package/agents/roles/system/privacy-compliance-specialist/learning/reports/_template.md +0 -14
  73. package/agents/roles/system/procurement-manager/learning/proposals/_template.md +0 -14
  74. package/agents/roles/system/procurement-manager/learning/reports/_template.md +0 -13
  75. package/agents/roles/system/product-manager/learning/proposals/_template.md +0 -15
  76. package/agents/roles/system/product-manager/learning/reports/_template.md +0 -14
  77. package/agents/roles/system/product-marketing-manager/learning/proposals/_template.md +0 -15
  78. package/agents/roles/system/product-marketing-manager/learning/reports/_template.md +0 -14
  79. package/agents/roles/system/project-manager/learning/proposals/_template.md +0 -13
  80. package/agents/roles/system/project-manager/learning/reports/_template.md +0 -12
  81. package/agents/roles/system/qa-engineer/learning/proposals/_template.md +0 -15
  82. package/agents/roles/system/qa-engineer/learning/reports/_template.md +0 -14
  83. package/agents/roles/system/release-manager/learning/proposals/_template.md +0 -13
  84. package/agents/roles/system/release-manager/learning/reports/_template.md +0 -12
  85. package/agents/roles/system/revenue-operations-manager/learning/proposals/_template.md +0 -13
  86. package/agents/roles/system/revenue-operations-manager/learning/reports/_template.md +0 -12
  87. package/agents/roles/system/sales-representative/learning/proposals/_template.md +0 -15
  88. package/agents/roles/system/sales-representative/learning/reports/_template.md +0 -14
  89. package/agents/roles/system/security-engineer/learning/proposals/_template.md +0 -15
  90. package/agents/roles/system/security-engineer/learning/reports/_template.md +0 -14
  91. package/agents/roles/system/site-reliability-engineer/learning/proposals/_template.md +0 -15
  92. package/agents/roles/system/site-reliability-engineer/learning/reports/_template.md +0 -14
  93. package/agents/roles/system/software-architect/learning/proposals/_template.md +0 -15
  94. package/agents/roles/system/software-architect/learning/reports/_template.md +0 -14
  95. package/agents/roles/system/solutions-engineer/learning/proposals/_template.md +0 -13
  96. package/agents/roles/system/solutions-engineer/learning/reports/_template.md +0 -12
  97. package/agents/roles/system/technical-program-manager/learning/proposals/_template.md +0 -9
  98. package/agents/roles/system/technical-program-manager/learning/reports/_template.md +0 -9
  99. package/agents/roles/system/technical-writer/learning/proposals/_template.md +0 -14
  100. package/agents/roles/system/technical-writer/learning/reports/_template.md +0 -12
  101. package/agents/roles/system/ui-designer/learning/proposals/_template.md +0 -15
  102. package/agents/roles/system/ui-designer/learning/reports/_template.md +0 -14
  103. package/agents/roles/system/user-researcher/learning/proposals/_template.md +0 -15
  104. package/agents/roles/system/user-researcher/learning/reports/_template.md +0 -14
  105. package/agents/roles/system/ux-designer/learning/proposals/_template.md +0 -15
  106. package/agents/roles/system/ux-designer/learning/reports/_template.md +0 -14
@@ -16,9 +16,10 @@ on:
16
16
  required: false
17
17
  default: ""
18
18
 
19
+ # Mínimo arriba: cada job eleva sólo lo que necesita. El que corre el agente se queda en `read` —
20
+ # ingiere contenido web que no controlamos y no tiene por qué poder escribir el repositorio.
19
21
  permissions:
20
- contents: write
21
- pull-requests: write
22
+ contents: read
22
23
 
23
24
  jobs:
24
25
  discover:
@@ -26,8 +27,8 @@ jobs:
26
27
  outputs:
27
28
  agents: ${{ steps.list.outputs.agents }}
28
29
  steps:
29
- - uses: actions/checkout@v4
30
- - uses: actions/setup-node@v4
30
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
31
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
31
32
  with:
32
33
  node-version: "24"
33
34
 
@@ -71,14 +72,16 @@ jobs:
71
72
  if: github.event.schedule != '17 13 1 * *'
72
73
  needs: discover
73
74
  runs-on: ubuntu-latest
75
+ permissions:
76
+ contents: read
74
77
  strategy:
75
78
  fail-fast: false
76
79
  max-parallel: 3
77
80
  matrix:
78
81
  agent: ${{ fromJSON(needs.discover.outputs.agents) }}
79
82
  steps:
80
- - uses: actions/checkout@v4
81
- - uses: actions/setup-node@v4
83
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
84
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
82
85
  with:
83
86
  node-version: "24"
84
87
  - name: Check credential
@@ -118,7 +121,7 @@ jobs:
118
121
  AGENT: ${{ matrix.agent }}
119
122
  ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
120
123
  run: |
121
- npm install -g @anthropic-ai/claude-code
124
+ npm install -g @anthropic-ai/claude-code@2.1.233
122
125
  claude -p "Leé el learning/AUTOMATION.md del cargo $AGENT y ejecutá exactamente lo que declara. El informe de esta semana ya está creado y vacío: completalo. Cada afirmación necesita enlace, fecha y versión; lo que no puedas corroborar va a Preguntas abiertas en vez de afirmarse. El único archivo que escribís es ese informe."
123
126
  - name: Detect changes
124
127
  if: steps.creds.outputs.ready == 'true'
@@ -129,20 +132,102 @@ jobs:
129
132
  else
130
133
  echo "changed=true" >> "$GITHUB_OUTPUT"
131
134
  fi
132
- - name: Open research pull request
135
+ # El informe sale de acá como artifact, no como commit. Lo que el agente escribió fuera de su
136
+ # informe se queda en este runner y muere con él: no hay credencial con que sacarlo.
137
+ - name: Collect report
133
138
  if: steps.creds.outputs.ready == 'true' && steps.changes.outputs.changed == 'true'
139
+ id: collect
134
140
  env:
135
141
  AGENT: ${{ matrix.agent }}
136
- GH_TOKEN: ${{ github.token }}
137
142
  run: |
138
143
  stamp="$(date -u +%Y-%m-%d)"
139
- branch="automation/$AGENT-research-$stamp"
140
144
  report="$(git diff --name-only -- "agents/*/$AGENT/learning/reports/$stamp.md")"
141
145
  if [ -z "$report" ]; then
142
- echo "El agente cambió archivos fuera de su informe; no se abre PR." >&2
146
+ echo "El agente no escribió su informe; lo que haya tocado no sale de acá." >&2
143
147
  git diff --name-only >&2
144
148
  exit 1
145
149
  fi
150
+ echo "path=$report" >> "$GITHUB_OUTPUT"
151
+ echo "stamp=$stamp" >> "$GITHUB_OUTPUT"
152
+ - name: Upload report
153
+ if: steps.collect.outputs.path != ''
154
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
155
+ with:
156
+ name: research-${{ matrix.agent }}
157
+ path: ${{ steps.collect.outputs.path }}
158
+ retention-days: 7
159
+
160
+ # Segundo job y no un paso más: acá vive la credencial de escritura, y para llegar hasta acá el
161
+ # informe tuvo que pasar por un artifact. Este job no habla con ningún modelo ni lee la web —
162
+ # recibe un archivo, comprueba que caiga donde debe, y lo commitea.
163
+ research-pr:
164
+ needs: [discover, research]
165
+ if: needs.research.result == 'success'
166
+ runs-on: ubuntu-latest
167
+ permissions:
168
+ contents: write
169
+ pull-requests: write
170
+ strategy:
171
+ fail-fast: false
172
+ max-parallel: 3
173
+ matrix:
174
+ agent: ${{ fromJSON(needs.discover.outputs.agents) }}
175
+ steps:
176
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
177
+ - name: Download report
178
+ id: fetch
179
+ continue-on-error: true
180
+ uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
181
+ with:
182
+ name: research-${{ matrix.agent }}
183
+ path: ${{ github.workspace }}
184
+ - name: Resolve CLI
185
+ if: steps.fetch.outcome == 'success'
186
+ id: cli
187
+ run: |
188
+ for candidate in tools/ops.js engine/cli/ops.js; do
189
+ if [ -f "$candidate" ]; then
190
+ echo "path=$candidate" >> "$GITHUB_OUTPUT"
191
+ exit 0
192
+ fi
193
+ done
194
+ echo "No se encontró el CLI de Cauce." >&2
195
+ exit 1
196
+ - name: Open research pull request
197
+ if: steps.fetch.outcome == 'success'
198
+ env:
199
+ AGENT: ${{ matrix.agent }}
200
+ OPS: ${{ steps.cli.outputs.path }}
201
+ GH_TOKEN: ${{ github.token }}
202
+ run: |
203
+ stamp="$(date -u +%Y-%m-%d)"
204
+ branch="automation/$AGENT-research-$stamp"
205
+ # El artifact trae contenido, no destino: `upload-artifact` aplana la ruta de un archivo
206
+ # suelto, así que llega como `<fecha>.md` a la raíz. Dónde va se resuelve **acá**, con el
207
+ # mismo CLI que resolvió el catálogo antes, y eso además es la garantía: nada de lo que
208
+ # venga en el artifact puede redirigir dónde aterriza el archivo.
209
+ dir="$(node "$OPS" agents list --json | node -e '
210
+ let s = ""
211
+ process.stdin.on("data", (d) => { s += d }).on("end", () => {
212
+ const found = JSON.parse(s).find((role) => role.slug === process.env.AGENT)
213
+ if (!found) { console.error("agente desconocido"); process.exit(1) }
214
+ console.log(found.path)
215
+ })')"
216
+ dest="$dir/learning/reports/$stamp.md"
217
+ mkdir -p "$(dirname "$dest")"
218
+ mv "$stamp.md" "$dest"
219
+ report="$(git diff --name-only -- "agents/*/$AGENT/learning/reports/$stamp.md")"
220
+ otros="$(git status --porcelain | awk '{print $2}' | grep -v -F "$dest" || true)"
221
+ if [ -z "$report" ] && [ ! -f "$dest" ]; then
222
+ echo "No llegó el informe de $AGENT." >&2
223
+ exit 1
224
+ fi
225
+ if [ -n "$otros" ]; then
226
+ echo "Se esperaba exactamente el informe de $AGENT y nada más." >&2
227
+ git status --porcelain >&2
228
+ exit 1
229
+ fi
230
+ report="$dest"
146
231
  git config user.name "github-actions[bot]"
147
232
  git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
148
233
  git switch -c "$branch"
@@ -153,18 +238,23 @@ jobs:
153
238
  --title "$AGENT weekly research — $stamp" \
154
239
  --body "Investigación semanal de la profesión. No modifica SKILL.md ni propone cambios: alimenta la propuesta mensual."
155
240
 
241
+ # Este job no habla con ningún modelo: consolida informes ya commiteados con el CLI y abre el PR.
242
+ # Por eso puede escribir sin la separación que exige `research`.
156
243
  propose:
157
244
  if: github.event.schedule == '17 13 1 * *' || github.event_name == 'workflow_dispatch'
158
245
  needs: discover
159
246
  runs-on: ubuntu-latest
247
+ permissions:
248
+ contents: write
249
+ pull-requests: write
160
250
  strategy:
161
251
  fail-fast: false
162
252
  max-parallel: 5
163
253
  matrix:
164
254
  agent: ${{ fromJSON(needs.discover.outputs.agents) }}
165
255
  steps:
166
- - uses: actions/checkout@v4
167
- - uses: actions/setup-node@v4
256
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
257
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
168
258
  with:
169
259
  node-version: "24"
170
260
 
@@ -17,8 +17,8 @@ jobs:
17
17
  ci:
18
18
  runs-on: ubuntu-latest
19
19
  steps:
20
- - uses: actions/checkout@v4
21
- - uses: actions/setup-node@v4
20
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
21
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
22
22
  with:
23
23
  node-version: "24"
24
24
  # Valida planning, automatización e integraciones y después corre las pruebas
package/CHANGELOG.md CHANGED
@@ -8,6 +8,113 @@ 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.20.0] - 2026-08-17
12
+
13
+ Casi todo lo de abajo sale de la primera investigación semanal del cargo `security-engineer` corriendo
14
+ de verdad sobre este repositorio. De sus ocho hallazgos, dos resultaron sobredimensionados al
15
+ verificarlos y quedaron cerrados sin cambio; el resto está acá.
16
+
17
+ ### Cambiado
18
+
19
+ - **El agente de investigación semanal ya no comparte job con la credencial de escritura.** Ingiere
20
+ contenido web que nadie controla, y hasta ahora corría con `contents: write` y la API key en el
21
+ mismo lugar: cualquier instrucción que llegara dentro de una página tenía un repositorio a mano.
22
+
23
+ Ahora entrega su informe como artifact y un segundo job lo commitea, sin modelo y sin credencial de
24
+ API. Ese job resuelve **dónde** aterriza el archivo con el mismo CLI que resolvió el catálogo, así
25
+ que nada de lo que viaje en el artifact puede redirigirlo. El permiso por defecto del workflow baja
26
+ a `contents: read`: un job nuevo ya no nace pudiendo escribir por herencia.
27
+
28
+ - **Las acciones de GitHub quedan fijadas por SHA de commit**, y el CLI del agente por versión. Un tag
29
+ es mutable: quien controle el repositorio de la acción puede moverlo a otro commit y el workflow
30
+ ejecuta código nuevo sin que cambie una línea acá.
31
+
32
+ - **`guard-secrets` reconoce los archivos de credencial que las herramientas escriben solas** —
33
+ `.npmrc`, `.netrc`, `id_rsa` y compañía—. Correr el guard sobre trece nombres mostró que `.env`
34
+ bloqueaba y esos pasaban, y `.npmrc` es donde vive el token de publicación. Tapa un caso conocido;
35
+ no vuelve completo al guard.
36
+
37
+ ### Corregido
38
+
39
+ - **Los informes de aprendizaje traen escritas las convenciones de las que depende el ciclo.** Cuatro
40
+ corridas independientes etiquetaron sus hallazgos `H1`, `H2`, … sin que nada se lo pidiera, y esa
41
+ etiqueta terminó siendo carga: dentro del informe une «Hallazgos» con «Evidencia» y «Recomendación»,
42
+ y la propuesta mensual la cita para decir de qué hallazgo sale un cambio. Funcionaba porque los
43
+ modelos convergen, que es exactamente lo que deja de funcionar sin avisar.
44
+
45
+ Lo mismo con los títulos: la consolidación busca `## Recomendación` exacto y renombrarlo no da error
46
+ — deja la propuesta diciendo que no se registró nada.
47
+
48
+ ### Removido
49
+
50
+ - **Se retiran 94 `_template.md` que el motor nunca leyó.** `learn` arma el andamiaje del informe y de
51
+ la propuesta desde un molde propio; esos archivos no los leía nadie: ni el motor, ni un workflow, ni
52
+ un runner, y ningún `SKILL.md` los nombra.
53
+
54
+ No eran inertes. **Quince de los cuarenta y siete describían una forma que el motor nunca produce**
55
+ —viñetas planas, sin sección de hallazgos y sin el título que la consolidación busca—, así que un
56
+ agente que respetara su molde habría reestructurado el informe y dejado la propuesta vacía sin
57
+ levantar nada.
58
+
59
+ Comprobado antes de retirarlos: sin sus moldes, `qa-engineer` sigue evaluando 7/7 y `learn` arma su
60
+ andamiaje igual. Adoptar un cargo pasa a copiar trece archivos en vez de quince.
61
+
62
+ ### Notas de seguridad sin cambio
63
+
64
+ - **El token de npm no requiere acción.** El hallazgo lo describía como secreto de larga vida y sin
65
+ expiración; verificado, tiene ventana acotada, y la afirmación de que npm revocó los tokens clásicos
66
+ no se sostiene —el token funciona—. Lo único cierto que queda es que su alcance es de cuenta y no de
67
+ paquete: al renovarlo conviene acotarlo, y nada más.
68
+
69
+ - **Los guards no son un límite de seguridad**, y `automatization/hooks/README.md` ahora lo dice con
70
+ sus dos casos reproducibles. El riesgo real no es el bypass sino la confianza que doce guards
71
+ puestos inspiran: si algo tiene que ser imposible, va en permisos, alcance de token o revisión
72
+ humana, no en una coincidencia de texto.
73
+
74
+ ## [0.19.0] - 2026-08-16
75
+
76
+ Los cuatro arreglos de abajo salieron de correr los tres caminos de punta a punta —un cargo que
77
+ aprende en el toolkit, uno propio de una empresa, y uno del catálogo adoptado y aprendiendo—, no de
78
+ un test. Son cosas que se veían correctas hasta que algo las siguió de verdad.
79
+
80
+ ### Agregado
81
+
82
+ - **`guard-governance` cubre el contrato de un cargo, su medición y su firma.** `agent-promote` se
83
+ niega si «Aprobación humana» no está firmada, pero lo único que impedía que la escribiera un agente
84
+ era una frase en un prompt: una instrucción, no un candado, y el archivo no estaba protegido por
85
+ nada.
86
+
87
+ Alrededor de la firma van las otras piezas del mismo acto. `SKILL.md` y `references/` son lo que la
88
+ propuesta cambia: sin ellos, editar el contrato directo saltea el ciclo entero. Y
89
+ `evaluations/cases/` con `expected-behaviors.yaml` son el denominador con que se juzga —el propio
90
+ recorrido de propuesta ya dice que cambiarlo «es parte de lo que se aprueba»—, así que moverlo en
91
+ silencio ablanda toda medición pasada sin tocar una regla.
92
+
93
+ **Para una empresa esto significa** que tocar su propio cargo pide `OPS_GOVERNANCE_OVERRIDE=1`, la
94
+ misma puerta explícita que ya rige para `planning/adr/` y `planning/rules/`. Las dos clases de
95
+ evidencia quedan afuera: `learning/reports/` y `evaluations/results/` registran lo que pasó un día
96
+ en vez de decidir algo, y un veredicto se escribe en cada corrida.
97
+
98
+ ### Corregido
99
+
100
+ - **La automatización de un cargo adoptado apuntaba al catálogo.** El `AUTOMATION.md` del sistema dice
101
+ «mantené `agents/<tipo>/system/<slug>`», que dentro de una empresa es el paquete. Copiado tal cual,
102
+ el ciclo semanal del cargo adoptado escribía en un directorio que el guard bloquea y que npm borra
103
+ —y reportaba éxito—. `agents fork` ahora reescribe esas rutas a las de la empresa.
104
+
105
+ - **Devolver un cargo al catálogo dejaba avisos sobre una copia que no existe.** Borrar un fork
106
+ resuelve bien —el cargo vuelve a salir del paquete— pero el manifiesto conservaba su registro, así
107
+ que `check` decía «tu copia no recibe mejoras del catálogo» y mandaba a mirar un directorio
108
+ borrado. Devolver es tan legítimo como adoptar: ahora la deriva exige que la copia exista antes de
109
+ comparar, y `upgrade` poda el registro huérfano igual que ya poda los archivos.
110
+
111
+ - **El puntero que instala el runner no decía a qué se ancla.** Dos agentes que resolvieron un cargo
112
+ parados en el repo ops construyeron la ruta doblada —`<empresa>-ops/<empresa>-ops/...`— y tuvieron
113
+ que deducir la raíz. En sidecar el wiring vive en la carpeta de la compañía y el repo ops es uno de
114
+ sus hijos; ahora el puntero lo dice.
115
+
116
+ - **`learn` sugería copiar un cargo a mano** en vez de nombrar `agents fork`, que ya existe.
117
+
11
118
  ## [0.18.0] - 2026-08-16
12
119
 
13
120
  ### Agregado
package/README.md CHANGED
@@ -80,6 +80,7 @@ Lee [template/planning/PROTOCOL.md](template/planning/PROTOCOL.md) para el contr
80
80
  | `ops learn <agent>` | Prepara el informe semanal que completa la automatización de Codex. |
81
81
  | `ops learn <agent> --proposal` | Consolida informes mensuales en una propuesta sin aplicar cambios. |
82
82
  | `ops evaluate <agent>` | Valida controles, casos y propuestas del agente. |
83
+ | `ops evaluate <agent> --bench` | Arma el banco desechable donde un cargo del catálogo trabaja. |
83
84
  | `ops team list` | Lista equipos disponibles. |
84
85
  | `ops team check <team>` | Valida manifiesto, agentes, dependencias y gates del equipo. |
85
86
  | `ops team show <team>` | Muestra el recorrido y artefactos del equipo; `--json` para consumirlo. |
@@ -184,6 +185,26 @@ todas las empresas: investigarla una vez y bien es mejor que repetirla en cada i
184
185
  Por eso `learn` falla si lo corrés sobre un cargo del catálogo dentro de una instancia: escribiría en
185
186
  el paquete y se perdería. El ciclo mensual de aprendizaje tampoco se distribuye — vive sólo acá.
186
187
 
188
+ #### Evaluar un cargo del catálogo
189
+
190
+ Los casos adversariales miden a un cargo trabajando, y un cargo cuya entrega es una épica o una entrada
191
+ de INBOX necesita un `planning/` donde escribir sea legítimo. El toolkit no lo tiene ni puede tenerlo:
192
+ el único `planning/` que vive acá es `template/planning`, el molde que se distribuye.
193
+
194
+ ```bash
195
+ node engine/cli/ops.js evaluate product-manager --bench
196
+ ```
197
+
198
+ Devuelve la ruta de una instancia desechable —`check` pasa, el catálogo resuelve desde adentro,
199
+ `planning/` está vacío y escribible— que el recorrido `/agent-eval` usa como lugar de trabajo. Se
200
+ recrea entera en cada corrida: reutilizarla dejaría que lo que un cargo escribió el lunes sea contexto
201
+ del que responde el martes.
202
+
203
+ El veredicto se escribe **junto al cargo**, no en el banco. El banco se borra; el contrato queda.
204
+
205
+ Desde una empresa esto no aplica: su instancia ya es el lugar, y lo que se evalúa ahí tiene que ser un
206
+ cargo suyo —propio o adoptado—.
207
+
187
208
  #### Quedarse con una versión propia de un cargo del catálogo
188
209
 
189
210
  ```bash