@highflame/policy 2.2.26 → 2.2.28

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.
@@ -29,6 +29,476 @@ permit (
29
29
  resource
30
30
  );
31
31
  `;
32
+ const AGENT_OPS_SANDBOX_LOCKED_DOWN_CEDAR = `// =============================================================================
33
+ // Sandbox profile — Locked down
34
+ // =============================================================================
35
+ // The tightest Forge sandbox envelope (ADR 0019 D4): execute \`python\` only,
36
+ // write only under \`/scratch\`, no network egress, no mechanism toggles,
37
+ // kernel-tier isolation or stronger (Forge IsolationTier kernel/hardware).
38
+ // Deploy to an agent to let it provision sandboxes for pure, offline compute
39
+ // and nothing more.
40
+ //
41
+ // Enforcement model (ADR 0019 D1/D3): AgentOps ships \`organization.permit-baseline\`
42
+ // which permits every action — including provision_sandbox — so the ceiling here
43
+ // is expressed as \`forbid\` rules (forbid overrides permit in Cedar). The single
44
+ // \`permit\` below turns provisioning ON when this profile is deployed without the
45
+ // baseline. Every forbid \`has\`-guards the optional context attribute it reads:
46
+ // touching an absent attribute is a Cedar evaluation error that silently voids
47
+ // the forbid (fail-open), so the guard is load-bearing, not decorative.
48
+ //
49
+ // Context keys consumed: isolation_tier, writable_paths, network_egress,
50
+ // egress_hosts, exec_allowlist, mechanism_capabilities.
51
+ //
52
+ // Category: sandbox
53
+ // Namespace: AgentOps
54
+ // =============================================================================
55
+
56
+ @id("sandbox.allow-locked-down")
57
+ @name("Permit locked-down sandbox provisioning")
58
+ @description("Permits provision_sandbox so this identity can create sandboxes within the locked-down ceiling enforced by the forbid rules below.")
59
+ @severity("high")
60
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
61
+ permit (
62
+ principal,
63
+ action == AgentOps::Action::"provision_sandbox",
64
+ resource
65
+ );
66
+
67
+ @id("sandbox.block-locked-down-tier")
68
+ @name("Block weak isolation for locked-down sandbox")
69
+ @description("Blocks provision_sandbox when the requested isolation tier is weaker than the kernel tier.")
70
+ @severity("high")
71
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
72
+ @reject_message("Sandbox provisioning blocked: locked-down profile requires kernel-tier isolation or stronger.")
73
+ forbid (
74
+ principal,
75
+ action == AgentOps::Action::"provision_sandbox",
76
+ resource
77
+ )
78
+ when {
79
+ context has isolation_tier &&
80
+ !(["kernel", "hardware"].contains(context.isolation_tier))
81
+ };
82
+
83
+ @id("sandbox.block-locked-down-write")
84
+ @name("Block writable paths outside scratch")
85
+ @description("Blocks provision_sandbox when a requested writable path prefix is outside /scratch.")
86
+ @severity("high")
87
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
88
+ @reject_message("Sandbox provisioning blocked: locked-down profile permits writes only under /scratch.")
89
+ forbid (
90
+ principal,
91
+ action == AgentOps::Action::"provision_sandbox",
92
+ resource
93
+ )
94
+ when {
95
+ context has writable_paths &&
96
+ !(["/scratch"].containsAll(context.writable_paths))
97
+ };
98
+
99
+ @id("sandbox.block-locked-down-exec")
100
+ @name("Block executables outside python")
101
+ @description("Blocks provision_sandbox when the requested exec allowlist includes anything other than python.")
102
+ @severity("high")
103
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
104
+ @reject_message("Sandbox provisioning blocked: locked-down profile permits only python and python3.")
105
+ forbid (
106
+ principal,
107
+ action == AgentOps::Action::"provision_sandbox",
108
+ resource
109
+ )
110
+ when {
111
+ context has exec_allowlist &&
112
+ !(["python", "python3"].containsAll(context.exec_allowlist))
113
+ };
114
+
115
+ @id("sandbox.block-locked-down-egress")
116
+ @name("Block network egress for locked-down sandbox")
117
+ @description("Blocks provision_sandbox when outbound network egress is requested.")
118
+ @severity("high")
119
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
120
+ @reject_message("Sandbox provisioning blocked: locked-down profile forbids all network egress.")
121
+ forbid (
122
+ principal,
123
+ action == AgentOps::Action::"provision_sandbox",
124
+ resource
125
+ )
126
+ when {
127
+ (context has network_egress && context.network_egress == true) ||
128
+ (context has egress_hosts)
129
+ };
130
+
131
+ @id("sandbox.block-locked-down-mechanisms")
132
+ @name("Block mechanism toggles for locked-down sandbox")
133
+ @description("Blocks provision_sandbox when any curated mechanism toggle is requested.")
134
+ @severity("high")
135
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
136
+ @reject_message("Sandbox provisioning blocked: locked-down profile forbids all mechanism toggles.")
137
+ forbid (
138
+ principal,
139
+ action == AgentOps::Action::"provision_sandbox",
140
+ resource
141
+ )
142
+ when {
143
+ context has mechanism_capabilities &&
144
+ (context.mechanism_capabilities.contains("sys:ptrace") ||
145
+ context.mechanism_capabilities.contains("sys:bpf") ||
146
+ context.mechanism_capabilities.contains("sys:raw_socket") ||
147
+ context.mechanism_capabilities.contains("dev:gpu") ||
148
+ context.mechanism_capabilities.contains("virt:nested"))
149
+ };
150
+ `;
151
+ const AGENT_OPS_SANDBOX_DATA_PROCESSING_CEDAR = `// =============================================================================
152
+ // Sandbox profile — Data processing
153
+ // =============================================================================
154
+ // Offline batch data work (ADR 0019 D4): read/write under /scratch, /data and
155
+ // /tmp; run python and a POSIX shell; no network egress; no mechanism toggles;
156
+ // kernel-tier isolation or stronger (Forge IsolationTier kernel/hardware).
157
+ //
158
+ // Enforcement model (ADR 0019 D1/D3): the ceiling is expressed as \`forbid\`
159
+ // rules so it overrides AgentOps' \`organization.permit-baseline\`; the single
160
+ // \`permit\` turns provisioning ON. Every forbid \`has\`-guards the optional
161
+ // attribute it reads — an absent-attribute access errors and silently voids the
162
+ // forbid (fail-open), so the guard is load-bearing.
163
+ //
164
+ // Context keys consumed: isolation_tier, writable_paths, network_egress,
165
+ // exec_allowlist, mechanism_capabilities.
166
+ //
167
+ // Category: sandbox
168
+ // Namespace: AgentOps
169
+ // =============================================================================
170
+
171
+ @id("sandbox.allow-data-processing")
172
+ @name("Permit data-processing sandbox provisioning")
173
+ @description("Permits provision_sandbox so this identity can create sandboxes within the data-processing ceiling enforced by the forbid rules below.")
174
+ @severity("high")
175
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
176
+ permit (
177
+ principal,
178
+ action == AgentOps::Action::"provision_sandbox",
179
+ resource
180
+ );
181
+
182
+ @id("sandbox.block-data-processing-tier")
183
+ @name("Block weak isolation for data sandbox")
184
+ @description("Blocks provision_sandbox when the requested isolation tier is weaker than the kernel tier.")
185
+ @severity("high")
186
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
187
+ @reject_message("Sandbox provisioning blocked: data-processing profile requires kernel-tier isolation or stronger.")
188
+ forbid (
189
+ principal,
190
+ action == AgentOps::Action::"provision_sandbox",
191
+ resource
192
+ )
193
+ when {
194
+ context has isolation_tier &&
195
+ !(["kernel", "hardware"].contains(context.isolation_tier))
196
+ };
197
+
198
+ @id("sandbox.block-data-processing-write")
199
+ @name("Block writable paths outside data dirs")
200
+ @description("Blocks provision_sandbox when a requested writable path prefix is outside /scratch, /data or /tmp.")
201
+ @severity("high")
202
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
203
+ @reject_message("Sandbox provisioning blocked: data-processing profile permits writes only under /scratch, /data or /tmp.")
204
+ forbid (
205
+ principal,
206
+ action == AgentOps::Action::"provision_sandbox",
207
+ resource
208
+ )
209
+ when {
210
+ context has writable_paths &&
211
+ !(["/scratch", "/data", "/tmp"].containsAll(context.writable_paths))
212
+ };
213
+
214
+ @id("sandbox.block-data-processing-exec")
215
+ @name("Block executables outside python and shell")
216
+ @description("Blocks provision_sandbox when the requested exec allowlist includes anything other than python or a POSIX shell.")
217
+ @severity("high")
218
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
219
+ @reject_message("Sandbox provisioning blocked: data-processing profile permits only python, python3, bash and sh.")
220
+ forbid (
221
+ principal,
222
+ action == AgentOps::Action::"provision_sandbox",
223
+ resource
224
+ )
225
+ when {
226
+ context has exec_allowlist &&
227
+ !(["python", "python3", "bash", "sh"].containsAll(context.exec_allowlist))
228
+ };
229
+
230
+ @id("sandbox.block-data-processing-egress")
231
+ @name("Block network egress for data sandbox")
232
+ @description("Blocks provision_sandbox when outbound network egress is requested.")
233
+ @severity("high")
234
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
235
+ @reject_message("Sandbox provisioning blocked: data-processing profile forbids all network egress.")
236
+ forbid (
237
+ principal,
238
+ action == AgentOps::Action::"provision_sandbox",
239
+ resource
240
+ )
241
+ when {
242
+ (context has network_egress && context.network_egress == true) ||
243
+ (context has egress_hosts)
244
+ };
245
+
246
+ @id("sandbox.block-data-processing-mechanisms")
247
+ @name("Block mechanism toggles for data sandbox")
248
+ @description("Blocks provision_sandbox when any curated mechanism toggle is requested.")
249
+ @severity("high")
250
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
251
+ @reject_message("Sandbox provisioning blocked: data-processing profile forbids all mechanism toggles.")
252
+ forbid (
253
+ principal,
254
+ action == AgentOps::Action::"provision_sandbox",
255
+ resource
256
+ )
257
+ when {
258
+ context has mechanism_capabilities &&
259
+ (context.mechanism_capabilities.contains("sys:ptrace") ||
260
+ context.mechanism_capabilities.contains("sys:bpf") ||
261
+ context.mechanism_capabilities.contains("sys:raw_socket") ||
262
+ context.mechanism_capabilities.contains("dev:gpu") ||
263
+ context.mechanism_capabilities.contains("virt:nested"))
264
+ };
265
+ `;
266
+ const AGENT_OPS_SANDBOX_NETWORK_DEV_CEDAR = `// =============================================================================
267
+ // Sandbox profile — Network dev
268
+ // =============================================================================
269
+ // Interactive/dev workloads that need controlled egress (ADR 0019 D4): write
270
+ // under /scratch, /workspace and /tmp; run the common dev toolchain; reach ONLY
271
+ // an approved set of package and source hosts; no mechanism toggles; kernel-tier
272
+ // isolation or stronger (Forge IsolationTier kernel/hardware).
273
+ //
274
+ // Enforcement model (ADR 0019 D1/D3): the ceiling is expressed as \`forbid\`
275
+ // rules so it overrides AgentOps' \`organization.permit-baseline\`; the single
276
+ // \`permit\` turns provisioning ON. Network egress is PERMITTED here but the host
277
+ // allowlist is enforced by the egress forbid. Every forbid \`has\`-guards the
278
+ // optional attribute it reads (absent-attribute access errors and silently
279
+ // voids a forbid — fail-open).
280
+ //
281
+ // Context keys consumed: isolation_tier, writable_paths, exec_allowlist,
282
+ // egress_hosts, mechanism_capabilities.
283
+ //
284
+ // Category: sandbox
285
+ // Namespace: AgentOps
286
+ // =============================================================================
287
+
288
+ @id("sandbox.allow-network-dev")
289
+ @name("Permit network-dev sandbox provisioning")
290
+ @description("Permits provision_sandbox so this identity can create sandboxes within the network-dev ceiling enforced by the forbid rules below.")
291
+ @severity("high")
292
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
293
+ permit (
294
+ principal,
295
+ action == AgentOps::Action::"provision_sandbox",
296
+ resource
297
+ );
298
+
299
+ @id("sandbox.block-network-dev-tier")
300
+ @name("Block weak isolation for network-dev sandbox")
301
+ @description("Blocks provision_sandbox when the requested isolation tier is weaker than the kernel tier.")
302
+ @severity("high")
303
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
304
+ @reject_message("Sandbox provisioning blocked: network-dev profile requires kernel-tier isolation or stronger.")
305
+ forbid (
306
+ principal,
307
+ action == AgentOps::Action::"provision_sandbox",
308
+ resource
309
+ )
310
+ when {
311
+ context has isolation_tier &&
312
+ !(["kernel", "hardware"].contains(context.isolation_tier))
313
+ };
314
+
315
+ @id("sandbox.block-network-dev-write")
316
+ @name("Block writable paths outside workspace")
317
+ @description("Blocks provision_sandbox when a requested writable path prefix is outside /scratch, /workspace or /tmp.")
318
+ @severity("high")
319
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
320
+ @reject_message("Sandbox provisioning blocked: network-dev profile permits writes only under /scratch, /workspace or /tmp.")
321
+ forbid (
322
+ principal,
323
+ action == AgentOps::Action::"provision_sandbox",
324
+ resource
325
+ )
326
+ when {
327
+ context has writable_paths &&
328
+ !(["/scratch", "/workspace", "/tmp"].containsAll(context.writable_paths))
329
+ };
330
+
331
+ @id("sandbox.block-network-dev-exec")
332
+ @name("Block executables outside the dev toolchain")
333
+ @description("Blocks provision_sandbox when the requested exec allowlist includes anything outside the approved dev toolchain.")
334
+ @severity("high")
335
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
336
+ @reject_message("Sandbox provisioning blocked: network-dev profile permits only python, node, npm, pip, git and a POSIX shell.")
337
+ forbid (
338
+ principal,
339
+ action == AgentOps::Action::"provision_sandbox",
340
+ resource
341
+ )
342
+ when {
343
+ context has exec_allowlist &&
344
+ !(["python", "python3", "node", "npm", "pip", "git", "bash", "sh"].containsAll(context.exec_allowlist))
345
+ };
346
+
347
+ @id("sandbox.block-network-dev-egress")
348
+ @name("Block egress outside approved hosts")
349
+ @description("Blocks provision_sandbox when a requested egress host is outside the approved package and source hosts.")
350
+ @severity("high")
351
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
352
+ @reject_message("Sandbox provisioning blocked: network-dev profile permits egress only to approved package and source hosts.")
353
+ forbid (
354
+ principal,
355
+ action == AgentOps::Action::"provision_sandbox",
356
+ resource
357
+ )
358
+ when {
359
+ (context has egress_hosts &&
360
+ !(["pypi.org", "files.pythonhosted.org", "registry.npmjs.org", "github.com", "objects.githubusercontent.com"].containsAll(context.egress_hosts))) ||
361
+ (context has network_egress && context.network_egress == true && !(context has egress_hosts))
362
+ };
363
+
364
+ @id("sandbox.block-network-dev-mechanisms")
365
+ @name("Block mechanism toggles for network-dev sandbox")
366
+ @description("Blocks provision_sandbox when any curated mechanism toggle is requested.")
367
+ @severity("high")
368
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
369
+ @reject_message("Sandbox provisioning blocked: network-dev profile forbids all mechanism toggles.")
370
+ forbid (
371
+ principal,
372
+ action == AgentOps::Action::"provision_sandbox",
373
+ resource
374
+ )
375
+ when {
376
+ context has mechanism_capabilities &&
377
+ (context.mechanism_capabilities.contains("sys:ptrace") ||
378
+ context.mechanism_capabilities.contains("sys:bpf") ||
379
+ context.mechanism_capabilities.contains("sys:raw_socket") ||
380
+ context.mechanism_capabilities.contains("dev:gpu") ||
381
+ context.mechanism_capabilities.contains("virt:nested"))
382
+ };
383
+ `;
384
+ const AGENT_OPS_SANDBOX_GPU_TRAINING_CEDAR = `// =============================================================================
385
+ // Sandbox profile — GPU training
386
+ // =============================================================================
387
+ // GPU-accelerated training/fine-tuning (ADR 0019 D4): write under /scratch,
388
+ // /data, /workspace and /tmp; run python and the common launchers; reach model
389
+ // and dataset hubs; the ONLY permitted mechanism toggle is \`dev:gpu\`; kernel-tier
390
+ // isolation or stronger (Forge IsolationTier kernel/hardware — GPU passthrough
391
+ // needs a real kernel, ADR 0019 D4 "KERNEL-tier floor").
392
+ //
393
+ // Enforcement model (ADR 0019 D1/D3): the ceiling is expressed as \`forbid\`
394
+ // rules so it overrides AgentOps' \`organization.permit-baseline\`; the single
395
+ // \`permit\` turns provisioning ON. \`dev:gpu\` is allowed; every OTHER mechanism
396
+ // toggle (ptrace, bpf, raw_socket, nested virt) is still forbidden. Every forbid
397
+ // \`has\`-guards the optional attribute it reads (absent-attribute access errors
398
+ // and silently voids a forbid — fail-open).
399
+ //
400
+ // Context keys consumed: isolation_tier, writable_paths, exec_allowlist,
401
+ // egress_hosts, mechanism_capabilities.
402
+ //
403
+ // Category: sandbox
404
+ // Namespace: AgentOps
405
+ // =============================================================================
406
+
407
+ @id("sandbox.allow-gpu-training")
408
+ @name("Permit gpu-training sandbox provisioning")
409
+ @description("Permits provision_sandbox so this identity can create sandboxes within the gpu-training ceiling enforced by the forbid rules below.")
410
+ @severity("high")
411
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
412
+ permit (
413
+ principal,
414
+ action == AgentOps::Action::"provision_sandbox",
415
+ resource
416
+ );
417
+
418
+ @id("sandbox.block-gpu-training-tier")
419
+ @name("Block weak isolation for gpu sandbox")
420
+ @description("Blocks provision_sandbox when the requested isolation tier is weaker than the kernel tier required for GPU passthrough.")
421
+ @severity("high")
422
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
423
+ @reject_message("Sandbox provisioning blocked: gpu-training profile requires kernel-tier isolation or stronger.")
424
+ forbid (
425
+ principal,
426
+ action == AgentOps::Action::"provision_sandbox",
427
+ resource
428
+ )
429
+ when {
430
+ context has isolation_tier &&
431
+ !(["kernel", "hardware"].contains(context.isolation_tier))
432
+ };
433
+
434
+ @id("sandbox.block-gpu-training-write")
435
+ @name("Block writable paths outside training dirs")
436
+ @description("Blocks provision_sandbox when a requested writable path prefix is outside /scratch, /data, /workspace or /tmp.")
437
+ @severity("high")
438
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
439
+ @reject_message("Sandbox provisioning blocked: gpu-training profile permits writes only under /scratch, /data, /workspace or /tmp.")
440
+ forbid (
441
+ principal,
442
+ action == AgentOps::Action::"provision_sandbox",
443
+ resource
444
+ )
445
+ when {
446
+ context has writable_paths &&
447
+ !(["/scratch", "/data", "/workspace", "/tmp"].containsAll(context.writable_paths))
448
+ };
449
+
450
+ @id("sandbox.block-gpu-training-exec")
451
+ @name("Block executables outside training launchers")
452
+ @description("Blocks provision_sandbox when the requested exec allowlist includes anything outside python and the approved launchers.")
453
+ @severity("high")
454
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
455
+ @reject_message("Sandbox provisioning blocked: gpu-training profile permits only python, bash, sh, accelerate and torchrun.")
456
+ forbid (
457
+ principal,
458
+ action == AgentOps::Action::"provision_sandbox",
459
+ resource
460
+ )
461
+ when {
462
+ context has exec_allowlist &&
463
+ !(["python", "python3", "bash", "sh", "accelerate", "torchrun"].containsAll(context.exec_allowlist))
464
+ };
465
+
466
+ @id("sandbox.block-gpu-training-egress")
467
+ @name("Block egress outside model and dataset hubs")
468
+ @description("Blocks provision_sandbox when a requested egress host is outside the approved model and dataset hubs.")
469
+ @severity("high")
470
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
471
+ @reject_message("Sandbox provisioning blocked: gpu-training profile permits egress only to approved model and dataset hubs.")
472
+ forbid (
473
+ principal,
474
+ action == AgentOps::Action::"provision_sandbox",
475
+ resource
476
+ )
477
+ when {
478
+ (context has egress_hosts &&
479
+ !(["huggingface.co", "cdn-lfs.huggingface.co", "pypi.org", "files.pythonhosted.org", "storage.googleapis.com"].containsAll(context.egress_hosts))) ||
480
+ (context has network_egress && context.network_egress == true && !(context has egress_hosts))
481
+ };
482
+
483
+ @id("sandbox.block-gpu-training-mechanisms")
484
+ @name("Block mechanism toggles beyond gpu")
485
+ @description("Blocks provision_sandbox when a mechanism toggle other than dev:gpu is requested.")
486
+ @severity("high")
487
+ @tags("category:sandbox,surface:provision-sandbox,scope:per-agent,posture:deny-default")
488
+ @reject_message("Sandbox provisioning blocked: gpu-training profile permits only the dev:gpu mechanism toggle.")
489
+ forbid (
490
+ principal,
491
+ action == AgentOps::Action::"provision_sandbox",
492
+ resource
493
+ )
494
+ when {
495
+ context has mechanism_capabilities &&
496
+ (context.mechanism_capabilities.contains("sys:ptrace") ||
497
+ context.mechanism_capabilities.contains("sys:bpf") ||
498
+ context.mechanism_capabilities.contains("sys:raw_socket") ||
499
+ context.mechanism_capabilities.contains("virt:nested"))
500
+ };
501
+ `;
32
502
  // =============================================================================
33
503
  // CATEGORIES
34
504
  // =============================================================================
@@ -40,6 +510,7 @@ export const AGENT_OPS_CATEGORIES = [
40
510
  { id: 'code-security', name: 'Code Security', description: 'Enforce safe coding patterns: no exfiltration commands, no destructive write operations.' },
41
511
  { id: 'content-safety', name: 'Content Safety', description: 'Block harmful, toxic, or policy-violating content in agent inputs and outputs.' },
42
512
  { id: 'organization', name: 'Organization', description: 'Organization-wide baselines and default permit/deny policies.' },
513
+ { id: 'sandbox', name: 'Sandbox', description: 'Forge sandbox provisioning profiles — capability ceilings for the OS-layer envelope (writable paths, egress, exec, mechanism toggles, isolation tier).' },
43
514
  ];
44
515
  // =============================================================================
45
516
  // DEFAULT POLICIES
@@ -70,6 +541,42 @@ export const AGENT_OPS_TEMPLATES = [
70
541
  tags: ['category:organization', 'posture:permit-default'],
71
542
  autoDeploy: true,
72
543
  },
544
+ {
545
+ id: 'sandbox.locked-down',
546
+ name: 'Sandbox: Locked down',
547
+ description: 'Permits sandbox provisioning within the tightest ceiling: python only, writes under /scratch, no network, no mechanism toggles, kernel-tier isolation or stronger.',
548
+ category: 'sandbox',
549
+ cedarText: AGENT_OPS_SANDBOX_LOCKED_DOWN_CEDAR,
550
+ severity: 'high',
551
+ tags: ['category:sandbox', 'surface:provision-sandbox', 'scope:per-agent', 'posture:deny-default'],
552
+ },
553
+ {
554
+ id: 'sandbox.data-processing',
555
+ name: 'Sandbox: Data processing',
556
+ description: 'Permits sandbox provisioning for offline batch data work: python and a POSIX shell, writes under /scratch, /data and /tmp, no network, no mechanism toggles.',
557
+ category: 'sandbox',
558
+ cedarText: AGENT_OPS_SANDBOX_DATA_PROCESSING_CEDAR,
559
+ severity: 'high',
560
+ tags: ['category:sandbox', 'surface:provision-sandbox', 'scope:per-agent', 'posture:deny-default'],
561
+ },
562
+ {
563
+ id: 'sandbox.network-dev',
564
+ name: 'Sandbox: Network dev',
565
+ description: 'Permits sandbox provisioning for dev workloads with controlled egress: common dev toolchain, writes under /scratch, /workspace and /tmp, egress limited to approved package and source hosts.',
566
+ category: 'sandbox',
567
+ cedarText: AGENT_OPS_SANDBOX_NETWORK_DEV_CEDAR,
568
+ severity: 'high',
569
+ tags: ['category:sandbox', 'surface:provision-sandbox', 'scope:per-agent', 'posture:deny-default'],
570
+ },
571
+ {
572
+ id: 'sandbox.gpu-training',
573
+ name: 'Sandbox: GPU training',
574
+ description: 'Permits sandbox provisioning for GPU training: dev:gpu the only mechanism toggle, kernel-tier isolation or stronger, writes under training dirs, egress limited to model and dataset hubs.',
575
+ category: 'sandbox',
576
+ cedarText: AGENT_OPS_SANDBOX_GPU_TRAINING_CEDAR,
577
+ severity: 'high',
578
+ tags: ['category:sandbox', 'surface:provision-sandbox', 'scope:per-agent', 'posture:deny-default'],
579
+ },
73
580
  ];
74
581
  // =============================================================================
75
582
  // TEMPLATES METADATA
@@ -114,6 +621,11 @@ export const AGENT_OPS_TEMPLATES_JSON = `{
114
621
  "id": "organization",
115
622
  "name": "Organization",
116
623
  "description": "Organization-wide baselines and default permit/deny policies."
624
+ },
625
+ {
626
+ "id": "sandbox",
627
+ "name": "Sandbox",
628
+ "description": "Forge sandbox provisioning profiles — capability ceilings for the OS-layer envelope (writable paths, egress, exec, mechanism toggles, isolation tier)."
117
629
  }
118
630
  ],
119
631
  "defaults": [
@@ -138,6 +650,42 @@ export const AGENT_OPS_TEMPLATES_JSON = `{
138
650
  "severity": "low",
139
651
  "tags": ["category:organization", "posture:permit-default"],
140
652
  "auto_deploy": true
653
+ },
654
+ {
655
+ "id": "sandbox.locked-down",
656
+ "name": "Sandbox: Locked down",
657
+ "description": "Permits sandbox provisioning within the tightest ceiling: python only, writes under /scratch, no network, no mechanism toggles, kernel-tier isolation or stronger.",
658
+ "category": "sandbox",
659
+ "file": "profiles/locked_down.cedar",
660
+ "severity": "high",
661
+ "tags": ["category:sandbox", "surface:provision-sandbox", "scope:per-agent", "posture:deny-default"]
662
+ },
663
+ {
664
+ "id": "sandbox.data-processing",
665
+ "name": "Sandbox: Data processing",
666
+ "description": "Permits sandbox provisioning for offline batch data work: python and a POSIX shell, writes under /scratch, /data and /tmp, no network, no mechanism toggles.",
667
+ "category": "sandbox",
668
+ "file": "profiles/data_processing.cedar",
669
+ "severity": "high",
670
+ "tags": ["category:sandbox", "surface:provision-sandbox", "scope:per-agent", "posture:deny-default"]
671
+ },
672
+ {
673
+ "id": "sandbox.network-dev",
674
+ "name": "Sandbox: Network dev",
675
+ "description": "Permits sandbox provisioning for dev workloads with controlled egress: common dev toolchain, writes under /scratch, /workspace and /tmp, egress limited to approved package and source hosts.",
676
+ "category": "sandbox",
677
+ "file": "profiles/network_dev.cedar",
678
+ "severity": "high",
679
+ "tags": ["category:sandbox", "surface:provision-sandbox", "scope:per-agent", "posture:deny-default"]
680
+ },
681
+ {
682
+ "id": "sandbox.gpu-training",
683
+ "name": "Sandbox: GPU training",
684
+ "description": "Permits sandbox provisioning for GPU training: dev:gpu the only mechanism toggle, kernel-tier isolation or stronger, writes under training dirs, egress limited to model and dataset hubs.",
685
+ "category": "sandbox",
686
+ "file": "profiles/gpu_training.cedar",
687
+ "severity": "high",
688
+ "tags": ["category:sandbox", "surface:provision-sandbox", "scope:per-agent", "posture:deny-default"]
141
689
  }
142
690
  ]
143
691
  }
@@ -7,7 +7,7 @@
7
7
  export const AGENT_OPS_ENTITIES = {
8
8
  principals: ['Agent', 'User'],
9
9
  resources: ['Agent', 'App', 'Session'],
10
- actions: ['call_tool', 'connect_server', 'process_prompt', 'read_file', 'write_file'],
10
+ actions: ['call_tool', 'connect_server', 'process_prompt', 'provision_sandbox', 'read_file', 'write_file'],
11
11
  };
12
12
  /**
13
13
  * Per-action entity mapping for AgentOps.
@@ -26,6 +26,10 @@ export const AGENT_OPS_ACTION_ENTITIES = {
26
26
  principals: ['Agent', 'User'],
27
27
  resources: ['Agent', 'App', 'Session'],
28
28
  },
29
+ 'provision_sandbox': {
30
+ principals: ['Agent', 'User'],
31
+ resources: ['Agent', 'Session'],
32
+ },
29
33
  'read_file': {
30
34
  principals: ['Agent', 'User'],
31
35
  resources: ['Agent', 'Session'],