Oris is a Rust framework for supervised, bounded, closed-loop software improvement. Capture signals. Generate mutations. Validate. Promote. Reuse. Reduce reasoning over time.
Most AI systems execute tasks without learning from them. Oris closes the loop — every execution is an opportunity to improve.
Collect actionable signals from compiler failures, test regressions, panics, and runtime outcomes — not synthetic benchmarks.
Generate candidate patches from successful patterns, executed in OS-level isolated child processes before touching production.
Static analysis gates block bad mutations cheaply before the LLM critic runs — fast rejection first, expensive evaluation second.
Proven solutions become durable genes with confidence scores. Future runs replay them — fewer LLM calls every cycle.
Fail-closed policy enforcement. No autonomous promotion without gate passage. Every decision is recorded and auditable.
Publish and fetch genes via the Oris Evolution Network with Ed25519-signed envelopes and federated queries.
Every improvement follows a deterministic, auditable pipeline from signal intake to a reusable gene asset.
Collect actionable signals from compiler diagnostics, test failures, panics, and runtime outcomes.
Choose the best candidate gene or strategy from the gene pool using confidence scores and task-class matching.
Generate candidate patches derived from prior successful patterns and gene history — not random mutation.
Run mutations inside a sandboxed child process with OS-level resource limits and budget enforcement.
Verify correctness through static analysis gates and configurable safety policies before any quality scoring.
Two-phase quality scoring: static analysis score first, LLM critic only on candidates that pass the gate.
Promote successful mutations into durable, reusable genes in the SQLite gene store with full metadata.
Replay proven genes with confidence tracking. Stale confidence triggers re-mutation automatically.
Add the crate, set your LLM API key, and run the canonical evolution scenario.
# Cargo.toml
[dependencies]
oris-runtime = { version = "*", features = ["full-evolution-experimental"] }
# Minimal setup — no evolution, just graphs + agents
# oris-runtime = { version = "*" }
# Set your LLM provider key
export OPENAI_API_KEY="sk-..." # OpenAI
export ANTHROPIC_API_KEY="sk-ant-..." # Anthropic (alternative)
cargo build
# Start the HTTP execution server
cargo run -p oris-runtime --example execution_server --features "sqlite-persistence,execution-server"
# Defaults:
# Listen: http://127.0.0.1:8080
# DB: in-memory SQLite
# Override via env vars:
export ORIS_SERVER_ADDR=0.0.0.0:8080
export ORIS_SQLITE_DB=oris.db
export ORIS_RUNTIME_BACKEND=sqlite # or postgres
# Run the canonical evolution scenario
cargo run -p evo_oris_repo
# Run with observable artifacts
bash scripts/evo_first_run.sh
# → target/evo_first_run/summary.json
# → target/evo_first_run/run.log
# Focused example binaries
cargo run -p evo_oris_repo --bin intake_webhook_demo
cargo run -p evo_oris_repo --bin confidence_lifecycle_demo
cargo run -p evo_oris_repo --bin network_exchange
# Submit a graph job to the execution server
curl -X POST http://127.0.0.1:8080/jobs -H "Content-Type: application/json" -d '{"graph_name":"my_graph","input":{"task":"example"}}'
# Response: {"job_id":"abc123", "status":"pending"}
# Poll status
curl http://127.0.0.1:8080/jobs/abc123
# Stream SSE events in real-time
curl -N http://127.0.0.1:8080/jobs/abc123/stream
Deep dives on the key abstractions — from the deterministic kernel to the plugin system.
A Gene is a proven, reusable solution to a class of problem. When a mutation succeeds, it is promoted and stored in the SQLite gene store with a confidence score, task-class label, and usage history. A Capsule bundles multiple related Genes for cross-node sharing via the Experience Repository.
// Gene lifecycle — from signal to reuse
let signal = IssueSignal {
source: SignalSource::CompilerDiagnostic,
message: "cannot borrow `x` as mutable".into(),
task_class: "borrow_checker_fix".into(),
};
let result = evokernel.process(signal).await?;
match result {
EvolutionResult::Promoted(gene) => {
// gene.confidence starts at 1.0, decays over time
// next identical signal replays this gene directly
println!("Promoted gene {} (conf={:.2})", gene.id, gene.confidence);
}
EvolutionResult::Replayed(gene) => {
println!("Replayed trusted gene {}", gene.id);
}
EvolutionResult::Rejected => println!("No valid mutation found"),
}
Confidence decays over time. When it falls below the configured threshold, the gene triggers a fresh mutation cycle instead of blind replay — ensuring stale knowledge is refreshed.
The oris-kernel crate provides a deterministic execution substrate: every action is recorded in an append-only event log, enabling replay, branch exploration, and zero-data-loss crash recovery.
Freeze the ExecutionStep API. All side effects pass through EffectSink. Determinism guard enforces reproducible output.
Append-only EventStore records every action. ReplayCursor walks the log deterministically; ReplayVerifier detects any divergence.
Interrupts are first-class objects driving a KernelInterrupt state machine. Suspended runs resume deterministically through replay — no lost state.
9 plugin categories with determinism declarations, resource limits, version negotiation. External crates extend the runtime without forking.
Zero-data-loss recovery via lease manager. Weighted priority dispatch, backpressure signaling, and circuit breaker pattern built-in.
The pipeline in oris-evolution/pipeline.rs orchestrates all 8 stages. Each stage is a composable trait object. The pipeline short-circuits on rejection and emits per-stage telemetry at every boundary.
// Compose a custom pipeline
let pipeline = EvolutionPipeline::builder()
.detector(CompilerSignalDetector::new())
.selector(ConfidenceSelector::with_threshold(0.7))
.mutator(LlmMutator::with_model("gpt-4o"))
.sandbox(ProcessSandbox::with_limits(ResourceLimits::default()))
.validator(StaticAnalysisValidator::new())
.evaluator(TwoPhaseEvaluator::new(static_gate, llm_critic))
.solidifier(SqliteGeneStore::open("genes.db")?)
.build()?;
let report = pipeline.run(signal).await?;
// report.stage_durations — per-stage timing
// report.rejection_reason — why it failed (if any)
If a trusted gene exists with confidence >= threshold, the pipeline enters replay mode — Mutate, Execute, Validate, and Evaluate are all skipped. This is how reasoning cost reduces over time.
The oris-sandbox crate runs candidate mutations in a controlled child process. Failed or runaway mutations cannot affect the host runtime. Enable fine-grained limits with the resource-limits feature flag.
let limits = ResourceLimits {
max_memory_bytes: 256 * 1024 * 1024, // 256 MB
max_cpu_seconds: 30,
max_output_bytes: 10 * 1024 * 1024, // 10 MB stdout
network_access: false,
};
let sandbox = ProcessSandbox::new(limits);
let outcome = sandbox.execute(&candidate_patch).await?;
match outcome {
SandboxOutcome::Success(output) => /* forward to validator */
SandboxOutcome::Timeout => /* penalize gene confidence */
SandboxOutcome::MemoryExceeded => /* reject immediately */
SandboxOutcome::CompileError(err) => /* feed back to mutator */
}
The oris-governor crate enforces promotion, cooldown, and revocation policies — preventing runaway mutation cycles and ensuring no gene is promoted without meeting quality thresholds.
let policy = PromotionPolicy::builder()
.min_confidence(0.75)
.min_passes(2) // must pass validator twice
.cooldown(Duration::hours(1)) // prevent promotion thrash
.max_revocations(3) // archive after 3 regressions
.build();
let governor = Governor::new(policy, gene_store.clone());
// Called automatically before the Solidify stage
if governor.allow_promotion(&candidate)? {
gene_store.save(candidate.into_gene())?;
}
Revocation triggers automatically when a promoted gene causes a regression. After max_revocations, the gene is archived and a forced re-mutation cycle begins with a clean slate.
The K4 plugin system lets external crates extend Oris without forking the runtime. Plugins declare determinism contracts; the registry enforces version negotiation and resource limits at load time.
// Implement a custom Tool plugin
#[derive(Plugin)]
#[plugin(category = "Tool", deterministic = false)]
struct MySearchTool;
impl ToolPlugin for MySearchTool {
fn name(&self) -> &str { "web_search" }
async fn call(&self, input: ToolInput) -> anyhow::Result<ToolOutput> {
// call your search API
todo!()
}
}
// Register at runtime startup
registry.register(Box::new(MySearchTool))?;
23 library crates with a strict no-cycles dependency graph — each layer only reaches downward.
Builder for stateful graphs with typed nodes, conditional edges, and persistence. invoke(), stream(), step_once().
Deterministic substrate: append-only event log, replay cursor, snapshot store. K1–K5 phases all complete.
Composable 8-stage Detect→Reuse orchestration. Per-stage telemetry, short-circuit on rejection, replay bypass.
Two-phase quality gate: static analysis score first, LLM critic only on candidates that pass the gate.
9 plugin categories, determinism declarations, resource limits, semantic version negotiation at load time.
Context-aware weighted priority dispatch with backpressure signaling and circuit breaker pattern.
The Hub connects multiple Experience Repository nodes — register, discover, federate queries, and subscribe to cross-node evolution events.
Register nodes with Ed25519 public keys. Key substitution prevention, health checking, and automatic deregistration on conflict.
Fan-out gene searches across all healthy nodes. One API call returns aggregated, deduplicated results from the entire network.
Subscribe to gene promotion events via webhook callbacks. Get notified when a proven gene appears on any connected node.
All inter-node traffic uses OEN envelopes with Ed25519 signatures. Built-in rate limiting and PKI key registry.
Hub Quick Start
cargo run -p oris-hub
# Configuration via environment variables
export HUB_ADDR=127.0.0.1:3000 # default: 0.0.0.0:3000
export HUB_DB_PATH=hub.db # default: hub.db
# Dashboard: http://localhost:3000/dashboard
# API base: http://localhost:3000/api/v1
curl -X POST http://localhost:3000/api/v1/nodes -H "Content-Type: application/json" -H "Authorization: Bearer <token>" -d '{
"node_id": "node-alpha",
"endpoint": "https://alpha.example.com",
"public_key": "<base64-ed25519-pubkey>",
"capabilities": ["gene-store", "capsule-store"]
}'
curl http://localhost:3000/api/v1/nodes # list all nodes
# Fan-out gene search across all healthy nodes
curl "http://localhost:3000/api/v1/federation/genes?q=fix_timeout"
# Filter by task class and minimum confidence
curl "http://localhost:3000/api/v1/federation/genes?task_class=network_retry&min_confidence=0.8"
# Response aggregates results from every healthy node:
# {"results":[...],"nodes_queried":3,"nodes_healthy":3}
curl -X POST http://localhost:3000/api/v1/subscriptions -H "Content-Type: application/json" -H "Authorization: Bearer <token>" -d '{
"callback_url": "https://my-node.example.com/hooks/gene",
"events": ["gene_promoted","gene_revoked"],
"filter": {"min_confidence":0.8}
}'
# Hub delivers a signed POST to your callback_url
# when any registered node promotes or revokes a matching gene.
SQLite or MySQL gene storage as ground truth. Network sync is optional. Your genes work offline, sync when connected. Official libraries for Go, Python, and TypeScript.
Default mode: Pure local — no network required. Genes are stored in SQLite with WAL mode for performance.
MySQL mode: Use MySQL as shared backend for multi-node deployments or team collaboration. Same API, just swap config.
Connected mode: Push local genes to Experience Repo for sharing. Pull community genes to enrich your local pool.
Conflict resolution: Same task class → merge stats (max values). Different task class → skip & log conflict.
Pure Go SQLite (no CGo) + optional MySQL, sync.RWMutex thread safety, strongly typed.
go get github.com/Colin4k1024/Oris/sdks/go@v0.3.0
Zero extra deps (stdlib sqlite3) + optional MySQL via pymysql. Full type hints.
pip install oris-rt-sdk==0.3.0
pip install oris-rt-sdk[mysql]==0.3.0 # with MySQL
Synchronous better-sqlite3 + optional async MySQL via mysql2. ESM-first, tree-shakable.
npm install @colin4k1024/oris-sdk@0.3.0
npm install mysql2 # optional, for MySQL
Local-First Usage (Recommended)
package main
import (
"fmt"
"time"
oris "github.com/Colin4k1024/Oris/sdks/go"
"github.com/Colin4k1024/Oris/sdks/go/store"
)
func main() {
// Initialize — local SQLite storage, no network needed
client, _ := oris.NewClient(oris.Config{
StorePath: "my_genes.db",
})
defer client.Close()
// Save a gene locally
gene := store.Gene{
GeneID: "retry-backoff-1",
Name: "exponential-retry",
TaskClass: "error-handling",
Confidence: 0.92,
Strategy: map[string]any{"approach": "exponential_backoff", "max_retries": 5},
Signals: map[string]any{"error_rate": 0.15},
UseCount: 12,
SuccessCount: 11,
Source: "local",
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
client.Store.Save(gene)
// Query genes by task class
results := client.Store.Query(store.StoreQuery{
TaskClass: "error-handling",
MinConfidence: 0.8,
})
fmt.Printf("Found %d high-confidence genes\n", len(results))
// Update stats after using a gene
client.Store.UpdateStats("retry-backoff-1", true, true)
}
from oris_sdk import OrisClient, OrisConfig, Gene
from datetime import datetime
# Initialize — local SQLite storage, no network needed
client = OrisClient(OrisConfig(store_path="my_genes.db"))
# Save a gene locally
gene = Gene(
gene_id="retry-backoff-1",
name="exponential-retry",
task_class="error-handling",
confidence=0.92,
strategy={"approach": "exponential_backoff", "max_retries": 5},
signals={"error_rate": 0.15},
use_count=12,
success_count=11,
source="local",
created_at=datetime.now(),
updated_at=datetime.now(),
)
client.store.save(gene)
# Query genes by task class
results = client.store.query(task_class="error-handling", min_confidence=0.8)
print(f"Found {len(results)} high-confidence genes")
# Update stats after using a gene
client.store.update_stats("retry-backoff-1", used=True, success=True)
# Context manager support
with OrisClient(OrisConfig(store_path=":memory:")) as c:
c.store.save(gene)
print(c.store.get("retry-backoff-1").name)
import { OrisClient } from "@colin4k1024/oris-sdk";
import type { Gene } from "@colin4k1024/oris-sdk";
// Initialize — local SQLite storage, no network needed
const client = new OrisClient({ storePath: "my_genes.db" });
// Save a gene locally
const gene: Gene = {
geneId: "retry-backoff-1",
name: "exponential-retry",
taskClass: "error-handling",
confidence: 0.92,
strategy: { approach: "exponential_backoff", max_retries: 5 },
signals: { error_rate: 0.15 },
useCount: 12,
successCount: 11,
contributorId: "agent-1",
source: "local",
createdAt: new Date(),
updatedAt: new Date(),
};
client.store.save(gene);
// Query genes by task class
const results = client.store.query({
taskClass: "error-handling",
minConfidence: 0.8,
});
console.log(`Found ${results.length} high-confidence genes`);
// Update stats after using a gene
client.store.updateStats("retry-backoff-1", true, true);
// Clean up
client.close();
MySQL Storage (Alternative Backend)
package main
import (
"fmt"
"time"
oris "github.com/Colin4k1024/Oris/sdks/go"
"github.com/Colin4k1024/Oris/sdks/go/store"
)
func main() {{
// Initialize with MySQL — shared storage for teams
client, _ := oris.NewClient(oris.Config{{
MySQL: &oris.MySQLSync{{
Host: "127.0.0.1",
Port: 3306,
User: "oris",
Password: "secret",
Database: "oris",
}},
}})
defer client.Close()
// Same API as SQLite — save, query, update
gene := store.Gene{{
GeneID: "retry-backoff-1",
Name: "exponential-retry",
TaskClass: "error-handling",
Confidence: 0.92,
Strategy: map[string]any{{"approach": "exponential_backoff"}},
Source: "local",
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}}
client.Store.Save(nil, gene)
results, _ := client.Store.Query(nil, store.StoreQuery{{
TaskClass: "error-handling",
MinConfidence: 0.8,
}})
fmt.Printf("Found %d genes in MySQL\n", len(results))
}}
from oris_sdk import OrisClient, OrisConfig, Gene
from oris_sdk.mysql_store import MySQLConfig
from datetime import datetime, timezone
# Initialize with MySQL — shared storage for teams
client = OrisClient(OrisConfig(
mysql=MySQLConfig(
host="127.0.0.1",
port=3306,
user="oris",
password="secret",
database="oris",
)
))
# Same API as SQLite — save, query, update
gene = Gene(
gene_id="retry-backoff-1",
name="exponential-retry",
task_class="error-handling",
confidence=0.92,
strategy={{"approach": "exponential_backoff"}},
source="local",
created_at=datetime.now(timezone.utc),
updated_at=datetime.now(timezone.utc),
)
client.store.save(gene)
results = client.store.query(task_class="error-handling", min_confidence=0.8)
print(f"Found {{len(results)}} genes in MySQL")
# Or connect via DSN string
from oris_sdk.mysql_store import MySQLStore
store = MySQLStore.from_url("mysql://oris:secret@127.0.0.1:3306/oris")
import {{ OrisClient }} from "@colin4k1024/oris-sdk";
import type {{ Gene }} from "@colin4k1024/oris-sdk";
// Initialize with MySQL — shared storage for teams
// Note: requires `npm install mysql2`
const client = await OrisClient.create({{
mysql: {{
host: "127.0.0.1",
port: 3306,
user: "oris",
password: "secret",
database: "oris",
}},
}});
// Same API as SQLite — save, query, update
const gene: Gene = {{
geneId: "retry-backoff-1",
name: "exponential-retry",
taskClass: "error-handling",
confidence: 0.92,
strategy: {{ approach: "exponential_backoff" }},
source: "local",
useCount: 0,
successCount: 0,
contributorId: "agent-1",
createdAt: new Date(),
updatedAt: new Date(),
}};
await client.store.save(gene);
const results = await client.store.query({{
taskClass: "error-handling",
minConfidence: 0.8,
}});
console.log(`Found ${{results.length}} genes in MySQL`);
client.close();
Network Sync (Optional)
package main
import (
"fmt"
oris "github.com/Colin4k1024/Oris/sdks/go"
"github.com/Colin4k1024/Oris/sdks/go/store"
)
func main() {
seed := [32]byte{/* your Ed25519 seed */}
// Initialize with Experience Repo connection
client, _ := oris.NewClient(oris.Config{
StorePath: "my_genes.db",
Experience: &oris.ExperienceSync{
BaseURL: "https://experience.oris.dev",
APIKey: "your-api-key",
Seed: seed,
SenderID: "agent-1",
},
})
defer client.Close()
// Push unsynced local genes to Experience Repo
result, _ := client.Sync.PushToHub(nil)
fmt.Printf("Pushed %d genes, %d failed\n", result.Pushed, result.Failed)
// Pull community genes from Experience Repo
imported, _ := client.Sync.PullFromHub(nil)
fmt.Printf("Imported %d new genes\n", imported)
// Push specific genes only
result, _ = client.Sync.PushToHub(&store.PushOpts{
GeneIDs: []string{"retry-backoff-1", "cache-warm-2"},
})
// Pull with filters
imported, _ = client.Sync.PullFromHub(&store.PullOpts{
Q: "error-handling",
MinConfidence: 0.85,
Limit: 50,
})
}
from oris_sdk import OrisClient, OrisConfig
# Initialize with Experience Repo connection
client = OrisClient(OrisConfig(
store_path="my_genes.db",
experience_base_url="https://experience.oris.dev",
experience_api_key="your-api-key",
experience_seed=b"your-32-byte-ed25519-seed-here..",
experience_sender_id="agent-1",
))
# Push unsynced local genes to Experience Repo
result = client.sync.push_to_hub()
print(f"Pushed {result.pushed} genes, {result.failed} failed")
# Pull community genes from Experience Repo
imported = client.sync.pull_from_hub()
print(f"Imported {imported} new genes")
# Push specific genes only
result = client.sync.push_to_hub(gene_ids=["retry-backoff-1", "cache-warm-2"])
# Pull with filters
imported = client.sync.pull_from_hub(
q="error-handling",
min_confidence=0.85,
limit=50,
)
# Check sync history
logs = client.sync.get_sync_log(limit=20)
for log in logs:
print(f" {log.direction} {log.gene_id}: {log.status}")
import { OrisClient } from "@colin4k1024/oris-sdk";
// Initialize with Experience Repo connection
const seed = new Uint8Array(32); // Your Ed25519 seed
const client = new OrisClient({
storePath: "my_genes.db",
experience: {
baseUrl: "https://experience.oris.dev",
apiKey: "your-api-key",
seed,
senderId: "agent-1",
},
});
// Push unsynced local genes to Experience Repo
const result = await client.sync.pushToHub();
console.log(`Pushed ${result.pushed} genes, ${result.failed} failed`);
// Pull community genes from Experience Repo
const imported = await client.sync.pullFromHub();
console.log(`Imported ${imported} new genes`);
// Push specific genes only
await client.sync.pushToHub({ geneIds: ["retry-backoff-1", "cache-warm-2"] });
// Pull with filters
await client.sync.pullFromHub({
q: "error-handling",
minConfidence: 0.85,
limit: 50,
});
// Check sync history
const logs = client.sync.getSyncLog(20);
logs.forEach((l) => console.log(` ${l.direction} ${l.geneId}: ${l.status}`));
client.close();
Store API Reference (LocalStore & MySQLStore)
| Method | Description | Returns |
|---|---|---|
save(gene) | Insert or upsert a gene (by gene_id) | void |
get(id) | Retrieve a gene by ID | Gene | null |
query(opts) | Filter by task_class, min_confidence, search text, with pagination | Gene[] |
delete(id) | Remove a gene permanently | void |
updateStats(id, used, success) | Increment use_count (and success_count if success) | void |
getUnsynced() | Get all local genes not yet pushed to Hub | Gene[] |
markSynced(id, time) | Mark a gene as synced with timestamp | void |
getSyncLog(limit) | Get recent sync operation history | SyncLogEntry[] |
Gene Data Model
| Field | Type | Description |
|---|---|---|
geneId | string | Unique identifier |
name | string | Human-readable name |
taskClass | string | Category (e.g. "error-handling", "caching", "testing") |
confidence | float [0,1] | How reliable this gene is (higher = more trusted) |
strategy | JSON | The actual approach/algorithm (optional) |
signals | JSON | Input signals that trigger this gene (optional) |
validation | JSON | Validation results/evidence (optional) |
qualityScore | float [0,1] | Quality metric from evaluators |
useCount | int | Total times this gene was applied |
successCount | int | Times it led to a successful outcome |
contributorId | string | Node/agent that created this gene |
source | "local" | "hub" | Where this gene came from |
syncedAt | datetime? | Last sync timestamp (null if never synced) |
createdAt | datetime | Creation time |
updatedAt | datetime | Last modification time |
Direct Remote Clients (Advanced)
For advanced use cases where you need direct access to Hub, Execution Runtime, or Experience Repo without local storage:
import (
"github.com/Colin4k1024/Oris/sdks/go/hub"
"github.com/Colin4k1024/Oris/sdks/go/execution"
"github.com/Colin4k1024/Oris/sdks/go/experience"
)
// Hub — register a node
seed := [32]byte{...} // Ed25519 seed
h := hub.New(hub.Config{BaseURL: "http://hub:8080", APIKey: "key", Seed: seed, NodeID: "n1"})
resp, _ := h.Register("http://my-node:9000", []string{"evolve"}, "0.1.0")
// Execution — run a job
e := execution.New(execution.Config{BaseURL: "http://exec:8080", Token: "tok"})
job, _ := e.RunJob("thread-1", map[string]any{"task": "hello"})
// Experience — share a gene
exp := experience.New(experience.Config{BaseURL: "http://exp:8080", APIKey: "ak", Seed: seed, SenderID: "agent-1"})
gene, _ := exp.Share(map[string]any{"gene_id": "g1", "confidence": 0.9})
from oris_sdk import HubClient, HubConfig, ExecutionClient, ExecutionConfig
from oris_sdk import ExperienceClient, ExperienceConfig
# Hub — register a node
hub = HubClient(HubConfig(base_url="http://hub:8080", api_key="key",
seed=b"32-byte-ed25519-seed-here.......", node_id="n1"))
hub.register(endpoint="http://my-node:9000", capabilities=["evolve"], version="0.1.0")
# Execution — run a job
exe = ExecutionClient(ExecutionConfig(base_url="http://exec:8080", token="tok"))
job = exe.run_job(thread_id="thread-1", input={"task": "hello"})
# Experience — share a gene
exp = ExperienceClient(ExperienceConfig(base_url="http://exp:8080", api_key="ak",
seed=b"32-byte-ed25519-seed-here.......", sender_id="agent-1"))
gene = exp.share({"gene_id": "g1", "confidence": 0.9})
import { HubClient, ExecutionClient, ExperienceClient } from "@colin4k1024/oris-sdk";
// Hub — register a node
const seed = new Uint8Array(32); // Ed25519 seed
const hub = new HubClient({ baseUrl: "http://hub:8080", apiKey: "key", seed, nodeId: "n1" });
const reg = await hub.register("http://my-node:9000", ["evolve"], "0.1.0");
// Execution — run a job
const exe = new ExecutionClient({ baseUrl: "http://exec:8080", token: "tok" });
const job = await exe.runJob("thread-1", { task: "hello" });
// Experience — share a gene
const exp = new ExperienceClient({ baseUrl: "http://exp:8080", apiKey: "ak", seed, senderId: "agent-1" });
const gene = await exp.share({ gene_id: "g1", confidence: 0.9 });
23 library crates — include only what your project needs via feature flags.
| Crate | Purpose | Maturity | Feature Flag |
|---|---|---|---|
oris-runtime | Main facade: agents, graphs, tools, RAG, multi-step execution | stable | — |
oris-kernel | Deterministic execution: event log, replay, snapshot, K1–K5 | stable | — |
oris-evolution | Core types: Gene, Capsule, EvolutionEvent, Pipeline, Confidence, Task Classes | stable | evolution-experimental |
oris-evokernel | Self-evolving kernel orchestration — highest fan-in, 11 workspace deps | stable | full-evolution-experimental |
oris-execution-runtime | Control plane: scheduler, lease manager, repositories, circuit breaker, crash recovery | stable | — |
oris-execution-server | Graph-aware HTTP execution server (Axum) | stable | execution-server |
oris-sandbox | OS-level isolated mutation execution with resource budgets | stable | evolution-experimental |
oris-mutation-evaluator | Two-phase quality evaluator: static analysis gate + LLM critic | stable | evolution-experimental |
oris-genestore | SQLite-based Gene and Capsule persistence with full metadata | stable | — |
oris-governor | Promotion, cooldown, and revocation policies | stable | governor-experimental |
oris-intake | Issue intake, deduplication, prioritization, webhook support, CI failure parsing | stable | — |
oris-evolution-network | OEN envelope, gossip sync, Ed25519 signing, rate-limited PKI registry | experimental | evolution-network-experimental |
oris-experience-repo | HTTP API: gene/capsule sharing, Ed25519 OEN verification, PKI key service | v0.3.0 | standalone |
oris-hub | Experience Hub: node registry, discovery, federation, subscriptions, dashboard | stable | standalone |
oris-orchestrator | Autonomous loop, release automation, GitHub delivery, task planning | experimental | release-automation-experimental |
oris-spec | OUSL YAML spec contracts and compilers | experimental | spec-experimental |
oris-agent-contract | External agent proposal contracts (proposal-only interface) | stable | agent-contract-experimental |
oris-economics | Local EVU ledger and reputation accounting | experimental | economics-experimental |
All flags are on oris-runtime unless otherwise noted. Use full-evolution-experimental to enable all evolution capabilities.
evolution-experimentalevokernel-facadeoris-evokernel — base for the full evolution stackgovernor-experimentalevolution-network-experimentaleconomics-experimentalspec-experimentalagent-contract-experimentalfull-evolution-experimentalsqlite-persistencepostgreskernel-postgressurrealdb · qdrantsqlite-vss · sqlite-vecin-memoryopensearch · pinecone · weaviatechroma · mongodb · milvus · faissollamahttp://localhost:11434geminimistralaibedrocklopdf · pdf-extractgit · aws-s3 · githubfastembedflashranktree-sitterexecution-servermcp-experimentalexecution-server)a2a-productionbrowser-use