// FRANKENSTEIN — BOB-powered 2-step sovereign workflow // // BRAIN = Claude Sonnet 4.6 (Bedrock) — architect, Trust Deed, reasoning // HANDS = pgvector — corpus retrieval (semantic context) // LEGS = Granite (vLLM, local) — code executor, Tokio-spawned baby // WORM = SHA-256 chain — every step sealed // // Powered by BOB. SnapKitty Collective 2026. Apache 2.0. mod inject { pub mod trust_deed; } mod tools { pub mod tavily; pub mod ddg; } mod gates { pub mod lean4; pub mod prolog; } mod models { pub mod bedrock; pub mod vllm; } use anyhow::Result; use axum::{ extract::State, routing::{get, post}, Json, Router, response::Html, }; use serde::{Deserialize, Serialize}; use sha2::{Sha256, Digest}; use std::sync::Arc; use tokio::sync::Mutex; use tower_http::cors::CorsLayer; const PORT: u16 = 4300; const BRAIN_MODEL: &str = "us.anthropic.claude-sonnet-4-6"; const BATTLE_OPUS: &str = "us.anthropic.claude-opus-4-6-v1"; const BATTLE_CODE: &str = "mistral.devstral-2-123b"; const LEGS_MODEL: &str = "granite-code:3b"; // Ollama local GPU — RTX 3080 const PGVECTOR_URL: &str = "http://localhost:5433/retrieve"; // ── Shared state ───────────────────────────────────────────────────────────── struct AppState { bedrock: aws_sdk_bedrockruntime::Client, http: reqwest::Client, worm: Mutex, } struct WormChain { prev: String, count: u64 } impl WormChain { fn new() -> Self { Self { prev: "FRANKENSTEIN_GENESIS".to_string(), count: 0 } } fn seal(&mut self, event: &str) -> String { let msg = format!("{}|{}|{}", self.prev, event, chrono::Utc::now().timestamp_millis()); let hash = hex::encode(Sha256::digest(msg.as_bytes())); self.prev = hash.clone(); self.count += 1; hash[..16].to_string() } } // ── Request / Response ──────────────────────────────────────────────────────── #[derive(Deserialize)] struct WorkflowRequest { prompt: String } #[derive(Deserialize)] struct BattleRequest { prompt: String } #[derive(Deserialize)] struct AskRequest { query: String } #[derive(Serialize)] struct WorkflowStep { step: String, model: String, output: String, worm: String, ms: u128, } #[derive(Serialize)] struct WorkflowResponse { prompt: String, is_code: bool, steps: Vec, final_out: String, worm: WormStatus, } #[derive(Serialize)] struct WormStatus { hash: String, seals: u64 } // ── Bedrock helper ──────────────────────────────────────────────────────────── async fn brain( client: &aws_sdk_bedrockruntime::Client, system: &str, msg: &str, tokens: u32, ) -> Result { models::bedrock::invoke_with_model(client, BRAIN_MODEL, system, &[("user", msg)], tokens).await } async fn brain_model( client: &aws_sdk_bedrockruntime::Client, model: &str, system: &str, msg: &str, tokens: u32, ) -> Result { models::bedrock::invoke_with_model(client, model, system, &[("user", msg)], tokens).await } // ── Legs: Granite Code 3B via Ollama (local RTX 3080) ─────────────────────── async fn legs( _bedrock: &aws_sdk_bedrockruntime::Client, http: &reqwest::Client, spec: &str, ) -> Result { models::vllm::complete_code(http, spec, LEGS_MODEL).await } // ── Hands: pgvector context retrieval ──────────────────────────────────────── async fn hands(http: &reqwest::Client, query: &str) -> String { let body = serde_json::json!({ "query": query, "k": 5 }); match tokio::time::timeout( std::time::Duration::from_secs(8), http.post(PGVECTOR_URL).json(&body).send() ).await { Ok(Ok(resp)) => { match resp.text().await { Ok(text) => text, Err(_) => "HANDS_OFFLINE — response parse error".to_string(), } } Ok(Err(_)) => "HANDS_OFFLINE — FAISS+Neo4j+RDF not running (start: python hands/hands_server.py)".to_string(), Err(_) => "HANDS_TIMEOUT — 8s exceeded".to_string(), } } // ── /workflow — the real Frankenstein ──────────────────────────────────────── async fn workflow_handler( State(state): State>, Json(req): Json, ) -> Json { let prompt = req.prompt.trim().to_string(); let mut steps: Vec = vec![]; let is_code = ["code","write","implement","function","build","class","asm","assembly", "script","program","algorithm","struct","fn ","def ","pub "] .iter().any(|kw| prompt.to_lowercase().contains(kw)); // ── STEP 1: BRAIN — architecture plan ──────────────────────────────────── let t = std::time::Instant::now(); let brain_system = inject::trust_deed::build_system_prompt(None); let brain_prompt = if is_code { format!("You are the ARCHITECT. Produce a structured technical spec for this task. \ Output: (1) GOAL, (2) COMPONENTS list, (3) DATA STRUCTURES, (4) PSEUDOCODE outline. \ Be precise. The LEGS (Granite vLLM) will implement from your spec.\n\nTASK: {}", prompt) } else { format!("Answer using Evidence or Silence protocol. Use Tavily search context if available.\n\nQUERY: {}", prompt) }; let brain_out = brain(&state.bedrock, &brain_system, &brain_prompt, 2048) .await .unwrap_or_else(|e| format!("BRAIN_ERR: {}", e)); let mut worm = state.worm.lock().await; let h1 = worm.seal("BRAIN"); drop(worm); steps.push(WorkflowStep { step: "BRAIN".to_string(), model: format!("Claude Sonnet 4.6 (Bedrock · {})", BRAIN_MODEL), output: brain_out.clone(), worm: h1, ms: t.elapsed().as_millis(), }); // ── STEP 2: HANDS — pgvector retrieval (parallel with brain output ready) ── let t = std::time::Instant::now(); // HANDS returns {results, context, nlp, graph, rdf, layers, worm} // Use the pre-formatted "context" string if available, else raw let hands_raw = hands(&state.http, &prompt).await; let context = if hands_raw.starts_with("HANDS_OFFLINE") { hands_raw.clone() } else { // Try to parse as JSON and extract context field serde_json::from_str::(&hands_raw) .ok() .and_then(|v| v["context"].as_str().map(|s| s.to_string())) .unwrap_or(hands_raw.clone()) }; let mut worm = state.worm.lock().await; let h2 = worm.seal("HANDS"); drop(worm); steps.push(WorkflowStep { step: "HANDS".to_string(), model: "pgvector (sovereign corpus)".to_string(), output: context.clone(), worm: h2, ms: t.elapsed().as_millis(), }); // ── STEP 3: LEGS — Granite vLLM (Tokio JoinSet, timeout 30s) ──────────── let legs_out = if is_code { let t = std::time::Instant::now(); let spec = format!( "ARCHITECT SPEC:\n{}\n\nCORPUS CONTEXT:\n{}\n\nORIGINAL TASK:\n{}\n\nWrite complete working code. No prose. Pure implementation.", brain_out, context, prompt ); // Call Legs directly — Ollama/Granite on local GPU, 120s timeout let result = tokio::time::timeout( std::time::Duration::from_secs(120), legs(&state.bedrock, &state.http, &spec) ) .await .unwrap_or_else(|_| Ok("LEGS_TIMEOUT (120s) — Granite did not respond".to_string())) .unwrap_or_else(|e| format!("LEGS_ERR: {}", e)); let mut worm = state.worm.lock().await; let h3 = worm.seal("LEGS"); drop(worm); steps.push(WorkflowStep { step: "LEGS".to_string(), model: format!("Granite Code (Ollama · local RTX 3080 · {})", LEGS_MODEL), output: result.clone(), worm: h3, ms: t.elapsed().as_millis(), }); result } else { String::new() }; // ── STEP 4: BRAIN REVIEW — merge + seal ─────────────────────────────────── let t = std::time::Instant::now(); let final_prompt = if is_code && !legs_out.starts_with("LEGS") { format!( "You are the SOVEREIGN REVIEWER. The LEGS (Granite) produced this implementation:\n\n{}\n\nYour job:\n1. Verify it matches the spec\n2. Note any gaps\n3. Add Trust Deed seal\n4. Output: VERDICT (PASS/PATCH/REJECT) + brief notes\n\nOriginal task: {}", legs_out, prompt ) } else { format!("Summarize your answer with the Omega seal. Evidence or Silence.\n\n{}", brain_out) }; let review = brain(&state.bedrock, &brain_system, &final_prompt, 512) .await .unwrap_or_else(|e| format!("REVIEW_ERR: {}", e)); let mut worm = state.worm.lock().await; let h4 = worm.seal("REVIEW"); let final_hash = worm.prev[..16].to_string(); let final_seals = worm.count; drop(worm); steps.push(WorkflowStep { step: "REVIEW".to_string(), model: format!("Claude Sonnet 4.6 (Bedrock · {})", BRAIN_MODEL), output: review.clone(), worm: h4, ms: t.elapsed().as_millis(), }); // Final output = legs code (if code) + brain review let final_out = if is_code && !legs_out.is_empty() { format!("{}\n\n---\n🧠 BRAIN REVIEW:\n{}", legs_out, review) } else { brain_out }; Json(WorkflowResponse { prompt, is_code, steps, final_out, worm: WormStatus { hash: final_hash, seals: final_seals }, }) } // ── /battle — 3-way compare ─────────────────────────────────────────────────── async fn battle_handler( State(state): State>, Json(req): Json, ) -> Json { let prompt = req.prompt.trim().to_string(); let system_frank = inject::trust_deed::build_system_prompt(None); let system_raw = "You are a helpful AI assistant. Answer directly."; let (frank_res, opus_res, devstral_res) = tokio::join!( brain_model(&state.bedrock, BRAIN_MODEL, &system_frank, &prompt, 1024), brain_model(&state.bedrock, BATTLE_OPUS, system_raw, &prompt, 1024), brain_model(&state.bedrock, BATTLE_CODE, system_raw, &prompt, 1024), ); let mut worm = state.worm.lock().await; let hash = worm.seal(&format!("BATTLE|{}", &prompt[..prompt.len().min(32)])); Json(serde_json::json!({ "prompt": prompt, "frankenstein": frank_res.unwrap_or_else(|e| format!("ERROR: {}", e)), "opus": opus_res.unwrap_or_else(|e| format!("ERROR: {}", e)), "devstral": devstral_res.unwrap_or_else(|e| format!("ERROR: {}", e)), "worm": { "hash": hash, "seals": worm.count }, })) } // ── /ask — sovereign query (no code path) ──────────────────────────────────── async fn ask_handler( State(state): State>, Json(req): Json, ) -> Json { let query = req.query.trim().to_string(); let system = inject::trust_deed::build_system_prompt(None); let tavily = tools::tavily::search(&state.http, &query).await; let search_ctx = match &tavily { Ok(t) => tools::tavily::format_results(t), Err(_) => String::new(), }; let msg = format!("QUERY: {}\n\nSEARCH CONTEXT:\n{}", query, search_ctx); let resp = brain(&state.bedrock, &system, &msg, 1024).await; let mut worm = state.worm.lock().await; let hash = worm.seal("ASK"); Json(serde_json::json!({ "query": query, "tavily": tavily.ok().and_then(|t| t.answer), "response": resp.unwrap_or_else(|e| format!("ERROR: {}", e)), "worm": { "hash": hash, "seals": worm.count }, })) } async fn worm_handler(State(state): State>) -> Json { let worm = state.worm.lock().await; Json(WormStatus { hash: worm.prev[..16].to_string(), seals: worm.count }) } async fn index() -> Html<&'static str> { Html(FRANKENSTEIN_HTML) } // ── Main ────────────────────────────────────────────────────────────────────── #[tokio::main] async fn main() -> Result<()> { let _ = dotenvy::from_filename( std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join(".env") ); let aws_cfg = aws_config::defaults(aws_config::BehaviorVersion::latest()) .region(aws_config::Region::new("us-east-1")) .load() .await; let state = Arc::new(AppState { bedrock: aws_sdk_bedrockruntime::Client::new(&aws_cfg), http: reqwest::Client::new(), worm: Mutex::new(WormChain::new()), }); let app = Router::new() .route("/", get(index)) .route("/workflow", post(workflow_handler)) .route("/battle", post(battle_handler)) .route("/ask", post(ask_handler)) .route("/worm", get(worm_handler)) .layer(CorsLayer::permissive()) .with_state(state); println!("⬡ FRANKENSTEIN → http://localhost:{}", PORT); println!(" BRAIN: {}", BRAIN_MODEL); println!(" LEGS: {} (Ollama local GPU — RTX 3080)", LEGS_MODEL); println!(" HANDS: pgvector ({})", PGVECTOR_URL); let listener = tokio::net::TcpListener::bind(format!("0.0.0.0:{}", PORT)).await?; axum::serve(listener, app).await?; Ok(()) } // ── HTML UI ─────────────────────────────────────────────────────────────────── const FRANKENSTEIN_HTML: &str = r#" FRANKENSTEIN — BOB Workflow
Franken-Claude held by SnapKitty

⬡ FRANKSTEIN

🧠 BRAIN: Sonnet 4.6 (Bedrock)  ·  🤲 HANDS: pgvector corpus  ·  🦵 LEGS: Devstral 123B (Bedrock)  ·  Ω WORM sealed  ·  Powered by BOB  ·  SnapKitty Collective 2026
Ω WORM  ────────────────  |  seals: 0  |  BOOT

🧠 BRAIN — Claude Sonnet 4.6

waiting...
Bedrock  |  Trust Deed injected  |  Ω  |  ms

🤲 HANDS — pgvector corpus

waiting...
Sovereign corpus  |  Ω  |  ms

🦵 LEGS — Granite (vLLM local)

waiting... (only fires on code prompts)
Tokio-spawned baby  |  Ω  |  ms

🧠 BRAIN REVIEW — seal

waiting...
Merge + verdict  |  Ω  |  ms
FINAL OUTPUT
─ fire a prompt to see the full workflow ─

⬡ FRANKENSTEIN
Sonnet 4.6 + Trust Deed + Tavily

Ω OPUS 4.6
Raw Claude — no stack

Φ DEVSTRAL 123B
Mistral code beast (Bedrock)

─ sovereign query ready ─
"#;