@bluefly/openstandardagents 0.2.8 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/.env.example +1 -1
  2. package/.github/AGENTS.md +245 -0
  3. package/.github/agents/github-issue-triage.ossa.yaml +99 -0
  4. package/.github/agents/github-pr-triage.ossa.yaml +137 -0
  5. package/.github/workflows/issue-sync-to-gitlab.yml +138 -0
  6. package/.github/workflows/pr-triage-to-gitlab.yml +164 -0
  7. package/.version.json +1 -1
  8. package/.wiki-config.json +1 -1
  9. package/CHANGELOG.md +33 -0
  10. package/CONTRIBUTING.md +102 -3
  11. package/README.md +17 -10
  12. package/dist/services/release-automation/schemas/release.schema.js +1 -1
  13. package/dist/services/release-automation/webhook.service.js +3 -3
  14. package/dist/services/release-automation/webhook.service.js.map +1 -1
  15. package/dist/services/runtime/claude/claude-adapter.d.ts +1 -1
  16. package/dist/services/runtime/claude/claude-adapter.d.ts.map +1 -1
  17. package/dist/services/runtime/claude/claude-adapter.js +1 -1
  18. package/dist/services/runtime/claude/claude-adapter.js.map +1 -1
  19. package/dist/spec/v0.2.9/a2a-protocol.md +1337 -0
  20. package/dist/spec/v0.2.9/agent.md +1946 -0
  21. package/dist/spec/v0.2.9/capabilities/index.yaml +25 -0
  22. package/dist/spec/v0.2.9/capabilities/memory.yaml +251 -0
  23. package/dist/spec/v0.2.9/capability-schema.md +576 -0
  24. package/dist/spec/v0.2.9/compliance-profiles.md +533 -0
  25. package/dist/spec/v0.2.9/conformance-testing.md +1527 -0
  26. package/dist/spec/v0.2.9/gitlab-duo-integration.md +621 -0
  27. package/dist/spec/v0.2.9/ossa-0.2.9.schema.json +3699 -0
  28. package/dist/spec/v0.2.9/runtime-semantics.md +464 -0
  29. package/dist/spec/v0.2.9/security-model.md +1245 -0
  30. package/dist/spec/v0.2.9/semantic-conventions.md +347 -0
  31. package/dist/spec/v0.2.9/types.ts +522 -0
  32. package/dist/types/policy.d.ts +377 -0
  33. package/dist/types/policy.d.ts.map +1 -0
  34. package/dist/types/policy.js +84 -0
  35. package/dist/types/policy.js.map +1 -0
  36. package/dist/utils/version.js +1 -1
  37. package/docs/specs/policy-dsl.md +925 -0
  38. package/examples/adk-integration/code-review-workflow.yml +1 -1
  39. package/examples/adk-integration/customer-support.yml +1 -1
  40. package/examples/adk-integration/data-pipeline.yml +1 -1
  41. package/examples/advanced/reasoning-agent.yaml +136 -0
  42. package/examples/advanced/workflows/hybrid-model-strategy.yaml +1 -1
  43. package/examples/agent-manifests/critics/critic-agent.yaml +1 -1
  44. package/examples/agent-manifests/governors/governor-agent.yaml +1 -1
  45. package/examples/agent-manifests/integrators/integrator-agent.yaml +1 -1
  46. package/examples/agent-manifests/judges/judge-agent.yaml +1 -1
  47. package/examples/agent-manifests/monitors/monitor-agent.yaml +1 -1
  48. package/examples/agent-manifests/orchestrators/orchestrator-agent.yaml +1 -1
  49. package/examples/agent-manifests/sample-compliant-agent.yaml +1 -1
  50. package/examples/agent-manifests/workers/worker-agent.yaml +1 -1
  51. package/examples/agents-md/code-agent.ossa.json +100 -0
  52. package/examples/agents-md/monorepo-agent.ossa.yaml +180 -0
  53. package/examples/anthropic/claude-assistant.ossa.json +1 -1
  54. package/examples/autogen/multi-agent.ossa.json +1 -1
  55. package/examples/claude-code/code-reviewer.ossa.yaml +1 -1
  56. package/examples/claude-code/ossa-validator.ossa.yaml +2 -2
  57. package/examples/common_npm/agent-router.ossa.yaml +1 -1
  58. package/examples/common_npm/agent-router.v0.2.2.ossa.yaml +1 -1
  59. package/examples/crewai/research-team.ossa.json +1 -1
  60. package/examples/cursor/code-review-agent.ossa.json +1 -1
  61. package/examples/drupal/gitlab-ml-recommender.ossa.yaml +1 -1
  62. package/examples/drupal/gitlab-ml-recommender.v0.2.2.ossa.yaml +1 -1
  63. package/examples/extensions/agents-md-v1.yml +175 -0
  64. package/examples/extensions/drupal-v1.yml +1 -1
  65. package/examples/extensions/kagent-v1.yml +1 -1
  66. package/examples/getting-started/hello-world-complete.ossa.yaml +1 -1
  67. package/examples/integration-patterns/agent-to-agent-orchestration.ossa.yaml +4 -4
  68. package/examples/kagent/compliance-validator.ossa.yaml +1 -1
  69. package/examples/kagent/cost-optimizer.ossa.yaml +1 -1
  70. package/examples/kagent/documentation-agent.ossa.yaml +1 -1
  71. package/examples/kagent/k8s-troubleshooter-v1.ossa.yaml +1 -1
  72. package/examples/kagent/k8s-troubleshooter-v1.v0.2.2.ossa.yaml +1 -1
  73. package/examples/kagent/k8s-troubleshooter.ossa.yaml +1 -1
  74. package/examples/kagent/security-scanner.ossa.yaml +1 -1
  75. package/examples/langchain/chain-agent.ossa.json +1 -1
  76. package/examples/langflow/workflow-agent.ossa.json +1 -1
  77. package/examples/langgraph/state-machine-agent.ossa.json +1 -1
  78. package/examples/llamaindex/rag-agent.ossa.json +1 -1
  79. package/examples/migration-guides/from-langchain-to-ossa.yaml +4 -4
  80. package/examples/multi-agent/conditional-router.ossa.yaml +1 -1
  81. package/examples/multi-agent/parallel-execution.ossa.yaml +1 -1
  82. package/examples/multi-agent/sequential-pipeline.ossa.yaml +1 -1
  83. package/examples/openai/basic-agent.ossa.yaml +1 -1
  84. package/examples/openai/multi-tool-agent.ossa.json +1 -1
  85. package/examples/openai/swarm-agent.ossa.json +1 -1
  86. package/examples/production/document-analyzer-openai.yml +1 -1
  87. package/examples/quickstart/support-agent.ossa.yaml +1 -1
  88. package/examples/templates/ossa-compliance.yaml +1 -1
  89. package/examples/vercel/edge-agent.ossa.json +1 -1
  90. package/llms.txt +1 -1
  91. package/package.json +5 -3
  92. package/scripts/README.md +25 -0
  93. package/scripts/compliance-audit.ts +796 -0
  94. package/scripts/generate-agents-catalog.ts +2 -1
  95. package/scripts/generate-api-docs.ts +2 -1
  96. package/scripts/generate-examples-docs.ts +2 -1
  97. package/scripts/generate-llms-ctx.sh +2 -2
  98. package/spec/v0.2.9/a2a-protocol.md +1337 -0
  99. package/spec/v0.2.9/agent.md +1946 -0
  100. package/spec/v0.2.9/capabilities/index.yaml +25 -0
  101. package/spec/v0.2.9/capabilities/memory.yaml +251 -0
  102. package/spec/v0.2.9/capability-schema.md +576 -0
  103. package/spec/v0.2.9/compliance-profiles.md +533 -0
  104. package/spec/v0.2.9/conformance-testing.md +1527 -0
  105. package/spec/v0.2.9/gitlab-duo-integration.md +621 -0
  106. package/spec/v0.2.9/ossa-0.2.9.schema.json +3699 -0
  107. package/spec/v0.2.9/runtime-semantics.md +464 -0
  108. package/spec/v0.2.9/security-model.md +1245 -0
  109. package/spec/v0.2.9/semantic-conventions.md +347 -0
  110. package/spec/v0.2.9/types.ts +522 -0
  111. package/test-results/junit.xml +184 -146
  112. package/.github/workflows/pr-comment.yml +0 -33
@@ -0,0 +1,925 @@
1
+ # OSSA Policy DSL Specification
2
+
3
+ **Version:** 1.0.0
4
+ **Status:** Draft
5
+ **Last Updated:** 2025-12-03
6
+
7
+ ## Abstract
8
+
9
+ This document defines the formal Policy Domain-Specific Language (DSL) for the Open Standard for Scalable AI Agents (OSSA). The Policy DSL provides a declarative, type-safe mechanism for defining agent behavior constraints, escalation rules, and autonomous decision-making policies.
10
+
11
+ ## Table of Contents
12
+
13
+ 1. [Overview](#overview)
14
+ 2. [Grammar Definition](#grammar-definition)
15
+ 3. [Type System](#type-system)
16
+ 4. [Operators](#operators)
17
+ 5. [Policy Rules](#policy-rules)
18
+ 6. [Escalation Policies](#escalation-policies)
19
+ 7. [Examples](#examples)
20
+ 8. [Error Handling](#error-handling)
21
+ 9. [Security Considerations](#security-considerations)
22
+
23
+ ---
24
+
25
+ ## 1. Overview
26
+
27
+ The Policy DSL enables OSSA-compliant agents to:
28
+
29
+ - **Define Constraints**: Specify what actions are allowed or forbidden
30
+ - **Escalate Decisions**: Route complex decisions to human oversight
31
+ - **Enforce Compliance**: Validate actions against regulatory frameworks
32
+ - **Manage Autonomy**: Control the level of agent decision-making authority
33
+
34
+ ### Design Principles
35
+
36
+ 1. **Declarative**: Policies describe "what" not "how"
37
+ 2. **Composable**: Simple policies combine into complex rules
38
+ 3. **Type-Safe**: Static validation prevents runtime errors
39
+ 4. **Human-Readable**: Policies are understandable by non-programmers
40
+ 5. **Machine-Parseable**: Unambiguous formal grammar
41
+
42
+ ---
43
+
44
+ ## 2. Grammar Definition
45
+
46
+ ### 2.1 EBNF Grammar
47
+
48
+ ```ebnf
49
+ (* OSSA Policy DSL - EBNF Grammar v1.0 *)
50
+
51
+ (* Top-Level Structures *)
52
+ policy = "policy" identifier "{" policy_body "}" ;
53
+ policy_body = { policy_rule | escalation_rule } ;
54
+
55
+ (* Policy Rules *)
56
+ policy_rule = "rule" identifier "{"
57
+ condition_clause
58
+ action_clause
59
+ [ effect_clause ]
60
+ "}" ;
61
+
62
+ condition_clause = "when" condition ;
63
+ action_clause = "do" action ;
64
+ effect_clause = "then" effect ;
65
+
66
+ (* Conditions *)
67
+ condition = boolean_expr ;
68
+ boolean_expr = comparison_expr
69
+ | logical_expr
70
+ | "(" boolean_expr ")" ;
71
+
72
+ logical_expr = boolean_expr logical_op boolean_expr ;
73
+ logical_op = "and" | "or" | "not" ;
74
+
75
+ comparison_expr = value comparison_op value ;
76
+ comparison_op = "==" | "!=" | ">" | "<" | ">=" | "<="
77
+ | "contains" | "matches" | "in" | "startsWith" | "endsWith" ;
78
+
79
+ (* Values *)
80
+ value = literal
81
+ | variable
82
+ | function_call
83
+ | array_literal
84
+ | object_literal ;
85
+
86
+ literal = string_literal
87
+ | number_literal
88
+ | boolean_literal
89
+ | null_literal ;
90
+
91
+ string_literal = '"' { any_char - '"' } '"' ;
92
+ number_literal = [ "-" ] digit { digit } [ "." digit { digit } ] ;
93
+ boolean_literal = "true" | "false" ;
94
+ null_literal = "null" ;
95
+
96
+ variable = "$" identifier { "." identifier } ;
97
+ array_literal = "[" [ value { "," value } ] "]" ;
98
+ object_literal = "{" [ key_value { "," key_value } ] "}" ;
99
+ key_value = identifier ":" value ;
100
+
101
+ function_call = identifier "(" [ value { "," value } ] ")" ;
102
+
103
+ (* Actions *)
104
+ action = action_type action_params ;
105
+ action_type = "allow" | "deny" | "require_approval" | "log"
106
+ | "escalate" | "notify" | "execute" ;
107
+
108
+ action_params = "(" [ param { "," param } ] ")" ;
109
+ param = identifier "=" value ;
110
+
111
+ (* Effects *)
112
+ effect = "allow" | "deny" | "escalate" | "log" ;
113
+
114
+ (* Escalation Rules *)
115
+ escalation_rule = "escalate" identifier "{"
116
+ "when" condition
117
+ "to" escalation_target
118
+ [ "timeout" duration ]
119
+ [ "fallback" action ]
120
+ "}" ;
121
+
122
+ escalation_target = identifier | string_literal ;
123
+ duration = number_literal time_unit ;
124
+ time_unit = "s" | "m" | "h" | "d" ;
125
+
126
+ (* Identifiers *)
127
+ identifier = letter { letter | digit | "_" } ;
128
+ letter = "a" .. "z" | "A" .. "Z" ;
129
+ digit = "0" .. "9" ;
130
+
131
+ (* Comments *)
132
+ comment = "//" { any_char - newline } newline
133
+ | "/*" { any_char } "*/" ;
134
+ ```
135
+
136
+ ### 2.2 Abstract Syntax Tree (AST)
137
+
138
+ ```typescript
139
+ type PolicyAST = {
140
+ type: 'Policy';
141
+ name: string;
142
+ rules: PolicyRule[];
143
+ escalations: EscalationRule[];
144
+ };
145
+
146
+ type PolicyRule = {
147
+ type: 'Rule';
148
+ name: string;
149
+ condition: Condition;
150
+ action: Action;
151
+ effect?: Effect;
152
+ };
153
+
154
+ type Condition = BooleanExpr;
155
+
156
+ type BooleanExpr =
157
+ | ComparisonExpr
158
+ | LogicalExpr
159
+ | { type: 'Group'; expr: BooleanExpr };
160
+
161
+ type ComparisonExpr = {
162
+ type: 'Comparison';
163
+ left: Value;
164
+ operator: ComparisonOperator;
165
+ right: Value;
166
+ };
167
+
168
+ type LogicalExpr = {
169
+ type: 'Logical';
170
+ operator: LogicalOperator;
171
+ operands: BooleanExpr[];
172
+ };
173
+ ```
174
+
175
+ ---
176
+
177
+ ## 3. Type System
178
+
179
+ ### 3.1 Core Types
180
+
181
+ ```typescript
182
+ /**
183
+ * Policy condition that must be satisfied for action execution
184
+ */
185
+ interface PolicyCondition {
186
+ /** Condition type */
187
+ type: 'comparison' | 'logical' | 'function';
188
+
189
+ /** Left-hand side value (for comparison) */
190
+ left?: Value;
191
+
192
+ /** Operator */
193
+ operator: ComparisonOperator | LogicalOperator;
194
+
195
+ /** Right-hand side value (for comparison) */
196
+ right?: Value;
197
+
198
+ /** Sub-conditions (for logical operators) */
199
+ conditions?: PolicyCondition[];
200
+
201
+ /** Function name (for function conditions) */
202
+ function?: string;
203
+
204
+ /** Function arguments */
205
+ args?: Value[];
206
+ }
207
+
208
+ /**
209
+ * Action to perform when condition matches
210
+ */
211
+ interface PolicyAction {
212
+ /** Action type */
213
+ type: ActionType;
214
+
215
+ /** Target resource or capability */
216
+ target?: string;
217
+
218
+ /** Action parameters */
219
+ params?: Record<string, Value>;
220
+
221
+ /** Effect of the action */
222
+ effect: Effect;
223
+
224
+ /** Notification configuration */
225
+ notify?: NotificationConfig;
226
+
227
+ /** Audit log configuration */
228
+ audit?: AuditConfig;
229
+ }
230
+
231
+ /**
232
+ * Complete policy rule
233
+ */
234
+ interface PolicyRule {
235
+ /** Rule identifier */
236
+ id: string;
237
+
238
+ /** Human-readable description */
239
+ description?: string;
240
+
241
+ /** Condition that triggers this rule */
242
+ condition: PolicyCondition;
243
+
244
+ /** Action to perform */
245
+ action: PolicyAction;
246
+
247
+ /** Rule priority (higher = evaluated first) */
248
+ priority?: number;
249
+
250
+ /** Rule enabled state */
251
+ enabled?: boolean;
252
+
253
+ /** Rule metadata */
254
+ metadata?: Record<string, any>;
255
+ }
256
+
257
+ /**
258
+ * Escalation policy for human-in-the-loop workflows
259
+ */
260
+ interface EscalationPolicy {
261
+ /** Escalation identifier */
262
+ id: string;
263
+
264
+ /** Condition that triggers escalation */
265
+ condition: PolicyCondition;
266
+
267
+ /** Escalation target (user, group, role) */
268
+ target: EscalationTarget;
269
+
270
+ /** Timeout for human response */
271
+ timeout?: Duration;
272
+
273
+ /** Fallback action if timeout expires */
274
+ fallback?: PolicyAction;
275
+
276
+ /** Escalation priority */
277
+ priority?: 'low' | 'medium' | 'high' | 'critical';
278
+
279
+ /** Notification channels */
280
+ channels?: NotificationChannel[];
281
+ }
282
+ ```
283
+
284
+ ### 3.2 Value Types
285
+
286
+ ```typescript
287
+ type Value =
288
+ | string
289
+ | number
290
+ | boolean
291
+ | null
292
+ | Value[]
293
+ | Record<string, Value>
294
+ | Variable
295
+ | FunctionCall;
296
+
297
+ interface Variable {
298
+ type: 'variable';
299
+ path: string[]; // e.g., ['agent', 'cost', 'tokens']
300
+ }
301
+
302
+ interface FunctionCall {
303
+ type: 'function';
304
+ name: string;
305
+ args: Value[];
306
+ }
307
+ ```
308
+
309
+ ### 3.3 Operator Types
310
+
311
+ ```typescript
312
+ /**
313
+ * Comparison operators for condition evaluation
314
+ */
315
+ type ComparisonOperator =
316
+ | 'equals' // ==
317
+ | 'notEquals' // !=
318
+ | 'greaterThan' // >
319
+ | 'lessThan' // <
320
+ | 'greaterEqual' // >=
321
+ | 'lessEqual' // <=
322
+ | 'contains' // substring/array membership
323
+ | 'matches' // regex match
324
+ | 'in' // value in array/set
325
+ | 'startsWith' // string prefix
326
+ | 'endsWith'; // string suffix
327
+
328
+ /**
329
+ * Logical operators for combining conditions
330
+ */
331
+ type LogicalOperator =
332
+ | 'and' // &&
333
+ | 'or' // ||
334
+ | 'not'; // !
335
+
336
+ /**
337
+ * Action types
338
+ */
339
+ type ActionType =
340
+ | 'allow' // Permit action
341
+ | 'deny' // Block action
342
+ | 'require_approval' // Escalate to human
343
+ | 'log' // Audit log only
344
+ | 'escalate' // Trigger escalation policy
345
+ | 'notify' // Send notification
346
+ | 'execute'; // Execute custom function
347
+
348
+ /**
349
+ * Action effects
350
+ */
351
+ type Effect =
352
+ | 'allow' // Action is permitted
353
+ | 'deny' // Action is blocked
354
+ | 'escalate' // Escalate to human
355
+ | 'log'; // Log and continue
356
+ ```
357
+
358
+ ### 3.4 Duration Type
359
+
360
+ ```typescript
361
+ interface Duration {
362
+ value: number;
363
+ unit: 'seconds' | 'minutes' | 'hours' | 'days';
364
+ }
365
+
366
+ // Helper function
367
+ function parseDuration(str: string): Duration {
368
+ const match = str.match(/^(\d+)(s|m|h|d)$/);
369
+ if (!match) throw new Error('Invalid duration format');
370
+
371
+ const unitMap = { s: 'seconds', m: 'minutes', h: 'hours', d: 'days' };
372
+ return {
373
+ value: parseInt(match[1]),
374
+ unit: unitMap[match[2]]
375
+ };
376
+ }
377
+ ```
378
+
379
+ ---
380
+
381
+ ## 4. Operators
382
+
383
+ ### 4.1 Comparison Operators
384
+
385
+ | Operator | Symbol | Description | Example |
386
+ |----------|--------|-------------|---------|
387
+ | `equals` | `==` | Equality check | `$cost.tokens == 1000` |
388
+ | `notEquals` | `!=` | Inequality check | `$severity != "low"` |
389
+ | `greaterThan` | `>` | Greater than | `$confidence > 0.8` |
390
+ | `lessThan` | `<` | Less than | `$latency < 500` |
391
+ | `greaterEqual` | `>=` | Greater or equal | `$cvss_score >= 7.0` |
392
+ | `lessEqual` | `<=` | Less or equal | `$cost.daily <= 100.00` |
393
+ | `contains` | `contains` | Substring/array membership | `$message contains "error"` |
394
+ | `matches` | `matches` | Regex match | `$email matches "^[a-z]+@"` |
395
+ | `in` | `in` | Value in collection | `$action in ["delete", "drop"]` |
396
+ | `startsWith` | `startsWith` | String prefix | `$resource startsWith "prod-"` |
397
+ | `endsWith` | `endsWith` | String suffix | `$file endsWith ".sql"` |
398
+
399
+ ### 4.2 Logical Operators
400
+
401
+ | Operator | Symbol | Description | Example |
402
+ |----------|--------|-------------|---------|
403
+ | `and` | `and`, `&&` | Logical AND | `$cost > 10 and $priority == "high"` |
404
+ | `or` | `or`, `\|\|` | Logical OR | `$severity == "critical" or $cvss >= 9.0` |
405
+ | `not` | `not`, `!` | Logical NOT | `not ($action in $blocked_actions)` |
406
+
407
+ ### 4.3 Operator Precedence
408
+
409
+ From highest to lowest:
410
+
411
+ 1. Function calls: `func()`
412
+ 2. Grouping: `()`
413
+ 3. Negation: `not`, `!`
414
+ 4. Comparison: `==`, `!=`, `>`, `<`, `>=`, `<=`, `contains`, `matches`, `in`, `startsWith`, `endsWith`
415
+ 5. Logical AND: `and`, `&&`
416
+ 6. Logical OR: `or`, `||`
417
+
418
+ ---
419
+
420
+ ## 5. Policy Rules
421
+
422
+ ### 5.1 Rule Structure
423
+
424
+ ```yaml
425
+ # YAML representation (equivalent to DSL)
426
+ rule: cost_limit_exceeded
427
+ description: Block actions that exceed daily cost limit
428
+ condition:
429
+ type: comparison
430
+ left: $cost.daily
431
+ operator: greaterThan
432
+ right: $constraints.cost.maxCostPerDay
433
+ action:
434
+ type: deny
435
+ effect: deny
436
+ notify:
437
+ channels: [email, slack]
438
+ message: "Daily cost limit exceeded: ${cost.daily} > ${constraints.cost.maxCostPerDay}"
439
+ priority: 100
440
+ ```
441
+
442
+ ### 5.2 Rule Evaluation
443
+
444
+ Rules are evaluated in **priority order** (highest first). The first matching rule determines the action.
445
+
446
+ **Evaluation Algorithm:**
447
+
448
+ ```typescript
449
+ function evaluatePolicy(rules: PolicyRule[], context: Context): PolicyAction | null {
450
+ // Sort by priority (descending)
451
+ const sorted = rules
452
+ .filter(r => r.enabled !== false)
453
+ .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
454
+
455
+ for (const rule of sorted) {
456
+ if (evaluateCondition(rule.condition, context)) {
457
+ return rule.action;
458
+ }
459
+ }
460
+
461
+ return null; // No matching rule (default allow)
462
+ }
463
+ ```
464
+
465
+ ### 5.3 Context Variables
466
+
467
+ Policies have access to runtime context via `$` variables:
468
+
469
+ ```typescript
470
+ interface PolicyContext {
471
+ // Agent metadata
472
+ agent: {
473
+ name: string;
474
+ version: string;
475
+ capabilities: string[];
476
+ };
477
+
478
+ // Current action
479
+ action: {
480
+ type: string;
481
+ target: string;
482
+ params: Record<string, any>;
483
+ };
484
+
485
+ // Cost metrics
486
+ cost: {
487
+ tokens: number;
488
+ daily: number;
489
+ monthly: number;
490
+ currency: string;
491
+ };
492
+
493
+ // Performance metrics
494
+ performance: {
495
+ latency: number;
496
+ throughput: number;
497
+ };
498
+
499
+ // Security context
500
+ security: {
501
+ user: string;
502
+ role: string;
503
+ permissions: string[];
504
+ };
505
+
506
+ // Compliance context
507
+ compliance: {
508
+ frameworks: string[];
509
+ policies: string[];
510
+ };
511
+
512
+ // Time context
513
+ time: {
514
+ timestamp: number;
515
+ hour: number;
516
+ day: string;
517
+ timezone: string;
518
+ };
519
+ }
520
+ ```
521
+
522
+ ---
523
+
524
+ ## 6. Escalation Policies
525
+
526
+ ### 6.1 Escalation Structure
527
+
528
+ ```typescript
529
+ interface EscalationTarget {
530
+ type: 'user' | 'group' | 'role' | 'webhook';
531
+ identifier: string;
532
+ metadata?: Record<string, any>;
533
+ }
534
+
535
+ interface NotificationChannel {
536
+ type: 'email' | 'slack' | 'pagerduty' | 'webhook' | 'sms';
537
+ config: Record<string, any>;
538
+ }
539
+ ```
540
+
541
+ ### 6.2 Escalation Flow
542
+
543
+ ```
544
+ ┌─────────────────────┐
545
+ │ Action Requested │
546
+ └──────────┬──────────┘
547
+
548
+
549
+ ┌─────────────────────┐
550
+ │ Evaluate Policies │
551
+ └──────────┬──────────┘
552
+
553
+
554
+ ┌─────┴─────┐
555
+ │ Match? │
556
+ └─────┬─────┘
557
+ Yes │ No (default allow)
558
+
559
+
560
+ ┌──────────────┐
561
+ │ Effect? │
562
+ └──────┬───────┘
563
+
564
+ ┌──────┼──────┐
565
+ │ │ │
566
+ ▼ ▼ ▼
567
+ ALLOW DENY ESCALATE
568
+ │ │ │
569
+ │ │ ▼
570
+ │ │ ┌──────────────────┐
571
+ │ │ │ Notify Human │
572
+ │ │ └────────┬─────────┘
573
+ │ │ │
574
+ │ │ ▼
575
+ │ │ ┌──────────────────┐
576
+ │ │ │ Wait for Response│
577
+ │ │ └────────┬─────────┘
578
+ │ │ │
579
+ │ │ ┌────┴────┐
580
+ │ │ │ Timeout?│
581
+ │ │ └────┬────┘
582
+ │ │ No │ Yes
583
+ │ │ │ │
584
+ │ │ │ ▼
585
+ │ │ │ Fallback Action
586
+ │ │ │
587
+ │ │ ▼
588
+ │ │ ┌──────────────────┐
589
+ │ │ │ Human Approval? │
590
+ │ │ └────────┬─────────┘
591
+ │ │ Yes │ No
592
+ │ │ │ │
593
+ ▼ ▼ ▼ ▼
594
+ ┌────────────────────────────┐
595
+ │ Execute or Block Action │
596
+ └────────────────────────────┘
597
+ ```
598
+
599
+ ### 6.3 Escalation Examples
600
+
601
+ ```yaml
602
+ # High-severity security finding
603
+ escalation: critical_vulnerability
604
+ condition:
605
+ type: logical
606
+ operator: and
607
+ conditions:
608
+ - type: comparison
609
+ left: $security.cvss_score
610
+ operator: greaterEqual
611
+ right: 9.0
612
+ - type: comparison
613
+ left: $security.exploitable
614
+ operator: equals
615
+ right: true
616
+ to:
617
+ type: group
618
+ identifier: security-team
619
+ timeout:
620
+ value: 15
621
+ unit: minutes
622
+ priority: critical
623
+ channels:
624
+ - type: pagerduty
625
+ config:
626
+ service_id: P1234567
627
+ - type: slack
628
+ config:
629
+ channel: "#security-alerts"
630
+ fallback:
631
+ type: deny
632
+ effect: deny
633
+ notify:
634
+ message: "Automatic deny due to escalation timeout"
635
+ ```
636
+
637
+ ---
638
+
639
+ ## 7. Examples
640
+
641
+ ### 7.1 Cost Control Policy
642
+
643
+ ```yaml
644
+ policy: cost_control
645
+ rules:
646
+ - rule: daily_limit
647
+ description: Enforce daily cost limit
648
+ condition:
649
+ type: comparison
650
+ left: $cost.daily
651
+ operator: greaterThan
652
+ right: $constraints.cost.maxCostPerDay
653
+ action:
654
+ type: deny
655
+ effect: deny
656
+ notify:
657
+ channels: [email]
658
+ message: "Daily cost limit exceeded"
659
+ priority: 100
660
+
661
+ - rule: high_cost_warning
662
+ description: Warn on high single-request cost
663
+ condition:
664
+ type: comparison
665
+ left: $cost.tokens
666
+ operator: greaterThan
667
+ right: 10000
668
+ action:
669
+ type: log
670
+ effect: allow
671
+ audit:
672
+ level: warning
673
+ message: "High token usage: ${cost.tokens}"
674
+ priority: 50
675
+ ```
676
+
677
+ ### 7.2 Security Policy
678
+
679
+ ```yaml
680
+ policy: security_controls
681
+ rules:
682
+ - rule: block_destructive_actions
683
+ description: Block dangerous Kubernetes actions
684
+ condition:
685
+ type: logical
686
+ operator: and
687
+ conditions:
688
+ - type: comparison
689
+ left: $action.type
690
+ operator: in
691
+ right: [delete, drop, terminate]
692
+ - type: comparison
693
+ left: $action.target
694
+ operator: startsWith
695
+ right: "prod-"
696
+ action:
697
+ type: deny
698
+ effect: deny
699
+ notify:
700
+ channels: [slack]
701
+ message: "Blocked destructive action on production: ${action.type} ${action.target}"
702
+ priority: 200
703
+
704
+ escalations:
705
+ - escalation: critical_vulnerability
706
+ condition:
707
+ type: comparison
708
+ left: $security.cvss_score
709
+ operator: greaterEqual
710
+ right: 9.0
711
+ to:
712
+ type: group
713
+ identifier: security-team
714
+ timeout:
715
+ value: 15
716
+ unit: minutes
717
+ priority: critical
718
+ channels:
719
+ - type: pagerduty
720
+ config:
721
+ service_id: P1234567
722
+ fallback:
723
+ type: deny
724
+ effect: deny
725
+ ```
726
+
727
+ ### 7.3 Compliance Policy
728
+
729
+ ```yaml
730
+ policy: gdpr_compliance
731
+ rules:
732
+ - rule: pii_access_logging
733
+ description: Log all PII access for GDPR compliance
734
+ condition:
735
+ type: logical
736
+ operator: and
737
+ conditions:
738
+ - type: comparison
739
+ left: $action.type
740
+ operator: in
741
+ right: [read, query, export]
742
+ - type: comparison
743
+ left: $action.target
744
+ operator: contains
745
+ right: "pii"
746
+ action:
747
+ type: log
748
+ effect: allow
749
+ audit:
750
+ level: info
751
+ compliance: [GDPR]
752
+ message: "PII access by ${security.user}: ${action.type} on ${action.target}"
753
+ priority: 150
754
+
755
+ - rule: pii_export_approval
756
+ description: Require approval for PII exports
757
+ condition:
758
+ type: logical
759
+ operator: and
760
+ conditions:
761
+ - type: comparison
762
+ left: $action.type
763
+ operator: equals
764
+ right: "export"
765
+ - type: comparison
766
+ left: $action.target
767
+ operator: contains
768
+ right: "pii"
769
+ action:
770
+ type: require_approval
771
+ effect: escalate
772
+ notify:
773
+ channels: [email]
774
+ message: "PII export requires approval: ${action.target}"
775
+ priority: 200
776
+ ```
777
+
778
+ ### 7.4 Time-Based Policy
779
+
780
+ ```yaml
781
+ policy: business_hours
782
+ rules:
783
+ - rule: off_hours_escalation
784
+ description: Require approval for high-risk actions outside business hours
785
+ condition:
786
+ type: logical
787
+ operator: and
788
+ conditions:
789
+ - type: comparison
790
+ left: $action.risk_level
791
+ operator: equals
792
+ right: "high"
793
+ - type: logical
794
+ operator: or
795
+ conditions:
796
+ - type: comparison
797
+ left: $time.hour
798
+ operator: lessThan
799
+ right: 9
800
+ - type: comparison
801
+ left: $time.hour
802
+ operator: greaterThan
803
+ right: 17
804
+ - type: comparison
805
+ left: $time.day
806
+ operator: in
807
+ right: ["Saturday", "Sunday"]
808
+ action:
809
+ type: require_approval
810
+ effect: escalate
811
+ notify:
812
+ channels: [pagerduty]
813
+ message: "High-risk action outside business hours: ${action.type}"
814
+ priority: 150
815
+ ```
816
+
817
+ ---
818
+
819
+ ## 8. Error Handling
820
+
821
+ ### 8.1 Error Types
822
+
823
+ ```typescript
824
+ type PolicyError =
825
+ | SyntaxError // Invalid DSL syntax
826
+ | ValidationError // Invalid condition/action
827
+ | EvaluationError // Runtime evaluation failure
828
+ | EscalationError // Escalation timeout/failure
829
+ | ContextError; // Missing context variable
830
+
831
+ interface PolicyErrorDetails {
832
+ type: PolicyError;
833
+ message: string;
834
+ rule?: string;
835
+ location?: {
836
+ line: number;
837
+ column: number;
838
+ };
839
+ context?: Record<string, any>;
840
+ }
841
+ ```
842
+
843
+ ### 8.2 Error Handling Strategies
844
+
845
+ | Error Type | Strategy | Fallback |
846
+ |------------|----------|----------|
847
+ | `SyntaxError` | Reject policy at load time | N/A |
848
+ | `ValidationError` | Reject policy at load time | N/A |
849
+ | `EvaluationError` | Log error, default deny | Deny action |
850
+ | `EscalationError` | Execute fallback action | Deny action |
851
+ | `ContextError` | Log warning, skip rule | Continue to next rule |
852
+
853
+ ### 8.3 Safe Defaults
854
+
855
+ When policy evaluation fails:
856
+
857
+ 1. **Default Deny**: If no explicit `allow` action, default is `deny`
858
+ 2. **Fail Closed**: Evaluation errors result in `deny`
859
+ 3. **Audit All**: All decisions (success/failure) are logged
860
+ 4. **Escalate on Uncertainty**: Ambiguous cases escalate to human
861
+
862
+ ---
863
+
864
+ ## 9. Security Considerations
865
+
866
+ ### 9.1 Policy Injection Prevention
867
+
868
+ - **Validate all policy sources**: Only load policies from trusted sources
869
+ - **Sanitize context variables**: Escape special characters
870
+ - **Limit expression complexity**: Prevent DoS via complex regex/expressions
871
+
872
+ ### 9.2 Privilege Escalation Prevention
873
+
874
+ - **Enforce least privilege**: Policies cannot grant more access than agent has
875
+ - **Validate escalation targets**: Ensure targets exist and are authorized
876
+ - **Audit all escalations**: Log who approved what and when
877
+
878
+ ### 9.3 Information Disclosure Prevention
879
+
880
+ - **Redact sensitive data in logs**: Mask PII, credentials, secrets
881
+ - **Limit error details**: Don't leak internal state in error messages
882
+ - **Validate notification channels**: Prevent exfiltration via malicious webhooks
883
+
884
+ ### 9.4 Compliance Considerations
885
+
886
+ - **GDPR**: Log all PII access with justification
887
+ - **SOC 2**: Require approval for sensitive actions
888
+ - **HIPAA**: Encrypt all PHI access logs
889
+ - **PCI DSS**: Separate production/non-production policies
890
+
891
+ ---
892
+
893
+ ## Appendix A: TypeScript Type Definitions
894
+
895
+ See `/src/types/policy.ts` for full TypeScript definitions.
896
+
897
+ ---
898
+
899
+ ## Appendix B: JSON Schema
900
+
901
+ See `/schemas/policy.schema.json` for JSON Schema validation.
902
+
903
+ ---
904
+
905
+ ## Appendix C: Change Log
906
+
907
+ | Version | Date | Changes |
908
+ |---------|------|---------|
909
+ | 1.0.0 | 2025-12-03 | Initial specification |
910
+
911
+ ---
912
+
913
+ ## Appendix D: References
914
+
915
+ - [OSSA v0.2.3 Schema](../../spec/v0.2.3/ossa-0.2.3.schema.json)
916
+ - [EBNF Notation (ISO 14977)](https://www.iso.org/standard/26153.html)
917
+ - [JSON Schema Draft 07](https://json-schema.org/draft-07/schema)
918
+ - [OpenPolicy Agent (OPA)](https://www.openpolicyagent.org/)
919
+ - [Cedar Policy Language](https://www.cedarpolicy.com/)
920
+
921
+ ---
922
+
923
+ **License:** MIT
924
+ **Maintainer:** OSSA Community
925
+ **Contact:** https://openstandardagents.org