311 lines
7.4 KiB
Markdown
311 lines
7.4 KiB
Markdown
---
|
|
name: policy.enforce
|
|
description: Enforces policy rules for skill and agent manifests
|
|
---
|
|
|
|
# policy.enforce
|
|
|
|
Enforces policy rules for skill and agent manifests including naming conventions, semantic versioning, permissions validation, and status lifecycle checks.
|
|
|
|
## Overview
|
|
|
|
The `policy.enforce` skill validates skill and agent manifests against Betty Framework policy rules to ensure consistency and compliance across the framework. It supports both single-file validation and batch mode for scanning all manifests.
|
|
|
|
## Policy Rules
|
|
|
|
### 1. Naming Convention
|
|
- Names must be **lowercase only**
|
|
- Can use **dots** for namespacing (e.g., `api.define`, `workflow.compose`)
|
|
- Must start with a lowercase letter
|
|
- Must end with a letter or number
|
|
- **No spaces, underscores, or hyphens** in the name field
|
|
|
|
**Valid Examples:**
|
|
- `api.define`
|
|
- `policy.enforce`
|
|
- `skill.create`
|
|
|
|
**Invalid Examples:**
|
|
- `API.define` (uppercase)
|
|
- `api_define` (underscore)
|
|
- `api define` (space)
|
|
- `api-define` (hyphen)
|
|
|
|
### 2. Semantic Versioning
|
|
- Must follow semantic versioning format: `MAJOR.MINOR.PATCH`
|
|
- Optional pre-release suffix allowed (e.g., `1.0.0-alpha`)
|
|
|
|
**Valid Examples:**
|
|
- `0.1.0`
|
|
- `1.0.0`
|
|
- `2.3.1-beta`
|
|
|
|
**Invalid Examples:**
|
|
- `1.0` (missing patch)
|
|
- `v1.0.0` (prefix not allowed)
|
|
- `1.0.0.0` (too many segments)
|
|
|
|
### 3. Permissions
|
|
Only the following permissions are allowed:
|
|
- `filesystem` (or scoped: `filesystem:read`, `filesystem:write`)
|
|
- `network` (or scoped: `network:http`, `network:https`)
|
|
- `read`
|
|
- `write`
|
|
|
|
Any other permissions will trigger a violation.
|
|
|
|
### 4. Status
|
|
Must be one of:
|
|
- `draft` - Under development
|
|
- `active` - Production ready
|
|
- `deprecated` - Still works but not recommended
|
|
- `archived` - No longer maintained
|
|
|
|
## Usage
|
|
|
|
### Single File Validation
|
|
|
|
Validate a single skill or agent manifest:
|
|
|
|
```bash
|
|
python3 skills/policy.enforce/policy_enforce.py path/to/skill.yaml
|
|
```
|
|
|
|
Example:
|
|
```bash
|
|
python3 skills/policy.enforce/policy_enforce.py skills/api.define/skill.yaml
|
|
```
|
|
|
|
### Batch Mode
|
|
|
|
Validate all manifests in `skills/` and `agents/` directories:
|
|
|
|
```bash
|
|
python3 skills/policy.enforce/policy_enforce.py --batch
|
|
```
|
|
|
|
Or simply run without arguments:
|
|
```bash
|
|
python3 skills/policy.enforce/policy_enforce.py
|
|
```
|
|
|
|
### Strict Mode
|
|
|
|
Treat warnings as errors (if warnings are implemented in future):
|
|
|
|
```bash
|
|
python3 skills/policy.enforce/policy_enforce.py --batch --strict
|
|
```
|
|
|
|
## Output Format
|
|
|
|
The skill outputs JSON with the following structure:
|
|
|
|
### Single File Success
|
|
|
|
```json
|
|
{
|
|
"success": true,
|
|
"path": "skills/api.define/skill.yaml",
|
|
"manifest_type": "skill",
|
|
"violations": [],
|
|
"violation_count": 0,
|
|
"message": "All policy checks passed"
|
|
}
|
|
```
|
|
|
|
### Single File Failure
|
|
|
|
```json
|
|
{
|
|
"success": false,
|
|
"path": "skills/example/skill.yaml",
|
|
"manifest_type": "skill",
|
|
"violations": [
|
|
{
|
|
"field": "name",
|
|
"rule": "naming_convention",
|
|
"message": "Name contains uppercase letters: 'API.define'. Names must be lowercase.",
|
|
"severity": "error"
|
|
},
|
|
{
|
|
"field": "version",
|
|
"rule": "semantic_versioning",
|
|
"message": "Invalid version: '1.0'. Must follow semantic versioning (e.g., 1.0.0, 0.1.0-alpha)",
|
|
"severity": "error"
|
|
}
|
|
],
|
|
"violation_count": 2,
|
|
"message": "Found 2 policy violation(s)"
|
|
}
|
|
```
|
|
|
|
### Batch Mode
|
|
|
|
```json
|
|
{
|
|
"success": true,
|
|
"mode": "batch",
|
|
"message": "Validated 15 manifest(s): 15 passed, 0 failed",
|
|
"total_manifests": 15,
|
|
"passed": 15,
|
|
"failed": 0,
|
|
"results": [
|
|
{
|
|
"success": true,
|
|
"path": "skills/api.define/skill.yaml",
|
|
"manifest_type": "skill",
|
|
"violations": [],
|
|
"violation_count": 0,
|
|
"message": "All policy checks passed"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
## Interpreting Results
|
|
|
|
### Exit Codes
|
|
- `0` - All policy checks passed
|
|
- `1` - One or more policy violations found
|
|
|
|
### Violation Severity
|
|
- `error` - Blocking violation that must be fixed
|
|
- `warning` - Non-blocking issue (recommended to fix)
|
|
|
|
### Common Violations
|
|
|
|
**Naming Convention Violations:**
|
|
- Use lowercase: `API.define` → `api.define`
|
|
- Use dots instead of underscores: `api_define` → `api.define`
|
|
- Remove spaces: `api define` → `api.define`
|
|
|
|
**Version Violations:**
|
|
- Add patch version: `1.0` → `1.0.0`
|
|
- Remove prefix: `v1.0.0` → `1.0.0`
|
|
|
|
**Permission Violations:**
|
|
- Use only allowed permissions
|
|
- Replace `http` with `network:http`
|
|
- Replace `file` with `filesystem`
|
|
|
|
**Status Violations:**
|
|
- Use lowercase: `Active` → `active`
|
|
- Use valid values: `production` → `active`
|
|
|
|
## Integration with CI/CD
|
|
|
|
Add to your CI pipeline to enforce policies on all manifests:
|
|
|
|
```yaml
|
|
# .github/workflows/policy-check.yml
|
|
name: Policy Enforcement
|
|
|
|
on: [push, pull_request]
|
|
|
|
jobs:
|
|
policy-check:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- name: Run Policy Enforcement
|
|
run: |
|
|
python3 skills/policy.enforce/policy_enforce.py --batch
|
|
```
|
|
|
|
## Inputs
|
|
|
|
| Input | Type | Required | Default | Description |
|
|
|-------|------|----------|---------|-------------|
|
|
| `manifest_path` | string | No | - | Path to a single manifest file to validate |
|
|
| `--batch` | boolean | No | false | Enable batch mode to validate all manifests |
|
|
| `--strict` | boolean | No | false | Treat warnings as errors |
|
|
|
|
## Outputs
|
|
|
|
| Output | Type | Description |
|
|
|--------|------|-------------|
|
|
| `success` | boolean | Whether all policy checks passed |
|
|
| `violations` | array | List of policy violations found |
|
|
| `violation_count` | integer | Total number of violations |
|
|
| `message` | string | Summary message |
|
|
| `path` | string | Path to the validated manifest (single mode) |
|
|
| `manifest_type` | string | Type of manifest: "skill" or "agent" (single mode) |
|
|
| `total_manifests` | integer | Total number of manifests checked (batch mode) |
|
|
| `passed` | integer | Number of manifests that passed (batch mode) |
|
|
| `failed` | integer | Number of manifests that failed (batch mode) |
|
|
| `results` | array | Individual results for each manifest (batch mode) |
|
|
|
|
## Dependencies
|
|
|
|
- `betty.config` - Configuration and paths
|
|
- `betty.validation` - Validation utilities
|
|
- `betty.logging_utils` - Logging infrastructure
|
|
- PyYAML - YAML parsing
|
|
|
|
## Status
|
|
|
|
**Active** - Production ready
|
|
|
|
## Examples
|
|
|
|
### Example 1: Validate a Single Skill
|
|
|
|
```bash
|
|
$ python3 skills/policy.enforce/policy_enforce.py skills/api.define/skill.yaml
|
|
{
|
|
"success": true,
|
|
"path": "skills/api.define/skill.yaml",
|
|
"manifest_type": "skill",
|
|
"violations": [],
|
|
"violation_count": 0,
|
|
"message": "All policy checks passed"
|
|
}
|
|
```
|
|
|
|
### Example 2: Batch Validation
|
|
|
|
```bash
|
|
$ python3 skills/policy.enforce/policy_enforce.py --batch
|
|
{
|
|
"success": true,
|
|
"mode": "batch",
|
|
"message": "Validated 15 manifest(s): 15 passed, 0 failed",
|
|
"total_manifests": 15,
|
|
"passed": 15,
|
|
"failed": 0,
|
|
"results": [...]
|
|
}
|
|
```
|
|
|
|
### Example 3: Failed Validation
|
|
|
|
```bash
|
|
$ python3 skills/policy.enforce/policy_enforce.py skills/bad-example/skill.yaml
|
|
{
|
|
"success": false,
|
|
"path": "skills/bad-example/skill.yaml",
|
|
"manifest_type": "skill",
|
|
"violations": [
|
|
{
|
|
"field": "name",
|
|
"rule": "naming_convention",
|
|
"message": "Name contains uppercase letters: 'Bad-Example'. Names must be lowercase.",
|
|
"severity": "error"
|
|
}
|
|
],
|
|
"violation_count": 1,
|
|
"message": "Found 1 policy violation(s)"
|
|
}
|
|
$ echo $?
|
|
1
|
|
```
|
|
|
|
## Future Enhancements
|
|
|
|
- Custom policy rule definitions via YAML files
|
|
- Support for warning-level violations
|
|
- Auto-fix capability for common violations
|
|
- Policy exemptions and overrides
|
|
- Historical violation tracking
|