@bluefly/openstandardagents 0.2.7 → 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.
- package/.devfile.yaml +1 -1
- package/.env.example +1 -1
- package/.github/AGENTS.md +245 -0
- package/.github/agents/github-issue-triage.ossa.yaml +99 -0
- package/.github/agents/github-pr-triage.ossa.yaml +137 -0
- package/.github/workflows/issue-sync-to-gitlab.yml +138 -0
- package/.github/workflows/pr-triage-to-gitlab.yml +164 -0
- package/.version.json +2 -2
- package/.wiki-config.json +24 -0
- package/CHANGELOG.md +44 -18
- package/CODEOWNERS +75 -0
- package/CONTRIBUTING.md +103 -4
- package/README.md +178 -243
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/repositories/schema.repository.d.ts +6 -1
- package/dist/repositories/schema.repository.d.ts.map +1 -1
- package/dist/repositories/schema.repository.js +49 -27
- package/dist/repositories/schema.repository.js.map +1 -1
- package/dist/services/migration.service.d.ts +4 -3
- package/dist/services/migration.service.d.ts.map +1 -1
- package/dist/services/migration.service.js +11 -10
- package/dist/services/migration.service.js.map +1 -1
- package/dist/services/release-automation/release.service.js +1 -1
- package/dist/services/release-automation/release.service.js.map +1 -1
- package/dist/services/release-automation/schemas/release.schema.js +1 -1
- package/dist/services/release-automation/webhook.service.js +3 -3
- package/dist/services/release-automation/webhook.service.js.map +1 -1
- package/dist/services/runtime/claude/claude-adapter.d.ts +1 -1
- package/dist/services/runtime/claude/claude-adapter.d.ts.map +1 -1
- package/dist/services/runtime/claude/claude-adapter.js +2 -2
- package/dist/services/runtime/claude/claude-adapter.js.map +1 -1
- package/dist/spec/v0.2.8/CHANGELOG.md +401 -0
- package/dist/spec/v0.2.8/README.md +72 -0
- package/dist/spec/v0.2.8/migrations/v0.2.3-to-v0.2.4.md +599 -0
- package/dist/spec/v0.2.8/migrations/v0.2.5-RC-to-v0.2.6.md +65 -0
- package/dist/spec/v0.2.8/migrations/v0.2.6-to-v0.2.8.md +81 -0
- package/{spec/v0.2.6-dev/ossa-0.2.5.schema.json → dist/spec/v0.2.8/ossa-0.2.8.schema.json} +1509 -52
- package/dist/spec/v0.2.8/ossa-0.2.8.yaml +581 -0
- package/dist/spec/v0.2.9/a2a-protocol.md +1337 -0
- package/dist/spec/v0.2.9/agent.md +1946 -0
- package/dist/spec/v0.2.9/capabilities/index.yaml +25 -0
- package/dist/spec/v0.2.9/capabilities/memory.yaml +251 -0
- package/dist/spec/v0.2.9/capability-schema.md +576 -0
- package/dist/spec/v0.2.9/compliance-profiles.md +533 -0
- package/dist/spec/v0.2.9/conformance-testing.md +1527 -0
- package/dist/spec/v0.2.9/gitlab-duo-integration.md +621 -0
- package/dist/spec/v0.2.9/ossa-0.2.9.schema.json +3699 -0
- package/dist/spec/v0.2.9/runtime-semantics.md +464 -0
- package/dist/spec/v0.2.9/security-model.md +1245 -0
- package/dist/spec/v0.2.9/semantic-conventions.md +347 -0
- package/dist/spec/v0.2.9/types.ts +522 -0
- package/dist/types/index.d.ts +3 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/policy.d.ts +377 -0
- package/dist/types/policy.d.ts.map +1 -0
- package/dist/types/policy.js +84 -0
- package/dist/types/policy.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/version.d.ts +68 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +156 -0
- package/dist/utils/version.js.map +1 -0
- package/docs/specs/policy-dsl.md +925 -0
- package/eslint-report.json +1 -0
- package/examples/adk-integration/code-review-workflow.yml +1 -1
- package/examples/adk-integration/customer-support.yml +1 -1
- package/examples/adk-integration/data-pipeline.yml +1 -1
- package/examples/advanced/reasoning-agent.yaml +136 -0
- package/examples/advanced/workflows/hybrid-model-strategy.yaml +1 -1
- package/examples/agent-manifests/critics/critic-agent.yaml +1 -1
- package/examples/agent-manifests/governors/governor-agent.yaml +1 -1
- package/examples/agent-manifests/integrators/integrator-agent.yaml +1 -1
- package/examples/agent-manifests/judges/judge-agent.yaml +1 -1
- package/examples/agent-manifests/monitors/monitor-agent.yaml +1 -1
- package/examples/agent-manifests/orchestrators/orchestrator-agent.yaml +1 -1
- package/examples/agent-manifests/sample-compliant-agent.yaml +1 -1
- package/examples/agent-manifests/workers/worker-agent.yaml +1 -1
- package/examples/agents-md/code-agent.ossa.json +100 -0
- package/examples/agents-md/monorepo-agent.ossa.yaml +180 -0
- package/examples/anthropic/claude-assistant.ossa.json +1 -1
- package/examples/autogen/multi-agent.ossa.json +1 -1
- package/examples/claude-code/code-reviewer.ossa.yaml +78 -0
- package/examples/claude-code/ossa-validator.ossa.yaml +80 -0
- package/examples/common_npm/agent-router.ossa.yaml +1 -0
- package/examples/common_npm/agent-router.v0.2.2.ossa.yaml +1 -1
- package/examples/crewai/research-team.ossa.json +1 -1
- package/examples/cursor/code-review-agent.ossa.json +1 -1
- package/examples/drupal/gitlab-ml-recommender.ossa.yaml +1 -0
- package/examples/drupal/gitlab-ml-recommender.v0.2.2.ossa.yaml +1 -1
- package/examples/extensions/agents-md-v1.yml +175 -0
- package/examples/extensions/drupal-v1.yml +1 -1
- package/examples/extensions/kagent-v1.yml +1 -1
- package/examples/getting-started/hello-world-complete.ossa.yaml +1 -1
- package/examples/integration-patterns/agent-to-agent-orchestration.ossa.yaml +4 -4
- package/examples/kagent/compliance-validator.ossa.yaml +1 -1
- package/examples/kagent/cost-optimizer.ossa.yaml +1 -1
- package/examples/kagent/documentation-agent.ossa.yaml +1 -1
- package/examples/kagent/k8s-troubleshooter-v1.ossa.yaml +1 -0
- package/examples/kagent/k8s-troubleshooter-v1.v0.2.2.ossa.yaml +1 -1
- package/examples/kagent/k8s-troubleshooter.ossa.yaml +1 -1
- package/examples/kagent/security-scanner.ossa.yaml +1 -1
- package/examples/langchain/chain-agent.ossa.json +1 -1
- package/examples/langflow/workflow-agent.ossa.json +1 -1
- package/examples/langgraph/state-machine-agent.ossa.json +1 -1
- package/examples/llamaindex/rag-agent.ossa.json +1 -1
- package/examples/migration-guides/from-langchain-to-ossa.yaml +4 -4
- package/examples/multi-agent/README.md +74 -0
- package/examples/multi-agent/conditional-router.ossa.yaml +42 -0
- package/examples/multi-agent/parallel-execution.ossa.yaml +54 -0
- package/examples/multi-agent/sequential-pipeline.ossa.yaml +45 -0
- package/examples/openai/basic-agent.ossa.yaml +1 -1
- package/examples/openai/multi-tool-agent.ossa.json +1 -1
- package/examples/openai/swarm-agent.ossa.json +1 -1
- package/examples/production/document-analyzer-openai.yml +1 -1
- package/examples/quickstart/support-agent.ossa.yaml +1 -1
- package/examples/spec-examples/audit-agent.yml +1 -1
- package/examples/spec-examples/chat-agent.yml +1 -1
- package/examples/spec-examples/compliance-agent.yml +1 -1
- package/examples/spec-examples/monitoring-agent.yml +1 -1
- package/examples/spec-examples/workflow-agent.yml +1 -1
- package/examples/templates/ossa-compliance.yaml +1 -1
- package/examples/vercel/edge-agent.ossa.json +1 -1
- package/gl-code-quality-report.json +62 -0
- package/llms-ctx-full.txt +39 -0
- package/llms-ctx.txt +39 -0
- package/llms.txt +47 -0
- package/package.json +6 -3
- package/scripts/README.md +25 -0
- package/scripts/compliance-audit.ts +796 -0
- package/scripts/eslint-to-codequality.cjs +34 -0
- package/scripts/generate-agents-catalog.ts +2 -1
- package/scripts/generate-api-docs.ts +2 -1
- package/scripts/generate-examples-docs.ts +2 -1
- package/scripts/generate-llms-ctx.sh +17 -0
- package/scripts/generate-schema-docs.ts +31 -10
- package/scripts/sync-version.js +4 -12
- package/scripts/validate-schema.ts +2 -1
- package/spec/v0.2.8/CHANGELOG.md +401 -0
- package/spec/v0.2.8/README.md +72 -0
- package/spec/v0.2.8/migrations/v0.2.3-to-v0.2.4.md +599 -0
- package/spec/v0.2.8/migrations/v0.2.5-RC-to-v0.2.6.md +65 -0
- package/spec/v0.2.8/migrations/v0.2.6-to-v0.2.8.md +81 -0
- package/spec/{v0.2.6-dev/ossa-0.2.6-dev.schema.json → v0.2.8/ossa-0.2.8.schema.json} +1509 -52
- package/spec/v0.2.8/ossa-0.2.8.yaml +581 -0
- package/spec/v0.2.9/a2a-protocol.md +1337 -0
- package/spec/v0.2.9/agent.md +1946 -0
- package/spec/v0.2.9/capabilities/index.yaml +25 -0
- package/spec/v0.2.9/capabilities/memory.yaml +251 -0
- package/spec/v0.2.9/capability-schema.md +576 -0
- package/spec/v0.2.9/compliance-profiles.md +533 -0
- package/spec/v0.2.9/conformance-testing.md +1527 -0
- package/spec/v0.2.9/gitlab-duo-integration.md +621 -0
- package/spec/v0.2.9/ossa-0.2.9.schema.json +3699 -0
- package/spec/v0.2.9/runtime-semantics.md +464 -0
- package/spec/v0.2.9/security-model.md +1245 -0
- package/spec/v0.2.9/semantic-conventions.md +347 -0
- package/spec/v0.2.9/types.ts +522 -0
- package/test-results/junit.xml +337 -0
- package/.github/workflows/pr-comment.yml +0 -33
- package/bin/validate-ossa-0.2.5-RC.ts +0 -244
- package/dist/spec/v0.2.6-dev/ossa-0.2.5.schema.json +0 -1696
- package/dist/spec/v0.2.6-dev/ossa-0.2.6-dev.schema.json +0 -1696
- package/scripts/lib/exec.ts +0 -37
- package/scripts/lib/file-ops.ts +0 -58
- package/scripts/lib/version.ts +0 -83
- package/website/.lighthouserc.ts +0 -24
- package/website/.prettierrc +0 -10
- package/website/DESIGN_SYSTEM_IMPLEMENTATION.md +0 -445
- package/website/Dockerfile +0 -30
- package/website/app/about/page.tsx +0 -304
- package/website/app/blog/[slug]/page.tsx +0 -208
- package/website/app/blog/page.tsx +0 -249
- package/website/app/design-guide/page.tsx +0 -511
- package/website/app/docs/[[...slug]]/page.tsx +0 -847
- package/website/app/docs/core-concepts/project-structure/page.tsx +0 -349
- package/website/app/ecosystem/page.tsx +0 -410
- package/website/app/examples/page.tsx +0 -133
- package/website/app/globals.scss +0 -370
- package/website/app/layout.tsx +0 -106
- package/website/app/license/page.tsx +0 -183
- package/website/app/not-found.tsx +0 -18
- package/website/app/page.tsx +0 -686
- package/website/app/page.tsx.bak +0 -679
- package/website/app/page.tsx.bak2 +0 -649
- package/website/app/playground/page.tsx +0 -487
- package/website/app/robots.ts +0 -19
- package/website/app/rss.xml/route.ts +0 -74
- package/website/app/schema/page.tsx +0 -1001
- package/website/app/sitemap.ts +0 -56
- package/website/app/specification/page.tsx +0 -287
- package/website/components/InstallCommand.tsx +0 -96
- package/website/components/Logo.tsx +0 -97
- package/website/components/StructuredData.tsx +0 -65
- package/website/components/docs/DocsSearch.tsx +0 -104
- package/website/components/docs/DocsSidebar.tsx +0 -155
- package/website/components/docs/MarkdownContent.tsx +0 -401
- package/website/components/docs/VersionSelector.tsx +0 -105
- package/website/components/examples/ExamplesViewer.tsx +0 -293
- package/website/components/layout/Footer.tsx +0 -116
- package/website/components/layout/Header.tsx +0 -172
- package/website/components/schema/SchemaComponentsAccordion.tsx +0 -84
- package/website/components/schema/SchemaExplorer.tsx +0 -213
- package/website/components/ui/Badge.tsx +0 -82
- package/website/components/ui/Button.tsx +0 -116
- package/website/components/ui/Card.tsx +0 -167
- package/website/components/ui/Checkbox.tsx +0 -141
- package/website/components/ui/Input.tsx +0 -169
- package/website/components/ui/Radio.tsx +0 -141
- package/website/components/ui/Select.tsx +0 -182
- package/website/components/ui/Tag.tsx +0 -158
- package/website/components/ui/Textarea.tsx +0 -195
- package/website/components/ui/index.ts +0 -11
- package/website/content/blog/OpenAPI-AI-Agents-Standard.md +0 -285
- package/website/content/blog/Why-Formal-Standards-Matter-Now.md +0 -198
- package/website/content/blog/gitlab-kubernetes-agent-ecosystem.md +0 -286
- package/website/content/blog/introducing-ossa-framework.md +0 -328
- package/website/content/blog/ossa-production-results.md +0 -279
- package/website/content/blog/welcome-to-ossa.md +0 -43
- package/website/content/blog/why-ai-agents-need-open-standard.md +0 -98
- package/website/content/docs/00-home.md +0 -153
- package/website/content/docs/adapters/openai-adapter.md +0 -693
- package/website/content/docs/agents/catalog.md +0 -28
- package/website/content/docs/aiflow-framework-integration-with-ossa.md +0 -107
- package/website/content/docs/api-reference/index.md +0 -38
- package/website/content/docs/api-reference/ossa-core-api.md +0 -634
- package/website/content/docs/api-reference/ossa-registry-api.md +0 -515
- package/website/content/docs/api-reference/unified-agent-gateway.md +0 -599
- package/website/content/docs/architecture/execution-flow.md +0 -335
- package/website/content/docs/architecture/multi-agent-systems.md +0 -737
- package/website/content/docs/architecture/overview.md +0 -121
- package/website/content/docs/architecture/stack-integration.md +0 -461
- package/website/content/docs/changelog.md +0 -246
- package/website/content/docs/cli-reference/index.md +0 -111
- package/website/content/docs/cli-reference/ossa-agents.md +0 -70
- package/website/content/docs/cli-reference/ossa-export.md +0 -56
- package/website/content/docs/cli-reference/ossa-generate.md +0 -66
- package/website/content/docs/cli-reference/ossa-gitlab-agent.md +0 -57
- package/website/content/docs/cli-reference/ossa-import.md +0 -56
- package/website/content/docs/cli-reference/ossa-init.md +0 -57
- package/website/content/docs/cli-reference/ossa-migrate.md +0 -62
- package/website/content/docs/cli-reference/ossa-run.md +0 -66
- package/website/content/docs/cli-reference/ossa-schema.md +0 -57
- package/website/content/docs/cli-reference/ossa-setup.md +0 -57
- package/website/content/docs/cli-reference/ossa-validate.md +0 -66
- package/website/content/docs/configuration/index.md +0 -97
- package/website/content/docs/contributing.md +0 -599
- package/website/content/docs/deployment/github-mirroring.md +0 -924
- package/website/content/docs/documentation.md +0 -100
- package/website/content/docs/ecosystem/framework-support.md +0 -1361
- package/website/content/docs/ecosystem/overview.md +0 -366
- package/website/content/docs/errors/index.md +0 -10
- package/website/content/docs/examples/aiflow-framework-integration-with-ossa.md +0 -107
- package/website/content/docs/examples/catalog.md +0 -300
- package/website/content/docs/for-audiences/students-researchers.md +0 -122
- package/website/content/docs/getting-started/index.md +0 -92
- package/website/content/docs/getting-started/installation.md +0 -155
- package/website/content/docs/getting-started/running-agents.md +0 -309
- package/website/content/docs/getting-started.md +0 -91
- package/website/content/docs/integrations/aiflow.md +0 -104
- package/website/content/docs/integrations/drupal.md +0 -105
- package/website/content/docs/migration-guides/agent-schema-comparison.md +0 -232
- package/website/content/docs/migration-guides/anthropic-mcp-to-ossa.md +0 -1750
- package/website/content/docs/migration-guides/crewai-to-ossa.md +0 -274
- package/website/content/docs/migration-guides/drupal-eca-to-ossa.md +0 -2017
- package/website/content/docs/migration-guides/general-agent-schema.yml +0 -247
- package/website/content/docs/migration-guides/index.md +0 -133
- package/website/content/docs/migration-guides/langchain-to-ossa.md +0 -1714
- package/website/content/docs/migration-guides/langflow-to-ossa.md +0 -2075
- package/website/content/docs/migration-guides/migration-manifest.json +0 -64
- package/website/content/docs/migration-guides/openai-to-ossa.md +0 -1202
- package/website/content/docs/openapi-extensions/examples.md +0 -550
- package/website/content/docs/openapi-extensions/index.md +0 -551
- package/website/content/docs/openapi-extensions/operation-extensions.md +0 -457
- package/website/content/docs/openapi-extensions/root-extensions.md +0 -410
- package/website/content/docs/ossa-compliant-badge.md +0 -251
- package/website/content/docs/pre-release/index.md +0 -175
- package/website/content/docs/quick-reference.md +0 -17
- package/website/content/docs/readme.md +0 -35
- package/website/content/docs/releases/v0.2.6.md +0 -99
- package/website/content/docs/schema-reference/agent-capabilities.md +0 -50
- package/website/content/docs/schema-reference/agent-id.md +0 -52
- package/website/content/docs/schema-reference/agent-name.md +0 -50
- package/website/content/docs/schema-reference/agent-role.md +0 -54
- package/website/content/docs/schema-reference/agent-spec.md +0 -406
- package/website/content/docs/schema-reference/agent-version.md +0 -50
- package/website/content/docs/schema-reference/autonomy.md +0 -568
- package/website/content/docs/schema-reference/constraints.md +0 -543
- package/website/content/docs/schema-reference/index.md +0 -45
- package/website/content/docs/schema-reference/llm-config.md +0 -445
- package/website/content/docs/schema-reference/observability.md +0 -654
- package/website/content/docs/schema-reference/ossa-manifest.md +0 -309
- package/website/content/docs/schema-reference/taxonomy.md +0 -509
- package/website/content/docs/schema-reference/tools.md +0 -628
- package/website/content/docs/templates/blog-post.md +0 -43
- package/website/content/docs/types-reference/index.md +0 -105
- package/website/content/docs/use-cases/00-index.md +0 -395
- package/website/content/docs/use-cases/cicd-code-review.md +0 -1236
- package/website/content/docs/use-cases/customer-support.md +0 -1234
- package/website/content/docs/use-cases/enterprise-compliance.md +0 -1208
- package/website/content/docs/use-cases/research-multi-agent.md +0 -1161
- package/website/content/docs/versioning.md +0 -288
- package/website/dev.sh +0 -53
- package/website/docker-compose.dev.yml +0 -36
- package/website/lib/version.ts +0 -35
- package/website/lib/versions.json +0 -103
- package/website/next.config.ts +0 -18
- package/website/nginx.conf +0 -32
- package/website/package-lock.json +0 -9679
- package/website/package.json +0 -59
- package/website/postcss.config.mjs +0 -9
- package/website/scripts/fetch-versions.js +0 -166
- package/website/scripts/generate-examples-index.js +0 -163
- package/website/scripts/merge-docs-to-wiki.ts +0 -207
- package/website/scripts/sync-version.js +0 -72
- package/website/scripts/sync-wiki.ts +0 -322
- package/website/scripts/upload-wiki.ts +0 -199
- package/website/styles/_spacing.scss +0 -453
- package/website/styles/_tokens.scss +0 -245
- package/website/styles/_typography.scss +0 -361
- package/website/styles/_variables.scss +0 -287
- package/website/tailwind.config.ts +0 -170
|
@@ -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
|