santismm-knowledge-mcp 0.2.2 → 0.3.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/README.md +9 -7
- package/content/architectures/ai-workforce.json +3 -1
- package/content/claims/a-harness-can-degrade-the-agent.json +51 -0
- package/content/claims/harness-changes-outcomes.json +57 -0
- package/content/claims/harness-engineering-is-a-distinct-discipline.json +43 -0
- package/content/claims/harness-is-the-durable-asset.json +43 -0
- package/content/claims/maturity-levels-are-ordered-by-dependency.json +43 -0
- package/content/claims/practice-converges-on-eight-components.json +58 -0
- package/content/claims/verified-outcome-is-the-unit.json +50 -0
- package/content/governance/agentic-ai-governance-checklist.json +3 -1
- package/content/harness/HRN-001-definition-and-overview.es.md +6 -3
- package/content/harness/HRN-001-definition-and-overview.md +6 -3
- package/content/harness/HRN-001-definition-and-overview.pt.md +6 -3
- package/content/harness/HRN-013-glossary.es.md +1 -1
- package/content/harness/HRN-013-glossary.md +1 -1
- package/content/harness/HRN-013-glossary.pt.md +1 -1
- package/content/knowledge/foundation-models.json +2 -1
- package/content/knowledge/harness-engineering.json +3 -3
- package/content/library/the-agentic-enterprise-needs-an-immune-system.md +16 -0
- package/content/library/the-stopwatch-and-the-exam.md +5 -1
- package/content/matrix/agentic-control-matrix.json +402 -3
- package/content/maturity/harness-maturity-model.json +569 -0
- package/content/patterns/evaluator-optimizer.json +1 -0
- package/content/patterns/goal-decomposition.json +1 -0
- package/content/patterns/human-approval-gate.json +1 -0
- package/content/patterns/long-term-memory.json +1 -0
- package/content/patterns/orchestrator-workers.json +1 -0
- package/content/patterns/sandboxed-execution.json +1 -0
- package/content/patterns/supervisor-agent.json +1 -0
- package/content/scorecard/harness-scorecard.json +460 -0
- package/dist/articles.js +120 -0
- package/dist/content.js +14 -1
- package/dist/shape.js +125 -3
- package/dist/tools.js +176 -4
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "ACM",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"updated": "2026-08-
|
|
3
|
+
"version": "1.2",
|
|
4
|
+
"updated": "2026-08-27",
|
|
5
5
|
"groups": [
|
|
6
6
|
"permissions",
|
|
7
7
|
"egress",
|
|
@@ -10,6 +10,21 @@
|
|
|
10
10
|
"observability",
|
|
11
11
|
"lifecycle"
|
|
12
12
|
],
|
|
13
|
+
"axes": {
|
|
14
|
+
"moment": [
|
|
15
|
+
"feedforward",
|
|
16
|
+
"feedback"
|
|
17
|
+
],
|
|
18
|
+
"mechanism": [
|
|
19
|
+
"deterministic",
|
|
20
|
+
"inferential"
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
"expiry": [
|
|
24
|
+
"measurement",
|
|
25
|
+
"architecture",
|
|
26
|
+
"never"
|
|
27
|
+
],
|
|
13
28
|
"frameworks": [
|
|
14
29
|
{
|
|
15
30
|
"key": "eu-ai-act",
|
|
@@ -56,6 +71,18 @@
|
|
|
56
71
|
{
|
|
57
72
|
"id": "ACM-01",
|
|
58
73
|
"group": "permissions",
|
|
74
|
+
"axes": {
|
|
75
|
+
"moment": "feedforward",
|
|
76
|
+
"mechanism": "inferential"
|
|
77
|
+
},
|
|
78
|
+
"expiry": {
|
|
79
|
+
"expiresOn": "architecture",
|
|
80
|
+
"improves": [
|
|
81
|
+
"contain"
|
|
82
|
+
],
|
|
83
|
+
"validatedAgainst": null,
|
|
84
|
+
"validatedOn": null
|
|
85
|
+
},
|
|
59
86
|
"patterns": [
|
|
60
87
|
"least-privilege-tooling"
|
|
61
88
|
],
|
|
@@ -92,16 +119,25 @@
|
|
|
92
119
|
"en": {
|
|
93
120
|
"name": "Scoped tool catalogue",
|
|
94
121
|
"statement": "Every tool the agent can call is listed, with its scope, whether it writes, and what an attacker gains by calling it. A tool nobody documented is a permission nobody reviewed.",
|
|
122
|
+
"axisNote": "It constrains what may exist before anything runs, but nothing enforces its completeness: a catalogue is worth the diligence of whoever wrote it.",
|
|
123
|
+
"assumes": "That nobody can hold the tool surface in their head, and that the surface changes faster than memory does.",
|
|
124
|
+
"retireWhen": "The runtime can enumerate every callable tool with its scope and its owner on demand, at which point a maintained document is a second copy of a fact the platform already holds.",
|
|
95
125
|
"test": "Produce the catalogue. Every entry has a written scope and a named owner, and nothing the agent can call is missing from it."
|
|
96
126
|
},
|
|
97
127
|
"es": {
|
|
98
128
|
"name": "Catálogo de herramientas acotado",
|
|
99
129
|
"statement": "Toda herramienta que el agente puede invocar está listada, con su alcance, si escribe y qué gana un atacante al invocarla. Una herramienta que nadie documentó es un permiso que nadie revisó.",
|
|
130
|
+
"axisNote": "Acota lo que puede existir antes de que nada se ejecute, pero nada garantiza que esté completo: un catálogo vale lo que la diligencia de quien lo escribió.",
|
|
131
|
+
"assumes": "Que nadie es capaz de retener la superficie de herramientas en la cabeza, y que esa superficie cambia más rápido que la memoria.",
|
|
132
|
+
"retireWhen": "El runtime puede enumerar bajo demanda toda herramienta invocable con su alcance y su responsable, momento en que un documento mantenido a mano es una segunda copia de un hecho que la plataforma ya tiene.",
|
|
100
133
|
"test": "Produce el catálogo. Cada entrada tiene alcance escrito y responsable con nombre, y nada de lo que el agente puede invocar falta en él."
|
|
101
134
|
},
|
|
102
135
|
"pt": {
|
|
103
136
|
"name": "Catálogo de ferramentas delimitado",
|
|
104
137
|
"statement": "Toda ferramenta que o agente pode invocar está listada, com seu escopo, se escreve e o que um atacante ganha ao invocá-la. Uma ferramenta que ninguém documentou é uma permissão que ninguém revisou.",
|
|
138
|
+
"axisNote": "Delimita o que pode existir antes de qualquer execução, mas nada garante que esteja completo: um catálogo vale a diligência de quem o escreveu.",
|
|
139
|
+
"assumes": "Que ninguém consegue reter a superfície de ferramentas na cabeça, e que essa superfície muda mais rápido que a memória.",
|
|
140
|
+
"retireWhen": "O runtime consegue enumerar sob demanda toda ferramenta invocável com seu escopo e seu responsável, momento em que um documento mantido à mão é uma segunda cópia de um dado que a plataforma já tem.",
|
|
105
141
|
"test": "Produza o catálogo. Cada entrada tem escopo escrito e responsável nomeado, e nada do que o agente pode invocar está fora dele."
|
|
106
142
|
}
|
|
107
143
|
}
|
|
@@ -109,6 +145,18 @@
|
|
|
109
145
|
{
|
|
110
146
|
"id": "ACM-02",
|
|
111
147
|
"group": "permissions",
|
|
148
|
+
"axes": {
|
|
149
|
+
"moment": "feedforward",
|
|
150
|
+
"mechanism": "deterministic"
|
|
151
|
+
},
|
|
152
|
+
"expiry": {
|
|
153
|
+
"expiresOn": "architecture",
|
|
154
|
+
"improves": [
|
|
155
|
+
"contain"
|
|
156
|
+
],
|
|
157
|
+
"validatedAgainst": null,
|
|
158
|
+
"validatedOn": null
|
|
159
|
+
},
|
|
112
160
|
"patterns": [
|
|
113
161
|
"least-privilege-tooling"
|
|
114
162
|
],
|
|
@@ -144,16 +192,25 @@
|
|
|
144
192
|
"en": {
|
|
145
193
|
"name": "Per-tool credentials at minimum scope",
|
|
146
194
|
"statement": "Each tool holds its own credential, issued at the narrowest scope the upstream system supports. A read-only tool backed by an admin token is one bug away from being a write tool.",
|
|
195
|
+
"axisNote": "The scope is enforced upstream, on the input side: a call outside it fails the same way every time, whatever the model intended.",
|
|
196
|
+
"assumes": "That upstream systems issue credentials narrower than the account, and that a compromised tool is a plausible event.",
|
|
197
|
+
"retireWhen": "Tool calls carry per-call, per-user authorisation that the upstream system evaluates, leaving a long-lived credential with nothing left to over-grant.",
|
|
147
198
|
"test": "For each tool, show the credential and its server-side scope. No two tools share a credential whose reach exceeds either one."
|
|
148
199
|
},
|
|
149
200
|
"es": {
|
|
150
201
|
"name": "Credenciales por herramienta con alcance mínimo",
|
|
151
202
|
"statement": "Cada herramienta tiene su credencial, emitida con el alcance más estrecho que soporte el sistema de arriba. Una herramienta de solo lectura respaldada por un token de administrador está a un bug de ser de escritura.",
|
|
203
|
+
"axisNote": "El alcance lo impone el sistema de origen, del lado de la entrada: una llamada fuera de él falla igual siempre, con independencia de lo que pretendiera el modelo.",
|
|
204
|
+
"assumes": "Que los sistemas de origen emiten credenciales más estrechas que la cuenta, y que una herramienta comprometida es un suceso plausible.",
|
|
205
|
+
"retireWhen": "Las llamadas a herramientas llevan autorización por llamada y por usuario que evalúa el sistema de origen, de modo que a una credencial de larga vida no le queda nada que conceder de más.",
|
|
152
206
|
"test": "Para cada herramienta, muestra la credencial y su alcance en el servidor. Ninguna pareja de herramientas comparte una credencial cuyo alcance exceda al de cualquiera de las dos."
|
|
153
207
|
},
|
|
154
208
|
"pt": {
|
|
155
209
|
"name": "Credenciais por ferramenta no escopo mínimo",
|
|
156
210
|
"statement": "Cada ferramenta tem sua credencial, emitida no escopo mais estreito que o sistema a montante suporta. Uma ferramenta somente leitura apoiada por um token de administrador está a um bug de virar de escrita.",
|
|
211
|
+
"axisNote": "O escopo é imposto pelo sistema de origem, do lado da entrada: uma chamada fora dele falha sempre da mesma forma, independentemente do que o modelo pretendesse.",
|
|
212
|
+
"assumes": "Que os sistemas de origem emitem credenciais mais estreitas que a conta, e que uma ferramenta comprometida é um evento plausível.",
|
|
213
|
+
"retireWhen": "As chamadas de ferramentas carregam autorização por chamada e por usuário que o sistema de origem avalia, de modo que a uma credencial de vida longa não sobra nada para conceder a mais.",
|
|
157
214
|
"test": "Para cada ferramenta, mostre a credencial e seu escopo no servidor. Nenhum par de ferramentas compartilha credencial cujo alcance exceda o de qualquer uma delas."
|
|
158
215
|
}
|
|
159
216
|
}
|
|
@@ -161,6 +218,18 @@
|
|
|
161
218
|
{
|
|
162
219
|
"id": "ACM-03",
|
|
163
220
|
"group": "permissions",
|
|
221
|
+
"axes": {
|
|
222
|
+
"moment": "feedforward",
|
|
223
|
+
"mechanism": "deterministic"
|
|
224
|
+
},
|
|
225
|
+
"expiry": {
|
|
226
|
+
"expiresOn": "architecture",
|
|
227
|
+
"improves": [
|
|
228
|
+
"contain"
|
|
229
|
+
],
|
|
230
|
+
"validatedAgainst": null,
|
|
231
|
+
"validatedOn": null
|
|
232
|
+
},
|
|
164
233
|
"patterns": [
|
|
165
234
|
"least-privilege-tooling"
|
|
166
235
|
],
|
|
@@ -194,16 +263,25 @@
|
|
|
194
263
|
"en": {
|
|
195
264
|
"name": "Parameter allowlists",
|
|
196
265
|
"statement": "The targets a tool may address — paths, repositories, tables, accounts, recipients — are constrained server-side, so a hijacked agent cannot repoint a legitimate tool at an illegitimate target.",
|
|
266
|
+
"axisNote": "It inspects the argument before the call happens, and refuses by rule rather than by opinion.",
|
|
267
|
+
"assumes": "That the model can be induced to point a legitimate tool at an illegitimate target, and that the upstream system will not stop it.",
|
|
268
|
+
"retireWhen": "The upstream system enforces the same constraint through its own authority model, at which point the allowlist is a duplicate that can drift out of agreement with it.",
|
|
197
269
|
"test": "Call each write-capable tool with an out-of-scope target. The call is refused by the tool's own boundary, not by the model declining."
|
|
198
270
|
},
|
|
199
271
|
"es": {
|
|
200
272
|
"name": "Listas de permitidos de parámetros",
|
|
201
273
|
"statement": "Los objetivos a los que una herramienta puede dirigirse —rutas, repositorios, tablas, cuentas, destinatarios— están acotados en el servidor, de modo que un agente secuestrado no pueda reapuntar una herramienta legítima a un objetivo ilegítimo.",
|
|
274
|
+
"axisNote": "Inspecciona el argumento antes de que la llamada ocurra, y rechaza por regla, no por criterio.",
|
|
275
|
+
"assumes": "Que al modelo se le puede inducir a apuntar una herramienta legítima a un destino ilegítimo, y que el sistema de origen no lo va a impedir.",
|
|
276
|
+
"retireWhen": "El sistema de origen impone la misma restricción con su propio modelo de autoridad, momento en que la lista permitida es un duplicado que puede desalinearse con él.",
|
|
202
277
|
"test": "Invoca cada herramienta con escritura contra un objetivo fuera de alcance. La llamada se rechaza en la frontera de la propia herramienta, no porque el modelo se niegue."
|
|
203
278
|
},
|
|
204
279
|
"pt": {
|
|
205
280
|
"name": "Listas de permitidos de parâmetros",
|
|
206
281
|
"statement": "Os alvos que uma ferramenta pode endereçar — caminhos, repositórios, tabelas, contas, destinatários — são limitados no servidor, de modo que um agente sequestrado não consiga reapontar uma ferramenta legítima para um alvo ilegítimo.",
|
|
282
|
+
"axisNote": "Inspeciona o argumento antes de a chamada acontecer, e recusa por regra, não por critério.",
|
|
283
|
+
"assumes": "Que o modelo pode ser induzido a apontar uma ferramenta legítima para um destino ilegítimo, e que o sistema de origem não vai impedir.",
|
|
284
|
+
"retireWhen": "O sistema de origem impõe a mesma restrição com seu próprio modelo de autoridade, momento em que a lista permitida é uma duplicata que pode se desalinhar dele.",
|
|
207
285
|
"test": "Invoque cada ferramenta com escrita contra um alvo fora do escopo. A chamada é recusada na fronteira da própria ferramenta, não porque o modelo se recusou."
|
|
208
286
|
}
|
|
209
287
|
}
|
|
@@ -211,6 +289,18 @@
|
|
|
211
289
|
{
|
|
212
290
|
"id": "ACM-04",
|
|
213
291
|
"group": "egress",
|
|
292
|
+
"axes": {
|
|
293
|
+
"moment": "feedforward",
|
|
294
|
+
"mechanism": "deterministic"
|
|
295
|
+
},
|
|
296
|
+
"expiry": {
|
|
297
|
+
"expiresOn": "never",
|
|
298
|
+
"improves": [
|
|
299
|
+
"contain"
|
|
300
|
+
],
|
|
301
|
+
"validatedAgainst": null,
|
|
302
|
+
"validatedOn": null
|
|
303
|
+
},
|
|
214
304
|
"patterns": [
|
|
215
305
|
"egress-allowlist"
|
|
216
306
|
],
|
|
@@ -246,16 +336,25 @@
|
|
|
246
336
|
"en": {
|
|
247
337
|
"name": "Default-deny egress",
|
|
248
338
|
"statement": "Outbound traffic reaches only named destinations; everything else is refused. Every exfiltration path ends in an outbound request, so this is the control that still works after the model has been convinced.",
|
|
339
|
+
"axisNote": "The destination is checked before the request leaves; no outcome is measured and no judgement is involved.",
|
|
340
|
+
"assumes": "That every exfiltration path ends in an outbound request, and that the set of legitimate destinations is knowable in advance.",
|
|
341
|
+
"retireWhen": "Not on capability grounds. Retire it when the agent has nothing worth exfiltrating — which is a statement about the data, not about the model.",
|
|
249
342
|
"test": "From inside the agent's environment, request a host that is not on the list. It fails at the network or proxy layer and the refusal is logged."
|
|
250
343
|
},
|
|
251
344
|
"es": {
|
|
252
345
|
"name": "Salida denegada por defecto",
|
|
253
346
|
"statement": "El tráfico saliente solo llega a destinos nombrados; todo lo demás se rechaza. Toda ruta de exfiltración termina en una petición saliente, así que este es el control que sigue funcionando cuando ya han convencido al modelo.",
|
|
347
|
+
"axisNote": "El destino se comprueba antes de que la petición salga; no se mide ningún resultado ni interviene criterio alguno.",
|
|
348
|
+
"assumes": "Que toda vía de exfiltración termina en una petición saliente, y que el conjunto de destinos legítimos se puede conocer de antemano.",
|
|
349
|
+
"retireWhen": "No por capacidad. Retíralo cuando el agente no tenga nada que valga la pena exfiltrar, que es una afirmación sobre los datos y no sobre el modelo.",
|
|
254
350
|
"test": "Desde dentro del entorno del agente, pide un host que no esté en la lista. Falla en la capa de red o de proxy y el rechazo queda registrado."
|
|
255
351
|
},
|
|
256
352
|
"pt": {
|
|
257
353
|
"name": "Saída negada por padrão",
|
|
258
354
|
"statement": "O tráfego de saída alcança apenas destinos nomeados; todo o resto é recusado. Todo caminho de exfiltração termina em uma requisição de saída, então este é o controle que continua funcionando depois que o modelo foi convencido.",
|
|
355
|
+
"axisNote": "O destino é verificado antes de a requisição sair; nenhum resultado é medido e nenhum critério intervém.",
|
|
356
|
+
"assumes": "Que toda via de exfiltração termina em uma requisição de saída, e que o conjunto de destinos legítimos pode ser conhecido de antemão.",
|
|
357
|
+
"retireWhen": "Não por capacidade. Remova-o quando o agente não tiver nada que valha a pena exfiltrar, o que é uma afirmação sobre os dados e não sobre o modelo.",
|
|
259
358
|
"test": "De dentro do ambiente do agente, requisite um host fora da lista. Falha na camada de rede ou de proxy e a recusa fica registrada."
|
|
260
359
|
}
|
|
261
360
|
}
|
|
@@ -263,6 +362,18 @@
|
|
|
263
362
|
{
|
|
264
363
|
"id": "ACM-05",
|
|
265
364
|
"group": "egress",
|
|
365
|
+
"axes": {
|
|
366
|
+
"moment": "feedback",
|
|
367
|
+
"mechanism": "deterministic"
|
|
368
|
+
},
|
|
369
|
+
"expiry": {
|
|
370
|
+
"expiresOn": "architecture",
|
|
371
|
+
"improves": [
|
|
372
|
+
"recon"
|
|
373
|
+
],
|
|
374
|
+
"validatedAgainst": null,
|
|
375
|
+
"validatedOn": null
|
|
376
|
+
},
|
|
266
377
|
"patterns": [
|
|
267
378
|
"egress-allowlist"
|
|
268
379
|
],
|
|
@@ -296,16 +407,25 @@
|
|
|
296
407
|
"en": {
|
|
297
408
|
"name": "Denied egress is an alert, not an error",
|
|
298
409
|
"statement": "Refused outbound requests are logged as security signal and reach a human. A denial is one of the few unambiguous attack signals an agent stack produces, and it is worthless if it lands in the same bucket as a timeout.",
|
|
410
|
+
"axisNote": "It acts on something that already happened — a refusal — and it fires by rule, on every one of them.",
|
|
411
|
+
"assumes": "That a refused outbound request is rare enough to be signal rather than noise.",
|
|
412
|
+
"retireWhen": "The platform surfaces denials as security events on its own, or denials become routine — which means the allowlist is wrong, not that the alert is.",
|
|
299
413
|
"test": "Trigger a denial. It appears as a distinct, alertable event with the destination and the calling agent, not as a generic network error."
|
|
300
414
|
},
|
|
301
415
|
"es": {
|
|
302
416
|
"name": "Una salida denegada es una alerta, no un error",
|
|
303
417
|
"statement": "Las peticiones salientes rechazadas se registran como señal de seguridad y llegan a una persona. Una denegación es una de las pocas señales de ataque inequívocas que produce una pila agéntica, y no vale nada si cae en el mismo cajón que un timeout.",
|
|
418
|
+
"axisNote": "Actúa sobre algo que ya ocurrió —una denegación— y se dispara por regla, en todas ellas.",
|
|
419
|
+
"assumes": "Que una petición saliente denegada es lo bastante rara como para ser señal y no ruido.",
|
|
420
|
+
"retireWhen": "La plataforma expone las denegaciones como eventos de seguridad por su cuenta, o las denegaciones se vuelven rutina, lo que significa que la lista está mal, no la alerta.",
|
|
304
421
|
"test": "Provoca una denegación. Aparece como evento distinguible y alertable, con el destino y el agente que llamó, no como un error de red genérico."
|
|
305
422
|
},
|
|
306
423
|
"pt": {
|
|
307
424
|
"name": "Uma saída negada é um alerta, não um erro",
|
|
308
425
|
"statement": "As requisições de saída recusadas são registradas como sinal de segurança e chegam a uma pessoa. Uma negação é um dos poucos sinais de ataque inequívocos que uma pilha agêntica produz, e não vale nada se cair no mesmo balde de um timeout.",
|
|
426
|
+
"axisNote": "Age sobre algo que já aconteceu — uma recusa — e dispara por regra, em todas elas.",
|
|
427
|
+
"assumes": "Que uma requisição de saída recusada é rara o bastante para ser sinal e não ruído.",
|
|
428
|
+
"retireWhen": "A plataforma expõe as recusas como eventos de segurança por conta própria, ou as recusas viram rotina, o que significa que a lista está errada, não o alerta.",
|
|
309
429
|
"test": "Provoque uma negação. Ela aparece como evento distinguível e alertável, com o destino e o agente que chamou, não como erro de rede genérico."
|
|
310
430
|
}
|
|
311
431
|
}
|
|
@@ -313,6 +433,18 @@
|
|
|
313
433
|
{
|
|
314
434
|
"id": "ACM-06",
|
|
315
435
|
"group": "execution",
|
|
436
|
+
"axes": {
|
|
437
|
+
"moment": "feedforward",
|
|
438
|
+
"mechanism": "deterministic"
|
|
439
|
+
},
|
|
440
|
+
"expiry": {
|
|
441
|
+
"expiresOn": "architecture",
|
|
442
|
+
"improves": [
|
|
443
|
+
"contain"
|
|
444
|
+
],
|
|
445
|
+
"validatedAgainst": null,
|
|
446
|
+
"validatedOn": null
|
|
447
|
+
},
|
|
316
448
|
"patterns": [
|
|
317
449
|
"sandboxed-execution"
|
|
318
450
|
],
|
|
@@ -346,16 +478,25 @@
|
|
|
346
478
|
"en": {
|
|
347
479
|
"name": "Ephemeral, credential-free execution",
|
|
348
480
|
"statement": "Anything the agent generates or invokes runs in an environment created per task and destroyed after, holding no ambient credentials. Persistence is how a one-off compromise becomes a foothold.",
|
|
481
|
+
"axisNote": "The environment is built without the credentials before the task starts; there is nothing to measure and nothing to decide.",
|
|
482
|
+
"assumes": "That a compromise of one task should not survive into the next, and that setup cost is lower than the cost of persistence.",
|
|
483
|
+
"retireWhen": "Execution environments are per-call and credential-free by construction, so “ephemeral” stops being something anyone can switch off.",
|
|
349
484
|
"test": "Inside a live task, enumerate the environment. No credential is present that the task did not need, and the environment does not survive the task."
|
|
350
485
|
},
|
|
351
486
|
"es": {
|
|
352
487
|
"name": "Ejecución efímera y sin credenciales",
|
|
353
488
|
"statement": "Todo lo que el agente genera o invoca corre en un entorno creado por tarea y destruido al terminar, sin credenciales ambientales. La persistencia es cómo un compromiso puntual se convierte en punto de apoyo.",
|
|
489
|
+
"axisNote": "El entorno se construye sin las credenciales antes de que la tarea empiece; no hay nada que medir ni nada que decidir.",
|
|
490
|
+
"assumes": "Que el compromiso de una tarea no debe sobrevivir a la siguiente, y que el coste de montar el entorno es menor que el coste de la persistencia.",
|
|
491
|
+
"retireWhen": "Los entornos de ejecución son por llamada y sin credenciales por construcción, con lo que «efímero» deja de ser algo que alguien pueda desactivar.",
|
|
354
492
|
"test": "Dentro de una tarea en vivo, enumera el entorno. No hay ninguna credencial que la tarea no necesitara, y el entorno no sobrevive a la tarea."
|
|
355
493
|
},
|
|
356
494
|
"pt": {
|
|
357
495
|
"name": "Execução efêmera e sem credenciais",
|
|
358
496
|
"statement": "Tudo o que o agente gera ou invoca roda em um ambiente criado por tarefa e destruído ao final, sem credenciais ambientais. A persistência é como um comprometimento pontual vira ponto de apoio.",
|
|
497
|
+
"axisNote": "O ambiente é construído sem as credenciais antes de a tarefa começar; não há nada a medir nem nada a decidir.",
|
|
498
|
+
"assumes": "Que o comprometimento de uma tarefa não deve sobreviver à seguinte, e que o custo de montar o ambiente é menor que o custo da persistência.",
|
|
499
|
+
"retireWhen": "Os ambientes de execução são por chamada e sem credenciais por construção, com o que “efêmero” deixa de ser algo que alguém possa desativar.",
|
|
359
500
|
"test": "Dentro de uma tarefa ao vivo, enumere o ambiente. Não há credencial que a tarefa não precisasse, e o ambiente não sobrevive à tarefa."
|
|
360
501
|
}
|
|
361
502
|
}
|
|
@@ -363,6 +504,20 @@
|
|
|
363
504
|
{
|
|
364
505
|
"id": "ACM-07",
|
|
365
506
|
"group": "execution",
|
|
507
|
+
"axes": {
|
|
508
|
+
"moment": "feedback",
|
|
509
|
+
"mechanism": "deterministic"
|
|
510
|
+
},
|
|
511
|
+
"expiry": {
|
|
512
|
+
"expiresOn": "never",
|
|
513
|
+
"improves": [
|
|
514
|
+
"tvt",
|
|
515
|
+
"cvo",
|
|
516
|
+
"tvo"
|
|
517
|
+
],
|
|
518
|
+
"validatedAgainst": null,
|
|
519
|
+
"validatedOn": null
|
|
520
|
+
},
|
|
366
521
|
"patterns": [
|
|
367
522
|
"sandboxed-execution",
|
|
368
523
|
"recovery-strategy"
|
|
@@ -396,16 +551,25 @@
|
|
|
396
551
|
"en": {
|
|
397
552
|
"name": "Resource caps and timeouts",
|
|
398
553
|
"statement": "CPU, memory, disk, wall-clock and call count are bounded by the host. Runaway consumption is the failure mode that arrives first and most often, usually with no adversary involved at all.",
|
|
554
|
+
"axisNote": "A cap is a feedback loop in the strict sense: it measures consumption as it happens and acts when a threshold is crossed.",
|
|
555
|
+
"assumes": "That an agent will consume without bound if nothing stops it, with or without an adversary.",
|
|
556
|
+
"retireWhen": "Not on capability grounds. Runaway consumption is a property of loops, and better models attempt longer tasks rather than shorter ones.",
|
|
399
557
|
"test": "Run a task designed not to terminate. It is stopped by a quota, the stop is recorded, and the cost of the attempt is bounded and known."
|
|
400
558
|
},
|
|
401
559
|
"es": {
|
|
402
560
|
"name": "Límites de recursos y timeouts",
|
|
403
561
|
"statement": "CPU, memoria, disco, tiempo de reloj y número de llamadas los acota el anfitrión. El consumo desbocado es el modo de fallo que llega primero y más a menudo, normalmente sin ningún adversario.",
|
|
562
|
+
"axisNote": "Un tope es un lazo de realimentación en sentido estricto: mide el consumo según ocurre y actúa al cruzar un umbral.",
|
|
563
|
+
"assumes": "Que un agente consumirá sin límite si nada lo detiene, con adversario o sin él.",
|
|
564
|
+
"retireWhen": "No por capacidad. El consumo desbocado es una propiedad de los bucles, y los modelos mejores intentan tareas más largas, no más cortas.",
|
|
404
565
|
"test": "Ejecuta una tarea diseñada para no terminar. La detiene una cuota, la parada queda registrada y el coste del intento es acotado y conocido."
|
|
405
566
|
},
|
|
406
567
|
"pt": {
|
|
407
568
|
"name": "Limites de recursos e timeouts",
|
|
408
569
|
"statement": "CPU, memória, disco, tempo de relógio e número de chamadas são limitados pelo host. O consumo descontrolado é o modo de falha que chega primeiro e com mais frequência, normalmente sem adversário algum.",
|
|
570
|
+
"axisNote": "Um teto é uma malha de realimentação em sentido estrito: mede o consumo enquanto acontece e age ao cruzar um limiar.",
|
|
571
|
+
"assumes": "Que um agente consumirá sem limite se nada o detiver, com adversário ou sem ele.",
|
|
572
|
+
"retireWhen": "Não por capacidade. O consumo desenfreado é uma propriedade dos laços, e os modelos melhores tentam tarefas mais longas, não mais curtas.",
|
|
409
573
|
"test": "Execute uma tarefa projetada para não terminar. Ela é interrompida por uma cota, a parada fica registrada e o custo da tentativa é limitado e conhecido."
|
|
410
574
|
}
|
|
411
575
|
}
|
|
@@ -413,6 +577,19 @@
|
|
|
413
577
|
{
|
|
414
578
|
"id": "ACM-08",
|
|
415
579
|
"group": "oversight",
|
|
580
|
+
"axes": {
|
|
581
|
+
"moment": "feedforward",
|
|
582
|
+
"mechanism": "inferential"
|
|
583
|
+
},
|
|
584
|
+
"expiry": {
|
|
585
|
+
"expiresOn": "measurement",
|
|
586
|
+
"improves": [
|
|
587
|
+
"vgap",
|
|
588
|
+
"hir"
|
|
589
|
+
],
|
|
590
|
+
"validatedAgainst": null,
|
|
591
|
+
"validatedOn": null
|
|
592
|
+
},
|
|
416
593
|
"patterns": [
|
|
417
594
|
"human-approval-gate"
|
|
418
595
|
],
|
|
@@ -447,16 +624,25 @@
|
|
|
447
624
|
"en": {
|
|
448
625
|
"name": "Approval gate on high-impact actions",
|
|
449
626
|
"statement": "Actions that are irreversible, regulated or expensive stop for a person who can approve, edit or reject, with enough context to decide. Gate by risk, not by default — over-gating produces rubber-stamping, which is worse than no gate because it looks like one.",
|
|
627
|
+
"axisNote": "It stops the action before it happens, but what it stops for is a person's decision, and the same case can be decided two ways.",
|
|
628
|
+
"assumes": "That the model's judgement on high-impact actions is worse than a person's, and that a person given the context decides better than a rule would.",
|
|
629
|
+
"retireWhen": "The verification gap on the gated action types reaches zero across a task set large enough to trust. Past that point the gate is buying rubber stamps at the price of latency.",
|
|
450
630
|
"test": "List the gated actions and the risk criterion that put them there. Attempt one; it suspends, routes, and records the decision with the identity of who made it."
|
|
451
631
|
},
|
|
452
632
|
"es": {
|
|
453
633
|
"name": "Puerta de aprobación en acciones de alto impacto",
|
|
454
634
|
"statement": "Las acciones irreversibles, reguladas o caras se detienen ante una persona que puede aprobar, editar o rechazar, con contexto suficiente para decidir. Acota por riesgo, no por defecto: poner puertas de más produce aprobación automática, que es peor que no tener puerta porque lo parece.",
|
|
635
|
+
"axisNote": "Detiene la acción antes de que ocurra, pero lo que decide es el criterio de una persona, y el mismo caso puede resolverse de dos maneras.",
|
|
636
|
+
"assumes": "Que el criterio del modelo sobre acciones de alto impacto es peor que el de una persona, y que una persona con el contexto decide mejor que una regla.",
|
|
637
|
+
"retireWhen": "La brecha de verificación en los tipos de acción con compuerta llega a cero sobre un conjunto de tareas lo bastante grande como para fiarse. Pasado ese punto, la compuerta compra sellos de goma al precio de la latencia.",
|
|
455
638
|
"test": "Lista las acciones con puerta y el criterio de riesgo que las puso ahí. Intenta una; se suspende, se enruta y se registra la decisión con la identidad de quien la tomó."
|
|
456
639
|
},
|
|
457
640
|
"pt": {
|
|
458
641
|
"name": "Portão de aprovação em ações de alto impacto",
|
|
459
642
|
"statement": "Ações irreversíveis, reguladas ou caras param diante de uma pessoa que pode aprovar, editar ou rejeitar, com contexto suficiente para decidir. Delimite por risco, não por padrão: portões demais produzem aprovação automática, que é pior do que não ter portão porque parece um.",
|
|
643
|
+
"axisNote": "Detém a ação antes de acontecer, mas o que decide é o critério de uma pessoa, e o mesmo caso pode ser resolvido de duas maneiras.",
|
|
644
|
+
"assumes": "Que o critério do modelo sobre ações de alto impacto é pior que o de uma pessoa, e que uma pessoa com o contexto decide melhor que uma regra.",
|
|
645
|
+
"retireWhen": "A lacuna de verificação nos tipos de ação com comporta chega a zero sobre um conjunto de tarefas grande o bastante para confiar. Passado esse ponto, a comporta compra carimbos ao preço da latência.",
|
|
460
646
|
"test": "Liste as ações com portão e o critério de risco que as colocou ali. Tente uma; ela suspende, roteia e registra a decisão com a identidade de quem a tomou."
|
|
461
647
|
}
|
|
462
648
|
}
|
|
@@ -464,6 +650,19 @@
|
|
|
464
650
|
{
|
|
465
651
|
"id": "ACM-09",
|
|
466
652
|
"group": "oversight",
|
|
653
|
+
"axes": {
|
|
654
|
+
"moment": "feedback",
|
|
655
|
+
"mechanism": "inferential"
|
|
656
|
+
},
|
|
657
|
+
"expiry": {
|
|
658
|
+
"expiresOn": "measurement",
|
|
659
|
+
"improves": [
|
|
660
|
+
"recov",
|
|
661
|
+
"hir"
|
|
662
|
+
],
|
|
663
|
+
"validatedAgainst": null,
|
|
664
|
+
"validatedOn": null
|
|
665
|
+
},
|
|
467
666
|
"patterns": [
|
|
468
667
|
"human-escalation"
|
|
469
668
|
],
|
|
@@ -493,16 +692,25 @@
|
|
|
493
692
|
"en": {
|
|
494
693
|
"name": "Escalation path with a named owner",
|
|
495
694
|
"statement": "When the agent is uncertain, blocked or out of policy, there is a defined path to a person, and that person is named. An escalation route with no owner is a queue.",
|
|
695
|
+
"axisNote": "It triggers on a state the run has already reached — uncertain, blocked, out of policy — and what happens next is a judgement.",
|
|
696
|
+
"assumes": "That the agent can recognise being blocked or out of policy, and that a person can unblock it.",
|
|
697
|
+
"retireWhen": "Recovery rate at parity with and without the escalation path, measured on the failures that actually occur rather than the ones anticipated.",
|
|
496
698
|
"test": "Force an escalation. It reaches a named human within the stated time, and the handoff carries the context needed to act without re-deriving it."
|
|
497
699
|
},
|
|
498
700
|
"es": {
|
|
499
701
|
"name": "Vía de escalado con responsable con nombre",
|
|
500
702
|
"statement": "Cuando el agente duda, se bloquea o se sale de política, hay una vía definida hacia una persona, y esa persona tiene nombre. Una vía de escalado sin responsable es una cola.",
|
|
703
|
+
"axisNote": "Se dispara ante un estado que la ejecución ya alcanzó —incertidumbre, bloqueo, fuera de política— y lo que sigue es criterio.",
|
|
704
|
+
"assumes": "Que el agente es capaz de reconocer que está bloqueado o fuera de política, y que una persona puede desbloquearlo.",
|
|
705
|
+
"retireWhen": "Que la tasa de recuperación sea igual con y sin la vía de escalado, medida sobre los fallos que ocurren de verdad y no sobre los previstos.",
|
|
501
706
|
"test": "Fuerza un escalado. Llega a un humano con nombre dentro del tiempo declarado, y el traspaso lleva el contexto necesario para actuar sin volver a deducirlo."
|
|
502
707
|
},
|
|
503
708
|
"pt": {
|
|
504
709
|
"name": "Via de escalonamento com responsável nomeado",
|
|
505
710
|
"statement": "Quando o agente hesita, trava ou sai da política, há uma via definida até uma pessoa, e essa pessoa tem nome. Uma via de escalonamento sem responsável é uma fila.",
|
|
711
|
+
"axisNote": "Dispara perante um estado que a execução já atingiu — incerteza, bloqueio, fora da política — e o que vem depois é critério.",
|
|
712
|
+
"assumes": "Que o agente consegue reconhecer que está bloqueado ou fora da política, e que uma pessoa pode desbloqueá-lo.",
|
|
713
|
+
"retireWhen": "Que a taxa de recuperação seja igual com e sem a via de escalonamento, medida sobre as falhas que de fato ocorrem e não sobre as previstas.",
|
|
506
714
|
"test": "Force um escalonamento. Ele chega a um humano nomeado dentro do tempo declarado, e a passagem carrega o contexto necessário para agir sem rededuzi-lo."
|
|
507
715
|
}
|
|
508
716
|
}
|
|
@@ -510,6 +718,18 @@
|
|
|
510
718
|
{
|
|
511
719
|
"id": "ACM-10",
|
|
512
720
|
"group": "observability",
|
|
721
|
+
"axes": {
|
|
722
|
+
"moment": "feedback",
|
|
723
|
+
"mechanism": "deterministic"
|
|
724
|
+
},
|
|
725
|
+
"expiry": {
|
|
726
|
+
"expiresOn": "never",
|
|
727
|
+
"improves": [
|
|
728
|
+
"recon"
|
|
729
|
+
],
|
|
730
|
+
"validatedAgainst": null,
|
|
731
|
+
"validatedOn": null
|
|
732
|
+
},
|
|
513
733
|
"patterns": [
|
|
514
734
|
"correlated-run-trace"
|
|
515
735
|
],
|
|
@@ -545,16 +765,25 @@
|
|
|
545
765
|
"en": {
|
|
546
766
|
"name": "Correlated trace of every decision and tool call",
|
|
547
767
|
"statement": "Each run produces an immutable, correlated record: inputs, model and version, tool calls with arguments and outcomes, and the final action. Enough to reconstruct what happened, and nothing that turns the log itself into the breach.",
|
|
768
|
+
"axisNote": "Pure measurement after the fact: it changes nothing about the run it records, and it records by rule.",
|
|
769
|
+
"assumes": "That something will need to be reconstructed later by somebody who was not there.",
|
|
770
|
+
"retireWhen": "Not on capability grounds. This is the control every other measurement is computed from; removing it removes the ability to know whether removing anything else was a good idea.",
|
|
548
771
|
"test": "Pick a past run at random and reconstruct it end to end from the log alone. Then confirm the log holds no secret or raw personal data it did not need."
|
|
549
772
|
},
|
|
550
773
|
"es": {
|
|
551
774
|
"name": "Traza correlada de cada decisión y llamada a herramienta",
|
|
552
775
|
"statement": "Cada ejecución produce un registro inmutable y correlado: entradas, modelo y versión, llamadas a herramientas con argumentos y resultados, y la acción final. Lo suficiente para reconstruir qué pasó, y nada que convierta el propio log en la brecha.",
|
|
776
|
+
"axisNote": "Medición pura a posteriori: no cambia nada de la ejecución que registra, y registra por regla.",
|
|
777
|
+
"assumes": "Que algo tendrá que reconstruirlo más tarde alguien que no estaba.",
|
|
778
|
+
"retireWhen": "No por capacidad. Es el control a partir del cual se calcula todo lo demás que se mide; quitarlo quita la capacidad de saber si quitar cualquier otra cosa fue buena idea.",
|
|
553
779
|
"test": "Coge una ejecución pasada al azar y reconstrúyela de punta a punta solo desde el log. Después confirma que el log no guarda ningún secreto ni dato personal en crudo que no necesitara."
|
|
554
780
|
},
|
|
555
781
|
"pt": {
|
|
556
782
|
"name": "Trace correlacionado de cada decisão e chamada de ferramenta",
|
|
557
783
|
"statement": "Cada execução produz um registro imutável e correlacionado: entradas, modelo e versão, chamadas de ferramentas com argumentos e resultados, e a ação final. O suficiente para reconstruir o que aconteceu, e nada que transforme o próprio log na brecha.",
|
|
784
|
+
"axisNote": "Medição pura a posteriori: não muda nada da execução que registra, e registra por regra.",
|
|
785
|
+
"assumes": "Que algo terá de ser reconstruído mais tarde por alguém que não estava lá.",
|
|
786
|
+
"retireWhen": "Não por capacidade. É o controle a partir do qual todo o resto que se mede é calculado; removê-lo remove a capacidade de saber se remover qualquer outra coisa foi boa ideia.",
|
|
558
787
|
"test": "Pegue uma execução passada ao acaso e reconstrua-a de ponta a ponta só pelo log. Depois confirme que o log não guarda nenhum segredo ou dado pessoal cru de que não precisava."
|
|
559
788
|
}
|
|
560
789
|
}
|
|
@@ -562,6 +791,19 @@
|
|
|
562
791
|
{
|
|
563
792
|
"id": "ACM-11",
|
|
564
793
|
"group": "observability",
|
|
794
|
+
"axes": {
|
|
795
|
+
"moment": "feedback",
|
|
796
|
+
"mechanism": "inferential"
|
|
797
|
+
},
|
|
798
|
+
"expiry": {
|
|
799
|
+
"expiresOn": "never",
|
|
800
|
+
"improves": [
|
|
801
|
+
"catch",
|
|
802
|
+
"dband"
|
|
803
|
+
],
|
|
804
|
+
"validatedAgainst": null,
|
|
805
|
+
"validatedOn": null
|
|
806
|
+
},
|
|
565
807
|
"patterns": [
|
|
566
808
|
"evaluator-optimizer"
|
|
567
809
|
],
|
|
@@ -594,16 +836,25 @@
|
|
|
594
836
|
"en": {
|
|
595
837
|
"name": "Evaluation suite gating change",
|
|
596
838
|
"statement": "A curated set of cases runs on every change, and a regression blocks release. Without it, 'it seems to work' is the entire quality argument, and nothing distinguishes a fix from a change.",
|
|
839
|
+
"axisNote": "It measures outputs the system already produced, and what counts as a regression in agentic output is a judgement — the suite covers whichever cases someone chose.",
|
|
840
|
+
"assumes": "That changes regress behaviour in ways nobody predicts, and that a curated set catches more of them than judgement does.",
|
|
841
|
+
"retireWhen": "Not as a category. Individual cases retire constantly: a case no change has failed in two years is measuring the past, and keeping it is how suites get expensive without getting better.",
|
|
597
842
|
"test": "Introduce a known regression. The suite catches it and the change does not ship. A suite never seen failing is a suite never verified."
|
|
598
843
|
},
|
|
599
844
|
"es": {
|
|
600
845
|
"name": "Suite de evaluación que condiciona los cambios",
|
|
601
846
|
"statement": "Un conjunto curado de casos se ejecuta en cada cambio, y una regresión bloquea el despliegue. Sin eso, «parece que funciona» es todo el argumento de calidad, y nada distingue un arreglo de un cambio.",
|
|
847
|
+
"axisNote": "Mide salidas que el sistema ya produjo, y qué cuenta como regresión en una salida agéntica es criterio: la suite cubre los casos que alguien eligió.",
|
|
848
|
+
"assumes": "Que los cambios provocan regresiones que nadie predice, y que un conjunto curado atrapa más de ellas que el criterio.",
|
|
849
|
+
"retireWhen": "No como categoría. Los casos concretos se retiran continuamente: un caso que ningún cambio ha hecho fallar en dos años está midiendo el pasado, y conservarlo es como las suites se encarecen sin mejorar.",
|
|
602
850
|
"test": "Introduce una regresión conocida. La suite la caza y el cambio no sale. Una suite que nunca se ha visto fallar es una suite que nunca se ha verificado."
|
|
603
851
|
},
|
|
604
852
|
"pt": {
|
|
605
853
|
"name": "Suíte de avaliação que condiciona mudanças",
|
|
606
|
-
"statement": "Um conjunto curado de casos roda a cada mudança, e uma regressão bloqueia o lançamento. Sem isso,
|
|
854
|
+
"statement": "Um conjunto curado de casos roda a cada mudança, e uma regressão bloqueia o lançamento. Sem isso, “parece que funciona” é todo o argumento de qualidade, e nada distingue uma correção de uma mudança.",
|
|
855
|
+
"axisNote": "Mede saídas que o sistema já produziu, e o que conta como regressão numa saída agêntica é critério: a suite cobre os casos que alguém escolheu.",
|
|
856
|
+
"assumes": "Que as mudanças provocam regressões que ninguém prevê, e que um conjunto curado pega mais delas que o critério.",
|
|
857
|
+
"retireWhen": "Não como categoria. Os casos concretos são removidos continuamente: um caso que nenhuma mudança fez falhar em dois anos está medindo o passado, e mantê-lo é como as suites encarecem sem melhorar.",
|
|
607
858
|
"test": "Introduza uma regressão conhecida. A suíte a pega e a mudança não sai. Uma suíte que nunca foi vista falhando é uma suíte que nunca foi verificada."
|
|
608
859
|
}
|
|
609
860
|
}
|
|
@@ -611,6 +862,18 @@
|
|
|
611
862
|
{
|
|
612
863
|
"id": "ACM-12",
|
|
613
864
|
"group": "lifecycle",
|
|
865
|
+
"axes": {
|
|
866
|
+
"moment": "feedforward",
|
|
867
|
+
"mechanism": "deterministic"
|
|
868
|
+
},
|
|
869
|
+
"expiry": {
|
|
870
|
+
"expiresOn": "measurement",
|
|
871
|
+
"improves": [
|
|
872
|
+
"vyr"
|
|
873
|
+
],
|
|
874
|
+
"validatedAgainst": null,
|
|
875
|
+
"validatedOn": null
|
|
876
|
+
},
|
|
614
877
|
"patterns": [
|
|
615
878
|
"least-privilege-tooling",
|
|
616
879
|
"egress-allowlist"
|
|
@@ -647,16 +910,25 @@
|
|
|
647
910
|
"en": {
|
|
648
911
|
"name": "Untrusted content is isolated and marked",
|
|
649
912
|
"statement": "Retrieved documents, tool results and third-party output are delimited as data, never merged into the instruction channel. The model cannot reliably tell them apart, so the harness must.",
|
|
913
|
+
"axisNote": "The delimiting happens on the input, before the model reads it, and it applies to every document without asking what is inside.",
|
|
914
|
+
"assumes": "That the model cannot reliably tell instruction from data inside its own context window.",
|
|
915
|
+
"retireWhen": "The injection cases in the evaluation suite stop succeeding with this control removed — measured, not announced. That would mean the separation is enforced below the prompt rather than inside it.",
|
|
650
916
|
"test": "Plant an instruction inside a document the agent retrieves. The agent may read it; it must not act on it, and the attempt must be visible afterwards."
|
|
651
917
|
},
|
|
652
918
|
"es": {
|
|
653
919
|
"name": "El contenido no confiable se aísla y se marca",
|
|
654
920
|
"statement": "Documentos recuperados, resultados de herramientas y salida de terceros se delimitan como datos, nunca se funden con el canal de instrucciones. El modelo no sabe distinguirlos de forma fiable, así que tiene que hacerlo el arnés.",
|
|
921
|
+
"axisNote": "La delimitación ocurre sobre la entrada, antes de que el modelo la lea, y se aplica a todo documento sin preguntar qué contiene.",
|
|
922
|
+
"assumes": "Que el modelo no distingue de forma fiable instrucción de dato dentro de su propia ventana de contexto.",
|
|
923
|
+
"retireWhen": "Que los casos de inyección de la suite dejen de tener éxito con este control quitado, medido y no anunciado. Eso significaría que la separación se impone por debajo del prompt y no dentro de él.",
|
|
655
924
|
"test": "Planta una instrucción dentro de un documento que el agente recupere. El agente puede leerla; no debe actuar sobre ella, y el intento debe quedar visible después."
|
|
656
925
|
},
|
|
657
926
|
"pt": {
|
|
658
927
|
"name": "O conteúdo não confiável é isolado e marcado",
|
|
659
928
|
"statement": "Documentos recuperados, resultados de ferramentas e saída de terceiros são delimitados como dados, nunca fundidos ao canal de instruções. O modelo não sabe distingui-los de forma confiável, então o harness precisa fazê-lo.",
|
|
929
|
+
"axisNote": "A delimitação ocorre sobre a entrada, antes de o modelo a ler, e aplica-se a todo documento sem perguntar o que há dentro.",
|
|
930
|
+
"assumes": "Que o modelo não distingue de forma confiável instrução de dado dentro da própria janela de contexto.",
|
|
931
|
+
"retireWhen": "Que os casos de injeção da suite deixem de ter sucesso com este controle removido, medido e não anunciado. Isso significaria que a separação é imposta abaixo do prompt e não dentro dele.",
|
|
660
932
|
"test": "Plante uma instrução dentro de um documento que o agente recupere. O agente pode lê-la; não deve agir sobre ela, e a tentativa deve ficar visível depois."
|
|
661
933
|
}
|
|
662
934
|
}
|
|
@@ -664,6 +936,18 @@
|
|
|
664
936
|
{
|
|
665
937
|
"id": "ACM-13",
|
|
666
938
|
"group": "lifecycle",
|
|
939
|
+
"axes": {
|
|
940
|
+
"moment": "feedforward",
|
|
941
|
+
"mechanism": "deterministic"
|
|
942
|
+
},
|
|
943
|
+
"expiry": {
|
|
944
|
+
"expiresOn": "never",
|
|
945
|
+
"improves": [
|
|
946
|
+
"vyr"
|
|
947
|
+
],
|
|
948
|
+
"validatedAgainst": null,
|
|
949
|
+
"validatedOn": null
|
|
950
|
+
},
|
|
667
951
|
"patterns": [
|
|
668
952
|
"output-boundary-encoding"
|
|
669
953
|
],
|
|
@@ -697,16 +981,25 @@
|
|
|
697
981
|
"en": {
|
|
698
982
|
"name": "Model output treated as untrusted input",
|
|
699
983
|
"statement": "Anything the model emits that reaches a renderer, a shell, a query or another system is encoded and validated exactly as input from a stranger would be.",
|
|
984
|
+
"axisNote": "The moment is relative to the action being protected: the encoding acts on the sink's input, before the sink does anything with it.",
|
|
985
|
+
"assumes": "That downstream sinks trust what reaches them, and that the model will emit whatever it was steered into emitting.",
|
|
986
|
+
"retireWhen": "Not on model grounds. This is a property of the sink, not of the producer: the same encoding would be required if a person had typed the string.",
|
|
700
987
|
"test": "Make the model emit a payload for each downstream sink you have. Each is neutralised at the boundary before it arrives."
|
|
701
988
|
},
|
|
702
989
|
"es": {
|
|
703
990
|
"name": "La salida del modelo se trata como entrada no confiable",
|
|
704
991
|
"statement": "Todo lo que el modelo emita y llegue a un renderizador, un shell, una consulta u otro sistema se codifica y valida exactamente igual que la entrada de un desconocido.",
|
|
992
|
+
"axisNote": "El momento es relativo a la acción que se protege: la codificación actúa sobre la entrada del destino, antes de que este haga nada con ella.",
|
|
993
|
+
"assumes": "Que los destinos aguas abajo se fían de lo que les llega, y que el modelo emitirá aquello a lo que se le haya dirigido.",
|
|
994
|
+
"retireWhen": "No por el modelo. Es una propiedad del destino, no del productor: la misma codificación haría falta si la cadena la hubiera escrito una persona.",
|
|
705
995
|
"test": "Haz que el modelo emita un payload para cada destino que tengas aguas abajo. Cada uno se neutraliza en la frontera antes de llegar."
|
|
706
996
|
},
|
|
707
997
|
"pt": {
|
|
708
998
|
"name": "A saída do modelo é tratada como entrada não confiável",
|
|
709
999
|
"statement": "Tudo o que o modelo emite e chega a um renderizador, a um shell, a uma consulta ou a outro sistema é codificado e validado exatamente como a entrada de um desconhecido.",
|
|
1000
|
+
"axisNote": "O momento é relativo à ação que se protege: a codificação atua sobre a entrada do destino, antes de este fazer qualquer coisa com ela.",
|
|
1001
|
+
"assumes": "Que os destinos a jusante confiam no que lhes chega, e que o modelo emitirá aquilo para o qual foi direcionado.",
|
|
1002
|
+
"retireWhen": "Não por causa do modelo. É uma propriedade do destino, não do produtor: a mesma codificação seria necessária se a string tivesse sido digitada por uma pessoa.",
|
|
710
1003
|
"test": "Faça o modelo emitir um payload para cada destino a jusante que você tenha. Cada um é neutralizado na fronteira antes de chegar."
|
|
711
1004
|
}
|
|
712
1005
|
}
|
|
@@ -714,6 +1007,18 @@
|
|
|
714
1007
|
{
|
|
715
1008
|
"id": "ACM-14",
|
|
716
1009
|
"group": "lifecycle",
|
|
1010
|
+
"axes": {
|
|
1011
|
+
"moment": "feedback",
|
|
1012
|
+
"mechanism": "inferential"
|
|
1013
|
+
},
|
|
1014
|
+
"expiry": {
|
|
1015
|
+
"expiresOn": "architecture",
|
|
1016
|
+
"improves": [
|
|
1017
|
+
"vgap"
|
|
1018
|
+
],
|
|
1019
|
+
"validatedAgainst": null,
|
|
1020
|
+
"validatedOn": null
|
|
1021
|
+
},
|
|
717
1022
|
"patterns": [
|
|
718
1023
|
"attributed-memory"
|
|
719
1024
|
],
|
|
@@ -749,16 +1054,25 @@
|
|
|
749
1054
|
"en": {
|
|
750
1055
|
"name": "Memory integrity and expiry",
|
|
751
1056
|
"statement": "What the agent writes to persistent memory is attributed, reviewable and expirable. Memory is what turns a one-shot attack into one that re-triggers on future, unrelated tasks.",
|
|
1057
|
+
"axisNote": "Its teeth close on what was already written, and deciding that a stored fact is false is a judgement no rule makes for you.",
|
|
1058
|
+
"assumes": "That written memory persists across tasks, and that a false fact written once will be read many times.",
|
|
1059
|
+
"retireWhen": "The memory system attributes and expires writes on its own, so integrity stops being a discipline the harness has to impose from outside.",
|
|
752
1060
|
"test": "Write a false fact through a normal interaction. Show where it came from, who can remove it, and when it would expire on its own."
|
|
753
1061
|
},
|
|
754
1062
|
"es": {
|
|
755
1063
|
"name": "Integridad y caducidad de la memoria",
|
|
756
1064
|
"statement": "Lo que el agente escribe en memoria persistente está atribuido, es revisable y caduca. La memoria es lo que convierte un ataque puntual en uno que se vuelve a disparar en tareas futuras sin relación.",
|
|
1065
|
+
"axisNote": "Sus dientes se cierran sobre lo ya escrito, y decidir que un hecho almacenado es falso es un criterio que ninguna regla toma por ti.",
|
|
1066
|
+
"assumes": "Que la memoria escrita persiste entre tareas, y que un hecho falso escrito una vez se leerá muchas.",
|
|
1067
|
+
"retireWhen": "Que el propio sistema de memoria atribuya y caduque las escrituras, con lo que la integridad deja de ser una disciplina que el harness tenga que imponer desde fuera.",
|
|
757
1068
|
"test": "Escribe un hecho falso a través de una interacción normal. Muestra de dónde vino, quién puede retirarlo y cuándo caducaría por sí solo."
|
|
758
1069
|
},
|
|
759
1070
|
"pt": {
|
|
760
1071
|
"name": "Integridade e expiração da memória",
|
|
761
1072
|
"statement": "O que o agente grava em memória persistente é atribuído, revisável e expira. A memória é o que transforma um ataque pontual em um que volta a disparar em tarefas futuras e não relacionadas.",
|
|
1073
|
+
"axisNote": "Seus dentes se fecham sobre o que já foi escrito, e decidir que um dado armazenado é falso é um critério que nenhuma regra toma por você.",
|
|
1074
|
+
"assumes": "Que a memória escrita persiste entre tarefas, e que um dado falso escrito uma vez será lido muitas.",
|
|
1075
|
+
"retireWhen": "Que o próprio sistema de memória atribua e expire as escritas, com o que a integridade deixa de ser uma disciplina que o harness tenha de impor de fora.",
|
|
762
1076
|
"test": "Grave um fato falso por meio de uma interação normal. Mostre de onde veio, quem pode removê-lo e quando expiraria sozinho."
|
|
763
1077
|
}
|
|
764
1078
|
}
|
|
@@ -766,6 +1080,18 @@
|
|
|
766
1080
|
{
|
|
767
1081
|
"id": "ACM-15",
|
|
768
1082
|
"group": "lifecycle",
|
|
1083
|
+
"axes": {
|
|
1084
|
+
"moment": "feedforward",
|
|
1085
|
+
"mechanism": "deterministic"
|
|
1086
|
+
},
|
|
1087
|
+
"expiry": {
|
|
1088
|
+
"expiresOn": "never",
|
|
1089
|
+
"improves": [
|
|
1090
|
+
"dband"
|
|
1091
|
+
],
|
|
1092
|
+
"validatedAgainst": null,
|
|
1093
|
+
"validatedOn": null
|
|
1094
|
+
},
|
|
769
1095
|
"patterns": [],
|
|
770
1096
|
"knowledge": [
|
|
771
1097
|
"mcp-security",
|
|
@@ -802,16 +1128,25 @@
|
|
|
802
1128
|
"en": {
|
|
803
1129
|
"name": "Provenance for models, prompts and servers",
|
|
804
1130
|
"statement": "Models, system prompts, MCP servers, packages and datasets are pinned, reviewed on change, and traceable to a source. A dependency that can rewrite a tool description can rewrite the agent's behaviour.",
|
|
1131
|
+
"axisNote": "A pin is checked before the dependency is used, and a tool description that changed is a diff, not an opinion.",
|
|
1132
|
+
"assumes": "That a dependency can change under you, and that the change can alter behaviour without altering your code.",
|
|
1133
|
+
"retireWhen": "Not on capability grounds. This is what makes the determinism band mean anything: without pinning, repeated runs measure the vendor's release schedule.",
|
|
805
1134
|
"test": "For each external dependency, name the pinned version and who reviewed the last change. Change a tool description upstream; the change is detected before it reaches production."
|
|
806
1135
|
},
|
|
807
1136
|
"es": {
|
|
808
1137
|
"name": "Procedencia de modelos, prompts y servidores",
|
|
809
1138
|
"statement": "Modelos, system prompts, servidores MCP, paquetes y datasets están fijados, se revisan al cambiar y son trazables a un origen. Una dependencia que puede reescribir la descripción de una herramienta puede reescribir el comportamiento del agente.",
|
|
1139
|
+
"axisNote": "Un anclaje se comprueba antes de usar la dependencia, y una descripción de herramienta que cambió es un diff, no una opinión.",
|
|
1140
|
+
"assumes": "Que una dependencia puede cambiar bajo tus pies, y que el cambio puede alterar el comportamiento sin alterar tu código.",
|
|
1141
|
+
"retireWhen": "No por capacidad. Es lo que hace que la banda de determinismo signifique algo: sin anclaje, las ejecuciones repetidas miden el calendario de versiones del proveedor.",
|
|
810
1142
|
"test": "Para cada dependencia externa, nombra la versión fijada y quién revisó el último cambio. Cambia una descripción de herramienta aguas arriba; el cambio se detecta antes de llegar a producción."
|
|
811
1143
|
},
|
|
812
1144
|
"pt": {
|
|
813
1145
|
"name": "Procedência de modelos, prompts e servidores",
|
|
814
1146
|
"statement": "Modelos, system prompts, servidores MCP, pacotes e datasets são fixados, revisados a cada mudança e rastreáveis até uma origem. Uma dependência que pode reescrever a descrição de uma ferramenta pode reescrever o comportamento do agente.",
|
|
1147
|
+
"axisNote": "Uma fixação é verificada antes de usar a dependência, e uma descrição de ferramenta que mudou é um diff, não uma opinião.",
|
|
1148
|
+
"assumes": "Que uma dependência pode mudar sob seus pés, e que a mudança pode alterar o comportamento sem alterar seu código.",
|
|
1149
|
+
"retireWhen": "Não por capacidade. É o que faz a banda de determinismo significar alguma coisa: sem fixação, as execuções repetidas medem o calendário de versões do fornecedor.",
|
|
815
1150
|
"test": "Para cada dependência externa, nomeie a versão fixada e quem revisou a última mudança. Altere uma descrição de ferramenta a montante; a mudança é detectada antes de chegar à produção."
|
|
816
1151
|
}
|
|
817
1152
|
}
|
|
@@ -819,6 +1154,18 @@
|
|
|
819
1154
|
{
|
|
820
1155
|
"id": "ACM-16",
|
|
821
1156
|
"group": "egress",
|
|
1157
|
+
"axes": {
|
|
1158
|
+
"moment": "feedforward",
|
|
1159
|
+
"mechanism": "deterministic"
|
|
1160
|
+
},
|
|
1161
|
+
"expiry": {
|
|
1162
|
+
"expiresOn": "never",
|
|
1163
|
+
"improves": [
|
|
1164
|
+
"contain"
|
|
1165
|
+
],
|
|
1166
|
+
"validatedAgainst": null,
|
|
1167
|
+
"validatedOn": null
|
|
1168
|
+
},
|
|
822
1169
|
"patterns": [],
|
|
823
1170
|
"knowledge": [
|
|
824
1171
|
"mcp-security"
|
|
@@ -850,16 +1197,25 @@
|
|
|
850
1197
|
"en": {
|
|
851
1198
|
"name": "Transport and origin validation on exposed endpoints",
|
|
852
1199
|
"statement": "An agent endpoint reachable from outside validates its transport before doing work: origin checked against an allowlist, browser-initiated cross-site calls rejected, and every caller rate limited with a real 429.",
|
|
1200
|
+
"axisNote": "The request is judged by its Origin header before any handler runs; the same call gets the same answer every time.",
|
|
1201
|
+
"assumes": "That the endpoint is reachable from outside, and that browsers will be pointed at it by somebody else's page.",
|
|
1202
|
+
"retireWhen": "The endpoint stops being externally reachable. A better model does not make an unvalidated Origin safe.",
|
|
853
1203
|
"test": "Call the endpoint with a foreign Origin and with no Origin. The first is rejected before any handler runs; the second is served and counted against its caller's limit."
|
|
854
1204
|
},
|
|
855
1205
|
"es": {
|
|
856
1206
|
"name": "Validación de transporte y origen en endpoints expuestos",
|
|
857
1207
|
"statement": "Un endpoint de agente accesible desde fuera valida el transporte antes de trabajar: origen comprobado contra una lista, llamadas cross-site iniciadas por navegador rechazadas y todo llamante con límite de tasa y un 429 real.",
|
|
1208
|
+
"axisNote": "La petición se juzga por su cabecera Origin antes de que corra ningún manejador; la misma llamada obtiene siempre la misma respuesta.",
|
|
1209
|
+
"assumes": "Que el endpoint es alcanzable desde fuera, y que a los navegadores los va a apuntar hacia él la página de otro.",
|
|
1210
|
+
"retireWhen": "Que el endpoint deje de ser alcanzable desde fuera. Un modelo mejor no hace seguro un Origin sin validar.",
|
|
858
1211
|
"test": "Llama al endpoint con un Origin ajeno y sin Origin. El primero se rechaza antes de ejecutar ningún handler; el segundo se sirve y cuenta contra el límite de su llamante."
|
|
859
1212
|
},
|
|
860
1213
|
"pt": {
|
|
861
1214
|
"name": "Validação de transporte e origem em endpoints expostos",
|
|
862
1215
|
"statement": "Um endpoint de agente acessível de fora valida o transporte antes de trabalhar: origem verificada contra uma lista, chamadas cross-site iniciadas por navegador recusadas e todo chamador com limite de taxa e um 429 real.",
|
|
1216
|
+
"axisNote": "A requisição é julgada pelo seu cabeçalho Origin antes de qualquer manipulador rodar; a mesma chamada obtém sempre a mesma resposta.",
|
|
1217
|
+
"assumes": "Que o endpoint é alcançável de fora, e que os navegadores serão apontados para ele pela página de outra pessoa.",
|
|
1218
|
+
"retireWhen": "Que o endpoint deixe de ser alcançável de fora. Um modelo melhor não torna seguro um Origin sem validação.",
|
|
863
1219
|
"test": "Chame o endpoint com um Origin alheio e sem Origin. O primeiro é recusado antes de qualquer handler rodar; o segundo é servido e conta contra o limite do seu chamador."
|
|
864
1220
|
}
|
|
865
1221
|
}
|
|
@@ -867,6 +1223,19 @@
|
|
|
867
1223
|
{
|
|
868
1224
|
"id": "ACM-17",
|
|
869
1225
|
"group": "execution",
|
|
1226
|
+
"axes": {
|
|
1227
|
+
"moment": "feedback",
|
|
1228
|
+
"mechanism": "inferential"
|
|
1229
|
+
},
|
|
1230
|
+
"expiry": {
|
|
1231
|
+
"expiresOn": "measurement",
|
|
1232
|
+
"improves": [
|
|
1233
|
+
"contain",
|
|
1234
|
+
"recov"
|
|
1235
|
+
],
|
|
1236
|
+
"validatedAgainst": null,
|
|
1237
|
+
"validatedOn": null
|
|
1238
|
+
},
|
|
870
1239
|
"patterns": [
|
|
871
1240
|
"recovery-strategy"
|
|
872
1241
|
],
|
|
@@ -900,16 +1269,25 @@
|
|
|
900
1269
|
"en": {
|
|
901
1270
|
"name": "Reversibility and a stop control",
|
|
902
1271
|
"statement": "Every action the agent can take is either reversible or gated, and a person can stop the agent mid-run without stopping the whole system. Autonomy without an off switch is not autonomy, it is exposure.",
|
|
1272
|
+
"axisNote": "Somebody has to be watching and decide that this run should end; the mechanism is deterministic, the trigger is not.",
|
|
1273
|
+
"assumes": "That a run can go wrong in a way a person notices before the harness does.",
|
|
1274
|
+
"retireWhen": "The verification gap reaches zero and the recovery rate is at parity without it — meaning the harness notices its own failures at least as fast as the person watching. Nothing in this corpus measures that today.",
|
|
903
1275
|
"test": "Stop a running agent. It halts within the stated time, leaves no half-applied change, and the stop is recorded with who issued it."
|
|
904
1276
|
},
|
|
905
1277
|
"es": {
|
|
906
1278
|
"name": "Reversibilidad y control de parada",
|
|
907
1279
|
"statement": "Toda acción que el agente puede tomar es reversible o tiene puerta, y una persona puede pararlo a mitad de ejecución sin parar el sistema entero. Autonomía sin interruptor no es autonomía, es exposición.",
|
|
1280
|
+
"axisNote": "Alguien tiene que estar mirando y decidir que esta ejecución debe terminar; el mecanismo es determinista, el disparador no.",
|
|
1281
|
+
"assumes": "Que una ejecución puede torcerse de una forma que una persona nota antes que el harness.",
|
|
1282
|
+
"retireWhen": "Que la brecha de verificación llegue a cero y la tasa de recuperación sea igual sin él, es decir, que el harness note sus propios fallos al menos tan rápido como quien mira. Hoy nada en este corpus mide eso.",
|
|
908
1283
|
"test": "Para un agente en marcha. Se detiene dentro del tiempo declarado, no deja ningún cambio a medio aplicar y la parada queda registrada con quién la ordenó."
|
|
909
1284
|
},
|
|
910
1285
|
"pt": {
|
|
911
1286
|
"name": "Reversibilidade e controle de parada",
|
|
912
1287
|
"statement": "Toda ação que o agente pode tomar é reversível ou tem portão, e uma pessoa pode pará-lo no meio da execução sem parar o sistema inteiro. Autonomia sem interruptor não é autonomia, é exposição.",
|
|
1288
|
+
"axisNote": "Alguém tem de estar olhando e decidir que essa execução deve terminar; o mecanismo é determinista, o gatilho não.",
|
|
1289
|
+
"assumes": "Que uma execução pode dar errado de uma forma que uma pessoa percebe antes do harness.",
|
|
1290
|
+
"retireWhen": "Que a lacuna de verificação chegue a zero e a taxa de recuperação seja igual sem ele, isto é, que o harness perceba as próprias falhas pelo menos tão rápido quanto quem observa. Hoje nada neste corpus mede isso.",
|
|
913
1291
|
"test": "Pare um agente em execução. Ele para dentro do tempo declarado, não deixa nenhuma mudança pela metade e a parada fica registrada com quem a ordenou."
|
|
914
1292
|
}
|
|
915
1293
|
}
|
|
@@ -917,6 +1295,18 @@
|
|
|
917
1295
|
{
|
|
918
1296
|
"id": "ACM-18",
|
|
919
1297
|
"group": "lifecycle",
|
|
1298
|
+
"axes": {
|
|
1299
|
+
"moment": "feedback",
|
|
1300
|
+
"mechanism": "inferential"
|
|
1301
|
+
},
|
|
1302
|
+
"expiry": {
|
|
1303
|
+
"expiresOn": "architecture",
|
|
1304
|
+
"improves": [
|
|
1305
|
+
"contain"
|
|
1306
|
+
],
|
|
1307
|
+
"validatedAgainst": null,
|
|
1308
|
+
"validatedOn": null
|
|
1309
|
+
},
|
|
920
1310
|
"patterns": [],
|
|
921
1311
|
"knowledge": [
|
|
922
1312
|
"agentic-threat-model",
|
|
@@ -953,16 +1343,25 @@
|
|
|
953
1343
|
"en": {
|
|
954
1344
|
"name": "A threat model that is maintained and tested",
|
|
955
1345
|
"statement": "The attack surfaces are written down with a control and an owner each, accepted risks are named as accepted, and the document is revisited whenever a tool, a data source or an autonomy level changes.",
|
|
1346
|
+
"axisNote": "Its test compares two dates, but what the document says is judgement, and it is revised in response to changes that already landed.",
|
|
1347
|
+
"assumes": "That the attack surface changes when tools, data sources or autonomy levels change, and that nobody notices unless somebody is made responsible for noticing.",
|
|
1348
|
+
"retireWhen": "The threat model is generated from the tool catalogue and the autonomy configuration, so it cannot lag them. At that point this control has been replaced, not retired.",
|
|
956
1349
|
"test": "Show the current threat model and the date of the last change to the tool catalogue. If the catalogue is newer than the model, the model is out of date and this control fails."
|
|
957
1350
|
},
|
|
958
1351
|
"es": {
|
|
959
1352
|
"name": "Un modelo de amenazas mantenido y probado",
|
|
960
1353
|
"statement": "Las superficies de ataque están escritas, cada una con control y responsable, los riesgos aceptados se nombran como aceptados, y el documento se revisa siempre que cambia una herramienta, una fuente de datos o un nivel de autonomía.",
|
|
1354
|
+
"axisNote": "Su prueba compara dos fechas, pero lo que el documento dice es criterio, y se revisa como respuesta a cambios que ya aterrizaron.",
|
|
1355
|
+
"assumes": "Que la superficie de ataque cambia cuando cambian las herramientas, las fuentes de datos o los niveles de autonomía, y que nadie se da cuenta salvo que se haga responsable a alguien de darse cuenta.",
|
|
1356
|
+
"retireWhen": "Que el modelo de amenazas se genere a partir del catálogo de herramientas y de la configuración de autonomía, con lo que no puede quedarse atrás. En ese punto este control ha sido sustituido, no retirado.",
|
|
961
1357
|
"test": "Muestra el modelo de amenazas vigente y la fecha del último cambio en el catálogo de herramientas. Si el catálogo es más nuevo que el modelo, el modelo está caducado y este control falla."
|
|
962
1358
|
},
|
|
963
1359
|
"pt": {
|
|
964
1360
|
"name": "Um modelo de ameaças mantido e testado",
|
|
965
1361
|
"statement": "As superfícies de ataque estão escritas, cada uma com controle e responsável, os riscos aceitos são nomeados como aceitos, e o documento é revisitado sempre que uma ferramenta, uma fonte de dados ou um nível de autonomia muda.",
|
|
1362
|
+
"axisNote": "Seu teste compara duas datas, mas o que o documento diz é critério, e é revisado em resposta a mudanças que já aconteceram.",
|
|
1363
|
+
"assumes": "Que a superfície de ataque muda quando mudam as ferramentas, as fontes de dados ou os níveis de autonomia, e que ninguém percebe a menos que alguém seja responsabilizado por perceber.",
|
|
1364
|
+
"retireWhen": "Que o modelo de ameaças seja gerado a partir do catálogo de ferramentas e da configuração de autonomia, com o que não pode ficar para trás. Nesse ponto este controle foi substituído, não removido.",
|
|
966
1365
|
"test": "Mostre o modelo de ameaças vigente e a data da última mudança no catálogo de ferramentas. Se o catálogo for mais novo que o modelo, o modelo está desatualizado e este controle falha."
|
|
967
1366
|
}
|
|
968
1367
|
}
|