Squashed 'vendor/ruvector/' content from commit b64c2172
git-subtree-dir: vendor/ruvector git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
This commit is contained in:
207
crates/rvf/rvf-runtime/examples/capability_report.rs
Normal file
207
crates/rvf/rvf-runtime/examples/capability_report.rs
Normal file
@@ -0,0 +1,207 @@
|
||||
//! Capability Report — "Prove It or It Didn't Happen"
|
||||
//!
|
||||
//! Demonstrates the full proof pipeline:
|
||||
//!
|
||||
//! 1. Define governance policy (restricted / approved / autonomous)
|
||||
//! 2. Execute tasks with policy enforcement and tool call tracing
|
||||
//! 3. Build signed witness bundles per task
|
||||
//! 4. Verify signatures and evidence completeness
|
||||
//! 5. Aggregate into a capability scorecard
|
||||
//!
|
||||
//! Zero external dependencies. Real HMAC-SHA256 signatures.
|
||||
//!
|
||||
//! Run: cargo run --example capability_report -p rvf-runtime
|
||||
|
||||
use rvf_runtime::seed_crypto;
|
||||
use rvf_runtime::witness::{GovernancePolicy, ParsedWitness, ScorecardBuilder, WitnessBuilder};
|
||||
use rvf_types::witness::*;
|
||||
|
||||
/// HMAC-SHA256 signing key (in production, load from secure storage).
|
||||
const SIGNING_KEY: &[u8] = b"capability-report-signing-key-ok";
|
||||
|
||||
fn main() {
|
||||
println!("=== Capability Report: Prove It or It Didn't Happen ===\n");
|
||||
|
||||
// --- Define the task suite ---
|
||||
let tasks = vec![
|
||||
Task {
|
||||
id: [0x01; 16],
|
||||
spec: "Fix authentication bypass in /api/login endpoint",
|
||||
plan: "1. Read auth.rs 2. Add input validation 3. Run tests",
|
||||
diff: "--- a/src/auth.rs\n+++ b/src/auth.rs\n@@ -42,6 +42,8 @@\n+ if !validate_token(token) {\n+ return Err(AuthError::InvalidToken);\n+ }",
|
||||
test_log: "test auth::login_valid ... ok\ntest auth::login_invalid ... ok\ntest auth::login_bypass ... ok\n3 passed, 0 failed",
|
||||
outcome: TaskOutcome::Solved,
|
||||
tools: vec![
|
||||
("Read", 50, 100, 500),
|
||||
("Read", 30, 80, 400),
|
||||
("Edit", 100, 200, 1000),
|
||||
("Bash", 3000, 0, 0),
|
||||
],
|
||||
},
|
||||
Task {
|
||||
id: [0x02; 16],
|
||||
spec: "Add rate limiting to /api/search endpoint",
|
||||
plan: "1. Read search.rs 2. Add rate limiter 3. Test",
|
||||
diff: "--- a/src/search.rs\n+++ b/src/search.rs\n@@ -10,3 +10,8 @@\n+ let limiter = RateLimiter::new(100, Duration::from_secs(60));\n+ limiter.check(client_ip)?;",
|
||||
test_log: "test search::rate_limit ... ok\ntest search::normal_query ... ok\n2 passed, 0 failed",
|
||||
outcome: TaskOutcome::Solved,
|
||||
tools: vec![
|
||||
("Read", 40, 90, 450),
|
||||
("Edit", 80, 180, 900),
|
||||
("Bash", 2500, 0, 0),
|
||||
],
|
||||
},
|
||||
Task {
|
||||
id: [0x03; 16],
|
||||
spec: "Implement WebSocket reconnection with exponential backoff",
|
||||
plan: "1. Read ws.rs 2. Add reconnect logic 3. Test",
|
||||
diff: "--- a/src/ws.rs\n+++ b/src/ws.rs\n@@ -50,2 +50,15 @@\n+ async fn reconnect(&mut self) -> Result<()> {\n+ for attempt in 0..5 {\n+ let delay = Duration::from_millis(100 * 2u64.pow(attempt));\n+ tokio::time::sleep(delay).await;\n+ // ...reconnect logic...\n+ }\n+ }",
|
||||
test_log: "test ws::reconnect_success ... ok\ntest ws::reconnect_max_retries ... ok\ntest ws::reconnect_backoff_timing ... FAILED\n2 passed, 1 failed",
|
||||
outcome: TaskOutcome::Failed,
|
||||
tools: vec![
|
||||
("Read", 60, 120, 600),
|
||||
("Edit", 150, 300, 1500),
|
||||
("Bash", 5000, 0, 0),
|
||||
("Edit", 100, 200, 1000),
|
||||
("Bash", 4000, 0, 0),
|
||||
],
|
||||
},
|
||||
Task {
|
||||
id: [0x04; 16],
|
||||
spec: "Refactor error handling to use thiserror derive",
|
||||
plan: "1. Read error.rs 2. Replace manual impls 3. Test",
|
||||
diff: "--- a/src/error.rs\n+++ b/src/error.rs\n@@ -1,30 +1,15 @@\n+#[derive(Debug, thiserror::Error)]\n+pub enum AppError {\n+ #[error(\"IO error: {0}\")]\n+ Io(#[from] std::io::Error),\n+}",
|
||||
test_log: "test error::display ... ok\ntest error::from_io ... ok\n2 passed, 0 failed",
|
||||
outcome: TaskOutcome::Solved,
|
||||
tools: vec![
|
||||
("Read", 30, 70, 350),
|
||||
("Edit", 90, 190, 950),
|
||||
("Bash", 1500, 0, 0),
|
||||
],
|
||||
},
|
||||
Task {
|
||||
id: [0x05; 16],
|
||||
spec: "Add CORS headers to all API responses",
|
||||
plan: "1. Read middleware.rs 2. Add CORS middleware 3. Test",
|
||||
diff: "--- a/src/middleware.rs\n+++ b/src/middleware.rs\n@@ -5,2 +5,8 @@\n+ .allow_origin(Any)\n+ .allow_methods([GET, POST, PUT, DELETE])\n+ .allow_headers(Any)",
|
||||
test_log: "test middleware::cors_preflight ... ok\ntest middleware::cors_headers ... ok\n2 passed, 0 failed",
|
||||
outcome: TaskOutcome::Solved,
|
||||
tools: vec![
|
||||
("Read", 25, 60, 300),
|
||||
("Edit", 70, 150, 750),
|
||||
("Bash", 1200, 0, 0),
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
// --- Run all three governance modes ---
|
||||
let modes = vec![
|
||||
("RESTRICTED", GovernancePolicy::restricted()),
|
||||
("APPROVED", GovernancePolicy::approved()),
|
||||
("AUTONOMOUS", GovernancePolicy::autonomous()),
|
||||
];
|
||||
|
||||
for (mode_name, policy) in &modes {
|
||||
println!("--- Governance Mode: {mode_name} ---");
|
||||
println!(" Policy hash: {:02x?}", policy.hash());
|
||||
|
||||
let mut scorecard = ScorecardBuilder::new();
|
||||
|
||||
for task in &tasks {
|
||||
let mut builder = WitnessBuilder::new(task.id, policy.clone())
|
||||
.with_spec(task.spec.as_bytes())
|
||||
.with_plan(task.plan.as_bytes())
|
||||
.with_diff(task.diff.as_bytes())
|
||||
.with_test_log(task.test_log.as_bytes())
|
||||
.with_outcome(task.outcome);
|
||||
|
||||
if task.outcome == TaskOutcome::Failed {
|
||||
builder = builder.with_postmortem(
|
||||
b"Timing-dependent test failed due to non-deterministic backoff",
|
||||
);
|
||||
}
|
||||
|
||||
let mut denials = 0u32;
|
||||
for &(tool, latency, cost, tokens) in &task.tools {
|
||||
let entry = ToolCallEntry {
|
||||
action: tool.as_bytes().to_vec(),
|
||||
args_hash: seed_crypto::seed_content_hash(tool.as_bytes()),
|
||||
result_hash: [0x00; 8],
|
||||
latency_ms: latency,
|
||||
cost_microdollars: cost,
|
||||
tokens,
|
||||
policy_check: PolicyCheck::Allowed,
|
||||
};
|
||||
let check = builder.record_tool_call(entry);
|
||||
if check == PolicyCheck::Denied {
|
||||
denials += 1;
|
||||
}
|
||||
}
|
||||
|
||||
let violations = builder.policy_violations.len() as u32;
|
||||
|
||||
let (payload, header) = builder.build_and_sign(SIGNING_KEY).unwrap();
|
||||
|
||||
// Verify.
|
||||
let parsed = ParsedWitness::parse(&payload).unwrap();
|
||||
parsed.verify_all(SIGNING_KEY, &payload).unwrap();
|
||||
|
||||
let outcome_str = match task.outcome {
|
||||
TaskOutcome::Solved => "SOLVED",
|
||||
TaskOutcome::Failed => "FAILED",
|
||||
_ => "OTHER",
|
||||
};
|
||||
|
||||
println!(
|
||||
" [{outcome_str}] {} | {} bytes | {}ms | ${:.4} | {} tools | {} denied | {} violations",
|
||||
&task.spec[..40.min(task.spec.len())],
|
||||
header.total_bundle_size,
|
||||
header.total_latency_ms,
|
||||
header.total_cost_microdollars as f64 / 1_000_000.0,
|
||||
header.tool_call_count,
|
||||
denials,
|
||||
violations,
|
||||
);
|
||||
|
||||
scorecard.add_witness(&parsed, violations, 0);
|
||||
}
|
||||
|
||||
let card = scorecard.finish();
|
||||
println!();
|
||||
println!(" Scorecard:");
|
||||
println!(" Tasks: {}", card.total_tasks);
|
||||
println!(
|
||||
" Solved: {} ({:.0}%)",
|
||||
card.solved,
|
||||
card.solve_rate * 100.0
|
||||
);
|
||||
println!(" Failed: {}", card.failed);
|
||||
println!(" Errors: {}", card.errors);
|
||||
println!(" Violations: {}", card.policy_violations);
|
||||
println!(" Rollbacks: {}", card.rollback_count);
|
||||
println!(
|
||||
" Cost/solve: ${:.4}",
|
||||
card.cost_per_solve_microdollars as f64 / 1_000_000.0
|
||||
);
|
||||
println!(" Median latency: {} ms", card.median_latency_ms);
|
||||
println!(" P95 latency: {} ms", card.p95_latency_ms);
|
||||
println!(" Total tokens: {}", card.total_tokens);
|
||||
println!(
|
||||
" Evidence: {:.0}%",
|
||||
card.evidence_coverage * 100.0
|
||||
);
|
||||
println!();
|
||||
}
|
||||
|
||||
println!("=== Report complete. Evidence > claims. ===");
|
||||
}
|
||||
|
||||
struct Task {
|
||||
id: [u8; 16],
|
||||
spec: &'static str,
|
||||
plan: &'static str,
|
||||
diff: &'static str,
|
||||
test_log: &'static str,
|
||||
outcome: TaskOutcome,
|
||||
tools: Vec<(&'static str, u32, u32, u32)>,
|
||||
}
|
||||
359
crates/rvf/rvf-runtime/examples/qr_seed_bootstrap.rs
Normal file
359
crates/rvf/rvf-runtime/examples/qr_seed_bootstrap.rs
Normal file
@@ -0,0 +1,359 @@
|
||||
//! QR Cognitive Seed — "A World Inside a World"
|
||||
//!
|
||||
//! Demonstrates the full zero-dependency pipeline:
|
||||
//!
|
||||
//! 1. Compress a WASM microkernel using built-in LZ
|
||||
//! 2. Build an RVQS payload with hosts, layers, and HMAC-SHA256 signing
|
||||
//! 3. Verify it fits in a single QR code (<=2,953 bytes)
|
||||
//! 4. Parse the seed back and verify signature + content hash
|
||||
//! 5. Decompress the microkernel using built-in LZ
|
||||
//! 6. Simulate progressive bootstrap from seed to full intelligence
|
||||
//!
|
||||
//! Zero external dependencies. Real cryptography.
|
||||
//!
|
||||
//! Run: cargo run --example qr_seed_bootstrap -p rvf-runtime
|
||||
|
||||
use rvf_runtime::qr_seed::{make_host_entry, BootstrapProgress, ParsedSeed, SeedBuilder};
|
||||
use rvf_runtime::seed_crypto;
|
||||
use rvf_types::qr_seed::*;
|
||||
|
||||
/// HMAC-SHA256 signing key (in production, load from secure storage).
|
||||
const SIGNING_KEY: &[u8] = b"example-signing-key-for-demo-ok!";
|
||||
|
||||
fn main() {
|
||||
println!("=== QR Cognitive Seed: A World Inside a World ===\n");
|
||||
|
||||
// --- Phase 0: Build the seed ---
|
||||
println!("[Phase 0] Building RVQS seed with real crypto...");
|
||||
|
||||
// Simulated WASM microkernel (will be compressed by built-in LZ).
|
||||
let raw_wasm = fake_wasm(5500);
|
||||
println!(" Raw WASM: {} bytes", raw_wasm.len());
|
||||
|
||||
// Primary CDN host.
|
||||
let primary_host = make_host_entry(
|
||||
"https://cdn.ruvector.ai/rvf/brain-v1.rvf",
|
||||
0, // highest priority
|
||||
1, // region: US-East
|
||||
[0xAA; 16],
|
||||
)
|
||||
.expect("primary host");
|
||||
|
||||
// Fallback host.
|
||||
let fallback_host = make_host_entry(
|
||||
"https://mirror.ruvector.ai/rvf/brain-v1.rvf",
|
||||
1, // lower priority
|
||||
2, // region: EU-West
|
||||
[0xBB; 16],
|
||||
)
|
||||
.expect("fallback host");
|
||||
|
||||
// Progressive layers with real content hashes.
|
||||
let layer_data_0 = vec![0x42u8; 4_096];
|
||||
let layer_data_1 = vec![0x43u8; 51_200];
|
||||
let layer_data_2 = vec![0x44u8; 204_800];
|
||||
let layer_data_3 = vec![0x45u8; 102_400];
|
||||
let layer_data_4 = vec![0x46u8; 512_000];
|
||||
|
||||
let layers = vec![
|
||||
(
|
||||
LayerEntry {
|
||||
offset: 0,
|
||||
size: 4_096,
|
||||
content_hash: seed_crypto::layer_content_hash(&layer_data_0),
|
||||
layer_id: layer_id::LEVEL0,
|
||||
priority: 0,
|
||||
required: 1,
|
||||
_pad: 0,
|
||||
},
|
||||
layer_data_0,
|
||||
),
|
||||
(
|
||||
LayerEntry {
|
||||
offset: 4_096,
|
||||
size: 51_200,
|
||||
content_hash: seed_crypto::layer_content_hash(&layer_data_1),
|
||||
layer_id: layer_id::HOT_CACHE,
|
||||
priority: 1,
|
||||
required: 1,
|
||||
_pad: 0,
|
||||
},
|
||||
layer_data_1,
|
||||
),
|
||||
(
|
||||
LayerEntry {
|
||||
offset: 55_296,
|
||||
size: 204_800,
|
||||
content_hash: seed_crypto::layer_content_hash(&layer_data_2),
|
||||
layer_id: layer_id::HNSW_LAYER_A,
|
||||
priority: 2,
|
||||
required: 0,
|
||||
_pad: 0,
|
||||
},
|
||||
layer_data_2,
|
||||
),
|
||||
(
|
||||
LayerEntry {
|
||||
offset: 260_096,
|
||||
size: 102_400,
|
||||
content_hash: seed_crypto::layer_content_hash(&layer_data_3),
|
||||
layer_id: layer_id::QUANT_DICT,
|
||||
priority: 3,
|
||||
required: 0,
|
||||
_pad: 0,
|
||||
},
|
||||
layer_data_3,
|
||||
),
|
||||
(
|
||||
LayerEntry {
|
||||
offset: 362_496,
|
||||
size: 512_000,
|
||||
content_hash: seed_crypto::layer_content_hash(&layer_data_4),
|
||||
layer_id: layer_id::HNSW_LAYER_B,
|
||||
priority: 4,
|
||||
required: 0,
|
||||
_pad: 0,
|
||||
},
|
||||
layer_data_4,
|
||||
),
|
||||
];
|
||||
|
||||
// Build with built-in LZ compression and HMAC-SHA256 signing.
|
||||
let mut builder = SeedBuilder::new(
|
||||
[0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08],
|
||||
384,
|
||||
100_000,
|
||||
)
|
||||
.compress_microkernel(&raw_wasm)
|
||||
.add_host(primary_host)
|
||||
.add_host(fallback_host);
|
||||
|
||||
builder.base_dtype = 1; // F16
|
||||
builder.profile_id = 2; // Hot profile
|
||||
builder.content_hash_full = Some(seed_crypto::full_content_hash(b"full rvf data"));
|
||||
builder.total_file_size = Some(874_496);
|
||||
builder.stream_upgrade = true;
|
||||
|
||||
for (layer, _data) in &layers {
|
||||
builder = builder.add_layer(*layer);
|
||||
}
|
||||
|
||||
let (payload, header) = builder.build_and_sign(SIGNING_KEY).expect("seed build");
|
||||
|
||||
println!(" Seed magic: 0x{:08X} (\"RVQS\")", header.seed_magic);
|
||||
println!(" Version: {}", header.seed_version);
|
||||
println!(" Flags: 0x{:04X}", header.flags);
|
||||
println!(" File ID: {:02X?}", header.file_id);
|
||||
println!(" Vectors: {}", header.total_vector_count);
|
||||
println!(" Dimension: {}", header.dimension);
|
||||
println!(
|
||||
" Microkernel: {} bytes (LZ compressed)",
|
||||
header.microkernel_size
|
||||
);
|
||||
println!(" Manifest: {} bytes", header.download_manifest_size);
|
||||
println!(
|
||||
" Signature: {} bytes (HMAC-SHA256, algo={})",
|
||||
header.sig_length, header.sig_algo
|
||||
);
|
||||
println!(" Content hash: {:02x?}", header.content_hash);
|
||||
println!(" Total size: {} bytes", header.total_seed_size);
|
||||
println!(" QR capacity: {} bytes", QR_MAX_BYTES);
|
||||
println!(
|
||||
" Fits in QR: {} ({} bytes headroom)",
|
||||
header.fits_in_qr(),
|
||||
QR_MAX_BYTES as u32 - header.total_seed_size
|
||||
);
|
||||
println!();
|
||||
|
||||
// --- Phase 1: Parse, verify, decompress ---
|
||||
println!("[Phase 1] Parsing and verifying seed...");
|
||||
|
||||
let parsed = ParsedSeed::parse(&payload).expect("parse seed");
|
||||
|
||||
println!(" Header valid: {}", parsed.header.is_valid_magic());
|
||||
println!(
|
||||
" Microkernel: {} ({} bytes compressed)",
|
||||
if parsed.microkernel.is_some() {
|
||||
"present"
|
||||
} else {
|
||||
"absent"
|
||||
},
|
||||
parsed.microkernel.map(|m| m.len()).unwrap_or(0)
|
||||
);
|
||||
println!(
|
||||
" Manifest: {} ({} bytes)",
|
||||
if parsed.manifest_bytes.is_some() {
|
||||
"present"
|
||||
} else {
|
||||
"absent"
|
||||
},
|
||||
parsed.manifest_bytes.map(|m| m.len()).unwrap_or(0)
|
||||
);
|
||||
println!(
|
||||
" Signature: {} ({} bytes)",
|
||||
if parsed.signature.is_some() {
|
||||
"present"
|
||||
} else {
|
||||
"absent"
|
||||
},
|
||||
parsed.signature.map(|s| s.len()).unwrap_or(0)
|
||||
);
|
||||
|
||||
// Full verification: magic + content hash + HMAC-SHA256 signature.
|
||||
parsed
|
||||
.verify_all(SIGNING_KEY, &payload)
|
||||
.expect("verify_all");
|
||||
println!(" verify_all: PASSED (magic + hash + HMAC-SHA256)");
|
||||
|
||||
// Individual checks.
|
||||
assert!(parsed.verify_content_hash());
|
||||
println!(" content_hash: PASSED");
|
||||
|
||||
parsed
|
||||
.verify_signature(SIGNING_KEY, &payload)
|
||||
.expect("sig verify");
|
||||
println!(" signature: PASSED (HMAC-SHA256)");
|
||||
|
||||
// Wrong key must fail.
|
||||
assert!(parsed
|
||||
.verify_signature(b"wrong-key-should-fail-immediatel", &payload)
|
||||
.is_err());
|
||||
println!(" wrong key: REJECTED (as expected)");
|
||||
|
||||
// Decompress microkernel using built-in LZ.
|
||||
let decompressed = parsed.decompress_microkernel().expect("decompress");
|
||||
assert_eq!(decompressed, raw_wasm);
|
||||
let ratio = raw_wasm.len() as f64 / parsed.microkernel.unwrap().len() as f64;
|
||||
println!(
|
||||
" Decompressed: {} bytes (ratio: {:.2}x)",
|
||||
decompressed.len(),
|
||||
ratio
|
||||
);
|
||||
println!();
|
||||
|
||||
// --- Phase 2: Parse download manifest ---
|
||||
println!("[Phase 2] Parsing download manifest...");
|
||||
|
||||
let manifest = parsed.parse_manifest().expect("parse manifest");
|
||||
|
||||
println!(" Hosts: {}", manifest.hosts.len());
|
||||
for (i, host) in manifest.hosts.iter().enumerate() {
|
||||
let label = if i == 0 { "Primary" } else { "Fallback" };
|
||||
println!(
|
||||
" [{label}] {} (priority={}, region={})",
|
||||
host.url_str().unwrap_or("<invalid>"),
|
||||
host.priority,
|
||||
host.region
|
||||
);
|
||||
}
|
||||
|
||||
println!(
|
||||
" Content hash: {:?}",
|
||||
manifest.content_hash.map(|h| hex_short(&h))
|
||||
);
|
||||
println!(
|
||||
" Total size: {} bytes",
|
||||
manifest.total_file_size.unwrap_or(0)
|
||||
);
|
||||
println!(" Layers: {}", manifest.layers.len());
|
||||
for layer in &manifest.layers {
|
||||
let name = layer_name(layer.layer_id);
|
||||
println!(
|
||||
" [{:>2}] {:<20} offset={:<8} size={:<8} required={} hash={}",
|
||||
layer.priority,
|
||||
name,
|
||||
layer.offset,
|
||||
layer.size,
|
||||
if layer.required == 1 { "yes" } else { "no " },
|
||||
hex_short(&layer.content_hash)
|
||||
);
|
||||
}
|
||||
|
||||
// Verify layer hashes.
|
||||
println!();
|
||||
println!(" Layer hash verification:");
|
||||
for (layer, data) in &layers {
|
||||
let ok = seed_crypto::verify_layer(&layer.content_hash, data);
|
||||
println!(
|
||||
" {} {:<20} {}",
|
||||
if ok { "PASS" } else { "FAIL" },
|
||||
layer_name(layer.layer_id),
|
||||
hex_short(&layer.content_hash)
|
||||
);
|
||||
}
|
||||
println!();
|
||||
|
||||
// --- Phase 3: Simulate progressive bootstrap ---
|
||||
println!("[Phase 3] Simulating progressive bootstrap...\n");
|
||||
|
||||
let mut progress = BootstrapProgress::new(&manifest);
|
||||
|
||||
println!(
|
||||
" Boot phase: {} | query_ready: {} | recall: {:.0}%",
|
||||
phase_name(progress.phase),
|
||||
progress.query_ready,
|
||||
progress.estimated_recall * 100.0
|
||||
);
|
||||
|
||||
for (layer, _data) in &layers {
|
||||
progress.record_layer(layer);
|
||||
println!(
|
||||
" Downloaded {:<20} | phase: {} | query_ready: {} | recall: {:.0}% | progress: {:.1}%",
|
||||
layer_name(layer.layer_id),
|
||||
phase_name(progress.phase),
|
||||
progress.query_ready,
|
||||
progress.estimated_recall * 100.0,
|
||||
progress.progress_fraction() * 100.0
|
||||
);
|
||||
}
|
||||
|
||||
println!("\n=== Seed bootstrapped to full intelligence ===");
|
||||
println!(
|
||||
" The AI that lived in printed ink now spans {} bytes.",
|
||||
manifest.total_file_size.unwrap_or(0)
|
||||
);
|
||||
println!(" Zero dependencies. Real cryptography. Scan. Boot. Intelligence.");
|
||||
}
|
||||
|
||||
/// Build a realistic fake WASM module (compressible patterns).
|
||||
fn fake_wasm(size: usize) -> Vec<u8> {
|
||||
let mut wasm = Vec::with_capacity(size);
|
||||
wasm.extend_from_slice(&[0x00, 0x61, 0x73, 0x6D, 0x01, 0x00, 0x00, 0x00]);
|
||||
while wasm.len() < size {
|
||||
wasm.extend_from_slice(&[0x01, 0x06, 0x01, 0x60, 0x01, 0x7F, 0x01, 0x7F]);
|
||||
}
|
||||
wasm.truncate(size);
|
||||
wasm
|
||||
}
|
||||
|
||||
fn phase_name(phase: u8) -> &'static str {
|
||||
match phase {
|
||||
0 => "Parse ",
|
||||
1 => "Stream ",
|
||||
2 => "Full ",
|
||||
_ => "Unknown",
|
||||
}
|
||||
}
|
||||
|
||||
fn layer_name(id: u8) -> &'static str {
|
||||
match id {
|
||||
0 => "Level 0 manifest",
|
||||
1 => "Hot cache",
|
||||
2 => "HNSW Layer A",
|
||||
3 => "Quant dictionaries",
|
||||
4 => "HNSW Layer B",
|
||||
5 => "Full vectors",
|
||||
6 => "HNSW Layer C",
|
||||
_ => "Unknown",
|
||||
}
|
||||
}
|
||||
|
||||
fn hex_short(bytes: &[u8]) -> String {
|
||||
bytes
|
||||
.iter()
|
||||
.take(4)
|
||||
.map(|b| format!("{b:02x}"))
|
||||
.collect::<Vec<_>>()
|
||||
.join("")
|
||||
+ ".."
|
||||
}
|
||||
49
crates/rvf/rvf-runtime/examples/qr_seed_encode.rs
Normal file
49
crates/rvf/rvf-runtime/examples/qr_seed_encode.rs
Normal file
@@ -0,0 +1,49 @@
|
||||
//! QR Cognitive Seed — Encode to QR Code
|
||||
//!
|
||||
//! Builds an RVQS seed payload and renders it as an SVG QR code.
|
||||
//!
|
||||
//! Run: cargo run --example qr_seed_encode -p rvf-runtime --features qr
|
||||
|
||||
use rvf_runtime::qr_encode::{EcLevel, QrEncoder};
|
||||
use rvf_runtime::qr_seed::SeedBuilder;
|
||||
|
||||
fn main() {
|
||||
println!("=== QR Seed Encoder ===\n");
|
||||
|
||||
// Build a minimal RVQS seed payload.
|
||||
let builder = SeedBuilder::new(
|
||||
[0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08],
|
||||
384, // dimension
|
||||
100_000, // total vectors
|
||||
);
|
||||
|
||||
let (payload, header) = builder.build().expect("seed build");
|
||||
|
||||
println!("Seed payload: {} bytes", payload.len());
|
||||
println!(" Magic: 0x{:08X}", header.seed_magic);
|
||||
println!(" Version: {}", header.seed_version);
|
||||
println!(" Vectors: {}", header.total_vector_count);
|
||||
println!(" Dim: {}", header.dimension);
|
||||
println!();
|
||||
|
||||
// Encode as QR code. The 64-byte header fits easily in Version 2 with EC-M.
|
||||
let code = QrEncoder::encode(&payload, EcLevel::M).expect("QR encode");
|
||||
|
||||
println!("QR Code:");
|
||||
println!(" Version: {}", code.version);
|
||||
println!(" Size: {}x{} modules", code.size, code.size);
|
||||
println!();
|
||||
|
||||
// Render as ASCII for terminal display.
|
||||
let ascii = QrEncoder::to_ascii(&code);
|
||||
println!("{ascii}");
|
||||
println!();
|
||||
|
||||
// Render as SVG.
|
||||
let svg = QrEncoder::to_svg(&code);
|
||||
println!("SVG output: {} bytes", svg.len());
|
||||
println!(" Starts with: {}", &svg[..60]);
|
||||
println!();
|
||||
|
||||
println!("=== Done ===");
|
||||
}
|
||||
Reference in New Issue
Block a user