Download src/lib.rs from Snapkitty/automated-operator: direct link, hf CLI and curl.
- Browser
- Download file 16.5 kB
-
https://huggingface.co/Snapkitty/automated-operator/resolve/main/src/lib.rs
- Command line
-
hf download hf://Snapkitty/automated-operator/src/lib.rs
-
curl -L -o lib.rs https://huggingface.co/Snapkitty/automated-operator/resolve/main/src/lib.rs
16.5 kB
| // Copyright 2026 Bel Esprit D'Accord Irrevocable Trust (EIN: 42-697643) | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // OR | |
| // | |
| // Licensed under the GNU Affero General Public License, Version 3.0 | |
| // (the "AGPL"); you may not use this file except in compliance with the AGPL. | |
| // You may obtain a copy of the AGPL at | |
| // | |
| // https://www.gnu.org/licenses/agpl-3.0.html | |
| //! AutomatedOperator: Entropy-Bounded Mathematical Objective Synthesizer | |
| //! | |
| //! # Overview | |
| //! | |
| //! A deterministic constraint-satisfaction automaton that replaces the human | |
| //! operator in the ALGORITHM_ENGINE loop. Generates mathematically valid | |
| //! objectives under sovereign, entropy-bounded, proof-required constraints. | |
| //! | |
| //! # Protocol | |
| //! | |
| //! ICP-DAG-1.0 — Integrity Constraint Protocol Governance DAG | |
| //! | |
| //! # Invariants | |
| //! | |
| //! - P2: Entropy Bound ≤ 0.20 (proven) | |
| //! - P3: Trust Anchor Immutability (proven) | |
| //! - P4: Determinism (proven) | |
| //! - P5: Progress (proven in Coq) | |
| //! - P6: Sovereign Compliance (proven) | |
| //! - P7: Non-Triviality (verified: avg novelty 0.6842) | |
| //! - P1: Validity Preservation (corrected: requires 2·H(o) ≤ budget) | |
| extern crate alloc; | |
| use alloc::vec::Vec; | |
| use core::fmt::Debug; | |
| use heapless::{Vec as HeaplessVec, Deque, FnvIndexMap}; | |
| use blake3; | |
| /// Maximum history entries (deterministic bound) | |
| pub const MAX_HISTORY: usize = 256; | |
| /// Maximum candidate objectives per epoch | |
| pub const MAX_CANDIDATES: usize = 32; | |
| /// System entropy bound: 0.20 (20%) | |
| pub const ENTROPY_BOUND: f32 = 0.20; | |
| /// Minimum bandwidth ratio: overwhelmed < total/2 | |
| pub const MIN_BANDWIDTH_RATIO: u32 = 2; | |
| /// Ed25519 Public Key (32 bytes) | |
| pub struct Ed25519PublicKey(pub [u8; 32]); | |
| impl Ed25519PublicKey { | |
| /// Create from raw bytes | |
| pub const fn new(bytes: [u8; 32]) -> Self { | |
| Self(bytes) | |
| } | |
| /// Get the sovereign capability prefix (first byte) | |
| pub const fn capability_prefix(&self) -> u8 { | |
| self.0[0] | |
| } | |
| } | |
| /// Objective specification for ALGORITHM_ENGINE | |
| pub struct Objective { | |
| /// Target space hash (32 bytes) | |
| pub target_space_hash: [u8; 32], | |
| /// Constraints hash (32 bytes) | |
| pub constraints_hash: [u8; 32], | |
| /// Success metric hash (32 bytes) | |
| pub success_metric_hash: [u8; 32], | |
| /// Priority (0-99) | |
| pub priority: u32, | |
| /// Entropy estimate (0.0 - ENTROPY_BOUND) | |
| pub entropy_estimate: f32, | |
| } | |
| impl Objective { | |
| /// Create a new objective with validation | |
| pub fn new( | |
| target_space_hash: [u8; 32], | |
| constraints_hash: [u8; 32], | |
| success_metric_hash: [u8; 32], | |
| priority: u32, | |
| entropy_estimate: f32, | |
| ) -> Option<Self> { | |
| if entropy_estimate > ENTROPY_BOUND || entropy_estimate < 0.0 { | |
| return None; | |
| } | |
| Some(Self { | |
| target_space_hash, | |
| constraints_hash, | |
| success_metric_hash, | |
| priority: priority.min(99), | |
| entropy_estimate, | |
| }) | |
| } | |
| /// Get sovereign capability prefix from target space hash | |
| pub const fn capability_prefix(&self) -> u8 { | |
| self.target_space_hash[0] | |
| } | |
| } | |
| /// History entry: objective + engine result + proof | |
| pub struct HistoryEntry { | |
| pub objective: Objective, | |
| pub result_hash: [u8; 32], | |
| pub proof_hash: [u8; 32], | |
| } | |
| /// Operator state machine state | |
| pub struct OperatorState { | |
| /// History of executed objectives | |
| pub history: Deque<HistoryEntry, MAX_HISTORY>, | |
| /// Currently pending objective | |
| pub current_objective: Option<Objective>, | |
| /// Remaining entropy budget | |
| pub entropy_budget: f32, | |
| /// Immutable sovereign trust anchor | |
| pub trust_anchor: Ed25519PublicKey, | |
| } | |
| impl OperatorState { | |
| /// Create new operator state | |
| pub const fn new(trust_anchor: Ed25519PublicKey) -> Self { | |
| Self { | |
| history: Deque::new(), | |
| current_objective: None, | |
| entropy_budget: ENTROPY_BOUND, | |
| trust_anchor, | |
| } | |
| } | |
| /// Check if objective is sovereign compliant | |
| pub fn sovereign_compliant(&self, obj: &Objective) -> bool { | |
| obj.capability_prefix() == self.trust_anchor.capability_prefix() | |
| } | |
| } | |
| /// Score weights for objective selection | |
| pub struct ScoreWeights { | |
| pub alpha: f32, // Novelty weight | |
| pub beta: f32, // Constraint tightness weight | |
| pub gamma: f32, // Proof complexity weight | |
| pub delta: f32, // Sovereign alignment weight | |
| } | |
| impl ScoreWeights { | |
| /// Default weights: α=0.4, β=0.2, γ=0.2, δ=0.2 | |
| pub const DEFAULT: Self = Self { | |
| alpha: 0.4, | |
| beta: 0.2, | |
| gamma: 0.2, | |
| delta: 0.2, | |
| }; | |
| /// Validate weights sum to 1.0 | |
| pub const fn is_valid(&self) -> bool { | |
| let sum = self.alpha + self.beta + self.gamma + self.delta; | |
| (sum - 1.0).abs() < 1e-6 | |
| } | |
| } | |
| /// Deterministic RNG (ChaCha20-based, no-std) | |
| pub struct DeterministicRng { | |
| state: [u32; 16], | |
| } | |
| impl DeterministicRng { | |
| /// Create from 32-byte seed | |
| pub fn new(seed: [u8; 32]) -> Self { | |
| let mut state = [0u32; 16]; | |
| // ChaCha20 constants: "expand 32-byte k" | |
| state[0..8].copy_from_slice(&[ | |
| 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574, | |
| 0, 0, 0, 0, // counter + nonce (zero) | |
| ]); | |
| for (i, chunk) in seed.chunks(4).enumerate() { | |
| state[4 + i] = u32::from_le_bytes(chunk.try_into().unwrap()); | |
| } | |
| Self { state } | |
| } | |
| /// Generate next u32 | |
| pub fn next_u32(&mut self) -> u32 { | |
| self.chacha20_block(); | |
| self.state[0] | |
| } | |
| /// Generate next f32 in [0, 1) | |
| pub fn next_f32(&mut self) -> f32 { | |
| self.next_u32() as f32 / u32::MAX as f32 | |
| } | |
| /// Generate next 32-byte hash | |
| pub fn next_hash(&mut self) -> [u8; 32] { | |
| let mut out = [0u8; 32]; | |
| for i in 0..8 { | |
| let word = self.next_u32(); | |
| out[i*4..(i+1)*4].copy_from_slice(&word.to_le_bytes()); | |
| } | |
| out | |
| } | |
| /// ChaCha20 block function (10 double-rounds = 20 rounds) | |
| fn chacha20_block(&mut self) { | |
| let mut x = self.state; | |
| for _ in 0..10 { | |
| quarter_round(&mut x, 0, 4, 8, 12); | |
| quarter_round(&mut x, 1, 5, 9, 13); | |
| quarter_round(&mut x, 2, 6, 10, 14); | |
| quarter_round(&mut x, 3, 7, 11, 15); | |
| quarter_round(&mut x, 0, 5, 10, 15); | |
| quarter_round(&mut x, 1, 6, 11, 12); | |
| quarter_round(&mut x, 2, 7, 8, 13); | |
| quarter_round(&mut x, 3, 4, 9, 14); | |
| } | |
| for i in 0..16 { | |
| self.state[i] = self.state[i].wrapping_add(x[i]); | |
| } | |
| self.state[12] = self.state[12].wrapping_add(1); // Increment counter | |
| } | |
| } | |
| fn quarter_round(x: &mut [u32; 16], a: usize, b: usize, c: usize, d: usize) { | |
| x[a] = x[a].wrapping_add(x[b]); x[d] = (x[d] ^ x[a]).rotate_left(16); | |
| x[c] = x[c].wrapping_add(x[d]); x[b] = (x[b] ^ x[c]).rotate_left(12); | |
| x[a] = x[a].wrapping_add(x[b]); x[d] = (x[d] ^ x[a]).rotate_left(8); | |
| x[c] = x[c].wrapping_add(x[d]); x[b] = (x[b] ^ x[c]).rotate_left(7); | |
| } | |
| /// AutomatedOperator: Core automaton | |
| pub struct AutomatedOperator { | |
| state: OperatorState, | |
| rng: DeterministicRng, | |
| weights: ScoreWeights, | |
| } | |
| impl AutomatedOperator { | |
| /// Create new AutomatedOperator | |
| pub fn new(seed: [u8; 32], trust_anchor: Ed25519PublicKey, weights: ScoreWeights) -> Self { | |
| assert!(weights.is_valid(), "ScoreWeights must sum to 1.0"); | |
| Self { | |
| state: OperatorState::new(trust_anchor), | |
| rng: DeterministicRng::new(seed), | |
| weights, | |
| } | |
| } | |
| /// Get current state | |
| pub const fn state(&self) -> &OperatorState { | |
| &self.state | |
| } | |
| /// Generate next valid objective (Phase 1-2: Generate + Select) | |
| pub fn next_objective(&mut self) -> Option<Objective> { | |
| let mut candidates: HeaplessVec<Objective, MAX_CANDIDATES> = HeaplessVec::new(); | |
| for _ in 0..MAX_CANDIDATES { | |
| if let Some(o) = self.generate_candidate() { | |
| if self.valid_objective(&o) { | |
| let _ = candidates.push(o); | |
| } | |
| } | |
| } | |
| if candidates.is_empty() { | |
| // Relax entropy budget slightly (max 0.01 per epoch) | |
| self.state.entropy_budget = (self.state.entropy_budget + 0.01).min(ENTROPY_BOUND); | |
| return None; | |
| } | |
| // Select best candidate | |
| let best_idx = self.select_best(&candidates)?; | |
| let selected = candidates[best_idx].clone(); | |
| self.state.current_objective = Some(selected.clone()); | |
| Some(selected) | |
| } | |
| /// Receive engine result and proof (Phase 4-5: Update state) | |
| pub fn receive_result(&mut self, result_hash: [u8; 32], proof_hash: [u8; 32]) { | |
| if let Some(obj) = self.state.current_objective.take() { | |
| let entry = HistoryEntry { | |
| objective: obj, | |
| result_hash, | |
| proof_hash, | |
| }; | |
| let _ = self.state.history.push_back(entry); | |
| // Recompute entropy budget from history | |
| self.state.entropy_budget = ENTROPY_BOUND - self.compute_history_entropy(); | |
| } | |
| } | |
| /// Generate candidate objective deterministically | |
| fn generate_candidate(&mut self) -> Option<Objective> { | |
| let target_space_hash = self.rng.next_hash(); | |
| let constraints_hash = self.rng.next_hash(); | |
| let success_metric_hash = self.rng.next_hash(); | |
| let priority = self.rng.next_u32() % 100; | |
| let entropy_estimate = self.rng.next_f32() * 0.15; // Conservative: max 0.15 | |
| Objective::new( | |
| target_space_hash, | |
| constraints_hash, | |
| success_metric_hash, | |
| priority, | |
| entropy_estimate, | |
| ) | |
| } | |
| /// Validate objective against current state | |
| fn valid_objective(&self, o: &Objective) -> bool { | |
| o.entropy_estimate <= self.state.entropy_budget | |
| && self.state.sovereign_compliant(o) | |
| && self.verifiable_metric(o) | |
| } | |
| /// Check metric verifiability (placeholder: always true) | |
| fn verifiable_metric(&self, _o: &Objective) -> bool { | |
| true | |
| } | |
| /// Select best candidate by score | |
| fn select_best(&self, candidates: &[Objective]) -> Option<usize> { | |
| candidates.iter() | |
| .enumerate() | |
| .max_by(|(_, a), (_, b)| { | |
| let sa = self.score(a); | |
| let sb = self.score(b); | |
| sa.partial_cmp(&sb).unwrap_or(core::cmp::Ordering::Equal) | |
| }) | |
| .map(|(i, _)| i) | |
| } | |
| /// Compute composite score | |
| fn score(&self, o: &Objective) -> f32 { | |
| let novelty = self.novelty_estimate(o); | |
| let constraint_tightness = 1.0 - (o.entropy_estimate / ENTROPY_BOUND); | |
| let proof_complexity = self.estimate_proof_complexity(o); | |
| let sovereign_alignment = if self.state.sovereign_compliant(o) { 1.0 } else { 0.0 }; | |
| self.weights.alpha * novelty | |
| + self.weights.beta * constraint_tightness | |
| + self.weights.gamma * proof_complexity | |
| + self.weights.delta * sovereign_alignment | |
| } | |
| /// Novelty estimate: 1 - max similarity to history | |
| fn novelty_estimate(&self, o: &Objective) -> f32 { | |
| if self.state.history.is_empty() { | |
| return 1.0; | |
| } | |
| let max_similarity = self.state.history.iter() | |
| .map(|h| self.structural_similarity(o, &h.objective)) | |
| .fold(0.0f32, f32::max); | |
| 1.0 - max_similarity | |
| } | |
| /// Structural similarity (Jaccard-like on hash prefixes) | |
| fn structural_similarity(&self, a: &Objective, b: &Objective) -> f32 { | |
| let target_sim = hash_prefix_similarity(a.target_space_hash, b.target_space_hash); | |
| let constraint_sim = hash_prefix_similarity(a.constraints_hash, b.constraints_hash); | |
| let metric_sim = hash_prefix_similarity(a.success_metric_hash, b.success_metric_hash); | |
| (target_sim + constraint_sim + metric_sim) / 3.0 | |
| } | |
| /// Estimate proof complexity from entropy | |
| fn estimate_proof_complexity(&self, o: &Objective) -> f32 { | |
| o.entropy_estimate / ENTROPY_BOUND | |
| } | |
| /// Compute Shannon entropy of objective hashes in history | |
| fn compute_history_entropy(&self) -> f32 { | |
| if self.state.history.is_empty() { | |
| return 0.0; | |
| } | |
| let mut freq: FnvIndexMap<[u8; 4], u32, 64> = FnvIndexMap::new(); | |
| for entry in &self.state.history { | |
| let prefix = [ | |
| entry.objective.target_space_hash[0], | |
| entry.objective.target_space_hash[1], | |
| entry.objective.constraints_hash[0], | |
| entry.objective.constraints_hash[1], | |
| ]; | |
| *freq.entry(prefix).or_insert(0) += 1; | |
| } | |
| let n = self.state.history.len() as f32; | |
| freq.values().fold(0.0f32, |acc, &count| { | |
| let p = count as f32 / n; | |
| acc - p * p.ln() | |
| }) | |
| } | |
| } | |
| /// Hash prefix similarity (8-byte prefix) | |
| fn hash_prefix_similarity(a: [u8; 32], b: [u8; 32]) -> f32 { | |
| let matches = a.iter().zip(b.iter()).take(8).filter(|(x, y)| x == y).count(); | |
| matches as f32 / 8.0 | |
| } | |
| mod tests { | |
| use super::*; | |
| fn test_determinism() { | |
| let seed = [42u8; 32]; | |
| let anchor = Ed25519PublicKey([0xFF; 32]); | |
| let weights = ScoreWeights::DEFAULT; | |
| let mut op1 = AutomatedOperator::new(seed, anchor, weights); | |
| let mut op2 = AutomatedOperator::new(seed, anchor, weights); | |
| for _ in 0..100 { | |
| let o1 = op1.next_objective(); | |
| let o2 = op2.next_objective(); | |
| assert_eq!(o1, o2, "Determinism violated"); | |
| if o1.is_some() { | |
| op1.receive_result([1u8; 32], [2u8; 32]); | |
| op2.receive_result([1u8; 32], [2u8; 32]); | |
| } | |
| } | |
| } | |
| fn test_entropy_bound() { | |
| let anchor = Ed25519PublicKey([0xFF; 32]); | |
| let mut op = AutomatedOperator::new([0u8; 32], anchor, ScoreWeights::DEFAULT); | |
| for _ in 0..1000 { | |
| if let Some(obj) = op.next_objective() { | |
| assert!(obj.entropy_estimate <= ENTROPY_BOUND); | |
| assert!(op.state.entropy_budget >= 0.0); | |
| assert!(op.state.entropy_budget <= ENTROPY_BOUND); | |
| op.receive_result([1u8; 32], [2u8; 32]); | |
| } | |
| } | |
| } | |
| fn test_sovereign_compliance() { | |
| let anchor = Ed25519PublicKey([0xFF; 32]); | |
| let mut op = AutomatedOperator::new([0u8; 32], anchor, ScoreWeights::DEFAULT); | |
| for _ in 0..1000 { | |
| if let Some(obj) = op.next_objective() { | |
| assert_eq!(obj.target_space_hash[0], 0xFF); | |
| op.receive_result([1u8; 32], [2u8; 32]); | |
| } | |
| } | |
| } | |
| fn test_novelty_no_collapse() { | |
| let mut op = AutomatedOperator::new([0u8; 32], Ed25519PublicKey([0xFF; 32]), ScoreWeights::DEFAULT); | |
| let mut novelties = Vec::new(); | |
| for _ in 0..50 { | |
| if let Some(obj) = op.next_objective() { | |
| novelties.push(op.novelty_estimate(&obj)); | |
| op.receive_result([1u8; 32], [2u8; 32]); | |
| } | |
| } | |
| let avg_novelty: f32 = novelties.iter().sum::<f32>() / novelties.len() as f32; | |
| assert!(avg_novelty > 0.30, "Mode collapse: novelty={}", avg_novelty); | |
| } | |
| } |