Open Source Policy as Code - License compliance policy engine
Project description
OSPAC - Open Source Policy as Code
OSPAC (Open Source Policy as Code) is a comprehensive policy engine for automated OSS license compliance. It provides a declarative, data-driven approach where all compliance logic, rules, and decisions are defined in versionable policy files rather than hardcoded in application logic.
Key Features
- Policy as Code - All compliance logic is defined in YAML/JSON policy files
- SPDX Integration - Built-in support for SPDX license identifiers
- Compatibility Engine - Complex license compatibility evaluation
- Obligation Tracking - Automated compliance checklist generation
- Extensible - Easy to add new licenses, rules, and regulations
- CLI & API - Both command-line and programmatic interfaces
Core Philosophy
Everything in OSPAC is policy-defined, not code-defined:
- No hardcoded business logic - All rules are data-driven
- Versionable - Policies in Git, reviewable via PR
- Testable - Unit test your policies
- Composable - Build complex policies from simple rules
- Auditable - Clear lineage of decisions
Installation
pip install ospac
For development with SEMCL.ONE integration:
pip install "ospac[semcl]"
How It Works
OSPAC provides both:
- Data Generation Pipeline - Downloads SPDX licenses and generates comprehensive policy datasets
- Runtime Engine - Evaluates licenses against policies using the generated data
Data Generation
OSPAC includes a pipeline that:
- Downloads the complete SPDX license dataset (700+ licenses)
- Optionally uses LLM (Ollama + llama3) for enhanced analysis via StrandsAgents SDK
- Generates comprehensive policy files with:
- License categorizations (permissive, copyleft, etc.)
- Compatibility matrices
- Obligation databases
- Regulatory requirements
Quick Start
Data Generation (First Time Setup)
# Download SPDX dataset and generate basic policy data
ospac data download-spdx
# Generate complete policy dataset (basic analysis)
ospac data generate --output-dir ./data
# Generate with LLM-enhanced analysis (requires Ollama with llama3)
ospac data generate --use-llm --output-dir ./data
# Validate generated data
ospac data validate --data-dir ./data
# Query specific license from database
ospac data show MIT --format yaml
Policy Evaluation
# Evaluate licenses against policies
ospac evaluate --licenses GPL-3.0,MIT --context static_linking
# Check license compatibility
ospac check GPL-3.0 MIT --context static_linking
# Get license obligations
ospac obligations --licenses Apache-2.0,MIT --format checklist
# Initialize a new policy from template
ospac init --template enterprise --output my_policy.yaml
# Validate policy syntax
ospac validate ./my_policy.yaml
Python API
from ospac import PolicyRuntime
# Initialize runtime with policies
runtime = PolicyRuntime.from_path("policies/")
# Evaluate licenses
result = runtime.evaluate({
"licenses_found": ["GPL-3.0", "MIT"],
"context": "static_linking",
"distribution": "commercial"
})
# Check compatibility
compat = runtime.check_compatibility("GPL-3.0", "MIT", "static_linking")
# Get obligations
obligations = runtime.get_obligations(["Apache-2.0", "MIT"])
Policy Files
OSPAC uses declarative policy files to define all compliance logic:
License Definition
# policies/licenses/spdx/MIT.yaml
license:
id: MIT
type: permissive
requirements:
include_license: true
include_copyright: true
compatibility:
static_linking:
compatible_with: [category: any]
Organizational Policy
# policies/organizations/my_company.yaml
version: "1.0"
rules:
- id: no_copyleft
when:
license_type: copyleft_strong
then:
action: deny
message: "Strong copyleft licenses not allowed"
Integration with SEMCL.ONE
OSPAC integrates seamlessly with the SEMCL.ONE ecosystem:
# Use with osslili for license detection
from osslili import scan_directory
from ospac import PolicyRuntime
# Detect licenses
licenses = scan_directory("/path/to/project")
# Validate against policy
runtime = PolicyRuntime.from_path("policies/")
result = runtime.evaluate({"licenses_found": licenses})
Project Structure
ospac/
├── runtime/ # Policy execution engine
├── policies/ # Policy definitions (Policy as Code)
│ ├── licenses/ # License definitions
│ ├── compatibility/ # Compatibility rules
│ ├── obligations/ # License obligations
│ └── organizations/ # Org-specific policies
├── models/ # Data models
├── cli/ # CLI interface
└── utils/ # Utilities
Contributing
We welcome contributions! Please see CONTRIBUTING.md for details.
Support
For support, please:
- Check the documentation
- File an issue on GitHub
- See SUPPORT.md for more options
License
Apache-2.0 - See LICENSE for details.
Authors
See AUTHORS.md for a list of contributors.
Acknowledgments
- SPDX Project for license standardization
- SEMCL.ONE ecosystem for integration capabilities
- Open Chain Project for compliance best practices
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ospac-0.1.0.tar.gz.
File metadata
- Download URL: ospac-0.1.0.tar.gz
- Upload date:
- Size: 40.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6df9793fe3c2ec1c94d74b533f9574034f6af22df86c208830c29922097558e3
|
|
| MD5 |
436059e40ed1cece42e22abd506f50e3
|
|
| BLAKE2b-256 |
6c596755822740edf0be0a77740317d3f551b9ec4d5a5bdbec031fd5680e5b93
|
Provenance
The following attestation bundles were made for ospac-0.1.0.tar.gz:
Publisher:
python-publish.yml on SemClone/ospac
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ospac-0.1.0.tar.gz -
Subject digest:
6df9793fe3c2ec1c94d74b533f9574034f6af22df86c208830c29922097558e3 - Sigstore transparency entry: 669098093
- Sigstore integration time:
-
Permalink:
SemClone/ospac@2bfe76772dd08b1fd3d60fc5539832548c6486b4 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/SemClone
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@2bfe76772dd08b1fd3d60fc5539832548c6486b4 -
Trigger Event:
release
-
Statement type:
File details
Details for the file ospac-0.1.0-py3-none-any.whl.
File metadata
- Download URL: ospac-0.1.0-py3-none-any.whl
- Upload date:
- Size: 38.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bee1b82200b71d482506d996126151880d34b8a04c5e04866e2c8adf5f60fa41
|
|
| MD5 |
82789eb55e13ad31243d1062ef199392
|
|
| BLAKE2b-256 |
de2d3b1a6f4442abac64154acfca9893bfd8cca5b960bed08e9bd414078bf961
|
Provenance
The following attestation bundles were made for ospac-0.1.0-py3-none-any.whl:
Publisher:
python-publish.yml on SemClone/ospac
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ospac-0.1.0-py3-none-any.whl -
Subject digest:
bee1b82200b71d482506d996126151880d34b8a04c5e04866e2c8adf5f60fa41 - Sigstore transparency entry: 669098094
- Sigstore integration time:
-
Permalink:
SemClone/ospac@2bfe76772dd08b1fd3d60fc5539832548c6486b4 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/SemClone
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@2bfe76772dd08b1fd3d60fc5539832548c6486b4 -
Trigger Event:
release
-
Statement type: