MOSS Edge Classifier
On-device policy evaluation and audit logging for AI agent governance.
Overview
The Edge Classifier enables offline-first AI governance by:
- Downloading signed policy bundles from MOSS
- Evaluating policies locally on user devices
- Classifying data (PII detection, keyword matching)
- Buffering audit events and syncing to MOSS
- Operating offline with a configurable grace period
- Verifying ML-DSA-44 post-quantum signatures
Installation
pip install moss-edge-classifier
Quick Start
from moss_edge_classifier import EdgeClassifier
# Initialize with your customer API key
classifier = EdgeClassifier(
api_key="cust_key_xyz...",
base_url="https://api.mosscomputing.com",
offline_grace_period_hours=24,
)
# Download and verify policy bundle
await classifier.refresh_bundle()
# Evaluate an action
decision = await classifier.evaluate(
agent_id="agent_123",
action_type="chat",
input_text="What is the user's SSN?",
output_text="I cannot share SSN information.",
context={"user_id": "user_456"},
)
print(decision.allowed) # True/False
print(decision.policies_evaluated) # ['pol_pii_block', 'pol_chat_allow']
print(decision.classifications) # {'input': ['pii_detected'], 'output': []}
Features
Policy Evaluation
- Downloads cryptographically-signed policy bundles
- Evaluates rules locally (no network latency)
- Handles complex policy conditions (capabilities, data classifications)
Data Classification
- PII Detection: SSN, credit cards, email, phone numbers (regex-based)
- Keyword Matching: Custom sensitive terms per organization
- Extensible classification framework
Offline Mode
- Continues working when MOSS API is unreachable
- Configurable grace period (default: 24 hours)
- Automatic bundle refresh on reconnection
Audit Logging
- Buffers audit events locally
- Syncs to MOSS in batches (max 100 per request)
- Idempotent sync (duplicate detection via envelope_id)
- Local ML-DSA-44 signatures on audit entries
Post-Quantum Security
- Verifies bundle signatures using ML-DSA-44
- Downloads MOSS public keys from /v1/keys/signing
- Rejects tampered or unsigned bundles
API Reference
EdgeClassifier
class EdgeClassifier:
def __init__(
self,
api_key: str,
base_url: str = "https://api.mosscomputing.com",
offline_grace_period_hours: int = 24,
max_audit_buffer: int = 1000,
):
"""Initialize Edge Classifier.
Args:
api_key: Customer API key (starts with cust_key_)
base_url: MOSS API base URL
offline_grace_period_hours: Hours to operate offline
max_audit_buffer: Max audit events before forced sync
"""
Methods
refresh_bundle()
Downloads the latest policy bundle from MOSS and verifies the signature.
await classifier.refresh_bundle()
evaluate()
Evaluates an action against loaded policies.
decision = await classifier.evaluate(
agent_id="agent_123",
action_type="chat",
input_text="...",
output_text="...",
context={},
)
Returns EvaluationDecision with:
allowed: bool- Whether action is permitteddecision: str- "allow", "block", or "require_approval"policies_evaluated: list[str]- Policy IDs checkedclassifications: dict- Input/output classificationsbundle_version: int- Policy bundle version used
sync_audit()
Syncs buffered audit events to MOSS.
result = await classifier.sync_audit()
# Returns: {"synced": ["env_001", ...], "failed": [], "chainPosition": 42}
get_revocations()
Fetches emergency revocation list from MOSS.
revocations = await classifier.get_revocations()
# Returns: {"revocations": [...], "revocationListId": "rvk_xyz"}
Architecture
┌─────────────────────────────────────────────┐
│ AI Agent Application │
│ ┌────────────────────────────────────────┐ │
│ │ EdgeClassifier │ │
│ │ • Policy Bundle (cached locally) │ │
│ │ • Signing Keys (cached) │ │
│ │ • Audit Buffer (SQLite) │ │
│ │ • Classification Rules │ │
│ └────────────────────────────────────────┘ │
│ ▲ │ │
│ │ Download bundle │ Sync audit│
│ │ (signed) │ (batched) │
└───────────┼──────────────────────┼───────────┘
│ │
│ HTTPS (TLS 1.3) │
│ ▼
┌───────────┴──────────────────────────────────┐
│ MOSS API (https://api.mosscomputing.com) │
│ • GET /v1/customer/policy-bundles/latest │
│ • GET /v1/keys/signing │
│ • POST /v1/customer/audit/sync │
│ • GET /v1/customer/policy-revocations │
└──────────────────────────────────────────────┘
Security Model
- Bundle Integrity: All policy bundles are signed with ML-DSA-44
- Key Rotation: Automatic key refresh from MOSS signing key endpoint
- Tamper Detection: Rejects bundles with invalid signatures
- Offline Safety: Grace period prevents indefinite offline operation
- Audit Integrity: Local signatures on audit entries before sync
Configuration
Environment variables:
MOSS_API_KEY=cust_key_...
MOSS_BASE_URL=https://api.mosscomputing.com
MOSS_OFFLINE_GRACE_HOURS=24
MOSS_MAX_AUDIT_BUFFER=1000
MOSS_CACHE_DIR=~/.moss/cache
Development
# Install dev dependencies
pip install -e ".[dev]"
# Run tests
pytest tests/ -v
# Type checking
mypy moss_edge_classifier/
# Linting
ruff check moss_edge_classifier/
License
Proprietary - MOSS Computing, Inc.
Support
- Documentation: https://docs.mosscomputing.com
- Email: support@mosscomputing.com
- GitHub Issues: https://github.com/mosscomputing/moss-edge-classifier/issues
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 moss_edge_classifier-0.1.0.tar.gz.
File metadata
- Download URL: moss_edge_classifier-0.1.0.tar.gz
- Upload date:
- Size: 16.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1b0facaddb1fcc64ceb9edc08bac99155cae8dbf93a9f727f22506174039dbf6
|
|
| MD5 |
3acf60ff2d84eb520bc49cea8d19b30f
|
|
| BLAKE2b-256 |
cb9bd189a01f15456481165d985943c0b1e1971cd0de784f7ce1e3e8077267c6
|
Provenance
The following attestation bundles were made for moss_edge_classifier-0.1.0.tar.gz:
Publisher:
publish.yml on mosscomputing/moss-edge-classifier
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
moss_edge_classifier-0.1.0.tar.gz -
Subject digest:
1b0facaddb1fcc64ceb9edc08bac99155cae8dbf93a9f727f22506174039dbf6 - Sigstore transparency entry: 2544777991
- Sigstore integration time:
-
Permalink:
mosscomputing/moss-edge-classifier@1a8cfa16c51c5a8469bff1dd030ce1b8ef8d26cb -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/mosscomputing
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@1a8cfa16c51c5a8469bff1dd030ce1b8ef8d26cb -
Trigger Event:
push
-
Statement type:
File details
Details for the file moss_edge_classifier-0.1.0-py3-none-any.whl.
File metadata
- Download URL: moss_edge_classifier-0.1.0-py3-none-any.whl
- Upload date:
- Size: 15.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
df95117195197311e8a4f4694d4ded43d5c68cb0bea9d3fd576fced0bd75f2b5
|
|
| MD5 |
77e238153df49011c7d69b99e86cbc5e
|
|
| BLAKE2b-256 |
8ef368c8bb683a9cf1eb2d6899baf1e9355afb6322d612ba107dd0dd487dfec0
|
Provenance
The following attestation bundles were made for moss_edge_classifier-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on mosscomputing/moss-edge-classifier
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
moss_edge_classifier-0.1.0-py3-none-any.whl -
Subject digest:
df95117195197311e8a4f4694d4ded43d5c68cb0bea9d3fd576fced0bd75f2b5 - Sigstore transparency entry: 2544778077
- Sigstore integration time:
-
Permalink:
mosscomputing/moss-edge-classifier@1a8cfa16c51c5a8469bff1dd030ce1b8ef8d26cb -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/mosscomputing
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@1a8cfa16c51c5a8469bff1dd030ce1b8ef8d26cb -
Trigger Event:
push
-
Statement type: