Production-first agentic orchestrator with Snipara integration for context-aware validation
Project description
Snipara Orchestrator
Production-first agentic orchestrator with Snipara integration for context-aware validation.
Overview
Snipara Orchestrator implements the prod-first validation pattern for AI agents. It ensures that no task is marked "done" until it passes live production checks.
Key Features:
- Production-first validation - Tasks aren't done until
live_checkpasses - Proof-based verification - Standard proof contract (endpoint, user, result)
- Single gatekeeper - One authority for validation decisions
- Automatic cutover checklists - Generated and executed automatically
- Fail-fast on drift - Stops if route/schema drift detected
- Snipara integration - Context-aware with memory persistence
- Explicit htask coordination - Create, inspect, recommend, and complete hosted hierarchical tasks with evidence; it does not spawn Codex or Claude workers automatically
Installation
pip install snipara-orchestrator
Or with all optional dependencies:
pip install snipara-orchestrator[all]
Quick Start
CLI Usage
# Initialize configuration
snipara-orchestrator init --project my-project --prod-url https://api.example.com
# Run a validation task
snipara-orchestrator run "Deploy Auth Feature" \
--test "pnpm test" \
--test "pnpm lint" \
--endpoint "https://api.example.com/health" \
--endpoint "https://api.example.com/api/auth/session" \
--required-proofs 3
# Check for environment drift
snipara-orchestrator check-drift --route /api/users --route /api/auth
# Validate a single endpoint
snipara-orchestrator validate https://api.example.com/health
# Recall memories from previous sessions
snipara-orchestrator recall "deployment failures" --limit 5
# Store a memory
snipara-orchestrator remember "Chose Redis for rate limiting" --type decision
# Create an htask feature and workstreams
snipara-orchestrator htask-create-feature "Auth Overhaul" \
--swarm-id swarm_abc123 \
--description "Move auth to OAuth and JWT" \
--owner codex \
--workstream API \
--workstream QA
# Create a leaf htask under a workstream
snipara-orchestrator htask-create "Add refresh endpoint" \
--swarm-id swarm_abc123 \
--parent-id htask_ws_api \
--description "Implement token rotation" \
--owner codex \
--evidence-required '{"type":"test","description":"targeted tests passed"}'
# Pull the next ready htasks and inspect the hierarchy
snipara-orchestrator htask-next --swarm-id swarm_abc123 --limit 5
snipara-orchestrator htask-tree --swarm-id swarm_abc123 --task-id htask_feature
# Complete an N3 htask with proof
snipara-orchestrator htask-complete htask_task_001 \
--swarm-id swarm_abc123 \
--evidence "test:pytest packages/agentic-orchestrator" \
--result "Implemented and verified htask wrapper"
Python API
import asyncio
from snipara_orchestrator import Orchestrator, Task, ValidationCriteria
from snipara_orchestrator.models import LiveCheck, OrchestratorConfig
async def main():
# Configuration
config = OrchestratorConfig(
snipara_api_key="snp-your-api-key",
snipara_project="my-project",
prod_url="https://api.example.com",
repo_path="/path/to/repo",
test_user="test@example.com",
)
# Create orchestrator
orchestrator = Orchestrator(config)
await orchestrator.initialize()
# Define task with validation criteria
task = Task(
id="deploy-auth",
title="Deploy Authentication Feature",
description="Deploy OAuth2 authentication to production",
criteria=ValidationCriteria(
local_tests=["pnpm test", "pnpm lint"],
live_checks=[
LiveCheck(url="https://api.example.com/health"),
LiveCheck(
url="https://api.example.com/api/auth/login",
method="POST",
expected_status=200,
body={"email": "test@test.com", "password": "test"},
),
],
required_proofs=3,
),
)
# Execute the task
result = await orchestrator.execute_task(task)
print(f"Status: {result.status.value}")
print(f"Proofs: {len(result.passing_proofs())}/{len(result.proofs)}")
asyncio.run(main())
Task Lifecycle
PENDING → IN_PROGRESS → LOCAL_OK → VALIDATING → PROD_OK → DONE
↓ ↓
LOCAL_FAIL PROD_FAIL → ENV_DRIFT?
| Status | Description |
|---|---|
PENDING |
Task created, not started |
IN_PROGRESS |
Executing local tests |
LOCAL_OK |
Local tests passed |
LOCAL_FAIL |
Local tests failed |
VALIDATING |
Running production checks |
PROD_OK |
All production checks passed |
PROD_FAIL |
Production checks failed |
ENV_DRIFT |
Environment drift detected |
DONE |
Task completed successfully |
Proof Contract
Every validation produces a proof with three required fields:
@dataclass
class Proof:
endpoint: str # URL or test identifier
user_tested: str # Test user email
result: str # "pass" or "fail"
# Optional
response_code: int
response_body: dict
error_message: str
Tasks require a minimum number of passing proofs (default: 3) to reach PROD_OK.
Configuration
Create .snipara-orchestrator.json in your project root:
{
"snipara_api_key": "snp-your-api-key",
"snipara_project": "my-project",
"prod_url": "https://api.example.com",
"repo_path": "/path/to/repo",
"test_user": "test@example.com",
"fail_fast_on_drift": true,
"auto_remember": true,
"verbose": true
}
Or use environment variables:
export SNIPARA_API_KEY=snp-your-api-key
export SNIPARA_PROJECT=my-project
export PROD_URL=https://api.example.com
export REPO_PATH=/path/to/repo
Snipara Integration
The orchestrator uses Snipara for:
Context Retrieval
# Get relevant documentation
context = await orchestrator.snipara.query_context(
query="deployment checklist production",
max_tokens=6000,
)
Memory Persistence
# Remember decisions
await orchestrator.snipara.remember(
content="Chose Redis for rate limiting due to distributed nature",
type="decision",
category="architecture",
ttl_days=30,
)
# Recall previous context
memories = await orchestrator.snipara.recall(
query="deployment failures",
limit=5,
)
Multi-Agent Coordination
# Create a swarm
swarm = await orchestrator.snipara.create_swarm(
name="deployment-coordination",
description="Multi-agent deployment workflow",
)
# Store shared state
await orchestrator.snipara.set_state(
swarm_id=swarm["swarm_id"],
agent_id="coordinator",
key="deployment_status",
value={"phase": "validating", "progress": 75},
)
Hierarchical Tasks
These methods wrap the hosted snipara_htask_* tools. They coordinate work and
proofs; worker execution is still manual and explicit.
feature = await orchestrator.snipara.create_htask_feature(
swarm_id=swarm["swarm_id"],
title="Auth Overhaul",
description="Move auth to OAuth and JWT",
owner="codex",
workstreams=["API", "QA"],
)
task = await orchestrator.snipara.create_htask(
swarm_id=swarm["swarm_id"],
parent_id=feature["workstream_ids"]["API"],
title="Add refresh endpoint",
description="Implement token rotation",
owner="codex",
evidence_required=[
{"type": "test", "description": "targeted tests passed"},
],
)
ready = await orchestrator.snipara.recommend_htask_batch(
swarm_id=swarm["swarm_id"],
limit=5,
owner="codex",
)
tree = await orchestrator.snipara.get_htask_tree(
swarm_id=swarm["swarm_id"],
task_id=feature["feature_id"],
)
await orchestrator.snipara.complete_htask(
swarm_id=swarm["swarm_id"],
task_id=task["task_id"],
evidence=[
{"type": "test", "description": "pytest package suite passed"},
],
result={"files_modified": ["src/auth.py"]},
)
Components
Gatekeeper
Single authority for validation decisions:
from snipara_orchestrator.gates import Gatekeeper
gatekeeper = Gatekeeper(
snipara=snipara_client,
validator=validator,
drift_detector=drift_detector,
fail_fast_on_drift=True,
)
# Gate 1: LOCAL_OK → VALIDATING
result = await gatekeeper.gate_local_to_validation(task)
# Gate 2: VALIDATING → PROD_OK
result = await gatekeeper.gate_validation_to_prod(task)
Drift Detector
Detect environment drift:
from snipara_orchestrator.drift_detector import DriftDetector
detector = DriftDetector(
prod_url="https://api.example.com",
repo_path="/path/to/repo",
)
report = await detector.full_drift_check(
routes=["/api/users", "/api/auth"],
check_schema=True,
check_health=True,
)
if report.has_drift:
print(f"Issues: {report.issues}")
print(f"Recommendations: {report.recommendations}")
Validator
Collect proofs from live checks:
from snipara_orchestrator.validator import Validator
from snipara_orchestrator.models import LiveCheck
validator = Validator(test_user="test@example.com")
proof = await validator.run_live_check(
LiveCheck(
url="https://api.example.com/health",
expected_status=200,
)
)
print(f"Result: {proof.result}")
print(f"Status: {proof.response_code}")
Executor
Run commands and tests:
from snipara_orchestrator.executor import Executor
executor = Executor(working_dir="/path/to/repo")
result = await executor.run_command("pnpm test")
print(f"Success: {result.success}")
print(f"Output: {result.stdout}")
Architecture
┌─────────────────────────────────────────────────────────────────┐
│ ORCHESTRATOR │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ SNIPARA (Context Layer) │ │
│ │ • snipara_context_query → Documentation context │ │
│ │ • snipara_remember/recall → Memory persistence │ │
│ │ • snipara_swarm_* → Multi-agent coordination │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ GATEKEEPER (Single Authority) │ │
│ │ • gate_local_to_validation() → LOCAL_OK → VALIDATING │ │
│ │ • gate_validation_to_prod() → VALIDATING → PROD_OK │ │
│ │ • generate_cutover_checklist() → Auto checklist │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌─────────────────────┼─────────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ EXECUTOR │ │ VALIDATOR │ │ DRIFT │ │
│ │ • Tests │ │ • Live │ │ DETECTOR │ │
│ │ • Deploy │ │ • UI │ │ • Routes │ │
│ │ • Bash │ │ • Proofs │ │ • Schema │ │
│ └───────────┘ └───────────┘ └───────────┘ │
└─────────────────────────────────────────────────────────────────┘
Snipara Ecosystem
| Package | Install | Purpose |
|---|---|---|
| snipara-mcp | pip install snipara-mcp |
MCP client for context optimization |
| snipara-orchestrator | pip install snipara-orchestrator |
Production validation orchestrator |
| Snipara Sandbox | pip install snipara-sandbox |
Safe code execution runtime |
Best Practices
- Always define validation criteria - Don't rely on defaults
- Use meaningful test users - Helps with debugging
- Set appropriate proof requirements - 3 is a good minimum
- Enable fail-fast on drift - Catch issues early
- Use auto-remember - Preserve learnings across sessions
- Check drift before deployment - Run
snipara-orchestrator check-drift
Documentation
License
MIT
Built with ❤️ by Snipara
Project details
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 snipara_orchestrator-0.1.3.tar.gz.
File metadata
- Download URL: snipara_orchestrator-0.1.3.tar.gz
- Upload date:
- Size: 41.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d9cd8291ef6a944e173ce2c0b4306890c08b2079b007f12de273096484c7e5b5
|
|
| MD5 |
0699bb98a898f88195d7a4430689c886
|
|
| BLAKE2b-256 |
722e8e7d55d8dc78bf5f5972818a1a085f34186b3fdb019944d278a31de931d8
|
File details
Details for the file snipara_orchestrator-0.1.3-py3-none-any.whl.
File metadata
- Download URL: snipara_orchestrator-0.1.3-py3-none-any.whl
- Upload date:
- Size: 36.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
daffe0528f62e97c3204295b19001b2c8d7ba35da362621b42532ed6b30f8153
|
|
| MD5 |
7eb97eebb0130837ce76cf0d5997c66f
|
|
| BLAKE2b-256 |
d6cc5a8335e33bad7b3fa4cc79ee27c4556fb923a7fbd026458373cc040720c0
|