From fb7ba0e37645aaa6627ef6ae1b729c931387a772 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Wed, 21 Oct 2026 06:06:48 +0000 Subject: [PATCH 1/4] test(cpu-scheduler): add frozen native key reuse comparison --- ...l_cpu_residency_key_reuse_qualification.rs | 1220 +++++++++++++++++ .../src/serial_cpu_residency_tests.rs | 3 + .../serial_ready/configuration_tests.rs | 35 + .../src/workflow/serial_ready/grouping.rs | 25 + docs/plans/cpu-scheduler/execution-ledger.md | 47 + docs/plans/cpu-scheduler/issues.md | 3 + docs/plans/cpu-scheduler/plan.md | 4 +- .../2026-10-21-m5-m6-completion-checklist.md | 12 +- ...2026-10-21-m5-native-key-reuse-protocol.md | 87 ++ 9 files changed, 1428 insertions(+), 8 deletions(-) create mode 100644 crates/pantograph-embedded-runtime/src/serial_cpu_residency_key_reuse_qualification.rs create mode 100644 docs/plans/cpu-scheduler/reports/2026-10-21-m5-native-key-reuse-protocol.md diff --git a/crates/pantograph-embedded-runtime/src/serial_cpu_residency_key_reuse_qualification.rs b/crates/pantograph-embedded-runtime/src/serial_cpu_residency_key_reuse_qualification.rs new file mode 100644 index 000000000..9888e3909 --- /dev/null +++ b/crates/pantograph-embedded-runtime/src/serial_cpu_residency_key_reuse_qualification.rs @@ -0,0 +1,1220 @@ +//! One explicitly held native comparison; ordinary tests exercise only its oracle. +//! Public facade methods perform all actions. Private test-support reads observe +//! scalar work counts only and never supply readiness, native output or custody. + +use serde_json::{json, Value}; + +const WORKFLOW: &str = "cpu-m5-key-reuse-pair"; +const NODES: [&str; 2] = ["infer_a", "infer_b"]; +const OUTPUTS: [&str; 2] = ["vectors_a", "vectors_b"]; +const PHASES: [&str; 5] = ["probe", "capture", "fill", "lookup", "key_calculation"]; + +fn require(condition: bool, message: &str) -> Result<(), String> { + condition.then_some(()).ok_or_else(|| message.into()) +} + +fn array<'a>(value: &'a Value, field: &str) -> Result<&'a Vec, String> { + value[field] + .as_array() + .ok_or_else(|| format!("missing {field}")) +} + +fn rows<'a>(arm: &'a Value, phase: &str) -> Result, String> { + Ok(array(arm, "logs")? + .iter() + .filter(|row| row["record"]["phase"] == phase) + .collect()) +} + +fn vector_matches(actual: &Value, expected: &Value) -> bool { + let (Some(actual), Some(expected)) = (actual.as_array(), expected.as_array()) else { + return false; + }; + actual.len() == 8 + && expected.len() == 8 + && actual.iter().zip(expected).all(|(actual, expected)| { + match (actual.as_f64(), expected.as_f64()) { + (Some(actual), Some(expected)) => { + actual.is_finite() && expected.is_finite() && (actual - expected).abs() <= 1e-5 + } + _ => false, + } + }) +} + +fn verify_owner(owner: &Value) -> Result<(), String> { + for (field, length) in [ + ("loaded_instance", 16), + ("loaded_profile", 32), + ("effective_settings", 32), + ] { + require( + owner[field].as_array().is_some_and(|bytes| { + bytes.len() == length + && bytes + .iter() + .all(|byte| byte.as_u64().is_some_and(|byte| byte <= 255)) + }), + "native owner identity/settings missing", + )?; + } + require( + owner["cpu_threads"] == 1 + && owner["generation"] + .as_u64() + .is_some_and(|generation| generation > 0), + "native owner generation/threads invalid", + ) +} + +/// Hand-declared identities/counts are independent of production selection. +fn verify_arm(arm: &Value, enabled: bool, golden: &Value) -> Result<(), String> { + require( + arm["enabled"] == enabled && arm["configuration"]["key_reuse"] == enabled, + "wrong constructor configuration", + )?; + require( + arm["configuration"]["fair"] == true && arm["configuration"]["residency"] == true, + "required per-member modes missing", + )?; + require( + arm["error"].is_null() + && arm["collector_error"].is_null() + && arm["diagnostic_io_error"].is_null() + && arm["event_error"].is_null(), + "execution or collector failed", + )?; + require( + arm["session_close"]["ok"] == true + && arm["graph_closes_ok"] == true + && arm["shutdown"]["ok"] == true + && arm["shutdown"]["timed_out"] == false, + "teardown incomplete or uncertain", + )?; + require( + array(&arm["final_registry"], "reservations")?.is_empty() + && array(&arm["final_registry"], "runtimes")? + .iter() + .all(|runtime| runtime["model_resource_residency"].is_null()), + "final resources remain", + )?; + let diagnostics = &arm["diagnostics"]; + require( + diagnostics["loads"] == 1 + && diagnostics["retains"] == 1 + && diagnostics["forward_drains"] == 2 + && diagnostics["stops"] == 1 + && diagnostics["has_idle_owner"] == false, + "native populations differ", + )?; + require( + arm["work"]["error"].is_null() && arm["work"]["retained"] == 0, + "cache observation unavailable or entries retained", + )?; + require( + arm["work"]["encodings"] == if enabled { 4 } else { 6 } + && arm["work"]["hits"] == if enabled { 4 } else { 0 }, + "fixed mechanism counts differ", + )?; + let run = arm["response"]["workflow_run_id"] + .as_str() + .filter(|run| !run.is_empty()) + .ok_or("missing run")?; + require( + array(arm, "resume_run_ids")?.iter().all(|id| id == run), + "readiness resume changed run", + )?; + let returned = array(&arm["response"], "outputs")?; + require(returned.len() == 2, "public output population differs")?; + for (index, node) in OUTPUTS.iter().enumerate() { + let values: Vec<_> = returned + .iter() + .filter(|output| output["node_id"] == *node && output["port_id"] == "vector") + .collect(); + require( + values.len() == 1 + && vector_matches(&values[0]["value"], &golden["single_vectors"][index]), + "public golden vector differs", + )?; + let retained: Vec<_> = array(arm, "retained")? + .iter() + .filter(|row| row["node_id"] == *node) + .collect(); + require( + !retained.is_empty() + && retained.iter().all(|row| { + row["workflow_run_id"] == run + && row["value"] == values[0]["value"] + && row["read"]["complete"] == true + && row["read"]["artifact_id"] == row["artifact_id"] + && row["read"]["byte_length"] == row["body_bytes"] + && row["artifact_id"].as_str().is_some_and(|id| !id.is_empty()) + }), + "retained artifact missing or differs", + )?; + } + + let grants = rows(arm, "service_opportunity")?; + let drained = rows(arm, "native_drained")?; + let acks = rows(arm, "task_registry_ack")?; + require( + grants.len() == 2 && drained.len() == 2 && acks.len() == 2, + "grant/drain/registry-ACK populations differ", + )?; + let events = array(arm, "events")?; + let lifecycle = |transition: &str| { + events + .iter() + .filter(|event| { + event["payload"]["payload_type"] == "scheduler_task_attempt_lifecycle_changed" + && event["payload"]["execution_class"] == "runtime" + && event["payload"]["transition"] == transition + }) + .collect::>() + }; + let starts = lifecycle("started"); + let completed = lifecycle("completed"); + require( + starts.len() == 2 && completed.len() == 2, + "Start/Completed populations differ", + )?; + require( + grants[0]["record"]["ticket"].as_u64().is_some() + && grants[1]["record"]["ticket"].as_u64().is_some() + && grants[0]["record"]["ticket"] != grants[1]["record"]["ticket"], + "service ticket reused", + )?; + for field in [ + "task_id", + "attempt_id", + "execution_request_id", + "candidate_id", + "reservation_lease_id", + ] { + require( + !drained[0]["record"][field].is_null() + && drained[0]["record"][field] != drained[1]["record"][field], + "native identity reused", + )?; + } + let mut task_ids = Vec::new(); + for (index, row) in drained.iter().enumerate() { + let native = &row["record"]; + let (previous, current) = (&native["previous_owner"], &native["current_owner"]); + verify_owner(previous)?; + verify_owner(current)?; + for field in [ + "loaded_instance", + "loaded_profile", + "effective_settings", + "cpu_threads", + ] { + require( + previous[field] == current[field], + "native warm identity/settings changed", + )?; + } + require( + previous["generation"] + .as_u64() + .and_then(|generation| generation.checked_add(2)) + == current["generation"].as_u64(), + "native warm generation did not advance by two", + )?; + if index == 1 { + require( + drained[0]["record"]["current_owner"] == *previous, + "native owner continuity broken", + )?; + } + require( + native["workflow_id"] == WORKFLOW + && native["workflow_run_id"] == run + && native["node_id"] == NODES[index], + "native node/run order differs", + )?; + let task = native["task_id"] + .as_str() + .filter(|id| !id.is_empty()) + .ok_or("native task absent")?; + task_ids.push(json!(task)); + let lease = native["reservation_lease_id"] + .as_u64() + .ok_or("native lease absent")?; + let ack_rows: Vec<_> = acks + .iter() + .filter(|ack| ack["record"]["task_id"] == task) + .collect(); + let start_rows: Vec<_> = starts + .iter() + .filter(|event| event["payload"]["scheduler_task_id"] == task) + .collect(); + let complete_rows: Vec<_> = completed + .iter() + .filter(|event| event["payload"]["scheduler_task_id"] == task) + .collect(); + require( + ack_rows.len() == 1 && start_rows.len() == 1 && complete_rows.len() == 1, + "identity joins are not bijective", + )?; + let ack = &ack_rows[0]["record"]; + for field in [ + "workflow_id", + "workflow_run_id", + "node_id", + "task_id", + "attempt_id", + "execution_request_id", + "candidate_id", + "reservation_lease_id", + ] { + require( + !native[field].is_null() && ack[field] == native[field], + "registry ACK identity differs", + )?; + } + require( + ack["registry_task_release_acknowledged"] == true + && ack["scheduler_cleanup_acknowledged"] == false + && ack["lifecycle_event_id"] + .as_str() + .is_some_and(|id| !id.is_empty()), + "registry ACK missing or mislabeled", + )?; + let start = start_rows[0]; + let complete = complete_rows[0]; + require( + start["workflow_run_id"] == run + && complete["workflow_run_id"] == run + && start["node_id"] == native["node_id"] + && complete["node_id"] == native["node_id"] + && start["payload"]["scheduler_attempt_id"] == native["attempt_id"] + && complete["payload"]["scheduler_attempt_id"] == native["attempt_id"] + && complete["payload"]["reservation_id"] == format!("runtime-registry.{lease}") + && complete["payload"]["selected_runtime_id"] == "candle" + && complete["payload"]["selected_runtime_variant_id"] == "candle.cpu" + && complete["payload"]["selected_device_id"] == "cpu" + && start["event_seq"] + .as_u64() + .zip(complete["event_seq"].as_u64()) + .is_some_and(|(a, b)| a < b), + "ledger/native dispatch join differs", + )?; + require( + grants[index]["record"]["workflow_run_id"] == run + && grants[index]["record"]["task_id"] == task, + "service grant belongs to another member", + )?; + require( + grants[index]["sequence"] + .as_u64() + .zip(row["sequence"].as_u64()) + .is_some_and(|(a, b)| a < b) + && row["sequence"] + .as_u64() + .zip(ack_rows[0]["sequence"].as_u64()) + .is_some_and(|(a, b)| a < b), + "grant/native/ACK order differs", + )?; + if index == 0 { + require( + ack_rows[0]["sequence"] + .as_u64() + .zip(grants[1]["sequence"].as_u64()) + .is_some_and(|(a, b)| a < b), + "next grant preceded member registry ACK", + )?; + } + } + let proposals = rows(arm, "proposal")?; + require( + proposals.len() == 1 + && proposals[0]["record"]["workflow_run_id"] == run + && proposals[0]["record"]["task_ids"] == json!(task_ids) + && proposals[0]["sequence"] + .as_u64() + .zip(drained[0]["sequence"].as_u64()) + .is_some_and(|(a, b)| a < b), + "genuine two-Ready pair missing", + )?; + let metrics = rows(arm, "grouping_observations")?; + let forecasts = rows(arm, "warm_service_forecasts")?; + if enabled { + require( + !metrics.is_empty() + && forecasts.len() == 1 + && array(&forecasts[0]["record"], "forecasts")?.len() == 2 + && forecasts[0]["record"]["coverage"] == "captured_compatible_prefix", + "two-member captured prefix missing", + )?; + let snapshot = &metrics.last().ok_or("phase snapshot absent")?["record"]; + require( + snapshot["scope"] + .as_str() + .is_some_and(|scope| !scope.is_empty()) + && snapshot["scope"] == forecasts[0]["record"]["scope"], + "phase scope differs", + )?; + let phases = array(snapshot, "phases")?; + require(phases.len() == 5, "phase population differs")?; + for name in PHASES { + let phase: Vec<_> = phases + .iter() + .filter(|phase| phase["phase"] == name) + .collect(); + require( + phase.len() == 1 + && phase[0]["aggregate"]["state"] == "available" + && phase[0]["aggregate"]["calls"] + .as_u64() + .is_some_and(|calls| calls > 0) + && phase[0]["aggregate"]["elapsed_ns"].as_u64().is_some(), + "phase unavailable or unobserved", + )?; + } + } else { + require( + metrics.is_empty() && forecasts.is_empty(), + "disabled baseline acquired grouping measurements", + )?; + } + Ok(()) +} + +fn verify_comparison(arms: &[Value], golden: &Value) -> Result<(), String> { + require(arms.len() == 2, "two arms required")?; + verify_arm(&arms[0], false, golden)?; + verify_arm(&arms[1], true, golden)?; + require( + arms[0]["response"]["workflow_run_id"] != arms[1]["response"]["workflow_run_id"], + "fresh arms reused run identity", + )?; + for output in OUTPUTS { + let value = |arm: &Value| { + array(&arm["response"], "outputs") + .ok()? + .iter() + .find(|row| row["node_id"] == output) + .map(|row| row["value"].clone()) + }; + require( + value(&arms[0]) == value(&arms[1]), + "baseline/enabled output differs", + )?; + } + Ok(()) +} + +#[cfg(feature = "host-dependency-inventory")] +mod held { + use super::super::{config, seed, MODEL}; + use super::*; + use crate::EmbeddedSerialCpuResidency; + use pantograph_diagnostics_ledger::{DiagnosticsLedgerRepository, SqliteDiagnosticsLedger}; + use pantograph_workflow_service::graph::{ + authored_snapshot_from_descriptor, NodeRegistry, WorkflowGraph, + }; + use pantograph_workflow_service::*; + use std::{ + error::Error, + fs::{File, OpenOptions}, + io::Write, + path::{Path, PathBuf}, + sync::Mutex, + time::{Duration, Instant}, + }; + + type Outcome = Result>; + const PROTOCOL: &str = "m5-native-two-ready-key-reuse-v1"; + const TEXTS: [&str; 2] = ["hello world", "hello"]; + const RUN_BUDGET: Duration = Duration::from_secs(60); + const SHUTDOWN_BUDGET: Duration = Duration::from_secs(30); + struct LogBuffer { + rows: Vec, + bytes: usize, + error: Option<&'static str>, + file: Option, + arm: &'static str, + } + struct Collector(Mutex); + static LOG: Collector = Collector(Mutex::new(LogBuffer { + rows: Vec::new(), + bytes: 0, + error: None, + file: None, + arm: "preflight", + })); + impl log::Log for Collector { + fn enabled(&self, metadata: &log::Metadata<'_>) -> bool { + matches!( + metadata.target(), + "workflow::serial_ready" + | "workflow::serial_observations" + | "embedded::serial_cpu_residency" + ) + } + fn log(&self, record: &log::Record<'_>) { + if !self.enabled(record.metadata()) { + return; + } + let Ok(mut buffer) = self.0.lock() else { + return; + }; + let text = record.args().to_string(); + match serde_json::from_str::(&text) { + Ok(value) => { + let sequence = buffer.rows.len(); + let row = json!({"sequence":sequence,"arm":buffer.arm,"target":record.target(),"record":value}); + let Ok(mut bytes) = serde_json::to_vec(&row) else { + buffer.error = Some("structured row serialization failed"); + return; + }; + bytes.push(b'\n'); + if buffer.rows.len() >= 2048 + || bytes.len() > 64 * 1024 + || buffer.bytes + bytes.len() > 4 * 1024 * 1024 + { + buffer.error = Some("bounded log capacity exceeded"); + return; + } + buffer.bytes += bytes.len(); + buffer.rows.push(row); + if let Some(file) = buffer.file.as_mut() { + if file + .write_all(&bytes) + .and_then(|_| file.sync_all()) + .is_err() + { + buffer.error = Some("native row persistence failed"); + buffer.file = None; + } + } + } + Err(_) => buffer.error = Some("structured evidence parse failed"), + } + } + fn flush(&self) {} + } + fn logs(from: usize) -> (Vec, Option<&'static str>) { + LOG.0 + .lock() + .map_or((Vec::new(), Some("collector lock unavailable")), |buffer| { + (buffer.rows[from..].to_vec(), buffer.error) + }) + } + fn save(root: &Path, name: &str, value: &Value) -> Outcome<()> { + let mut file = OpenOptions::new() + .write(true) + .create_new(true) + .open(root.join(name))?; + serde_json::to_writer_pretty(&mut file, value)?; + file.write_all(b"\n")?; + file.sync_all()?; + Ok(()) + } + fn progress(file: &mut File, arm: &str, stage: &str, detail: Value) -> Outcome<()> { + serde_json::to_writer( + &mut *file, + &json!({"arm":arm,"stage":stage,"detail":detail}), + )?; + file.write_all(b"\n")?; + file.sync_all()?; + Ok(()) + } + + async fn author_pair( + facade: &EmbeddedSerialCpuResidency, + edits: &mut Vec, + ) -> Outcome<()> { + let mut nodes = Vec::new(); + let mut edges = Vec::new(); + for suffix in ["a", "b"] { + nodes.extend([ + json!({"id":format!("deps_{suffix}"),"node_type":"dependency-environment","position":{"x":0,"y":0},"data":{"mode":"manual"}}), + json!({"id":format!("prompt_{suffix}"),"node_type":"text-input","position":{"x":0,"y":100},"data":{}}), + json!({"id":format!("infer_{suffix}"),"node_type":"llm-inference","position":{"x":300,"y":100},"data":{ + "task_kind":"embedding","runtime":"candle","device":"cpu", + "runtime_source_context":{"operation_type":"embedding.text","context_shape_key":"embedding.one-text","cancellation_mode":"run_scoped"}, + "pumas_model_ref":{"model_id":MODEL,"selected_artifact_id":"main"}}}), + json!({"id":format!("vectors_{suffix}"),"node_type":"vector-output","position":{"x":600,"y":100},"data":{}}), + ]); + for (prefix, source, source_handle, target, target_handle) in [ + ( + "text", + format!("prompt_{suffix}"), + "text", + format!("infer_{suffix}"), + "text", + ), + ( + "vector", + format!("infer_{suffix}"), + "embedding", + format!("vectors_{suffix}"), + "vector", + ), + ( + "dep", + format!("deps_{suffix}"), + "dependency_environment_sidecar", + format!("infer_{suffix}"), + "dependency_environment_sidecar", + ), + ] { + edges.push(json!({"id":format!("{prefix}_{suffix}"),"source":source,"source_handle":source_handle,"target":target,"target_handle":target_handle})); + } + } + let mut graph: WorkflowGraph = + serde_json::from_value(json!({"nodes":nodes,"edges":edges}))?; + let registry = NodeRegistry::new(); + for node in &mut graph.nodes { + if node.node_type != "llm-inference" { + node.data["definition"] = serde_json::to_value( + registry + .get_definition(&node.node_type) + .ok_or("missing built-in definition")?, + )?; + } + } + let preview = facade + .workflow_graph_create_edit_session(WorkflowGraphEditSessionCreateRequest { + graph: graph.clone(), + workflow_id: None, + }) + .await?; + edits.push(preview.session_id.clone()); + let validation = facade + .workflow_graph_refresh_current_validation_summary( + WorkflowGraphCurrentValidationRefreshRequest { + graph_session_id: preview.session_id.clone(), + graph_revision: preview.graph_revision.parse()?, + }, + ) + .await?; + for id in NODES { + let descriptor = &validation + .node_projections + .iter() + .find(|node| node.node_id.as_str() == id) + .ok_or("missing native descriptor")? + .descriptor; + graph + .nodes + .iter_mut() + .find(|node| node.id == id) + .ok_or("missing infer node")? + .data["inference_interface_snapshot"] = + serde_json::to_value(authored_snapshot_from_descriptor(descriptor)?)?; + } + facade + .workflow_graph_close_edit_session(WorkflowGraphEditSessionCloseRequest { + session_id: preview.session_id, + }) + .await?; + edits.pop(); + facade.workflow_graph_save(WorkflowGraphSaveRequest { + name: WORKFLOW.into(), + graph: graph.clone(), + })?; + let edit = facade + .workflow_graph_create_edit_session(WorkflowGraphEditSessionCreateRequest { + graph, + workflow_id: Some(WORKFLOW.into()), + }) + .await?; + edits.push(edit.session_id.clone()); + let validation = facade + .workflow_graph_refresh_current_validation_summary( + WorkflowGraphCurrentValidationRefreshRequest { + graph_session_id: edit.session_id.clone(), + graph_revision: edit.graph_revision.parse()?, + }, + ) + .await?; + for id in ["deps_a", "deps_b"] { + let resolved = facade.workflow_graph_resolve_dependency_environment_action_intent(pantograph_inference_interface_contracts::DependencyEnvironmentActionIntent { + contract_version: 1, graph_session_id: edit.session_id.parse()?, graph_revision: edit.graph_revision.parse()?, + validation_session_id: validation.summary.validation_session_id.clone(), target_node_id: id.parse()?, + action: pantograph_inference_interface_contracts::DependencyEnvironmentAction::Resolve, + }).await?; + if resolved.status != pantograph_inference_interface_contracts::DependencyEnvironmentActionIntentStatus::RequestReady { return Err("dependency action not ready".into()); } + } + facade + .publish_graph_session_executable_validation_snapshot( + WorkflowGraphSessionExecutableValidationSnapshotPublishRequest { + workflow_id: WORKFLOW.into(), + workflow_semantic_version: "1.0.0".into(), + graph_session_id: edit.session_id, + validation_snapshot_id: None, + validation_session_id: Some( + validation + .summary + .validation_session_id + .ok_or("validation session absent")?, + ), + }, + ) + .await?; + Ok(()) + } + + async fn run_pair( + facade: &EmbeddedSerialCpuResidency, + session: &str, + arm: &mut Value, + ) -> Outcome { + let operation = async { + let mut result = facade + .run_workflow_execution_session(WorkflowExecutionSessionRunRequest { + session_id: session.into(), + workflow_semantic_version: "1.0.0".into(), + inputs: ["a", "b"] + .into_iter() + .zip(TEXTS) + .map(|(suffix, text)| WorkflowPortBinding { + node_id: format!("prompt_{suffix}"), + port_id: "text".into(), + value: json!(text), + }) + .collect(), + output_targets: Some( + OUTPUTS + .into_iter() + .map(|node| WorkflowOutputTarget { + node_id: node.into(), + port_id: "vector".into(), + }) + .collect(), + ), + override_selection: None, + timeout_ms: None, + priority: Some(0), + }) + .await; + let mut resumes = Vec::new(); + let mut polls = 0; + while matches!( + result, + Err(WorkflowServiceError::RuntimeDependencyReadinessPending { .. }) + ) { + arm["readiness_pending"] = json!(result.as_ref().err().map(ToString::to_string)); + polls += 1; + if polls > 1200 { + return Err("readiness poll bound exceeded".into()); + } + tokio::time::sleep(Duration::from_millis(50)).await; + if let Some(request) = facade + .workflow_execution_session_runtime_dependency_readiness_resume_candidates()? + .into_iter() + .find(|request| request.session_id == session) + { + if resumes.len() >= 32 { + return Err("readiness resume bound exceeded".into()); + } + resumes.push(request.workflow_run_id.clone()); + arm["resume_run_ids"] = json!(resumes); + result = facade + .resume_workflow_execution_session_runtime_dependency_readiness(request) + .await; + } + } + Ok::<_, Box>(result?) + }; + tokio::time::timeout(RUN_BUDGET, operation).await? + } + + fn events(root: &Path) -> Outcome> { + let ledger = + SqliteDiagnosticsLedger::open(root.join("app-data/serial-cpu-diagnostics.db"))?; + let events = ledger.diagnostic_events_after(0, 500)?; + if events.len() >= 500 { + return Err("ledger page bound exceeded".into()); + } + events + .into_iter() + .map(|event| { + Ok( + json!({"event_seq":event.event_seq,"workflow_run_id":event.workflow_run_id, + "node_id":event.node_id,"payload":serde_json::from_str::(&event.payload_json)?}), + ) + }) + .collect() + } + + async fn retained( + facade: &EmbeddedSerialCpuResidency, + session: &str, + response: &WorkflowRunResponse, + arm: &mut Value, + ) -> Outcome<()> { + let refresh = facade.workflow_diagnostics_projection_refresh( + WorkflowDiagnosticsProjectionRefreshRequest { + projections: vec![ + WorkflowDiagnosticsProjectionKind::RunDetail, + WorkflowDiagnosticsProjectionKind::NodeStatus, + WorkflowDiagnosticsProjectionKind::IoArtifact, + ], + workflow_run_id: Some(response.workflow_run_id.clone()), + workflow_id: Some(WORKFLOW.into()), + reason: WorkflowDiagnosticsProjectionRefreshReason::ExplicitRefresh, + batch_size: 500, + }, + )?; + arm["projection_refresh"] = json!(refresh); + if !refresh.failed.is_empty() || refresh.advanced.len() != 3 { + return Err("projection refresh incomplete".into()); + } + let inspection = + facade.workflow_run_inspection_query(WorkflowRunInspectionQueryRequest { + workflow_run_id: response.workflow_run_id.clone(), + artifact_limit: Some(128), + projection_batch_size: Some(500), + })?; + let mut values = Vec::new(); + for artifact in &inspection.io_artifacts { + let Some(node) = artifact + .producer_node_id + .as_deref() + .filter(|node| OUTPUTS.contains(node)) + else { + continue; + }; + if artifact.producer_port_id.as_deref() != Some("vector") { + continue; + } + let body = facade.workflow_read_artifact_body(ArtifactReadRequest { + artifact_id: artifact.payload_artifact_id.clone(), + byte_range_start: None, + byte_range_end_exclusive: None, + })?; + values.push(json!({"node_id":node,"workflow_run_id":artifact.workflow_run_id,"artifact_id":artifact.payload_artifact_id, + "read":body.response,"body_bytes":body.body.len(),"value":serde_json::from_slice::(&body.body)?,"body_blake3":blake3::hash(&body.body).to_hex().to_string()})); + } + arm["inspection"] = json!(inspection); + arm["retained"] = json!(values); + arm["task_states"] = json!(facade.workflow_get_scheduler_task_state_read_models( + pantograph_workflow_service::workflow::WorkflowSchedulerTaskStateReadModelQueryRequest { session_id: session.into(), workflow_run_id: response.workflow_run_id.clone() }).await?); + Ok(()) + } + + async fn run_arm(root: &Path, enabled: bool, progress_file: &mut File) -> Outcome { + std::fs::create_dir(root)?; + let name = if enabled { "enabled" } else { "baseline" }; + LOG.0.lock().map_err(|_| "collector lock unavailable")?.arm = name; + progress(progress_file, name, "seed", json!({}))?; + seed(root); + let log_start = logs(0).0.len(); + let constructed = if enabled { + EmbeddedSerialCpuResidency::new_with_bounded_key_reuse(config(root)).await + } else { + EmbeddedSerialCpuResidency::new(config(root)).await + }; + let facade = match constructed { + Ok(facade) => facade, + Err(error) => { + let row = json!({"enabled":enabled,"error":error.to_string(),"stage":"construct","construction_failed":true}); + save(root, "arm.json", &row)?; + return Err(error.into()); + } + }; + let snapshot = facade.scheduler_configuration(); + let mut arm = json!({"enabled":enabled,"configuration":{"key_reuse":snapshot.serial_key_reuse(),"fair":snapshot.serial_fair_opportunities(),"residency":snapshot.serial_residency()}, + "error":null,"collector_error":null,"resume_run_ids":[],"retained":[],"scheduler_cleanup_match":"source_assisted_adapter_validation; registry ACK is distinct"}); + let mut edit_sessions = Vec::new(); + let mut session = None; + let body: Outcome<()> = async { + progress(progress_file, name, "author", json!({}))?; + author_pair(&facade, &mut edit_sessions).await?; + let client = facade.register_attribution_client(ClientRegistrationRequest { + display_name: Some(PROTOCOL.into()), + metadata_json: None, + })?; + let opened = facade.open_client_session(ClientSessionOpenRequest { + credential: client.credential_proof_request(), + takeover: false, + reason: Some(PROTOCOL.into()), + })?; + let created = facade + .create_attributed_workflow_execution_session( + WorkflowExecutionSessionAttributedCreateRequest { + workflow_id: WORKFLOW.into(), + usage_profile: None, + keep_alive: false, + attribution: WorkflowExecutionSessionAttributionRequest { + credential: client.credential_proof_request(), + client_session_id: opened.session.client_session_id.as_str().into(), + bucket_selection: + pantograph_runtime_attribution::BucketSelection::Default, + }, + }, + ) + .await?; + session = Some(created.session_id.clone()); + arm["session"] = json!(created); + progress(progress_file, name, "run", json!({"session_id":session}))?; + let start = Instant::now(); + let response = run_pair( + &facade, + session.as_deref().ok_or("session missing")?, + &mut arm, + ) + .await?; + arm["submit_to_result_elapsed_ns"] = json!(start.elapsed().as_nanos()); + arm["response"] = json!(response); + progress(progress_file, name, "run_returned", arm["response"].clone())?; + arm["work"] = match facade + .runtime + .workflow_service + .try_serial_grouping_work_for_test() + { + Ok((encodings, hits, retained)) => { + json!({"encodings":encodings,"hits":hits,"retained":retained,"error":null}) + } + Err(error) => json!({"error":error.to_string()}), + }; + retained( + &facade, + session.as_deref().ok_or("session missing")?, + &response, + &mut arm, + ) + .await?; + Ok(()) + } + .await; + if let Err(error) = &body { + arm["error"] = json!(error.to_string()); + } + // No fallible diagnostic write may bypass close and the existing owner. + let mut io_error = progress( + progress_file, + name, + "teardown", + json!({"body_error":arm["error"]}), + ) + .err() + .map(|error| error.to_string()); + let close_deadline = tokio::time::Instant::now() + Duration::from_secs(5); + if let Some(session_id) = session { + let close = tokio::time::timeout_at( + close_deadline, + facade.close_workflow_execution_session(WorkflowExecutionSessionCloseRequest { + session_id, + }), + ) + .await; + arm["session_close"] = match close { + Ok(result) => { + json!({"ok":result.is_ok(),"error":result.err().map(|error|error.to_string())}) + } + Err(error) => json!({"ok":false,"timed_out":true,"error":error.to_string()}), + }; + } + let mut graph_closes_ok = true; + let mut graph_closes = Vec::new(); + for session_id in edit_sessions { + let close = tokio::time::timeout_at( + close_deadline, + facade.workflow_graph_close_edit_session(WorkflowGraphEditSessionCloseRequest { + session_id: session_id.clone(), + }), + ) + .await; + let row = match close { + Ok(result) => { + json!({"session_id":session_id,"ok":result.is_ok(),"error":result.err().map(|error|error.to_string())}) + } + Err(error) => { + json!({"session_id":session_id,"ok":false,"timed_out":true,"error":error.to_string()}) + } + }; + graph_closes_ok &= row["ok"] == true; + graph_closes.push(row); + } + arm["graph_closes_ok"] = json!(graph_closes_ok); + arm["graph_closes"] = json!(graph_closes); + arm["before_shutdown_registry"] = json!(facade.registry_snapshot()); + let shutdown = tokio::time::timeout(SHUTDOWN_BUDGET, facade.shutdown()).await; + arm["shutdown"] = match shutdown { + Ok(result) => { + json!({"ok":result.is_ok(),"timed_out":false,"error":result.err().map(|error|error.to_string())}) + } + Err(error) => { + json!({"ok":false,"timed_out":true,"error":error.to_string(),"custody":"supervisor retained; timeout is not release evidence"}) + } + }; + arm["final_registry"] = json!(facade.registry_snapshot()); + arm["diagnostics"] = json!(facade.residency_diagnostics()); + match events(root) { + Ok(events) => arm["events"] = json!(events), + Err(error) => { + arm["event_error"] = json!(error.to_string()); + } + } + let (records, error) = logs(log_start); + arm["logs"] = json!(records); + arm["collector_error"] = json!(error); + if let Err(error) = progress( + progress_file, + name, + "teardown_returned", + arm["shutdown"].clone(), + ) { + io_error.get_or_insert_with(|| error.to_string()); + } + arm["diagnostic_io_error"] = json!(io_error); + // Save raw outcomes before the caller runs any acceptance oracle. + save(root, "arm.json", &arm)?; + drop(facade); + if io_error.is_some() { + return Err("diagnostic output failed; retained prefix preserved".into()); + } + Ok(arm) + } + + #[tokio::test] + #[ignore = "one held native protocol; requires separate exact-source admission and evidence root"] + async fn fixed_two_ready_native_key_reuse_comparison() -> Outcome<()> { + let root = PathBuf::from( + std::env::var_os("PANTOGRAPH_M5_KEY_REUSE_EVIDENCE_ROOT") + .ok_or("mandatory evidence root missing")?, + ); + if !root.is_absolute() { + return Err("absolute evidence root required".into()); + } + if !root.is_dir() { + return Err("outer source/binary freeze must create the evidence root first".into()); + } + let metadata = PathBuf::from( + std::env::var_os("PUMAS_REGISTRY_DB_PATH") + .ok_or("static Pumas metadata path missing")?, + ); + if metadata != root.join("metadata.db") || metadata.exists() { + return Err( + "fresh root/metadata.db must be selected before this process starts".into(), + ); + } + save( + &root, + "protocol.json", + &json!({"protocol":PROTOCOL,"arms":["baseline","enabled"],"texts":TEXTS, + "public_runs_per_arm":1,"native_forwards_per_arm":2,"cpu_threads":1,"declared_ram_bytes":2_u64*1024*1024*1024, + "run_readiness_seconds":60,"teardown_close_seconds_total":5,"shutdown_seconds":30,"retries":0,"speedup_claim":false,"memory_claim":false, + "input_source":"committed BERT8 golden texts[0..2]","scheduler_cleanup_match":"source-assisted, registry ACK distinct", + "pumas_metadata":"one process-wide fresh metadata.db shared by arms; private library/project/RuntimeRegistry roots differ"}), + )?; + let mut progress_file = OpenOptions::new() + .write(true) + .create_new(true) + .open(root.join("progress.jsonl"))?; + LOG.0.lock().map_err(|_| "collector lock unavailable")?.file = Some( + OpenOptions::new() + .write(true) + .create_new(true) + .open(root.join("native-rows.jsonl"))?, + ); + log::set_logger(&LOG) + .map_err(|_| "isolated held process requires exclusive logger ownership")?; + log::set_max_level(log::LevelFilter::Info); + let golden: Value = serde_json::from_slice(include_bytes!( + "../../inference/tests/fixtures/candle_bert/bert-8/golden.json" + ))?; + require( + golden["texts"][0] == TEXTS[0] && golden["texts"][1] == TEXTS[1], + "fixed golden inputs changed", + )?; + let mut arms = Vec::new(); + let result: Outcome<()> = async { + for enabled in [false, true] { + let arm = run_arm( + &root.join(if enabled { "enabled" } else { "baseline" }), + enabled, + &mut progress_file, + ) + .await?; + arms.push(arm); + verify_arm(arms.last().ok_or("arm absent")?, enabled, &golden)?; + } + verify_comparison(&arms, &golden)?; + Ok(()) + } + .await; + save( + &root, + "comparison.json", + &json!({"ok":result.is_ok(),"error":result.as_ref().err().map(ToString::to_string),"arms":arms, + "speedup_claim":false,"complete_memory_claim":false,"native_batching_claim":false}), + )?; + result + } +} + +#[cfg(test)] +mod oracle_tests { + use super::*; + + fn positive(enabled: bool) -> (Value, Value) { + let run = if enabled { + "run-enabled" + } else { + "run-baseline" + }; + let golden = + json!({"single_vectors":[[1.,0.,0.,0.,0.,0.,0.,0.],[0.,1.,0.,0.,0.,0.,0.,0.]]}); + let mut logs = Vec::new(); + let mut events = Vec::new(); + for (index, node) in NODES.iter().enumerate() { + let task = format!("task-{index}"); + let attempt = format!("attempt-{index}"); + let lease = 10 + index; + logs.push(json!({"sequence":index*10,"record":{"phase":"service_opportunity","workflow_run_id":run,"task_id":task,"ticket":index+1}})); + let native = json!({"phase":"native_drained","workflow_id":WORKFLOW,"workflow_run_id":run,"node_id":node,"task_id":task, + "attempt_id":attempt,"execution_request_id":format!("request-{index}"),"candidate_id":format!("candidate-{index}"),"reservation_lease_id":lease, + "previous_owner":{"loaded_instance":vec![7;16],"loaded_profile":vec![8;32],"effective_settings":vec![9;32],"generation":2+index*2,"cpu_threads":1}, + "current_owner":{"loaded_instance":vec![7;16],"loaded_profile":vec![8;32],"effective_settings":vec![9;32],"generation":4+index*2,"cpu_threads":1}}); + logs.push(json!({"sequence":index*10+4,"record":native})); + let mut ack = native; + ack["phase"] = json!("task_registry_ack"); + ack["registry_task_release_acknowledged"] = json!(true); + ack["scheduler_cleanup_acknowledged"] = json!(false); + ack["lifecycle_event_id"] = json!(format!("lifecycle-{index}")); + logs.push(json!({"sequence":index*10+5,"record":ack})); + for (offset, transition) in ["started", "completed"].iter().enumerate() { + events.push(json!({"event_seq":index*2+offset+1,"workflow_run_id":run,"node_id":node,"payload":{ + "payload_type":"scheduler_task_attempt_lifecycle_changed","execution_class":"runtime","transition":transition, + "scheduler_task_id":task,"scheduler_attempt_id":attempt,"reservation_id":format!("runtime-registry.{lease}"), + "selected_runtime_id":"candle","selected_runtime_variant_id":"candle.cpu","selected_device_id":"cpu"}})); + } + } + logs.push(json!({"sequence":2,"record":{"phase":"proposal","workflow_run_id":run,"task_ids":["task-0","task-1"]}})); + if enabled { + logs.push(json!({"sequence":1,"record":{"phase":"warm_service_forecasts","coverage":"captured_compatible_prefix","scope":"opaque","forecasts":[{},{}]}})); + logs.push(json!({"sequence":30,"record":{"phase":"grouping_observations","scope":"opaque","phases":PHASES.iter().map(|phase|json!({"phase":phase,"aggregate":{"state":"available","calls":1,"elapsed_ns":0}})).collect::>()}})); + } + let arm = json!({"enabled":enabled,"configuration":{"key_reuse":enabled,"fair":true,"residency":true},"error":null,"collector_error":null, + "session_close":{"ok":true},"graph_closes_ok":true,"shutdown":{"ok":true,"timed_out":false},"final_registry":{"reservations":[],"runtimes":[{}]}, + "diagnostics":{"loads":1,"retains":1,"forward_drains":2,"stops":1,"has_idle_owner":false}, + "work":{"encodings":if enabled {4}else{6},"hits":if enabled {4}else{0},"retained":0,"error":null}, + "response":{"workflow_run_id":run,"outputs":OUTPUTS.iter().enumerate().map(|(index,node)|json!({"node_id":node,"port_id":"vector","value":golden["single_vectors"][index]})).collect::>()}, + "retained":OUTPUTS.iter().enumerate().map(|(index,node)|json!({"node_id":node,"workflow_run_id":run,"artifact_id":format!("artifact-{index}"), + "read":{"artifact_id":format!("artifact-{index}"),"complete":true,"byte_length":32},"body_bytes":32,"value":golden["single_vectors"][index]})).collect::>(), + "resume_run_ids":[run],"logs":logs,"events":events}); + (arm, golden) + } + + #[test] + fn hand_declared_pair_oracle_accepts_both_arms_and_zero_resolution_elapsed() { + let (baseline, golden) = positive(false); + let (enabled, _) = positive(true); + assert_eq!(verify_comparison(&[baseline, enabled], &golden), Ok(())); + } + + #[test] + fn mechanism_oracle_refuses_missing_hit_and_unavailable_or_nonempty_cache() { + let (arm, golden) = positive(true); + for work in [ + json!({"encodings":4,"hits":0,"retained":0,"error":null}), + json!({"error":"grouping cache unavailable"}), + json!({"encodings":4,"hits":4,"retained":1,"error":null}), + ] { + let mut changed = arm.clone(); + changed["work"] = work; + assert!(verify_arm(&changed, true, &golden).is_err()); + } + } + + #[test] + fn identity_oracle_refuses_foreign_attempt_lease_missing_start_and_reused_grant() { + let (arm, golden) = positive(true); + for field in ["attempt_id", "reservation_lease_id"] { + let mut changed = arm.clone(); + changed["logs"][2]["record"][field] = json!("foreign"); + assert!(verify_arm(&changed, true, &golden).is_err()); + } + let mut changed = arm.clone(); + changed["events"].as_array_mut().unwrap().remove(0); + assert!(verify_arm(&changed, true, &golden).is_err()); + let mut changed = arm; + changed["logs"][3]["record"]["ticket"] = json!(1); + assert!(verify_arm(&changed, true, &golden).is_err()); + } + + #[test] + fn phase_oracle_refuses_missing_unavailable_or_unobserved_spans_and_baseline_clocks() { + let (arm, golden) = positive(true); + for aggregate in [ + json!({"state":"unavailable","reason":"lock_unavailable"}), + json!({"state":"available","calls":0,"elapsed_ns":1}), + ] { + let mut changed = arm.clone(); + changed["logs"][8]["record"]["phases"][1]["aggregate"] = aggregate; + assert!(verify_arm(&changed, true, &golden).is_err()); + } + let mut changed = arm.clone(); + changed["logs"][8]["record"]["phases"] + .as_array_mut() + .unwrap() + .pop(); + assert!(verify_arm(&changed, true, &golden).is_err()); + let (mut baseline, _) = positive(false); + baseline["logs"] + .as_array_mut() + .unwrap() + .push(arm["logs"][8].clone()); + assert!(verify_arm(&baseline, false, &golden).is_err()); + } + + #[test] + fn cleanup_and_output_oracle_refuses_uncertain_shutdown_false_ack_and_bad_golden() { + let (arm, golden) = positive(true); + let mut changed = arm.clone(); + changed["shutdown"]["timed_out"] = json!(true); + assert!(verify_arm(&changed, true, &golden).is_err()); + let mut changed = arm.clone(); + changed["logs"][2]["record"]["registry_task_release_acknowledged"] = json!(false); + assert!(verify_arm(&changed, true, &golden).is_err()); + let mut changed = arm.clone(); + changed["response"]["outputs"][0]["value"][0] = json!(0.1); + assert!(verify_arm(&changed, true, &golden).is_err()); + let mut changed = arm; + changed["retained"][0]["workflow_run_id"] = json!("foreign"); + assert!(verify_arm(&changed, true, &golden).is_err()); + } + + #[test] + fn native_owner_oracle_refuses_missing_settings_wrong_threads_and_broken_lineage() { + let (arm, golden) = positive(true); + for owner in [Value::Null, json!({"cpu_threads":2})] { + let mut changed = arm.clone(); + changed["logs"][1]["record"]["previous_owner"] = owner; + assert!(verify_arm(&changed, true, &golden).is_err()); + } + for (field, value) in [ + ("generation", json!(99)), + ("cpu_threads", json!(2)), + ("effective_settings", json!(vec![10; 32])), + ] { + let mut changed = arm.clone(); + changed["logs"][1]["record"]["current_owner"][field] = value; + assert!(verify_arm(&changed, true, &golden).is_err()); + } + let mut changed = arm; + changed["logs"][4]["record"]["previous_owner"]["generation"] = json!(8); + changed["logs"][4]["record"]["current_owner"]["generation"] = json!(10); + assert!(verify_arm(&changed, true, &golden).is_err()); + } + + #[test] + fn retained_read_oracle_refuses_truncated_foreign_or_inconsistent_byte_reads() { + let (arm, golden) = positive(true); + for (field, value) in [ + ("complete", json!(false)), + ("artifact_id", json!("foreign")), + ("byte_length", json!(1)), + ] { + let mut changed = arm.clone(); + changed["retained"][0]["read"][field] = value; + assert!(verify_arm(&changed, true, &golden).is_err()); + } + } +} diff --git a/crates/pantograph-embedded-runtime/src/serial_cpu_residency_tests.rs b/crates/pantograph-embedded-runtime/src/serial_cpu_residency_tests.rs index a1cd3eeb7..c80dc356c 100644 --- a/crates/pantograph-embedded-runtime/src/serial_cpu_residency_tests.rs +++ b/crates/pantograph-embedded-runtime/src/serial_cpu_residency_tests.rs @@ -4,6 +4,9 @@ use pantograph_workflow_service::graph::{ }; use serde_json::json; +#[path = "serial_cpu_residency_key_reuse_qualification.rs"] +mod key_reuse_qualification; + const MODEL: &str = "embedding/qualification/synthetic-bert-8"; pub(crate) fn save_model_free_evidence(case: &str, observations: serde_json::Value) { diff --git a/crates/pantograph-workflow-service/src/workflow/serial_ready/configuration_tests.rs b/crates/pantograph-workflow-service/src/workflow/serial_ready/configuration_tests.rs index 61b584bd7..e83a9b1fa 100644 --- a/crates/pantograph-workflow-service/src/workflow/serial_ready/configuration_tests.rs +++ b/crates/pantograph-workflow-service/src/workflow/serial_ready/configuration_tests.rs @@ -77,6 +77,41 @@ impl SerialRuntimeHostBatchExecutionPort for UnqueriedPort { } struct UnqueriedCandidates; + +#[test] +fn fallible_grouping_observation_refuses_absent_mode_and_poisoned_cache() { + assert!(matches!( + WorkflowService::new().try_serial_grouping_work_for_test(), + Err(crate::workflow::WorkflowServiceError::InvalidRequest(_)) + )); + let service = WorkflowService::new_serial_ready_cpu( + Arc::new(UnqueriedPort), + WorkflowSerialReadyConfig::default() + .with_fair_service_opportunities() + .with_bounded_grouping() + .unwrap(), + ); + assert_eq!( + service.try_serial_grouping_work_for_test().unwrap(), + (0, 0, 0) + ); + let poisoned = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { + let _guard = service + .serial_ready_mode + .as_ref() + .unwrap() + .grouping + .lock() + .unwrap(); + panic!("controlled test-support cache poison"); + })); + assert!(poisoned.is_err()); + assert!(matches!( + service.try_serial_grouping_work_for_test(), + Err(crate::workflow::WorkflowServiceError::Internal(_)) + )); +} + impl WorkflowRuntimeDispatchCandidateProvider for UnqueriedCandidates { fn runtime_dispatch_candidates( &self, diff --git a/crates/pantograph-workflow-service/src/workflow/serial_ready/grouping.rs b/crates/pantograph-workflow-service/src/workflow/serial_ready/grouping.rs index 372443418..bc5567891 100644 --- a/crates/pantograph-workflow-service/src/workflow/serial_ready/grouping.rs +++ b/crates/pantograph-workflow-service/src/workflow/serial_ready/grouping.rs @@ -298,6 +298,31 @@ impl SerialReadyMode { pub(super) mod tests; impl super::WorkflowService { + /// Fallible test-support observation of mechanism work and retained entries. + /// Absent serial mode or poisoned cache is unavailable, never measured zero. + /// These fixed counters confer no execution or cleanup authority. + #[cfg(any(test, feature = "test-support"))] + pub fn try_serial_grouping_work_for_test( + &self, + ) -> Result<(u64, u64, usize), super::WorkflowServiceError> { + use std::sync::atomic::Ordering; + let mode = self.serial_ready_mode.as_ref().ok_or_else(|| { + super::WorkflowServiceError::InvalidRequest( + "serial grouping observation requires serial mode".into(), + ) + })?; + let cache = mode.grouping.lock().map_err(|_| { + super::WorkflowServiceError::Internal( + "serial grouping observation cache unavailable".into(), + ) + })?; + Ok(( + mode.key_encodings.load(Ordering::Relaxed), + mode.key_cache_hits.load(Ordering::Relaxed), + cache.entries.len(), + )) + } + /// Test-only mechanism counts, including independent final-request hashing. /// These counters establish no end-to-end or real-model performance result. #[cfg(any(test, feature = "test-support"))] diff --git a/docs/plans/cpu-scheduler/execution-ledger.md b/docs/plans/cpu-scheduler/execution-ledger.md index 267edbfdf..c574ca5dd 100644 --- a/docs/plans/cpu-scheduler/execution-ledger.md +++ b/docs/plans/cpu-scheduler/execution-ledger.md @@ -1,6 +1,53 @@ # CPU Scheduler Execution Ledger + +## 2026-10-21 — PR90 integration and fixed native comparison admission + +- User explicitly authorized guarded normal merge at c45d103f and the finite + native comparison producer, independent review, prospective freeze and one + retained execution. Fresh remote/actor/exact tree540618b7, successful22checks/ + four PR workflows and empty review/thread arrays were verified. Independent + source reviewer extended approval to merge. Ready transition preserved all + checks; normal merge succeeded as ecfed47d, parentsdc64b895/c45d103f and identical + tree. Actual-main CI is pending independently; all earlier resources retained. +- Producer write set: new serial_cpu_residency_key_reuse_qualification.rs under + existing test module plus its registration; test-support fallible scalar read + in serial_ready/grouping.rs and focused configuration_tests.rs; this canonical + plan/ledger/issues/checklist and the prospective protocol/result report. No + production policy/default/native allocator or dependency/manifest/lock change. +- Two independent pre-code reviews admitted fixed two-arm/two-Ready/four-forward + BERT-8 comparison and strict source-derived counts (baseline6/0, enabled4/4). + Each public member keeps its own grant/Start/drain/registryACK. No native wrapper, + injected readiness/history or redefined scheduler ACK. Resource, termination, + golden/input, evidence availability and no-winner-retry conditions are fixed in + the [protocol](reports/2026-10-21-m5-native-key-reuse-protocol.md). +- Root owns grouping helper/tests, module registration, canonical docs, freeze/ + invocation and serial integration. review_m3_merge owns only the new producer + file. review_c2a_m6 independently reviews source/oracles/protocol/evidence and + never executes the held run. New branchtest/cpu-scheduler-native-key-reuse and + /workspace/pantograph-native-key-reuse are retained-protected for parent review, + target main ecfed47d; no cleanup is authorized. +- The legacy test getter maps poisoned cache to0, so it cannot prove emptiness. + A new fallible companion retains old callers and rejects absent mode/poison. + Its controlled poison/healthy/absent regression passed, with no native work. + Full workflow library1048 and default embedded library614 passed; the latter + retains two existing ignored cost probes. Seven model-free oracle cases passed + with inventory enabled, compiling but never executing the held native body. + All-feature/all-target own-package warning-deny Clippy and warning-deny + own-package Rustdoc passed, as did formatting, staged traceability/local links + and declared pre-push261/one existing ignore+168. Independent source/protocol/ + supervisor review approved freezing; exact manifest/binary review still gates + execution, alongside actual-main CI. No native comparison has executed. +- Retained preparation failures: first default library run569passed/45setup + failures because the supported scratch Pumas metadata override was omitted; + the corrected process-local override run passed614. No HOME/security change. + Initial traceability lacked explicit staged/range selection; corrected staged + gate passed nine paths. First strict Clippy found a redundant Ok/try expression + in the new held helper; a semantic-preserving fix was independently re-reviewed + before the corrected strict gate passed. Initial author misprofile compile + stopped130 before any tests. No failure is erased or relabeled native evidence. + ## 2026-10-21 — PR89 integration and finite M5/M6 consuming path - User authorized normal PR89 integration and required a complete remaining-plan diff --git a/docs/plans/cpu-scheduler/issues.md b/docs/plans/cpu-scheduler/issues.md index a2212badb..c382336c7 100644 --- a/docs/plans/cpu-scheduler/issues.md +++ b/docs/plans/cpu-scheduler/issues.md @@ -50,3 +50,6 @@ are bounded implementation corrections, not default-policy or recovery expansion | CPU-36 | Original completed embedding-result payload can remain allocated in an unpolled join or surviving Shared/Arc reader after worker exit/drain; wrapper completion is not final storage retirement. | PR89 merged normally as dc64b895 after independent merge approval and 22 successful source check runs/four PR workflows; post-merge CI is pending. The reviewed safe-Rust foundation attaches one lease inside the blocking worker to the immutable completed result and releases after actual payload drop. Four fixed job-owner counters measure only observed retained Vec capacity. Complete allocator/attempt memory remains unavailable; existing admission and cleanup authority stay unchanged. See [contract](reports/2026-10-21-result-payload-attribution.md). | | CPU-37 | The protected `EmbeddedSerialCpuResidency` consumer hardcodes fair+residency with key reuse off and exposes no immutable configuration query, leaving the existing C2a opt-in inaccessible through that safe owner. | Add one explicit key-reuse constructor and delegate the existing value query, preserving defaults, config literals, private owners and shutdown. The [finite checklist](reports/2026-10-21-m5-m6-completion-checklist.md) owns remaining consumer and actual CPU gates; complete allocator diagnostics are not a substitute. | + +| CPU-38 | Existing test-support cache length maps poison/absent mode to0, so a qualification oracle could confuse unavailable evidence with an empty healthy cache. | Add a fallible test-only scalar companion, preserve legacy callers, and require explicit failure for absent/poisoned evidence before interpreting zero. Controlled regression passes; no production accounting/admission change. | +| CPU-39 | Actual native baseline-versus-key-reuse evidence remains missing despite controlled-worker and constructor coverage. | User authorized the [prospectively fixed protocol](reports/2026-10-21-m5-native-key-reuse-protocol.md), source/oracle review and one frozen retained execution. Do not run before prerequisites or choose criteria after outcomes. Counts/CPU outputs qualify only the disclosed two-member untrained-fixture envelope; representative model/hardware performance remains separate. | diff --git a/docs/plans/cpu-scheduler/plan.md b/docs/plans/cpu-scheduler/plan.md index 9dd860f4d..4c568b4a9 100644 --- a/docs/plans/cpu-scheduler/plan.md +++ b/docs/plans/cpu-scheduler/plan.md @@ -2,9 +2,9 @@ **Plan status:** `Active` — M1/M2/M3, bounded M4, M5 C1/C2a, M6a and the bounded warm-service/grouping diagnostic producer are accepted and merged. Overall M5, broader M6 and real-model qualification remain unaccepted. -**Current phase:** PR89 merged normally as `dc64b895180260ceef8619bedd1ac6d8b756a3ec`, tree `2d59d369f11b89e119c54afce9f0a6df86ada4bd`, preserving main `dc926783` and source `48717570` as parents. Independent exact-source review approved merging; all 22 source check runs and four PR workflows passed. Post-merge CI is pending. CodeRabbit status supplies no independent source-review credit. PR88 and prior integrations remain accepted within their reported limits; all earlier branches, PR84 lineage and unrelated work remain protected. +**Current phase:** PR90 merged normally as `ecfed47da7c51d03b968bed739e2abc06eb4a6de`, exact reviewed tree `540618b75e7ebbde9a5713c8ac14f05e77936f80`, preserving main `dc64b895` and source `c45d103f` as parents. Independent source approval extended to merge and all 22 source checks/four PR workflows passed. Actual-main post-merge CI is monitored separately. PR89 main `dc64b895` completed all20 post-merge checks/four workflows. CodeRabbit supplies no independent source-review credit. Prior branches, PR84 lineage and unrelated work remain retained-protected. -**Next slice:** Verify and publish the implemented ordinary-member key-reuse consuming path through the protected residency facade, following the [finite M5/M6 checklist](reports/2026-10-21-m5-m6-completion-checklist.md). The additive constructor choice reuses the immutable configuration snapshot; preserve the existing constructor, admission and lifecycle. The integrator selects C2's safe ordinary-member planning-reuse option as this supported envelope. Actual CPU comparison and final consumer qualification remain required before accepting that envelope. Complete allocator instrumentation is separate future work for a complete-memory claim, not a prerequisite for cost-free key reuse. Do not add another partial instrumentation domain instead of closing the five finite checklist rows. +**Next slice:** Complete finite checklist M5-CPU with the [prospective native comparison protocol](reports/2026-10-21-m5-native-key-reuse-protocol.md). A held test drives both baseline and explicit key-reuse facade through public sessions, with two fixed BERT-8 members per arm and four native forwards overall. Privately observe existing bounded test-support scalars using a fallible helper that refuses absent mode/poison. Compile and review producer/oracles, freeze exact source/binary/fixtures/environment and criteria, then execute once and retain all outcomes. Counts prove only the fixed mechanism; timings are descriptive. No admission, default, allocator or native batching change. Close exactly the finite rows that pass; do not substitute another diagnostic slice for failure or missing evidence. **Acceptance status:** M1 merged as PR73 in main `07b23d47`; the original negative cohort and the separately accepted C3 supplement remain unchanged. diff --git a/docs/plans/cpu-scheduler/reports/2026-10-21-m5-m6-completion-checklist.md b/docs/plans/cpu-scheduler/reports/2026-10-21-m5-m6-completion-checklist.md index ddd00cd0c..08177edf9 100644 --- a/docs/plans/cpu-scheduler/reports/2026-10-21-m5-m6-completion-checklist.md +++ b/docs/plans/cpu-scheduler/reports/2026-10-21-m5-m6-completion-checklist.md @@ -26,10 +26,10 @@ advisory grouping proposal as executing a group. | ID | Required outcome and deciding evidence | Current disposition / stop condition | | --- | --- | --- | -| INT-89 | PR89 exact head `48717570004be87735c4b693212fdadf154d8738`, tree `2d59d369f11b89e119c54afce9f0a6df86ada4bd`, independently approved for merge; normal merge preserves both parents; actual merge CI terminal. | Source had 22 successful checks/four PR workflows. Merged as `dc64b895180260ceef8619bedd1ac6d8b756a3ec`, parents `dc926783` and `48717570`, identical tree. Post-merge CI is pending; the integration receipt owns final run identities. Stop integration on an actual failed required check and diagnose permitted fresh evidence. | +| INT-89 | PR89 exact head `48717570004be87735c4b693212fdadf154d8738`, tree `2d59d369f11b89e119c54afce9f0a6df86ada4bd`, independently approved for merge; normal merge preserves both parents; actual merge CI terminal. | Source had 22 successful checks/four PR workflows. Merged as `dc64b895180260ceef8619bedd1ac6d8b756a3ec`, parents `dc926783` and `48717570`, identical tree. All20 post-merge checks/four workflows passed at dc64b895; the integration receipt and merged PR89 own final run identities. Stop integration on an actual failed required check and diagnose permitted fresh evidence. | | M5-SW | Bounded C1 library API and C2a ordinary-worker key reuse preserve fresh per-member authority, fallback, bounds and cleanup. | Implemented/merged PR85/86; independently reviewed focused and controlled-worker evidence exists. Do not add another scheduler, forecast store or allocator observer to close this row. | -| M6-SW | One supported owning host can explicitly choose that existing key-reuse mode and read its immutable configuration without exposing private authority. Existing constructor remains unchanged; shutdown/reconstruction is rollback. | Concrete missing production capability after PR89: `EmbeddedSerialCpuResidency::new` fixes fair+residency with reuse off and offers no choice/query. The reviewed implementation adds the explicit constructor and delegates the existing query. Default/inventory consumer tests pass; publication and required exact-head CI remain to decide this row. | -| M5-CPU | One prospectively fixed actual CPU baseline-versus-key-reuse comparison through public sessions verifies exact outputs, member/attempt identities, separate grants/Starts and matched cleanup, with fresh owner/proof checks. Capture actual cache behavior and all five existing phase spans; report elapsed observations descriptively. | Pending software qualification producer/protocol admission, then one retained execution using committed untrained BERT fixtures. Existing controlled 30-versus-16 encoding counts and isolated local times are not native acceptance. Missing instrumentation in this producer is software work, not an external-input blocker. Stop on the fixed protocol's terminal outcome, any missing criterion or infrastructure failure; preserve all outcomes and do not tune/retry for a winner. | +| M6-SW | One supported owning host can explicitly choose that existing key-reuse mode and read its immutable configuration without exposing private authority. Existing constructor remains unchanged; shutdown/reconstruction is rollback. | Concrete missing production capability after PR89: `EmbeddedSerialCpuResidency::new` fixes fair+residency with reuse off and offers no choice/query. The reviewed implementation adds the explicit constructor and delegates the existing query. PR90 source c45d103f passed all22 checks/four workflows and both new hosted cases (607 library passes/two existing ignores), then merged normally as ecfed47d with identical approved tree. Actual-main post-merge CI is pending separately. | +| M5-CPU | One prospectively fixed actual CPU baseline-versus-key-reuse comparison through public sessions verifies exact outputs, member/attempt identities, separate grants/Starts and matched cleanup, with fresh owner/proof checks. Capture actual cache behavior and all five existing phase spans; report elapsed observations descriptively. | The [prospective protocol](2026-10-21-m5-native-key-reuse-protocol.md) fixes two Ready members/arm and strict baseline6encodings/0hits versus enabled4encodings/4hits before execution. Producer/oracle source review approved freezing; seven model-free oracle tests and affected package/static checks passed. Exact manifest/binary review and one retained execution remain pending. Existing controlled 30-versus-16 encoding counts and isolated local times are not native acceptance. Stop on the fixed protocol's terminal outcome, any missing criterion or infrastructure failure; preserve all outcomes and do not tune/retry for a winner. | | M6-CLOSE | Independent exact source/consumer/evidence review, required exact-head CI and post-merge checks support the bounded host choice and operator instructions. | Pending M6-SW and M5-CPU. Close only the named ordinary-member envelope; retain other qualifications below. No UI, IPC, persistence, deployment or default activation is implied. | These five rows are the completion boundary. After they pass, stop implementation @@ -68,10 +68,10 @@ suitable devices/hosts already excluded by the plan. existing authority. Optional telemetry expansion must name a decision it changes before it delays this finite checklist. -## Next software slice and review boundary +## Accepted consumer slice and next qualification boundary -Write set: `serial_cpu_residency.rs`, its existing tests, the host-options guide, -this checklist and canonical CPU plan/ledger/issues. Add +The accepted consumer write set was `serial_cpu_residency.rs`, its existing tests, the host-options guide, +this checklist and canonical CPU plan/ledger/issues. It added `EmbeddedSerialCpuResidency::new_with_bounded_key_reuse(config)` and `scheduler_configuration()` returning the existing value snapshot. Reuse one private constructor implementation and existing builders; preserve config struct diff --git a/docs/plans/cpu-scheduler/reports/2026-10-21-m5-native-key-reuse-protocol.md b/docs/plans/cpu-scheduler/reports/2026-10-21-m5-native-key-reuse-protocol.md new file mode 100644 index 000000000..6e7575261 --- /dev/null +++ b/docs/plans/cpu-scheduler/reports/2026-10-21-m5-native-key-reuse-protocol.md @@ -0,0 +1,87 @@ +# Fixed native CPU key-reuse comparison: prospective contract + +Authority: continue docs/plans/cpu-scheduler/plan.md and finite checklist M5-CPU. +The user explicitly authorized implementation, independent review, freezing and +one bounded retained execution. This draft is not an execution receipt. + +One baseline arm then one enabled arm. Each constructs a fresh protected +EmbeddedSerialCpuResidency using the existing baseline or explicit key-reuse +constructor, authors one two-branch graph, opens one authenticated attributed +session and executes exactly one run. Both arms use the committed untrained +BERT-8 fixture and golden texts[0]="hello world", texts[1]="hello", paired with +single_vectors[0] and [1]. Exactly two forwards per arm/four overall; minimum +three history samples prevents trained ranking. No seeded timing/Ready/proofs, +downloaded model, external backend or fake native delegate is admitted. + +Each arm must observe a genuine two-Ready proposal. Enabled capture must contain +two compatible members. Mechanism oracle fixed before execution: baseline six +key encodings/zero hits, enabled four encodings/four hits, both healthy retained +entries zero after completed scope. These are the existing source-derived +n=2 controlled-worker formulas, not elapsed-time or total CPU improvement claims. +Poison/absent mode is unavailable and fails. A changed snapshot that defeats this +specific target is a retained failure, not permission to reinterpret the target. + +Both returned and retained vectors must match their corresponding frozen golden +within fixed absolute tolerance <=1e-5 and identical dimensions. Require exactly +two distinct member grants/Starts/drains/registry receipt ACKs with bijective +run/task/attempt/lease joins and observed native previous/current owner identity, +settings, one-thread and generation continuity checks; no injected capability. Registry ACK is not relabeled +scheduler ACK. Scheduler matching remains explicitly source-assisted through the +existing adapter and successful public completion. Full raw private readiness +proof/owner lineage is not independently observed. Independent source and focused +negative tests retain the final owner/Start/cleanup fence proof. + +Enabled diagnostics must contain available positive-call observations for all +five existing grouping phases and the actual captured pair. Nested spans overlap +and must not be summed; logging/observer overhead remains uncalibrated. Baseline +grouping instrumentation is disabled and reported absent, never measured zero. +No duration threshold or winner is chosen. Counts and correctness decide only +the disclosed two-member synthetic mechanism/ownership envelope. + +Resource/termination bounds: one configured CPU thread, existing explicit +operator declarations (2GiB RAM budget,1GiB VRAM budget unused by CPU,32MiB +resident and600MiB load envelope), eight graph nodes/six edges per arm, two short +fixed texts, four native forwards total. Declarations are not allocation +measurements. Record actual cgroup/affinity and fixture/binary sizes. Logger +capacity2048rows/4MiB; raw structured rows persist incrementally with sync so a +watchdog retains the observed prefix. Parse/overflow/I/O failure vetoes success. Each arm run plus +readiness resume waits at most60seconds, public shutdown at most30seconds. Session/graph closes share a five-second +absolute budget before the independent shutdown attempt. +A180second outer own-process execution watchdog is a hard global ceiling, not a guarantee +that both arms plus setup/teardown fit. At the deadline the supervisor kills only its own new process group and +attempts reaping for at most five more seconds. Watchdog failure/unknown shutdown +cannot be labeled cleanup success. Attempt public shutdown after every post-construction +body/oracle/I/O error; never start the next arm before acknowledged first teardown. + +All actual actions use public facade graph/session/run/resume/readback/artifact/ +close/shutdown methods. Private access is read-only scalar test-support evidence. +Pumas metadata uses one fresh process-local registry override, shared across arms; +each owns distinct local project/library/appdata and native RuntimeRegistry. The child has an8GiB virtual-address-space ceiling and the current observed +cgroup ceilings remain in force; this execution limit is not a footprint +measurement. No HOME, authentication, permission, sandbox or admission setting +changes. + +Before execution: PR90 actual-main post-merge checks/workflows successful; +independent source/oracle/protocol review; ordinary model-free +oracles including missing identities/hits/phases/outputs/cleanup and poisoned +counter negatives; exact source commit/tree and clean checkout; compile without +running the held test; copy/hash the exact producer binary; hash every fixture +and protocol; record toolchain, settings, environment allowlist, limits and input +oracle into a create-new manifest/evidence root. Review actual binary discovery +with --list (no native execution). No code/build changes or concurrent local +compilation during the held run. Execute exactly the discovered held test +serial_cpu_residency::tests::key_reuse_qualification::held::fixed_two_ready_native_key_reuse_comparison. +Require the static metadata override at evidence-root/metadata.db. The frozen +supervisor uses an exclusive execution-started marker, no automatic retry, +immutable hashes and the same cgroup/affinity at execution. Launch only the exact ignored held test once. + +Retain progress, raw rows, body error, teardown outcome and oracle outcome even +when failure occurs. Stop on the single terminal outcome, missing/unknown facts, +overflow, infrastructure failure or uncertain teardown. No rerun, post-outcome +input tuning, population growth, continued failed owners or retrospective +acceptance change. A genuine evidenced implementation defect may be repaired +separately only after re-planning; original cohort remains failed. + +After execution independently review raw evidence against these frozen criteria. +Do not close overall M5/M6, performance, complete memory, native batching, +representative model quality or hardware claims from this narrow comparison. From aea54f7ff4d7bc780b947b6cc11c61df27237dd0 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Wed, 21 Oct 2026 06:22:19 +0000 Subject: [PATCH 2/4] docs(cpu-scheduler): retain failed native qualification cohort --- docs/plans/cpu-scheduler/execution-ledger.md | 31 ++++ docs/plans/cpu-scheduler/issues.md | 6 +- docs/plans/cpu-scheduler/plan.md | 4 +- .../2026-10-21-m5-m6-completion-checklist.md | 6 +- .../2026-10-21-m5-native-key-reuse-result.md | 133 ++++++++++++++ .../archive-sha256.json | 9 + .../original-file-sha256.json | 162 ++++++++++++++++++ .../retained-failed-cohort.tar.gz | Bin 0 -> 131098 bytes 8 files changed, 344 insertions(+), 7 deletions(-) create mode 100644 docs/plans/cpu-scheduler/reports/2026-10-21-m5-native-key-reuse-result.md create mode 100644 docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v1/archive-sha256.json create mode 100644 docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v1/original-file-sha256.json create mode 100644 docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v1/retained-failed-cohort.tar.gz diff --git a/docs/plans/cpu-scheduler/execution-ledger.md b/docs/plans/cpu-scheduler/execution-ledger.md index c574ca5dd..4f6430048 100644 --- a/docs/plans/cpu-scheduler/execution-ledger.md +++ b/docs/plans/cpu-scheduler/execution-ledger.md @@ -2,6 +2,37 @@ +## 2026-10-21 — Single native cohort terminal failure and finite stop + +- PR90 actual main ecfed47d completed all20 checks/four workflows successfully, + preserving tree540618b7, twelve prior branch tips and eight prior clean + worktrees. Integration receipt SHA2569d7e20d34d5a1a55811134dd35058f3795f0f966a0fdf49b0c05b95b84a38daf. +- Independent review approved the exact nine-path staged source for commit/draft, + then exact frozen manifest/binary for one run after that actual-main gate. + Source fb7ba0e3/tree203f7b4a and manifest1aecf82f were unchanged. Root alone ran + the reviewed supervisor once, with no concurrent local compilation. +- Terminal result FAILED, exit101, reaped, no timeout: baseline completed two + forwards,6encodings/0hits/0retained and acknowledged closes/shutdown; frozen + candidate-ID distinctness oracle failed on runtime.candle. Enabled never ran. + Both source-author and independent source/raw review confirmed candidate_id + is stable runtime-alternative identity, not unique member custody. The + pre-run source/fixture review missed that distinction. Do not reinterpret + the old oracle, erase its failure or continue to an enabled-only run. +- The [successor result report](reports/2026-10-21-m5-native-key-reuse-result.md) + records exact provenance, actual baseline facts, limits and durable archived + originals. Distinct actual custody identities, joins, owners4→6→8, numerical + outputs/readbacks and cleanup checked out independently. Conservative VRAM + reservation claims are present; no physical allocation/GPU claim follows. +- Finite stop: INT-89/M5-SW/M6-SW complete within existing limits; M5-CPU failed + v1, M6-CLOSE unaccepted. Publish unchanged producer/oracle/protocol plus + independently reviewed failure disposition as draft. Do not merge a failed + qualification or select another allocator/diagnostic domain. Any evidenced + oracle correction/new physical cohort requires separate prospective replanning. + Missing representative workloads/hardware did not prevent this software work. +- Original once-only evidence root, exclusive marker and all branches/worktrees + remain retained. Historical denied-log evidence and baseline strict inference + lint/Rustdoc limitations remain unretried and unsuppressed. + ## 2026-10-21 — PR90 integration and fixed native comparison admission - User explicitly authorized guarded normal merge at c45d103f and the finite diff --git a/docs/plans/cpu-scheduler/issues.md b/docs/plans/cpu-scheduler/issues.md index c382336c7..37eebf9eb 100644 --- a/docs/plans/cpu-scheduler/issues.md +++ b/docs/plans/cpu-scheduler/issues.md @@ -47,9 +47,11 @@ are bounded implementation corrections, not default-policy or recovery expansion | CPU-34 | The Ready boundary lacked a provenance-aware historical warm-service producer and inclusive measurements covering capture/cloning, bounds/equality and key work. Encoding counts alone establish no total-overhead result. | The bounded producer merged normally as PR88/dc926783 with exact approved tree88aaf720 after independent review, 22 successful check runs and four successful PR workflows. Local1,047-case evidence and the hosted84-case selection remain distinct. Admission and key-work counts stay unchanged. See [contract/evidence](reports/2026-10-21-provenance-producer.md). | | CPU-35 | Pinned Candle has no inspected complete CPU allocation-lifetime observer: tensor IDs alias storage, while BERT temporaries, GEMM scratch and Rayon attribution escape returned-buffer snapshots. | This is missing software instrumentation, not a hardware-only blocker. The reviewed completed-result foundation covers only original immutable output Vec payload ownership after materialization, with explicit bookkeeping windows. No placeholder memory API or reservation/RSS arithmetic is added. Dependency allocation/drop, shared-storage, scratch and worker attribution remains required for a future complete incremental-memory claim or admission use. It is not required for the cost-free C2a path selected by the finite completion checklist; no further allocator slice is next. Representative model/hardware evidence qualifies future claims later. | -| CPU-36 | Original completed embedding-result payload can remain allocated in an unpolled join or surviving Shared/Arc reader after worker exit/drain; wrapper completion is not final storage retirement. | PR89 merged normally as dc64b895 after independent merge approval and 22 successful source check runs/four PR workflows; post-merge CI is pending. The reviewed safe-Rust foundation attaches one lease inside the blocking worker to the immutable completed result and releases after actual payload drop. Four fixed job-owner counters measure only observed retained Vec capacity. Complete allocator/attempt memory remains unavailable; existing admission and cleanup authority stay unchanged. See [contract](reports/2026-10-21-result-payload-attribution.md). | +| CPU-36 | Original completed embedding-result payload can remain allocated in an unpolled join or surviving Shared/Arc reader after worker exit/drain; wrapper completion is not final storage retirement. | PR89 merged normally as dc64b895 after independent merge approval and 22 successful source check runs/four PR workflows; all20 post-merge checks/four workflows passed. The reviewed safe-Rust foundation attaches one lease inside the blocking worker to the immutable completed result and releases after actual payload drop. Four fixed job-owner counters measure only observed retained Vec capacity. Complete allocator/attempt memory remains unavailable; existing admission and cleanup authority stay unchanged. See [contract](reports/2026-10-21-result-payload-attribution.md). | -| CPU-37 | The protected `EmbeddedSerialCpuResidency` consumer hardcodes fair+residency with key reuse off and exposes no immutable configuration query, leaving the existing C2a opt-in inaccessible through that safe owner. | Add one explicit key-reuse constructor and delegate the existing value query, preserving defaults, config literals, private owners and shutdown. The [finite checklist](reports/2026-10-21-m5-m6-completion-checklist.md) owns remaining consumer and actual CPU gates; complete allocator diagnostics are not a substitute. | +| CPU-37 | The protected `EmbeddedSerialCpuResidency` consumer hardcodes fair+residency with key reuse off and exposes no immutable configuration query, leaving the existing C2a opt-in inaccessible through that safe owner. | PR90 implemented one explicit key-reuse constructor and direct existing value query, preserving defaults, config literals, private owners and shutdown. Normal merge ecfed47d and all20 actual-main checks/four workflows passed. The [finite checklist](reports/2026-10-21-m5-m6-completion-checklist.md) owns remaining consumer and actual CPU gates; complete allocator diagnostics are not a substitute. | | CPU-38 | Existing test-support cache length maps poison/absent mode to0, so a qualification oracle could confuse unavailable evidence with an empty healthy cache. | Add a fallible test-only scalar companion, preserve legacy callers, and require explicit failure for absent/poisoned evidence before interpreting zero. Controlled regression passes; no production accounting/admission change. | | CPU-39 | Actual native baseline-versus-key-reuse evidence remains missing despite controlled-worker and constructor coverage. | User authorized the [prospectively fixed protocol](reports/2026-10-21-m5-native-key-reuse-protocol.md), source/oracle review and one frozen retained execution. Do not run before prerequisites or choose criteria after outcomes. Counts/CPU outputs qualify only the disclosed two-member untrained-fixture envelope; representative model/hardware performance remains separate. | + +| CPU-40 | The frozen qualification oracle confuses stable runtime-alternative candidate identity with distinct member custody identity. | Actual provider correctly uses runtime.candle for both members. One retained v1 cohort failed after the baseline; enabled never started. Independent source/raw review confirms the software-oracle defect. Preserve the frozen source/criteria and [failure evidence](reports/2026-10-21-m5-native-key-reuse-result.md); no rerun or retrospective acceptance. Any correction/new cohort requires separate prospective replanning. This is not a missing external hardware/model input or a production authority-reuse finding. | diff --git a/docs/plans/cpu-scheduler/plan.md b/docs/plans/cpu-scheduler/plan.md index 4c568b4a9..bbb4f9e3d 100644 --- a/docs/plans/cpu-scheduler/plan.md +++ b/docs/plans/cpu-scheduler/plan.md @@ -2,9 +2,9 @@ **Plan status:** `Active` — M1/M2/M3, bounded M4, M5 C1/C2a, M6a and the bounded warm-service/grouping diagnostic producer are accepted and merged. Overall M5, broader M6 and real-model qualification remain unaccepted. -**Current phase:** PR90 merged normally as `ecfed47da7c51d03b968bed739e2abc06eb4a6de`, exact reviewed tree `540618b75e7ebbde9a5713c8ac14f05e77936f80`, preserving main `dc64b895` and source `c45d103f` as parents. Independent source approval extended to merge and all 22 source checks/four PR workflows passed. Actual-main post-merge CI is monitored separately. PR89 main `dc64b895` completed all20 post-merge checks/four workflows. CodeRabbit supplies no independent source-review credit. Prior branches, PR84 lineage and unrelated work remain retained-protected. +**Current phase:** PR90 merged normally as `ecfed47da7c51d03b968bed739e2abc06eb4a6de`, exact reviewed tree `540618b75e7ebbde9a5713c8ac14f05e77936f80`, preserving main `dc64b895` and source `c45d103f` as parents. Independent source approval extended to merge and all 22 source checks/four PR workflows passed. All20 actual-main post-merge checks and all four workflows passed. PR89 main `dc64b895` completed all20 post-merge checks/four workflows. CodeRabbit supplies no independent source-review credit. Prior branches, PR84 lineage and unrelated work remain retained-protected. -**Next slice:** Complete finite checklist M5-CPU with the [prospective native comparison protocol](reports/2026-10-21-m5-native-key-reuse-protocol.md). A held test drives both baseline and explicit key-reuse facade through public sessions, with two fixed BERT-8 members per arm and four native forwards overall. Privately observe existing bounded test-support scalars using a fallible helper that refuses absent mode/poison. Compile and review producer/oracles, freeze exact source/binary/fixtures/environment and criteria, then execute once and retain all outcomes. Counts prove only the fixed mechanism; timings are descriptive. No admission, default, allocator or native batching change. Close exactly the finite rows that pass; do not substitute another diagnostic slice for failure or missing evidence. +**Finite disposition:** The [single frozen native cohort](reports/2026-10-21-m5-native-key-reuse-result.md) failed at source fb7ba0e3 after baseline teardown: its oracle incorrectly required provider candidate IDs to differ across members. Production correctly repeats runtime.candle; enabled never ran. Preserve original source/protocol, raw evidence and failure; no rerun or retrospective acceptance. INT-89/M5-SW/M6-SW are complete within their limits; M5-CPU failed v1 and M6-CLOSE remains unaccepted under the [finite checklist](reports/2026-10-21-m5-m6-completion-checklist.md). Publish the independently reviewed producer and failure as draft evidence. Any oracle correction/new cohort requires separate prospective replanning; this is a software qualification defect, not missing hardware input. No admission/default/allocator/native-batching change or optional instrumentation slice is selected. **Acceptance status:** M1 merged as PR73 in main `07b23d47`; the original negative cohort and the separately accepted C3 supplement remain unchanged. diff --git a/docs/plans/cpu-scheduler/reports/2026-10-21-m5-m6-completion-checklist.md b/docs/plans/cpu-scheduler/reports/2026-10-21-m5-m6-completion-checklist.md index 08177edf9..78b93ece1 100644 --- a/docs/plans/cpu-scheduler/reports/2026-10-21-m5-m6-completion-checklist.md +++ b/docs/plans/cpu-scheduler/reports/2026-10-21-m5-m6-completion-checklist.md @@ -28,9 +28,9 @@ advisory grouping proposal as executing a group. | --- | --- | --- | | INT-89 | PR89 exact head `48717570004be87735c4b693212fdadf154d8738`, tree `2d59d369f11b89e119c54afce9f0a6df86ada4bd`, independently approved for merge; normal merge preserves both parents; actual merge CI terminal. | Source had 22 successful checks/four PR workflows. Merged as `dc64b895180260ceef8619bedd1ac6d8b756a3ec`, parents `dc926783` and `48717570`, identical tree. All20 post-merge checks/four workflows passed at dc64b895; the integration receipt and merged PR89 own final run identities. Stop integration on an actual failed required check and diagnose permitted fresh evidence. | | M5-SW | Bounded C1 library API and C2a ordinary-worker key reuse preserve fresh per-member authority, fallback, bounds and cleanup. | Implemented/merged PR85/86; independently reviewed focused and controlled-worker evidence exists. Do not add another scheduler, forecast store or allocator observer to close this row. | -| M6-SW | One supported owning host can explicitly choose that existing key-reuse mode and read its immutable configuration without exposing private authority. Existing constructor remains unchanged; shutdown/reconstruction is rollback. | Concrete missing production capability after PR89: `EmbeddedSerialCpuResidency::new` fixes fair+residency with reuse off and offers no choice/query. The reviewed implementation adds the explicit constructor and delegates the existing query. PR90 source c45d103f passed all22 checks/four workflows and both new hosted cases (607 library passes/two existing ignores), then merged normally as ecfed47d with identical approved tree. Actual-main post-merge CI is pending separately. | -| M5-CPU | One prospectively fixed actual CPU baseline-versus-key-reuse comparison through public sessions verifies exact outputs, member/attempt identities, separate grants/Starts and matched cleanup, with fresh owner/proof checks. Capture actual cache behavior and all five existing phase spans; report elapsed observations descriptively. | The [prospective protocol](2026-10-21-m5-native-key-reuse-protocol.md) fixes two Ready members/arm and strict baseline6encodings/0hits versus enabled4encodings/4hits before execution. Producer/oracle source review approved freezing; seven model-free oracle tests and affected package/static checks passed. Exact manifest/binary review and one retained execution remain pending. Existing controlled 30-versus-16 encoding counts and isolated local times are not native acceptance. Stop on the fixed protocol's terminal outcome, any missing criterion or infrastructure failure; preserve all outcomes and do not tune/retry for a winner. | -| M6-CLOSE | Independent exact source/consumer/evidence review, required exact-head CI and post-merge checks support the bounded host choice and operator instructions. | Pending M6-SW and M5-CPU. Close only the named ordinary-member envelope; retain other qualifications below. No UI, IPC, persistence, deployment or default activation is implied. | +| M6-SW | One supported owning host can explicitly choose that existing key-reuse mode and read its immutable configuration without exposing private authority. Existing constructor remains unchanged; shutdown/reconstruction is rollback. | Concrete missing production capability after PR89: `EmbeddedSerialCpuResidency::new` fixes fair+residency with reuse off and offers no choice/query. The reviewed implementation adds the explicit constructor and delegates the existing query. PR90 source c45d103f passed all22 checks/four workflows and both new hosted cases (607 library passes/two existing ignores), then merged normally as ecfed47d with identical approved tree. All20 actual-main post-merge checks and all four workflows passed at ecfed47d. This software-consumer row is complete within its existing evidence limits. | +| M5-CPU | One prospectively fixed actual CPU baseline-versus-key-reuse comparison through public sessions verifies exact outputs, member/attempt identities, separate grants/Starts and matched cleanup, with fresh owner/proof checks. Capture actual cache behavior and all five existing phase spans; report elapsed observations descriptively. | The [prospective protocol](2026-10-21-m5-native-key-reuse-protocol.md) fixes two Ready members/arm and strict baseline6encodings/0hits versus enabled4encodings/4hits before execution. Independent source and exact-manifest review preceded one frozen execution at source fb7ba0e3. **FAILED v1**: baseline completed with6encodings/0hits/0retained and acknowledged teardown, then the frozen oracle wrongly required distinct provider candidate IDs; actual runtime.candle correctly repeats. Enabled arm never started. The [retained result](2026-10-21-m5-native-key-reuse-result.md) and unchanged protocol own this outcome. No rerun or retrospective acceptance change. Correcting the software oracle and any new cohort require separate prospective replanning; representative hardware was not the cause. Existing controlled counts are not native acceptance. Stop on the fixed protocol's terminal outcome, any missing criterion or infrastructure failure; preserve all outcomes and do not tune/retry for a winner. | +| M6-CLOSE | Independent exact source/consumer/evidence review, required exact-head CI and post-merge checks support the bounded host choice and operator instructions. | **Unaccepted:** M6-SW is complete, but the required M5-CPU comparison failed v1. No enabled native evidence exists. Stop this cohort and separately re-plan any evidenced oracle repair/fresh qualification. Close only the named ordinary-member envelope after its actual gates pass; retain other qualifications below. No UI, IPC, persistence, deployment or default activation is implied. | These five rows are the completion boundary. After they pass, stop implementation of this envelope and mark only these scoped claims accepted. If a row fails, diff --git a/docs/plans/cpu-scheduler/reports/2026-10-21-m5-native-key-reuse-result.md b/docs/plans/cpu-scheduler/reports/2026-10-21-m5-native-key-reuse-result.md new file mode 100644 index 000000000..8cf299892 --- /dev/null +++ b/docs/plans/cpu-scheduler/reports/2026-10-21-m5-native-key-reuse-result.md @@ -0,0 +1,133 @@ +# Fixed native CPU comparison v1: retained failure + +The single prospectively admitted cohort **failed**. Its enabled arm never +started. This report does not change the frozen criteria or accept M5-CPU. +No second physical execution, input tuning or post-outcome acceptance change +was performed. + +## Exact provenance and terminal result + +- Frozen source `fb7ba0e37645aaa6627ef6ae1b729c931387a772`, tree + `203f7b4a3d99f637fb96e99cb8fbc1c55b3f8f82`, based on PR90's actual normal + merge `ecfed47da7c51d03b968bed739e2abc06eb4a6de`. +- Producer source SHA256 + `cdd3ec4888a01dd1723616bfabd4099d5368013ba76714cc16b11bb527894b0e`; + copied executable SHA256 + `d465fc543206ba8879550901b415a1f092d995b6bbf4410606da0f2eeb5ac832`. +- [Prospective protocol](2026-10-21-m5-native-key-reuse-protocol.md) SHA256 + `a6648d0785bac9979ea3fc1f951f4c9b31a59d277f55f02b375b3bb7ae9c6216`; + supervisor SHA256 + `83f8598ee2d8f61e26711b64c18ae1e10fc1e596d1c1009b1b54e06d47b38d3c`. +- Independently approved frozen manifest SHA256 + `1aecf82f87d586f9eb28f8f5a4afdb03d721f72358f646804cc3fe58073b8e63`. + Exact held-test discovery listed one case without facade startup or metadata. +- Evidence root retained at + `/workspace/scratch/pantograph-recovery/native-key-reuse-cohort-v1`. + All original binary, fixture hashes, source identity, environment allowlist, + progress, raw rows and outcomes remain there. The exclusive execution marker + remains; the supervisor provides no retry path. +- Actual execution: 2026-10-21T06:15:00.456242Z to 06:15:05.539324Z; + supervised elapsed 5,083,100,620 ns, exit 101, reaped, no watchdog timeout, + supervisor error null. Producer verdict false, error `native identity reused`. +- Actual-main PR90 CI passed all 20 checks/four workflows before launch. The + integration receipt SHA256 is + `9d7e20d34d5a1a55811134dd35058f3795f0f966a0fdf49b0c05b95b84a38daf`. + Independent source/oracle/protocol/supervisor and exact-manifest/binary review + preceded execution. No local compilation ran concurrently. + +The environment was a debug/test binary, untrained committed BERT-8, one +configured CPU thread, CPU cgroup 400000 us/100000 us, memory cgroup 16 GiB, an 8 GiB +virtual-address-space ceiling and host-reported AMD EPYC 9V74. These facts do +not make the case representative of deployed models or hardware. + +## Observed baseline facts and failed criterion + +The baseline returned both requested 8-dimensional outputs, retained four +artifact readbacks, and recorded two native drains. Independent review of actual +artifact bytes confirmed agreement with returned values and the frozen golden; +maximum absolute golden error was 5.960464477539063e-8. Its scalar work observation +was six key encodings, zero hits and zero healthy retained cache entries. +Diagnostics recorded one load, one retain, two forward drains and one stop. +Public session close, graph closes and shutdown acknowledged success; shutdown +did not time out, final reservations were empty and no idle owner remained. +Body, collector, event and diagnostic-I/O errors were all null. The fsynced +journal contains 12 structured rows and the ledger 19 events. + +The frozen oracle requires distinct `task_id`, `attempt_id`, +`execution_request_id`, `candidate_id` and `reservation_lease_id` across the two +native drains. Actual task IDs were `infer_a` and `infer_b`; attempts and requests +differed, and reservation leases were 3 and 5. Both candidate IDs were +`runtime.candle`. This equality triggered the fixed failure. It is not evidence +that the distinct grants or leases were reused. Both producer-author and +independent source/evidence review confirmed that production deliberately builds +candidate IDs as `runtime.` in +[runtime_candidate_draft](../../../../crates/pantograph-embedded-runtime/src/runtime_dispatch_candidate_provider.rs). +Candidate uniqueness applies within one alternatives list, as enforced by +[dispatch selection](../../../../crates/pantograph-scheduler/src/dispatch_selection_policy.rs), +and not across member attempts. The frozen oracle and its hand-declared positive +fixture confused provider identity with custody identity. This is a qualification +software defect missed during pre-run review, rather than a discovered production +reuse-of-authority defect. This report does not retroactively exempt that field +or relabel the arm as passed. + +Independent raw review also confirmed exact joins across two grants, Starts, +Completed events and registry ACKs, with one-thread owner continuity 4→6→8 and +all 12 persisted rows matching the saved arm. Actual records contain conservative +VRAM reservation claims of 536895107 bytes per drain despite the CPU dispatch. +The frozen protocol's CPU/VRAM wording does not establish zero VRAM reservation +claims or physical GPU use. Neither reservation estimates nor declarations are +physical allocation evidence. + +The baseline failure stopped the loop after acknowledged teardown. There is no +enabled-arm directory, native output, key-reuse count, captured-prefix or phase +measurement from this cohort. Only two native forwards occurred, within the +four-forward maximum. No baseline-versus-enabled result exists. Scheduler +cleanup matching remains source-assisted through the existing adapter; the raw +registry ACK is not independent scheduler-ACK proof. + +## Retained evidence identities + +The [original retained cohort archive](m5-native-key-reuse-v1/retained-failed-cohort.tar.gz) +contains 40 files, 131098 bytes, SHA256 +`e6edef6c58518ab809be8fc5b31d1c9e18abd700ddafdb5037c82aa70fbed340`. +Its [per-file hashes](m5-native-key-reuse-v1/original-file-sha256.json) and +[archive identity/scope](m5-native-key-reuse-v1/archive-sha256.json) permit exact +verification without execution. It includes the actual artifact bodies and +review/preparation receipts, excluding executable binaries, databases and client +credentials. Original full local evidence remains preserved as well. + +| File under evidence root | Bytes | SHA256 | +| --- | --- | --- | +| execution-started.json | 145 | edc88952ee485a00fc4328c12c0c6ce8d873ae4ec5ec8375fb9594641565e6bf | +| execution-result.json | 598 | 77a24b38ccf56afccba928988e52d8c4fa99d2968b5e620689a19159b6fc1a91 | +| comparison.json | 150464 | 27cb921f9f4cf86bbd5cb23c224ce2084029c40bc1b2b05276f7e7592a15a0df | +| baseline/arm.json | 133686 | be7f39bc407b869955d282a40bcc22569e28d5952470ea35c225457dd4f2684f | +| native-rows.jsonl | 11369 | 3bfe2b7316a2d3754382e4a815755d560e2d94391827708278805789782d2f57 | +| progress.jsonl | 920 | 8870f3b249d6fc1ddef531cab2d29413ee465fb4a69dad0ef7e7004309b3bf9b | +| producer.stdout.log | 400 | 61139d5816979f711d6f99a11837422df7941fb5c3cd63949b188f01e6fad32c | + +Preparation receipt `native-key-reuse-local-validation.json` SHA256 +`3adf218aacf4b9cdec2bfe0fcdfeeb21a66b5a5f05a8b9c79af9a656939d71b1` +retains successful affected checks and initial failures. A wrong full source SHA +was refused by freeze preflight before creating the evidence root; the unchanged +actual Git HEAD then froze successfully. A PR90 receipt collector initially +referenced its not-yet-created output instead of the prior PR89 receipt; that +read-only collection error was corrected before the successful receipt and run. +Neither preparation error executed the held test. + +## Finite disposition + +PR89 integration, M5 software and the PR90 owning consumer are implemented and +integrated within their existing evidence limits. M5-CPU is failed for v1; +M6-CLOSE remains unaccepted. Stop at this terminal outcome. Preserve the frozen +source/protocol and this failure; any evidenced oracle repair and fresh cohort +must be separately re-planned prospectively. Missing representative model or +hardware measurements did not cause this failure and are not a blocker to +diagnosing the software assumption. No allocator expansion is selected. + +Production admission/defaults are unchanged. This cohort establishes no +key-reuse speedup, complete incremental-memory guarantee, native batching, +representative model quality or hardware qualification. RSS and reservation +estimates were not substituted for allocation measurements. Historical denied +log routes remain unretried, and baseline strict inference lint/Rustdoc +limitations remain unsuppressed. diff --git a/docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v1/archive-sha256.json b/docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v1/archive-sha256.json new file mode 100644 index 000000000..4b9f52bcf --- /dev/null +++ b/docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v1/archive-sha256.json @@ -0,0 +1,9 @@ +{ + "archive": "retained-failed-cohort.tar.gz", + "bytes": 131098, + "sha256": "e6edef6c58518ab809be8fc5b31d1c9e18abd700ddafdb5037c82aa70fbed340", + "member_count": 40, + "scope": "original once-only failed cohort plus pre-run source/binary/fixture manifest, supervisor, actual artifact bytes, review/integration/local-check receipts and preparation logs; no executable/databases/client credentials", + "original_frozen_source": "fb7ba0e37645aaa6627ef6ae1b729c931387a772", + "result": "FAILED; enabled arm absent; no rerun" +} diff --git a/docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v1/original-file-sha256.json b/docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v1/original-file-sha256.json new file mode 100644 index 000000000..3aa7946be --- /dev/null +++ b/docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v1/original-file-sha256.json @@ -0,0 +1,162 @@ +{ + "baseline/app-data/serial-cpu-artifacts/bodies/workflow-io-78821a221fa227fcd3caeb3f2990a121123a395a3a8210c3bf15683e0cef0c76.bin": { + "bytes": 160, + "sha256": "d3692d4df22e61e4e2c965304a642d323d05f42dc7d4f87018126b9672050494" + }, + "baseline/app-data/serial-cpu-artifacts/bodies/workflow-io-9f5e97f7733fcc67ce48b2867e34b3a9753f25e377a46b833b39805febda7470.bin": { + "bytes": 160, + "sha256": "4a688224ef6edeb30360652fa2b8953fa94120f6dfd649c22fe49494021effce" + }, + "baseline/app-data/serial-cpu-artifacts/bodies/workflow-io-c42766c95f453c55a06caf5aae4eca649c5fa8ab436221d53e578a159355075c.bin": { + "bytes": 11, + "sha256": "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9" + }, + "baseline/app-data/serial-cpu-artifacts/bodies/workflow-io-f96ad5684917e2ee1797911f0e979421274e6e392d6895b82a6012bd050cae96.bin": { + "bytes": 5, + "sha256": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824" + }, + "baseline/app-data/serial-cpu-artifacts/manifest.json": { + "bytes": 5012, + "sha256": "546495ec2200f27eade8b21c78667db45b04aa70d5f299f18fadde4dcb04f5a5" + }, + "baseline/arm.json": { + "bytes": 133686, + "sha256": "be7f39bc407b869955d282a40bcc22569e28d5952470ea35c225457dd4f2684f" + }, + "comparison.json": { + "bytes": 150464, + "sha256": "27cb921f9f4cf86bbd5cb23c224ce2084029c40bc1b2b05276f7e7592a15a0df" + }, + "discovery.stderr": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "discovery.stdout": { + "bytes": 132, + "sha256": "18790687fc28f2237596cb20cd11f762831554ff8b2476b6c7f1838eab9d3a22" + }, + "execution-result.json": { + "bytes": 598, + "sha256": "77a24b38ccf56afccba928988e52d8c4fa99d2968b5e620689a19159b6fc1a91" + }, + "execution-started.json": { + "bytes": 145, + "sha256": "edc88952ee485a00fc4328c12c0c6ce8d873ae4ec5ec8375fb9594641565e6bf" + }, + "frozen-manifest.json": { + "bytes": 5619, + "sha256": "1aecf82f87d586f9eb28f8f5a4afdb03d721f72358f646804cc3fe58073b8e63" + }, + "native-rows.jsonl": { + "bytes": 11369, + "sha256": "3bfe2b7316a2d3754382e4a815755d560e2d94391827708278805789782d2f57" + }, + "producer.stdout.log": { + "bytes": 400, + "sha256": "61139d5816979f711d6f99a11837422df7941fb5c3cd63949b188f01e6fad32c" + }, + "progress.jsonl": { + "bytes": 920, + "sha256": "8870f3b249d6fc1ddef531cab2d29413ee465fb4a69dad0ef7e7004309b3bf9b" + }, + "prospective-protocol.md": { + "bytes": 6170, + "sha256": "a6648d0785bac9979ea3fc1f951f4c9b31a59d277f55f02b375b3bb7ae9c6216" + }, + "protocol.json": { + "bytes": 680, + "sha256": "8834b7a8a53f9cee75c86a86ce2c89b87840b499bad8108782520aa20831def2" + }, + "supervisor.py": { + "bytes": 10347, + "sha256": "83f8598ee2d8f61e26711b64c18ae1e10fc1e596d1c1009b1b54e06d47b38d3c" + }, + "support/logs/native-key-reuse-build.log": { + "bytes": 186, + "sha256": "88cc95363ec99ade2504f9d86568c940e4cb0d48262148688a92e08643ad2179" + }, + "support/logs/native-key-reuse-clippy-corrected.log": { + "bytes": 2443, + "sha256": "edc5ec95569a91d97f4acf0094646ba0a0ed647379df80bbd81f04bbf4813f71" + }, + "support/logs/native-key-reuse-clippy.log": { + "bytes": 3205, + "sha256": "29c272d39bbfecb0f7672ee16d1783ba84b7420186685ac666f48a19748f33db" + }, + "support/logs/native-key-reuse-embedded-corrected.log": { + "bytes": 71308, + "sha256": "ddb92e856e6782166a4134c20d0c9d334c231615423d342e0b013d36f91ef330" + }, + "support/logs/native-key-reuse-embedded-full.log": { + "bytes": 101986, + "sha256": "c003d5e17a2001ec7c521aab13432e4579e9108c6c64423ca4dc3ef7a727181c" + }, + "support/logs/native-key-reuse-final-fmt.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "support/logs/native-key-reuse-final-oracles.log": { + "bytes": 1206, + "sha256": "c8de7126022de7aecc5de5f2c166c6f72cf541c4e3434129d32bfe04e0efb146" + }, + "support/logs/native-key-reuse-final-traceability.log": { + "bytes": 277, + "sha256": "8a71ef6bd357cc379c4b862e9df626f27b09da4656530681881dfcac75a086f9" + }, + "support/logs/native-key-reuse-lint-staged.log": { + "bytes": 3174, + "sha256": "271494bf62f1e1c00d66b7da89c582e9f708dcad5bfeaadf31c794df788f16e8" + }, + "support/logs/native-key-reuse-lint.log": { + "bytes": 3027, + "sha256": "1a39139815f170b7404be1375d3222de635581eb209f4d5e98acc5cc03ca607a" + }, + "support/logs/native-key-reuse-oracles-misprofile-stopped.log": { + "bytes": 13209, + "sha256": "c265b6793078b6abbf209344aeccfe7d95914dfab23efdc62f8cb35565270f7d" + }, + "support/logs/native-key-reuse-oracles.log": { + "bytes": 3848, + "sha256": "b95836ac6c6a45b69a036de784a5f63a7b35feb3f4359b806b8f23e89bf6325b" + }, + "support/logs/native-key-reuse-prepush.log": { + "bytes": 35127, + "sha256": "33ecebae24571313ea2c000264f2319f153a73641612ba22f1ee4a9f0576ea29" + }, + "support/logs/native-key-reuse-rustdoc-strict.log": { + "bytes": 471, + "sha256": "52ff88ae5092ae9668ab12077f838689005baba275de6bee1cba6b026caa1afa" + }, + "support/logs/native-key-reuse-rustdoc.log": { + "bytes": 2675, + "sha256": "359fa0e69da1187b4bd2b41000ecb7070db2dee718b9063e2196db5a4586de49" + }, + "support/logs/native-key-reuse-workflow-full.log": { + "bytes": 121326, + "sha256": "91cfc383f9418121faaaab54fbffa1ffea5f24f2d554a31cd5fb1d7d4fc5377c" + }, + "support/native-key-reuse-build-artifacts.jsonl": { + "bytes": 444411, + "sha256": "f66d09804b9713ba1a06573c69f799cc3c99c58cd5279062398f555527423e95" + }, + "support/native-key-reuse-freeze-preflight-failure.json": { + "bytes": 459, + "sha256": "29e121a62395fb7c5e18d6ead8997da3759934a49b5edde73b33daf9539699a0" + }, + "support/native-key-reuse-frozen-admission.json": { + "bytes": 904, + "sha256": "7d21d65f38d53080bee8a573afc84d9630aae5969dce24b4987fb595a8298e5a" + }, + "support/native-key-reuse-local-validation.json": { + "bytes": 4869, + "sha256": "3adf218aacf4b9cdec2bfe0fcdfeeb21a66b5a5f05a8b9c79af9a656939d71b1" + }, + "support/native-key-reuse-selected-artifact.json": { + "bytes": 245, + "sha256": "a5ff74c750a43ccfdf7e5243d08b72feb5b16d9153b35a2da993992ba3f8bae3" + }, + "support/pr90-integration-final-receipt.json": { + "bytes": 14133, + "sha256": "9d7e20d34d5a1a55811134dd35058f3795f0f966a0fdf49b0c05b95b84a38daf" + } +} diff --git a/docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v1/retained-failed-cohort.tar.gz b/docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v1/retained-failed-cohort.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..298cfd29aca24e9b70a7b1508577da03bb3e54a0 GIT binary patch literal 131098 zcma&NQ;;S=)27|FZ9Z+=wrzJ$+qP}nJ#E{zZQGdkw0GY3k3aU?h&|Xk$gHT7%F3gx zysspTh64J}0{OY_v9>>wP9oaOztVtuUxr81%ba%C)7_tSLv+C8>Dg&#Y0@;57aGU3 zb-Qq-oN(=qecZDrm%1+jh;22}b!kGDtB?f0Ma0Bth>LIgbi6(MeCmC_{AgR+yo6)E zfkp}V{y;KS|KtjU6G1#7Htl`?f$>M^>Y3Jk_5aKDBPeRF)6w_Qm%6=S+SzJw?1qco zk#69|E_1@XxFrH;^39U$+4EJxP2Su|C(OR~ZruKiSd<&)j4zBa$!PD>EP`KLq)r(Y z27)$$G65tKp-4eOvMNIZQb=K&70C-T=c-TEpn=D){szX(-g?g`Bd zH-8wu&-(h|MZts+c3_YpD37k4!R(+Q6p;e3DZrR8{2@4?NPvmP5{zGYM{ki&gPS2PCG; z=a6-GnJ;SzTKR7iVCekgAHYx9m;cU#!O{A~rFH@sYB6+TfK?_E6h$xXT5UE$v&z z*mrGyB0!|~Auwu_^ixOvQ)bI}^K8SBkzKQChDUeRC;`Q8EUVc(?Jsl{WV*{eCRhe5vM zYfv8Ev-5@tpyD}?I-odp*Vs+91l5>&K!Do&VFoc z?Y+#r%CsFl1-nr?06Je;vd!HXcFfr17+>+qG~@)Pyq?g(Z`q zfE!$~oZo{Fp`?vWwy*g%e$jN;*GN7$>n7eT%Goarq?h4XD|f65*xVrJ8#v8-f7#DkXIyUaqqJ& z#ER}-25w4*X2o?f&G-ybvM(h=B0qYFFbqwqVnRo z@tRZYRX2XbTR>ZKZlcz4^Nf|vtzA3DCpcBFN@D(t&DpHkgw_fht~z_#PnQpx^Q;qkM99TvA1P@(L8zEv94AfM2rziSERCT#G^s>^S|Uxf z*QwhYbF_im$>li`Q$~OQsPSHW1SPwO@m?=xxO2bh4=g$`2%fhK7KjO2w#*@W1b*4> zJ`CniQyk712~^7{Ipir>5`#OaU}lMo6FX!j=^)ERs@Wxy6-!gf8DFWxboC&hf*Zp| zkVxV2%tZ4iDS1ZQMTl_?%~QQC{yvsL;9;U(8}3<&+ja-tR0Vca>%QE`w&Shq6jl7o zsXwBhqru0~e*^kRedZ-dsk<~S{d$%WMX0Jk#fkSYh)77d)sD-NPWx~?cwBbAJmt9>%Z0gMc zi6qI26?(=#mBh7?+BjN#wZ+g!P@Ehi0nz8Jd3SfszmnLv!GB1{bY){d*8XaFgKXDO zXq6*ISbtU`5@ym%C-9fONhkB9&OW25MKwmY7(Y42q3G8zIwrC?>#UwA_o|VnZ+h+P z+jgtF+X-WrO&~g`KvZ0i9{Vn#+ruh-PK7RW)3Z^BO*cYBp3`;e5C0^Edc(K^JiqUC zk2x@YoBZ8PQ6!)z<)V@XCrf#y&Kv3!tyWpYNx+{rC-4Ys>`W!&_j}5OnkW5y;M>>Z z-?%XD_Pe{n=MSB(SfEH>7~l7sM}jIaQ_I^zQtfbP9*ZoB)5m;!Km&t52dkkZo{cVMg)$ zE<^f!ulHK9kzy=gWH{@m5otIUo4TR!6PM)iU3g%0>cF;Wh2}v0M6Wa>!o>V> zwN4+XsY~a^&utJ0!K&PAY(>k$cTA2E2@deXECa8*ej|-`$YM`Urr2*TaVTHh3E*^@ zjwINgoj8*quD`L6eOQFWDG(LD9ygbcuk?G2lGfln!TeorYD>XWZCm!OI@a7#I_Osg z98;!t6Z!kITiH@x-jrx-+I0%uxQACZ`S_FgOzub8$KH)SDyMR92Ln~|a@6)~*|}RD z(Js!Lj$dAD=c{bXJJGvKk0NGfM$DO~FCr7!XYNjC37yTM+`Dg+ER}ks55*1vZ22C= zZ2p+q0l)X3PsbLyT_eBTg6 z;ApxxT2!alQBEn=n_f$XuR>~%=P-Fbtd~42|N3MdyFYQYe&ur6Tv&0F!lv{jzgGOF zPTt+rvupEkH$3IzC?Q1pBTA+$Qj30=(Ah^kC~0ibZmNz_6Pkbm7|#+-#G)Fp5Y7aN zzyi?TGGCc|#LgFSbpvx0z^*$uV|U%WAH@Sn{1kvX+R(HGT)*?ruv_=NJo4Ya$K4m~ zVj+qGNv5zOS><2}8mCd3z&VCBfIt`-C5JeL8ow$C#vsKA+0j9YE6ZP#{Yj`rHSb15 z9d_!7a^jpz;6MIc$)4T=0ynuVMWyIRNmB$g7sXwNuC5!>WNzUp15d{;qK%-S(4?#g zlhe9Iv=4s<-^=TP{q+bchoXN=Xws+?@SZ9l*>)1{cn#{%5+Pw_RUbj1S>^SSL!hIQpyG=lH1=LlaYNYH(Na*e&ep_gc=H zS-RA?x29I__@K$>RnMM{%}K@y@6M$WzttSqiyjCxn8F@l9^O6hhWEF}YgDza`tB7PZYL6&I5nyZf$WQxR@32_mRKyPpQa?Z{LH^F%}p_|hq_lkHrlnjj-0J857M1@B^FPdrgBk17u*c{ z!5-OpjMZh!U*AqilP$=!E#dCAJL-5axbNw0d0#zWa~sR-O+4FL2(b1^;MloL#1C}64VzixkLjD55 z;4(#u46Y0{^t`cy;xyPT5qOA2-Nzg_$RP1(m?C;`7yJ;MWLorvS@hL*__xR)S2?+Z zF>DkSAp#{r41yWMXxI{9oF*EkoI4LjwmqJ>nc($`Mt`2_=nh3MwjU9*e~UB_Z^@8= z*ebG{+r!x2wkz!=$XU!=F=6O2=?1JklJn8js+l-G<|&Z_i$cbPildlEWG6u*cc))0 z=weGiiDeLXen6QS7p zVmYm<@TVXA4ostM>7x<*tsiHCjul9HCgyZdZechC`-FktBu|qDAOjb!E+R_xOHyfs zcyT;@9jMsw5BKL(sk^r*{qF~6hgPgO{i=gbXh(jFu+~INq_pfU)epmKr^mM|(r@mu zi}y5pl2M`SdLveK5G2D?a2TBYLLzq2(Pc_QR05M?cn*>UQS4zrF&gg0_ga+CMXquH zovxJG0DZbN$MZP*WVV_uSUMAoR^NCzk=5k&Zh*%~v;6=~TPnE&bG?!jtJ}p-!}E&J z-^uALI7Vw%+v&}FR1o9B!eVuDq){}c%HpFjrc_-f;f6WW;Y1hlX7qJq2%@OKCBj2d zLFOba1Lm0>(~Oo*q$a=gic9?%Etx{G>I!L2d1IquH|`cUl&KlQ;XD>WFwRC@luK3H zXi7$9$>Dl&#bB%+peDZ=xM+>pYKF+DbfeYdR8KbF*^TWg7VENSpuqZ3`6A`1o$n&~ z$ku7jVD=ZP^N=Nwol@t?1mtaUwE5vAQI;TZ$pC_hYKF|ax_qtt(`FclD+DR3WB2eGm*QUA#^zMnEEn=4iq#LG@{oP+TW>Q$cR>u~2-liha?ORa|a z&i7{D!lo@fFtl(G`S)Ov>qjgA3+Xm3nL?M-?G_8strT5DmPRr*qJ|kF{?|_Ww7xf4 z)@#=^_lNPd&KMdphe>g)(`hSXTxyrCXykDU(M{T-qgyz%FdBLcmA`E-L)GnrwccO|;bIiTvazq~I#H44ma8GW+(07@GBzhYgu*25?!vd$3yBpCO76LUv{scNY8;`%6`s zoo>CMkkxdVKhB&pHbnR7tKqa)kt7srgo2qH#g=s4hImI^2m{O6(>YbF8_cfS8v>xBbrx_O2>Lg___6n}xsW;0I#;)aoYQr0GS(hUry%s_o3oHJolxy%CRd zy9IX|g<9OA^u9bzG(d4e94HUON1;e#@aa<+1rOGl$5T`(Z&!%M(NI5PGS*?OkS?v* zBHAJ@@mGoHxr<)$FnKMJVm(f!0^5zjjibtX!wR|+PJv>gI@Hwxam7d~P?n*rOWbK$ zlYTRS@&kTz2rpeB-$*f4xZ`F&)+#im zoIf&42l)Fc1fxcnTO_xhtK(imG2%M_@C zIaWg}X*xO~M_?2M08eXgh%V=sE<|Txd`Y|L@z1l|OT+N6Nxb_Un8&8^0wS zQH!;QE=#5TMkvlg5We^{x^VXh>rmL}lcq%+o<*;gy)xCpT{;j~wJprnUb<_PI9&bK zvwCr(GFa=%F>M|#n_|PwvfFgx96VaD#muAS&2^fW-N99+p3QP$w?D-fiwezh&N)rx zADftT8BbSU%2`u_=yQb}I)9YDr9$b@~lTW_D^ zDNNdz5Z>&u>tk3sYvN||xlkY4riGJ+RU!@+e1)wiusC)KKclFY?=pXVLY5375`^!O z3@xo4{1ZfeCnw&&ebe zdQHK35vEi5?Jpfh;uxe;xm90Y1`k=0J+g+1n6VPjb$SZ!i!ihbr9K*FgKe>AkTf7Z9nr14_k|vjP4k{)~9)yS~R%T>rT1VoRP(Cr&D11&4+HsIc%U}`5 zIUHXrAyH9ji6Xnahq;0wM<-)!at+7zp%CX5#h8jd3^1CJ6zctEbW}CTr5_5hWMw;- zuZG=tZvQ@W`??w+7}Tsn{ZOkNG2Xz*zk9iutV#23k$=ds73=JriGPER(R$K&v;#Uh z()vuWJbxlf{BY)94MmS15P{4vB4q-h&|aBDA2fNh0eI0~-` zh?9AUZ$x_(@V6}S{xbc3P8XLuhWQ*v^vm@BF413GtWx(;RkToDGwluMa_RZYm80{e zPMXW+%J|mq53M5p)%oXmmHwpYdFcJa>(M0lwIB`m25YZ|LLixf`ziltjUhF?MP8}1 z1;N-i+ke%j-Rd^m{~%D$*{N;HQ*<}W|6obHG|vi0Eo-VaDkf>v#w z(APp^8f*VBRR`H2oBZ2wo3HxS-7Wu8a$_1>_2zEp&-ErEojs`@1^XjdeY>m4=YL9H zd`{lK_op3rGHcc^o~?Y<#Vl;CmO^|h%ac?sqn|ggp6P?IR-5#>j%^QJc6f#Ey^~$^ z`LuoNHiNIPcHxWN|8K>-%4{FKCKbqJ#t zC5fIWgaB2c_TkwtR}QuNMxf6Zv(d1|m;*?y+<%0!8DWROA1O zRBSXWbPHdf<=8|Ee0gvKg0@Qmd6RSqg__ebn7e`Hw&yMR524$6TC9AQkfNhcy%p#0 zBDw-zgK=+$P&Jc1@8vh3ab;4@9esgct@NVm8kv>TgYUd8H6+X+tcv1dc(^DB>qU}G z;-o=Xm<=N&$gzX)@!VZig>C#*_g)NB^Nk0Tcx#k1M7H2VfCn1#fF3#1!YO%j_4L`?n!A=++iZ27D(xYS=UTgQCS$ zWXtCO$!H2E&dYCzs$0aux5}%PXj2DtC}kCC3LA$uYLADEARwn__~&<@%Z$7eo7d_4 zzoZF?wV#AMtRo$p!AH)|Yoha1D}n-%X$uoZkNq;PSQuv#x&{RXI->3!zV>dZ48&TB zj|6@eg#$|kznjyV7-ig-daJ2*WSjM>1Zd=Yxvv&f)}`@{Omo&D#@YD;uvb{r&CROy zJw`9p%ykvF=a~_8w4TdnHK|NusyZ9SuqkRP%AHk|(sQD`5-U7}7@Nt>ZR$E7{cum2 zbgr2&G)zD)ufdkZ$O{Mr0?Rh_#cxf|NWAX1$uGEVS1PQc;X2ydvabtK6tYjGuzR{Q zb7vQCm>3V{z>n?J@BV6;jIGhXX*EumWw+!`?AZNQ@lVhs6rK6(7VcS@T~Tu^=P{Ug z7J`sSvnDG$ffbRoBCbNQrQmo{uqfr1lYC4L?@rL2!<4DGUi5#uJCSJmQTJK?7`d$9 zF5Ak%L+RMwAgF&(ox>XdQS9^gBY|=IxK1f^NvMaZQ}bT*#|P>R^2{^144TEjE$jGI z(QuajR`&+k)R+6QAJin^`9jxB$By1&*Z9Ov_xo|jYz{Ul%uSiCtZzB{-2hkJe?OUN zHmKh`6z45R?t@b9R5jgeuq}RUcB<~9jOD|4*C=1)S?z4jHO`gaGUqW5s$}mob92TL zdo}#f(|%=z_?{oSUkXSb!~rEB87K#AzX`nHT@hqnf!(dF)A)Olm`CK^C z+lnxDb@@UA+>dI=Pknks^pe-Zq6*fVX5AMjc*w1BjZ;$_EK>!uM}@;;`=(=xbk0HR z?>avI-ub~T=X!>|_d;41J~YL6H(q3)Z=$MqjjnXAaQ?pXDwYC`meQM?RDl_%Z*xDX z<4OaPe0-;8v0toUei-~fv55lr%m2-U zuQaSkEHsP}9=}-n?U-!$nP+?ZTd+OSFirJk-Ego-%rzbP4myrCWx9&y?rvdn72rE_ za~0>sDZADk`qbvSn*NEIoilye`&jK@@cI&)J>30y_rVE*dQ2PJ&1#>&SRd9P?`6JE zji1w4Rv6LnqAQ{|d6VhfqCXk3QwO`7i$XMy6xnQXOmFf_&WrIhLisibHoS|SKx@kU zs&U_tNabuNs(NFLeg=zsOyLQLKjuc0^)Wx>LEX#zD<5!IPIJtY--&vqyY0H%x_2hD zQ-j;RB-TPD?;o|~|IJ&*`SsuJU1DBc=A>nkdUA7C@d}`Z+>%YIYD$vknS9X-Mxm#d zv7CzcnHgD8#p4n!@0~#16-MDpaf&OnEY4{5-^xrY5lQ|;!p6)v2}J&K~bW%AnXsz&`aX3Hpv>d zJd0fqRbQR&=cdk>^*Vd*a($&Ij0(z8s05An%5OMZwx-vLa9s;?iPP}>kC91dp>a`J zN+*{&;<{cwh!FU|u@#$B2^lw~?3!GpdQ#D2;<%H6(38l1ZXw5N2jk*ZVU?l4IQW2G zS>7o41x9u8O)$Wys}%AnSWE1he=0h6T+MEfBuA(!yx` zaGxH~1e|h?*eJFvvV3tYSTUt?WO0&^A)IJn+846jLfj9gG8htxO|eCiXofMKRG1K0 zgAy7`E*1z#?DaNE-D|}ygS-Av8WAY$DAvW#HK+Njw-9ars3taY;y9GGB#D#weXFLXW zcGh2oS-+>%drisQ-7;&fIbv~>c7K)Hl2?Y;Y~MJs6%U}EZZa8PEy;7*lx9~$g;>fD zknYbuE9x@L_!OKOH$79&8{HIUJ8YQck8$N>-HuTCJ5%+W-Q1k5w-$K$23+dY9W9Vbr7^#tK^bXV=}u0*Hsxfk4hX~SXY z;ZAAt7&b~A3n_MFQA;IKoTHQUbs-%o@qPC7B#mN&r`rb6N=sQHy&!6-Jk%uM!YV}d zD)5TuF$3|>qmb5{r6}4T!|);e9mMCSi)o{jy;AThZmaEjgFn6qMBbJ=IH#7PogN`Q z`RYX#+JSM7TV2e7&hvg+oPJXB7{3Y#8Rvz5l$$XRb@CGpexL5M>$av}ydQsFzM?Yu z>ITR8b#F^HX=1h`YZ~r)w7oU7YPtXXjqU1t%(|)dF0`^s9>$>Al@wXia#$aLkLf~m zF!wZG4vZkaQQm-ODAw!WmV8;{j^su_f+IKIh#pcAwkZY^gyTT?ILIxm@?|bQ^UbHrsR=;m#=N z?!wCrjJ}=b{?i;hu?eg69cF&&+36L4u%svxO|4${2p*EFB#88C+$5UGQl9MM8P$O0 zE{W%^MBbS@FpEi{BHk|ZNFi5n3&!nnZ3nYUwm<8=d;(q{%(A;P(Y{2&e;}z>eUzLl z(+RuswzHE#kzEk|A)l@%n%5{dF9x`a>*T4rl_xu{9?;gp_iAz>0Z^1{uyEo?>k=1+ z6llU(=H2U9)9bS8~-oqk)>Q9!*<;!pDN_cZ)XnZw06GV9uC zxwU>Puim*2y1Px_RH2Tik;XH=#o+1Kq}RDk^1L6%u9?;L9Mq(~s&L!{l84W>n;Ky0 zyo{h-UuwY;I#>G&{^)s@FgjUXa$m(uV~^(5{{3(gt1QeM_6q?1J5lA?X4s^hR2o>t zj+DA4D_o=lI?LH^`nI$rKMLe-Qe7)9_;)7D33 z413H!Q#;dKl=?Gm!q;+=k?QK!$RhBXeFLZ?_k4DqqRDTxdN`2f&$&1^{;$vHcd>ML zU&p0Dbh;_8>OGr_0tBxgSSh;uI{95Gka==M2mWH8>(GcS?_hn++%_-S$tKKpA* z)~-+$+YH=gDi@XO+S@GEmK*p$t~W0jnXDZ2n$AVFR#>+z_5JSCkzC5JM7PHX;`~^5 z{g(tQX3mIl+k_BiqpA>z4?XmvG-}76j0Em=JzV(RiV{#p`MI26{Wxr!ZR|{#Uwq}= z@w6+&v8?B@cII(8H0P10Nb%L&$CY#CV$hHevAj>vg<>#BWOq2HuyH#lf#8KW&LzUh zhx_(6PHZ2OqaXoaSRQ&3+vj5I-WAFaawSv0ItCK`Y-XU#@Wo9-ICB})(R8__)tQ}Y zFqb69UghJ;au@P(bgN)seu95C*Hp?dyVaoMFH(c?UN+M5gYBXaRtY<+VBN>A&%Nt( zPCdI1K@vn1js`RcWNHh}2EqXbTE-1J%}E^50*~qtoRfz5AM_9s<>*Cc8XPrcBnEa6 z>4qJ?p$tksvFQp4GN`RD4*IvIB7Mlx3z%&m7!a|9v^?1voHL$@U?-^iJI}!2GYwWr ztW5D9gxf?WbEJZB{a6eT7MC0z$fo+(7pKWAmJkRuj`Jov(KatQ1xaaKu?f(&w2LEv zGH6(9aj+)dVoLgzDO6Q)GJxSs5X=xCU@Q(CUx5p3$V5{8;X0i-gfANNeiF$8TJ}vU z7%0Msk?=(-6mZhvRMcBLrN>xj3q#NJfqBsEOXvU_!8OUUYmzf8@*|pTlZdWHSc(=bfiY}WJzWwhvN#wNrveORG7)@}T#!YZr*dVKmo{oJ ziHikI8R)fe9|NV-Rer7M>FK_HGtf>BhD=xQ&R&bTx|xjTrtZ=;UhDac z*WF103*_CyXtZ`7=1^Oog0&nq=0~_~ZQ-ext!MNLp}tq^NrfZnghGDbDpuTo=(Jv4 zv=NHdYpO9EG^pT1LrE;S$RHyjMk0t=s6apDKQ|;J^4nV+J-;@|`haIS=JS-h}~a;B_5P1DIi z3Z;umjSP(}DTH=}4WLQ|Br0+TK`0!dUPk&H8e4d<@H;a3^r7W@ut$yENBVu3&%a|g z`-aix8+DnFUt%|VzSHIXCl=#FRMdPAIew)#TKORm4gOYUfzxT{NjjgD6MFYioQ~%} zn`h#oA2uEcn%VD@xt}3#rr3|vTAB1aA9MFEvjbhi=n_~~C{#K1ylypWRoP)^XXrj{67#-kh%nfn0 zCXS23T*uTmqW3h&b`LmH5y!zs)1ty%;zoxSYa|w#jC2UPo&mm-{HgRyzE<8jjSu>z zG8Jio_;tl1Bb&>yytJR>S7A;ws5GzP(-6Yllfw>T`qdy;k2}P37wb{FbVE)%54B&3 zk7hl!2Z&d@4840@4O}qXpr@3>lWG^Z_Jhw57U<9;m(^jpmTGW2`RpMi>!u7^+5K6@o)Ef;e zqI?aE)g=m%ik6lvV*~AGZ2)@iXB)eO8Uj;=J-fM^$gQ2i_YI|MMj?bITW_ePCw@wV zNdjCp9l4=SqJMn*oEFrPo)#-S%O*^QzVgiad{nc3pJs5U%fCaoGCsJd&Z>6k@pwr+ zo7iEd46i4jH?^#W0vVKW(b02DLiw{=9hX$JY<1l12Y%TD^6kZZ&J!$JAxeXh*sX4vg*wRcr_n_QC~lmqx{Yr2;GmHo-7N&X*`j?tNR zZf`|@B7$z^$z1KZVTr!Xwa0h;;&x(s;=4(O?Eh<+KcLSWvlcl_jZN+N*K zDKe!tfwX0Zt77TBUh`###74+n$xTy(#6f9fh)r1~oFp0|2Cx=pe_M@4zJG|f1nkH{S8L>ax~@>9BbM&T@GmOZQZH>(y&bD1FS3bno#`4$BRCw zK)u)z$-A=;WPHPo!IUkdv7gY{K%xmA!{hZ_JJM6`HpAq2923bqRb0pb|LpzVL^}K1 zB7ZHzjW4o4ft72lOFkES$M-jF(Ou@&$obc!Gmq^}$TzfrGj0le-!K6b+ZV67)6MC- z&w~fD-}Xb~Gf!3*aNO^&>78^v31^G(vffkWP{Jpsd|A4O$Zi{quhEO3!}I!=%>C5` zW<5f`XuGv=1a@V$7}GW`Pe<=A?e{YwQSi@=z=Kx4%|dib?v^giD~}e1nS1BBo7s2p zuT6NC(q@%O*YchGyQMuoZd!VZ1QudP@ae1Yp-}6a&1bvho4gBr13LeYimyX+%xBNp zY)Ad1R9BrFv2B2#CnP?=welFk0PBnZI==IY@a?Ma%YIHdr}=HGPa^yI!RXYBmpQX? zY{QK2F*MFxUhq0uuGK5Xdsyzl%#e}c9J|8%dtL}t;n~Lp{kIM2jI`6XE$Uu)-O2}(P$>ERMkl)PyJ2`g7V zcYNVr4{bkh0za?UKQv!^{+}O1-?OflEQgkvUlnxiJFNaZrHKAZn&}NDep5&p7>%_N zPXx%Yk5JU_A4C2&%)ahn0j-GMh%0`Yyk0U+I81-rii=gMeHBUGU$;S7KGK7wILs+4 z99C(IA>n(d^t;KFVsoc;l+_V2_E0_LzN25y``QiYHIhM(YVffJ{v^Y;Gd!&LQvHZo z%#%8t^Y(V?Z8^HKm$pJN>Z@)(*J5_is{eadX=7WcM!C(FJ(~IN0R4&ES->OOLj)87 zi||7Z=g8^=X0Q5Teo**PL0rt&7TM$5yEsm}7Egs9h5_}`W5^%Z^xN#nP~1$PK>NQ- zclqCpUvEVIP9n@Q_@wRki9!sEkPiNoKyN=nuRmC*>H;)*B2Yx%LvY;?AUPY1je4!Z(N*8O3`Z-1Qpxq%{4^MR}Y!-3#tNvs53DqrfExXDls2MMMtpU;0DnyH00&8-ZkyKjrK&7=U=_dZt!nRSblay_k`l? z*Hnpr)!9{~Ij}`K(W`xxlv9HKr79-(<5}^WrS;OeVkMoIMV%xh}bZ~XdE|`%L^Y>`w|G3Ax3_I$D81#0r%*{z!u~er0)1zQVN7_!z|DOTyI4tV!r;Nr%^;65 z^K#z)?sPNM7kTc$=L_9t5BrG6pLm}VV~V?w?hR`|h(k$;juc!;OV=4}pqECNcDdMf zT!yJ!omYAt50fgf%H?got}kZ6ahA>l(PM;-7u6=Eu9M1{13iL|512Qtl}6s-BQElr zOTFFC8(>~Lv_m+OGqi?HKbUXXCU0kgnQQRc8$Cu^^a-gh!1%A+*Eg8rYkTV5yl8da z-7uiCuKkBV`#IqbJD=>O!qmE4PEx%QX|9jgcEaKE< z*7MfTEPwKZ(){OW1Srx>DH>(i{a;AB*=kYPS{oy(u{6a_4F~IR0Nn_T}j@B?b2m zS>ST=kI4VCx_MYu&F6_BG<8BfY4rHMDgdj$thPV$U*H-0{|BD!KA>tE2Gp6`CW=8a za7(D7$N=h;RiUz)*GMi>-JG@_Ej#f@QXt3a+$HN z{+!3)Q8H~=*DIb!=2zWLZB>^wHi$GGAMYobyGfqN(%M>Kz)jA!uLNSLupB^*|Dfi- zQ;F$a8mHzFZvQ0wbS-MLlZw@^A>9GtLUV=`ZM!FT!q}ts2&q>-a%t0rH3@_<K2rW3b|Sm zq45l2(GSd^XQ9lRHV4-3AwmUFJS}YJ|fn3ol8MF zq@}8Dc8SEzP5!Z>f+@}E!z5Uh|F*m(A>?>#od!^!N+YPVhJ-?;K zUO8O1X3wpUU&~l1{u|6RX<^0ES$WOVFgi!j%LqyEV?}A|e=1rr0{^-5l-qbdEzho8T zg`A~`vtjF}WB3SGW;pxL;?bbI@h~Bu1&K;chd`uIL~Kb=MH4DN2|ela#xeS3%7IBt z@qa#Q>o1vg4x4pSXFh%Y4PzmQ`JTcm>@Vq=QNMV9@^bLiJE*K*a|htY<>Nt}PJrtB zgreahAT%t3F`L@@RX@Ij-PIGYJf8Tc3Tcvs6}h0kjU^sq-~g4Fi8~)C8W|79G{yij zC{|%6P=*Rukd$Dsl~o-hSRagBfGU#9qbrw|zFFfkm;6JmGl}FPz*MI~BrO|Ol8g(b zNIF!p7C6J+R-8u303gU9SPMORrrDqG>PHA31Oc8n7D;RGx;gP~HAaukqOL`yKskNq zz3s_eUA%;b*qxL04xBOoP!x;Vz{48^Me-D+B!IA>4L%CW0b_Il8v8B8 z_(wDq4R&|1Za3Gg8I?+3GDwTdDUG%A28_yAQZS+cpqfmP^u#<Jg5cUHm@l6L(6uA^3Sz+mh#9My~ zC7T|VYa@X=$;vVM?3SxpD)5U^f&=lBRO@L=4{-v_6!_>?n99=A`5ERhD?H+}m#sA~ zcd_rcH3kEH6h7C^2=%B{{qm;acA1~}n!4;E8YHaan101OF+i4<^5s^he%49)ozG@PqZpb?n@k(fBKyyx|kRP;_UTSEwLH5y3( zw|aSQv7#NRqZRo6CNY}Kq%lxZzKEgZ|6sXW!`&8_55R}>K!yH4mRlC(f3n;K{q3w3 zevE;RmQUT){X`l>4Cf`YnR~j1oUsT{A#83qz%AQ1I+rofQ*dW-E0zeMOFlbhZc%yv z2g>ai(r;KRMwvUA_}|HCr{&)XCKw=+SUg6d02EP@i~Rs`>cBY4e+{?JxOGx6aZiJ@ z?qR3|Q$h8RLg6G~SgL^RAPKx%HDKg#~gYZ-Ntj3<6-{%thcgt2Y2ucW;+$WjK)eDmpBhhvu zh(fyq$p{no^|VTDhI#@HvW_X7U&vo1Xh(9}K`i0Ot3=D_jwmiu45QFu!(n9nh6tv} zo<2e<04Gu8)mRNC=v_aE(f0noflWS+W)vb0MDt;z8M-!3Vi=uc*;mbs^^b>0A~+Rl zDUw2$M(|HO648GUdN_1(Y!DObXe4SI8&zTsO7Tt-&&465XhcyE)5#qxbQ~vUWK`rY z26|z7xe9v<;pM7`1ev2Nb0p%!p$H@zC|Bta7B*uXSlAp@q<*^AW+VWH6Fsu)C}g6d zLlw3Qd&B~gk#MN8e5-CUl&22tFBHP$zyETgz`)P%nsLv2zhIz1y(t74<)&L)E20pW zULoGEN?I^-lAj&Cxxnlvj&Lb+M&K{~a*?PtCQ?yW)_tU)`It|1=bn&ZD-s1b3TcSYi6E(#!lOF>K4~)dc+Sz|Dx-jq9f~~eSyd7IO*6%$9B@O)g9ZmZQHip9iw7&%#JIz z?Nn~Q@0>I4Id`1xQx63V{G7 zqGfMsKslG6TS3Q6_NkyfaSMM9xUP>6G4qwDFs@ND>jFYy#zG-V39`Iww4(}a&CHg;T{RS2PN9b}1f_&A?|0s{g8%v=P0lb*1Uo;__$s&y9Bj%Ef#{xMN z(u{d)kgt#Xhobe{Jm6iW0MxEW=k>{m)uPzMo3LF8tOdx|(u7$Hh4EFNPZixvq=TX< zi!7XAzF;TDp)Z2w>K%EbUd}T7DJAzmp9x5%yQ3|rd8#(Cvwkc79D}U&JPp(F`^s|I zZI=l%=fb|qqvvm<^CSDQZ&Avkyl%3Fw`APcUcSmK6lGd+DVGshd*1yPKUs-4Dacfa z5dWITX74<`STG*x!D?CfeVIl}!2MqLAG%Ke<=J*jT+|og#KBY`O_@U~U*}sHPLx|C zj+YSs0)*LV(`287TV3impioY24%NM`IQaXLpZ7QnG58DiEvEnFMekYj&=~p2c9<1{ z>ldzA8Z4h7CkrX7mXHKk0!wrKIKG@T6+YFZ^J3@lmI`+zQ_Me9Rpep{Q?-gn1SKPsI$C0&iT}K!?zYy*|NbJ#9s{|j$GiToG zhte886m*_*5;B@&VEUuPkdSo7gIM1?rcNGO2GK$@{NuN)(}Z(HOqEBxlIl9r;`8Yd zAO9q&h{&M&=;sFy%Bpyj>eLBUgm_0;i`MW5plXdd%0a^gk??avsqG9Uw8uIxab|Te z$S$5<8RRf0LX~p+hk`DSd4WQO+Yl{`h% z&q;tXRBpEkp~w)~vJ9X9!L|A)lS6HYkrJdCmZNC0#-WP4shJo2sHn!-6B1-Z>%Xnf*ujB+I&7} zAjl6s-bzy$LFvy+`UiZz=97k&jd*W=!vE#$Wr1@TTA!T#6I&4g2M9W-QV6D$WvUaW zI`}et&U!*{3wd{$Dw}{6CysmA5=E3#)m$ z`>g8EgN~1WFs^sL6~3L3?W3L%p|LMr1X)_Cjhn6i+H}?Sbk*myqnO#gu$f@m2+J0b zF<;BfUx0hGD?7Cu+<*Q3`1Fi>@ZgmI_F21AW$}rs=gli&oSg^Z_@4%o`D0~V%4Cl6 z3TOjqy6%1EhI7u+eb#3gb9|HVldgaCK%mf7C^Lz34T)%+k2@-D6WjITS!wkU>*$@? zrqCw80?Y%o>W}&+f_V{+OOXH(+S=ECmqH3xG~lZyyeHYBLPdejHFz&w+ZlZ4FSc&S za2F1pQK2RblTMZZL+KwPNCdHq!i3%IaC{yvo(OJCjXxd`CJ?#=RS<`unvt2j!Q<9G zh_~B%8>zEzKbQKRgmD`#Cttq#E3&C^FvoWfKQN&MAgN&IKAg7Pl+$Z4RB!s|Vn zUJUkCFyQT%h*`C!lgyK3dYt%=GAbxTAjJI0-uZZLw7;;S-otDLP!2GETAE=)ac7_7<&a zYe1lxe(O>GH|8KExE!%0BQAb%4T>C6bWO_KpF1|n_@{YlBcaNAtPwYlEv7Ah<{#b9 z8-tijw6sQ!2}L*71#=cD8xJ@=j`x}@#=0sX=MkOUUivDNo8i|Qdhk0!bT`Xa%yOgs z^rJ<_zb%9r!?!9VTHmG9(`_TmZe0_)WpP*Hvk`%xG@}*N!Gc55J4FS`s1tIn2r~Ii zyU4;$LzkE8xoDl-m;c51Im=dWfVFjaIo`D*s~`!Oa9Ln0WAmW22RctPF`Iw(g#fCN z*i^1IUiwD@r@jZefA?eAdNHU)IQFzikt<*E$zmwN!nDmOXSLvHMS^OiF(VUIVyHk3 zFlfOcLxq||uiWlT1*b3P>9DoEomnj6NW*uSSsw9E%IaanWMC9BcyJsFh$JksDJ)?# z%QOb4Se(){>NIX2P=j!NID3mu1{C{)dgwxsJ|&?A`%YhfDn#eQFrCm{83hEfxX#C5 z7{JTYps&*I{6YBa0xeeF{E&ra=8{pxl$EMcQu~tGuuOWCjBkg1|2BS7 zi7wN%M~7z&>^&C~SYEkho0D2Zt1f6DTe|&Tf85&U`0;n-Qzsb5B5^?ApQJVvZeZd= zQ|6P$-!9q;%%Q1mX%x5E-5n3>TW48Ku>X~nQw5B%14#H<)5vW$y@Ur^c8pu^R2epg z_ZBKfE29+@1bm&+fBVO-j|)2`?c~bOxq7K2H#zUx+uL)kh*Ab|jT>YhcD4WO+#3$3 zq3`U}oC`FAA^%E>H<~1W#tiT!cLF8KLBd^vO1aPN5BC~;7wY0O{XUdSuq%B1I;vmN zw=YBuz9gpNpqM%H6n4HW&`&Ck-UJOn>NAx7mi^f7Nhh8HX}=#eN_31EExAb)j75N99;kI8BGrL)SmQHUl)tfIV@6nvi(CmErh# zvtXPn{gzm*oNK&1O59vN=3JP|6lEGL`Xk}iBECs*!8U&7dQNoBLbPQ{&&9^##_||3 z;7Tk95ti9qAv)=gte?_I7YnW7J)u_k&rNk{?qmOlU_l?a^u=?5HNBA$yE<5f{- zq;u5A>he5f{`&ZS;i^EehZS8cA47Vu&Uhb}Q;Zj&khl~ZO?rCg&R&tRPuAYh>v;*h z$1%d<4CiU7IHx6y?-vMEd_e`K-C@H@~Bg`du>y{zYx}6~DMD|X}d#iPk%y@wFVmbNGsfa20 ztJLWlcCVxT^Aw%QZwkd>y;%D!8hNcBt)ztW`Y`&8rsL_!oA@)?wmqpDEuG82(OL#3 zxW5q{D>b(41+Y9-&HML>#nMXt_`HUvlH(dtN3EK9SfP(%+R%Zd*3dztdYNab|KEb) zE&eX|Ft!^+8P>FCS24KRI0+E?ll%NLXJ3EnAv<%8x^egY{+bju(>0qC(8@#v#qyBy zkz*yas?#>sc;;r-*m$_&7uWb9D2DIb8mjlU{<2$lSk990-gQCCwV}6#>AB;Kk)Qpv z-jv5QdAKlm2;pNl<8;p2(erP%%bD2_Wwqw@^*2YjZZ|uwv2xA?AXk?-Xi0M>zV|Ll za|*;MMOQp-2mm{My^4O7Lw;I#JyF~X`lRm;JHZ&lIZs=uHzN0OPg~`JP*CW)+%g-N zx6vHbxJ+fybG|k19oihg+N=vT-Oh@<3pJ$KL6_Dl-U{C{U{$Le50CV!^qfMHTT)YU zNiN0tG_~d5zf!BTCjJO3`QIO=$D?UYdg3k065iuw;8p*C6cr&pE9P&Z(6d&|z-qV^ z|7a`XWKtGf^#8qF&mzL#FNO`eXxetvaO$ePRx(xt{20a}q2(#~eicMQBQ=oR$7#&C zgr0`DmDB6=X)36GXY++E7j^b@9iC@(TSj6^P?zBH2$oe9#)hO7dd~64{G$xrcQ93 zyMF{eC_C+FSuMuyEU9xZgQNG9r8Mut-N{Ju59ZZTN3Tn5IHf`oVNNfl6j{|M`4+pd zV*jRL_0E4`!s2aYMR8bWQp-CPr84@SxE4%sv-mhtuvDnHvuJZD89!3wX6y1@CmuC1 zJYqq`ul1<9fgeqSnkMe6Ld=4eg%$VAFYpAaKSj%^NXDim^1?(S!$Ld zl6i6JD_xMNCTakWh`iqS^ z2i8wbzt*At1)Ej-ndskyK)X(8V8T5WTR9`deM4%eZrz-#$E*$?sgdssZ7aet6+OgF zhw43Cr?UVSEeDIhIh@pfUU~R@x#YZ$DvyqTKvXO@CH)YSmy!+rD`QT!>?48ANmzVCY~DO}n|28NnP`#<9ELF3Nr~Q8)LNMNa;nD5kyp)G_^+nV ze?O8V=4q_hvvV)T9#}VlzLwE_3ea_qe%I}|opYy;))*ktW5q=B%H*DTRz88n-ED`P zMVtA|Sk%tATfBHM#SZ@A_!*ehDe$hlaj;#Sr!DL6*W|E1{#rTZ5EeDb_4&#e_g_** zmM#IO8%TbR6SKRxCJSI~hEjuc5>#^viOzUQNoeXiVmZp?!=$ndk`BTGSlI)kssgTS*5b4gB;1)xC~rqZApINH+_yz& zMrf=I_YHf$8e6Q@@x1o4%Px*zUvyFP)+l~Kf905if{lQKae&{Q5hc(#z=0+){sW29 z+20g^cqa;hA_{~8heig22@@6FmG~ACJ<}wrEBZ}hDj}Q~Q5o<6@Xu?=1ozF^nlS!|x6g5ruJBvAP~YQAnJ`u&+RJfib~y9CwHp8Xgp) z524uC{z3sf8}v{re2wJK6RJXatN>9`5G-WdA*o#`Bw&jq9l4eY*@+6BEUdQ?bpYOO zeWn8@3_~lU;SYFW=yoA)7&F?=_YnRuOBKzAe@s0e^@Tc@9zKFk;a513UpU68gG(l< zIMva&aX!d8N>QB`*#DaPSH?|lQWR#7xc#*8`e1h*ouc+IYU4)WnZkv}>z`F1OX8nT zRG%yu|13wKa``W+SJVl<-MRj5pA+g6$fCCBvrB;%5__s-4{!wkd;Mx~xnz-2Tz%DZ z`M5}2oBmB?Q`1>v_1ldsS}K!$3VIR?1vxEFY|fZH`F|XPIU#KKPMn>ELwR_YF)B_2XzLhZUUA;$~h4kYC0h zp)YrlHVR~I*N(fu;%(Qaav$Hb%Uow*+On%0;9ZMLp{r_aawMaCd|}k`6q0ar_OX}) za{4p6ciwUKq`Lfz>sMEP46Y>oPh8KDn)He5^JlpEsu~gyu)m*KV7h8fWPn8#Ulv%p zKm(;7j}IEM7h84Iz;F6Js+RIbJ*33~%9hw-rxc`&bQ%-hg+?JhI zpp66yiqYVAmx&fv-{q;h>`Iy5NYPKax`b-j*s;=T$t=T(%sJ=Zx;S;jwdJ4pyA_4k4G3!PhqM` z{gyJaZu?7-m?QUiBRB=%zb9g6caz6kb@|PfdnQNCr%E#VUtgI#f2&%yWhyQ;`5lzz zDrcSJ*oO3U7N>?la=8zZLE=U;@35n@$dZXxDp&-e+wHlq7&khEyd|r5WeAte z*HsIhXE9RAJ?xn%x}8f4t|TW5@cdJrAs+VjcV!XTSwd<0SEHmH<;e#l27fKc zf$`rMLBy~)*7Ad(EI;p9iJ#oT(q2#f&zq-m-Hlp^mDQIcA>R3>FSl`fY}6lqm8Xb} z;fJMu?uru^-=1NBUPhUe;#_D%^4FM&s-n6*Ls)OmsJ|066;&s-re-!LJ&IwD7K{Rl z5YybabeS8(6D9x?%$4sYqdFzNVv@WvWY@Ez!0MSank?sMoq4AEtk69%n$GjgT3$T= z?X4_>S$`+d7ewFy9RwptFLXPJwRzQ&OtzDoE;oP zZ@TsuUYo*!Xr*1dh+sne7h!y#oByTnk(qsvoeQl?dG<-&4nC^;KbOirFU`eYD1!SM zZykNA7@Z9LovlmfeTT^S5`w+oWZuoq9kKoW zkk{G~Z)Uv3H{km54am|(h}y|Morsm9>!jPIkJOS|tG3Pgs=lN>0VLyMwr^tE-f4{w zJKN%bC%{b2msi%k@#gfOiR;u$?*qcsf4f^X6OFf?i}%*vJ!6aJUoGebvj_aVm-Dx| zV|N3*Tf4Gtu>bsM8hv2MU<}x`4^P;Jv?C#dbCLolK~!?H;uhNqGuWCS`X>zdmn!+! zbrSO-@INdi%Yj2rm=Ml=P^K)qLCj*JK;g5>C{;}IFmBYhrqm4PDCqs~-11s8s$gKK zPA124bW_YDEHD)8q~_sh-`2UIikp%h_SXIo;%eZyj)q=mV1kjG3y26S%F_tNXRt{m z2nP-4+>eV^+H69#6S?K za*_2KiD^`%W{`*5N8sF#vCpiQ$)&{-lWv1w$W39hM>! zp-4hTwkScDqLIXU`%I3ubY9bNW9H9)rdP_Vl2qyUE$3Ajn?KKVDfM18^-iL;??Fa{ zD2QNzX9lCyW;^}><(xBWw5eK6i&dSph(SEA@2@v9`Egsn78`CHv&#p;x_4X&h6<4F zVA#)vrBj32AXAFYC#iBbW{8pdEr|=k~JFJA|l(T_{?y1yE|1&|wk}>xk7To|C6YerkbY(7$Wi!5K(k@;F<&bqD5e zwrF7kUuqwstg716GtW&;UvX9hIa~50&kYS>nHzv-^yY6}F&520$9K8-yyICm0k1Mi zeF1^237BmYcKlc`K;|Wiq~9{JqKFYuC;-%SC@&nA=L$5+d*l z&Rn|QGHRMGmYioho)vFBs4kGi7Kk4yku*!gYu4*M_Ya%&+8c>@`s`-)mmW}Z?m!9z-}NwhQ^AX;Y&g%^3`|0 zb2SCQUa4bhGlpVoW<=u8xSiH7S+WCbqV=}~)(mo;Gz;IhV%@HmsmghWji?m`vowH46jC1r7pfo z0`as0*|cl@MtGZu%||@QtOW~9b}B){^~^q9IPY8sc6d6Tzz0Ty$}7vJh(+bLk(o=N z_iTSQV~bLHCF~j|tXVHCHj~rOw$o_MqgpP@HcCvjC|PHD9l>1em9Ue!^xtR{`w&WG z!wK;eag%)69*5fb7lw5Kp0NA~%U``@ug90CFOW3$jRwkgyoQ`O8b#`tTi~{^Z!@D8 z2$hHwdXb7!o>oM8KF76)wDKqUqn5Nur8-tbAYZa=a=#f$h zD%5==OWNnL7fA}&bF8Wxh{PVS&xP~0#6ADmSCAs(spWJdnWfX37+0x{`@P8?a45h# z(O*U)o8&pp43@{okkk|xEv_?EeigLSSB=)pHNG{r9lSXglVksJ2c#$bO+IsT%^Lu? z>QigKEl~ZG@ZY*nN}uPWndOu3&bm4P&OD^k$Sdb)?l2+f@poS)5~#$BREm;kMx)@$ z_#I}5s@(Snu)I_Vu~L_$e&{DMkQ2+8H(y1yWMdBOwbU)_<>G7l@X0G{7mHp`#JJb3 zrcTE9H!k)-huJ;$JM$qfUc=J(Y;BcV-z(al`=u)Hy8fD-==-Kt*~M5RMETVNkQzw@ zcihJLGiuBafw<~Hzd}cIvuci9C`C5Up=`zI7v&e?e5nCbCt^Eql1TGeAQe!J42+)k zTNf-Ls~!&!n-!k00z~HhXK@?dG~|_r23tr;4ho~W%4wojNkM?(F@>+tF#ZJL2SAu5 zmiAj7Bo_lxFHK7OU#z4mTi{^U-%ehb))_ww^@VLBk!^Z*3_=?U-gU7%Yn+IS3(m$b zTEW6m`d%b#b$LkNwLe$0zcseR&M)&PzfYSLnm5i!SEJ0Ch}R-=ktHI=aUfAz8yG~}HsbA!L>HE=b=Yd})zoB-eT zqf##aj2(8ZLMc0enf+Ftxxc!$-MmTH$4??^oT-Oabw7L9gzOMp>jrVHbYEac?>Anb z+D|?;b6{Qsl`-|ljI{XLYD>-DxPAqu zS)^bl8#T>whol3UVFWSi$&-cs5{sU)tM; z@QM@sgB;1V_IKFYgF8`ebSzs<9p-sftj3eSR%Bh|F=L=r3CeoNii9K51++uNk)TV( z05daExEI7Vbn4|gEf&?_njTSD+-IgvZ9nsJ%?-+;U*-G31Tl%epi<9WVP-94#*01C zb~%#JfLk`mHvNO)W8>Hbrg)S4e3QQqg=S3;Vaxxv=l1ij0)#dEVs9^7UWaZ+;`63I z;QgvPvNtv$xHQaLTS+|I#hTYYHUhTzFvcg(&-rzrT3Z{BzA&fVABNyZwSQlj&^B?F zCEq&l9X0r)RV(_jnA^ezEp=O(?l)%D;|Y5H>(^BC*TAzdG7+fg{juGG^5wB-?O163 zgZlZ|I+jqqg0C&RIX+0X6-da*doIy>+bz&_j%c@bZsyN?_R#sUY&Ssst^XT6G_tnTW;UP!l2&Y0%eC3!Vqwvr&9)T1PEeqoYip|PaLbW2T^yhOkVv=^S8 z^9-5#CJ#a%MiPqM;#e5FTP(fOep(q_oHg1$Vt@W3RXQ!CsQ3{I#}5IyO#k7^C;qZY z=$e20u_XTSTC9Be>-dB1*yDtl^x}k>SoCep`GXHQ+n~PiIhX%%`|khyby`Zv_kE2# z$+*E-S}#s{*xVDBexI35Sp^pE>*=5(7G0kEi~(*bI378NiD!eB>887h1}m5Kz{Zyv ztsr~V(=?m?XG7~!feF5;~_WM;sd-gLF{%L&V&SD47yZ$Mch1{oP zy>c!h&theDK&!$)LTdpRzWl2mQ-++`z=j29F5(6@b+SNyK6erQxXRvso;7zVE=E8f^A1QR^R&l(^!~;K1 zAf6=Qj<)*nH>qkm1VTW|q4J{Nl^(74V?K_wJCQsU_OCCvvzLdd6b|9$DyWFy%bsDQs;BqVFoJLJZ%YAwdW_2 zhY5Zt0cJk%LDsWbD|Q5Y2|jk<&AopmEHEGFwVv)U2}Tt*6@b?d)Cbu;2Ud(CAjuw1qrI1UXSWj=Z;Ae1Z1JuV=II0IR% z;=>B$+fRObNkW144qU@9W3ZZx`|TAi$IEbU5G@Uk*qrbV&?0mZ7qEoVWx#s+61?rOnBCh^ zCbEpL*in`qw^27*V21monEA1x`6!WGz(xf7Zbyw1Hvfz3$eo%k!;<(2yrBYQf_le0 zaBMRZIB+?jP2ToB7#EI4uXTwi-CO|Yek%7~_cxfS)kqEXx!$rhN;q@kENaC}8&`lY z>}n{xB@DjMaVvH4aT|~jsY92Cd|uFf6*Ft8Npzo%TIfje zZKY!Vv>CS8aSa7#!)ERt99v@B0q@~OFJRA;+hUq(0PP#J#r1@Bd^xjy0qVP-=gsol z2}CmNT=x00OK*a~s`aD9h5>4SY`AN$_#H(wnq9mfR{S z>bx5>k@wf^4g4IyAuh~lZ}DAWCpM68WBE~HH=cm;tA#*e5dWU9uLi;~?2yqg*9T$uh{>?yGz;P#X@CTAZ5wlNIF8tW z>$hD1ov8ilsb{V-_jN<-GNN}%GvJsc1In12n!8%rTqV!F97veYf6JZ{e)HYwem(F7 z>Gj>xn-!kw-4IS4TZ%*}Jy3|CH#ZkXmpiWE+_M02G62`Rc+`d$?7E29tz4wu>SDL= zXs^A;_x+@kSiks>63-fH0xJPHWKVn*U&Fdep+uKx*2IkTfj$$Yqd z*_HlM_LQ0MljK*NIotTKRpT)ml=2bz;k?25UPQE#cyB_s8yu$r3`Uq<4!mt_#nysg zq2f+%7E0RfVD4+cS8=SoVr)Pud@r-39tj(<3XpnIl7WUw?y66@|K~&e#$b)P=fU zc8M#t{B9L5{Woz=<9l57->*c6urD{>xBOmT&b=QWH$Qrf!>oH!O{1}NHaUvaApN(s z;aLOnt(5Hb-ml*k{XJe!CVM)Bkk|da-}5ilmi)aQSAE|vH~k-9;y1h9HbHmuuhB=O zcsu!iKKIB4Z`-f#mz$vSSK#G(l(z@jXuk`nSKE71Sp1;N<72)D0NQ>0*gS2$1e?-c z?pYG@`M8ioKbqw!Ao6}a5%Pa2ejO2dKkEKa-y^w{%2N8g{cd*cCg6R(^YP+R&-c~- za6yOG6m3G>W5Z`)!y>THe%>8;eW)SC(3ay=}Fa(G=rlmnTH^i>r? zg2gF90~}*!qlR~Y-+kY-sQs@z^4o(W7M#znhAT(2am`-)MvBZ@cmw^H8hnYcI)!Bm z6vViI^|bbCW>T7lH6_U??p!M0S?XYKF!JHjNvY_#@XB zdTuQShG&9ZIhx9V_o$2fXo1n)vJ(+oHSZc}oT1 zILEqRW}K(p=<4+m%diYcPel(=@>WAMYzM8&nO** z(gnoJpq0W>Vj^~v#%WR0H$!FIQgYBjGD$_c3V2u%8fu?mx8{2B$UR-rZ0nyeM}BOC zh-t3D!Pm|(2jSg5sIhY?2!TploZku9cIJFk?JF~83%CdrVR9cT^1OGtUlK{6oPtyE zoxOZlTY9V*k>WvbOV|WDAN^hWhZH|ju;w~x)QWea67s8hSmdgNE|6Y#^-sJ~UW>y6 zEgvM_r`py&_6L|2LoPXmna@K}I+KxS8r(YX5&&+m+RAZD4>W)cgPF_6j-TJOyT*TCS+I^N-<3Az$8!r7K@q#G zQ`9EWw#`*4XUjx1-~>e8zo%IX+xlK?zt-PzpNZiDg=<+`r!NAu_EncHERC(GTwimHLvD(;j((KfDJlzKLzS_Zk)%Q z>b4006$nF0czuFC_casB6IUVH z?2a3AuFf`qn>iElHF;hBT<@$5;*bJCDquKy8&$#X*f%nb$oIy%b0h3svKC`8lwjy( z;VRZ7)kMSRCRC<(KyGLfQOZ7qTPXN=0yrTW8yyP&hLkZMM#uEWA*-w30IgVAJ6YUk zf-L53?QST%yetuLYub0ut5b)WL<4LNJhl1bK6&i26DuK5zb!8@0D~IPz;faCHteuW zBoA&{2690N&MNV4Cfj3?pLDq~(fCFuA~SfnR5Wl;$BgB@30?NKOymHtHR;)S#e?hV zkyd>>v5#&+`9QYpWKlb?_-rJOfzKB3kHcs$Wu1sltd~vCQn*Tj8V)=Tpo=c*N@%4D11qBT5n96`QEOXK$7P0zyy3ig`=izkBo82ZakecHEu zEA9-f53^nZ510w!e0uoKLIvzsiJm6e2QiSCbHcu3yCq4t2V&t7xCzkm*}R@FNY&g7 zRM|h)`$xiJcMd9=4CZP{tY7Ru7(Uqy`f~1o&T$;edy>$WZeix7xsKSo9M}V*p=&%= zZzYiGiD7nUh$p(Pw^ky&8_?We_U`;#SiC-JQvDdPBy|;z&@P;iJ%<(PuBV4>GYsq( z;CPFbi#PF6@RKhr7U9A~{W){)&5XbGJlX88!rC?b9pmt5amtlZ9G+IIdmkgR@FK70 zJLl>cP^h1M9FR8VeF%@;u-Llq%oECLdeyGg$+aVH6lwh<=x?r8x80apT_cIo4HIa2 z(>i^dSF59FyU&|&MQFH>U`D=q>N#-j!8-J#>0Pbvm|VLZhFZHl4}|W%n%+5N7V5EZ zmSFivm27yuYTIu6_p#svuc5m`)eSv>!1vVb)a2f$kNyE(lr?XEyk1=Y=YAx-ekk5- zJ?7+Gc;RjOV?}S{p$eb=e!PrL>P`KmxYOg_y?!`Q<$crewH>sS{I(F_I3lb~ST~_H z@WG>)0z6~SmOtdcVqVwlX?S>5-~70G>D0145dSh^-_z_r6p~GyWfR*P_Jv}Dm%p}b z-tA8(mJcL;#BKlPYFvr=ZoTYQJN}FBa;RhxbOedvR-UYG7J9_VNBTjr~`jy06R>SOy`Q-qZdhcU>6tB{m8prj{r#n2^8`R z297l=9&+b93XNy_5<9SyDu?W-4S>Apj33k$5$rxvjD}T}i`cnKDwV+;JL7X0m*WDD0HiyF;A|FUWa@NIkG!5!-hWEbSd4dlVmb?uaeh()4R#HzMye&YSsG z!Jd7v*&Xc+wFjmH%=$!;H~1R%#}8rWk*yF)YfSU1Oqid{T<*!k-i}X0?BI+f9Iiv< z6=9m;dNPxI4~T{U-SV-{ni}n&v8fNL1S@&_7;_&sLsn_JMi;cFLJw;IyI&w{|7Fjz z55?BKErhi)On;E1_*+ zr)|Qvk0~#rVPs^cP{=FM1akrZIPb*1=EtSXU7i$)?IXCVRcqzc&BU#jbE{jm$l3;n z98N?;wt~H9K1fy;ZKJq~GEz!Q-3QuYX~V=x+C`iUz8`EQ7ZeSOZ-j#3Mx1KGftLTA zsSS1Hau|-fd{>!Z+eLKYhW5d*u$+I^{hhaK#KupP#XvH~sK}5g_C@@;i|;EeJ!WBwD;%gWH@=<_$5Y8mLv}W4;ETKB3CD-ufNa z5RL^0MY&6DNjf?9Tw+oGi@=v(DXU1x$KR{;0=mIkVZa-YWRXy(XYX0G{Nd*Z`^a!z zePJzHCo%4*g;>OE618w&s1{4qJ}FkB@1im#QG*!N);GOb<^g)_1N$({6u2!s;DFTi zI3q@x2{?vj!5LVvVPEECKjf1~bLoyBWF`v{ocIjdEM!L#L=uUq<1)-@4L~~KuDOeL zF{!|LXy7+qItyj6kb#gsPg}k__bE=m1o*1gMJ?eSlt+YefHg-+K}86!4Oej^*AMAC ztvtGd`X3o^l#7R z=&~w^Wo51KqKvCk-+7xKS6IeDB~kn9yW9)b!ZuvlFW9w@$|}wQ_u)c{IxI*bL8uNJj0rI9DnfvS$RJ7*p5H77Lolfvx?@;G*3$$g)J1+#)J2ZK2|1%r2_xcbFE! z#%*G^Xcp!rzmj$;wOOKrhe2<9|FZ^Z5`D1YxBXT`!2Me$T!(R%>+Vf01Wmt^if|{b zj(b6U#{s+#&}Ac4rl7YG=PGSwyGw zR-QouFZ@vW0jE#Ce+xGa{b1fe%p$UWEK}JYKI;p*80j}P>ve)a=Ly?AC^1wMaB6H; zN#0(>(Ev!|MKf+}fTepwBK=!v^obNts?t3Inin1_J_Hu36EG_^+y)Z|0W}$~`}=&K zd=^CF`nPn8GffJ2_dir7I0JNjF;OwS#i4i&C3L zc{u4+9hC3`?CTUA6WG7)rsQ;E@M2(3gHj#9eiPieKBCNC=CpoBSeIpkNtpnG{XaUN z!5#=%<}(Gip6>M?M~>V%_KW+6g3BO?dHzh^584|*%mRHTi&BEK+!rDIjtV-Jqw!qP zg;~G#su@Gbpv&iG7NJrwFVJ|%5XQ7+yrFyg(vAS{D9sc+D~nVT{ysHa z@D5B^c(m&?%24|GAbJ=rL7Aj4iCqFDiTYeki@{t_wwzV0SUXs_2Hj{*Qnm6H*hX#9 zAzDsZZc2nSaKBa!3X?Vt zwWXE7y%>rFeJ!w6tk*7}vp?CmWbjcrDtk4-Dg>!YqGCpm&48f>p0<*uRCU_4Uu@PM z!u&XV)8Q+-^8i*s32rD6k<22=#h`U|PLfJ^s^n?QcR4j^a-RXgzLK(0?7hqmscdo; z<5*J=BJ_3A&fURz2?O^+!3z2bqiDjqc#I7#q`BFs&E`T;lH5qcCai=i+vpJUqE61|%KC|=Fzp}aJlv1YKa@&+;>tUFODM4OaM666Y(`g8ox z4=lGSgIRFc?fb;|FXGd1A#8gDSAh>)J1oT*aSiyy+5$}myw0=Ns6iJp!(C_i;oat} zBsOt-OwIHfehJIPb$jaWF&_4*0#u+E+(`x3VaznI3e!#-;x}-s^h2=Q;I$QDvP!G7 zX1NbGVfww%A5MxDp;x*<^;CAc@>vq{C5{RtCtdcUbyT94AGg?RTG2$Ar2XKzs_KCk zhOzF+rBn&0PWaL-nM*d!vl94}zqWO@T22Y;1rpbqG*uBu9m!HmeMK8FIlfO7xitrN zTB+BY%Jf@VP41ZDW33og1{`YIDgI<*gT;>tqy4SgwL6;Bs~VvPz+y|%XcEzIe9h7ggY`-ClK!bYwa6>2Lt|E`N#S9T_H*fNB=MxI zW|md3Dt<=z=W9%vB&8^&;1*mI*Qv=qMUC#SUlVAg-h~@=^eP1_Y^>!qdaC`nct6Z5 z%R@yVDO_FN(zcT$+AZNC)XjIO46Iy|2_}fdHO*3MN;+r|aPpUKJ22U{Mu+$-?h~P2pm0g*lH1xJ@y^NMgY_AEQt&F@$88 z=T@hvSl=7o{ywIqy=z%y(EB^WQaN8W=I66Kx1Ky@7au`jNP^tH|*CpqT=hdz-wZl2ra1iL+9fj{ z41z0iAWqsgy}PmZs}6AcJoFl`u--z)0fi$Qh%#sCBwKl?^6UEhiVcwD{OZBEX49}M zP(Vwv8`5|DXAnFW7IJgmJ?;>W8sOWCxTWSi>|#UH>`z)1nO}4kiWFK!Se)6?^Jo)P z&DBw|8o@Y{H8N+SppG0!VNSD?!6Yu4rRr)oSs_6}j2iGesNNPjAXQ$VN0ygrdJyp+ zQT>{o6Hmp0do)9!v-XVSE6a_G^Zixz%!geM8_mOq4T@K=`O62U5R+cllR%hk$PQ1^ z!5&X}4`C!}o)x9H76f?=6y4XAimp4mP)_}OF0(;WS5^PwZfGc__sF8~7lBbLic}+4 zSdYQP_|4w@6SSXh;_tB(bXrF}!tl2f`q`DJ7Vo3MpwzM--XAYO@555(dohITpXZZn z`5Pa1=ZZokGhf`G0abvPi_X^iO@Q+z!1Mn6{{U7%slRI&eeC=Lwm$1S|L_k^ul66W ze)z$C_xjtP{`lQH__8x@*J?FTlpN66u5UP&njOjdyqfwK&=s%sANaq&0Ae)Z&6_4H zigc9q^^FV&JntIMPX;9e2p%AR*u*%L>#KBnb>ny$Mns3V(u_h+KoF#fUrLRSYy7$T3_Rt*PVZW+mq$b!(eff z3~Mf1?5=;lg4eF(l@FjHehyypAjn-`zQ@2rCtC+$n!dEgc=P?6*EdaI_|Z!59h<=n z9`F@wW*~IXSJ(QZw?BOUYm7tfF&=_qAke^~)+DI_TqFk2`>$|EZgI~A?$7Y| z2XbOy2ul>}V^KdpUt#Md*vu<53FE)md5Zp}R#WubckU10|L*OpxBuy?hjZSe0JS65_`!W8g_#mQc%3%TKZeMYuXk1mJu|m%U z2+#4$`wr|ge90Dd3MZI`Vo4Wo6|d>a9@-i<4euMoaS4B6_kgaweCg2i=Hx$DgHs5? zGPw_fE4}FE@>39{*Eez-(FR3SO)Su8sAIEQGDCYS1`vQq0PK>yD2%eigPUl@?_TqU z)E$LS%8oA-GWRTj%)-4fL*!&zc@Zue9Nrd^RAb`J0gEpk zncLOzeNM0JkuoGlc)wOnj07UdV4cv)Z*Fd#zbck?%Zw8-ffQ)?VAVu~xkh5`q9^~C z($ztVwn8G3Q8380z-*@IP`xGrF5&aotZod|gdMna$? zfStFDw+jxbdTFy*P^_gtK_%xv4OZcyj zu@blncNV{7R$OP-HHtH?c$k@??;P3U`x3n*vVwewq8ohhvfE~4*K5@NDoF$d0gJ^c z9PygBNxs_kCP*6F-h{7mlu^E65{~XKq*!e_upGE%2HM9O4N@SUG)XYHCYk*o9Y7O2 zWF~f4a`TI|8hw*-J<8RiM#hB+FNeW_wM3YiZ@#M_2U{eW{Cp~?h^BH3 zuSn|b{ntFqtsJ$$<6vk-dEr6zt2G|oms>@~uuU@jbvm`vZHM{Ke9K{*3|?8x79b+c zvyMeNgVM23Q&9K~iNH08#`HHRN;q9{#^N3@yMymZXLj%4uFAL9?VGJ9BTYJC0J_3g zt?U69Ik0f{_QKaq{2GCoex2K%<|pKZEdZ^io@UmdRb3-NW72kgbql-KxxrKhMHrAh zQ~VaNXCf+BXest_f*^(@S2uZbVo^w>DLghsSEJs0&9fi|4e~(lMiknG(g{>_3Wd)L zy53cFqfmIzHZ<(!R#&A?qE~1hcCISBh+bhAQ9eRJv8!9to^=ZZ)mijPI*alrYE6A@ zA)$ZljVU%5rJdQ*TNJO*uqD5ydB9^8G!60a4V-W};VU_IIwfHWIy}Mxuj# z!xtKi;;s;d&NUas$zD-cQM}dG1;-)o6jH(xGywb5r%u}(iC=!OP79M_rsOvq35;3xKju$Q4j;qc%duV1MgAPfJ-zNdH<%R42dMg7fE7zO@aYpY&%4ciXy=gcK= zGvu9WHd_g3`<`!?i_{1|E6M7^&-~Sgx?#O$4(4&qmf;2Y`ok~U#wOBU&gOB5IYX}+ zXAXLGs4$RbqchpNKr;uv}J zPH`?J`8fanZZWYi86}3oWVERHp~74OBFL4N5Oa1BzC|?SSy5d4D-Q4ri;MaV72f&M zDWZ8!NyP8A=!w>9^wzAmk3~P#a7a6rm{*ifc9(VSMeHBYTMp zAun!jVJ)RtQpH^UdL8ZI);E;-upehec;-=vu z!4wjX-A)|L%`5F=g>$jsyOV8977HZN8KLiOBG4nMu4Uv4T6^@0a0OS6L_!ShRwL=64`N-x`=psKKlDv5B~|n`FHnf`U+oosWZokC@LyZhYWXtfnQtRj=T3u!*AA$yq&B6_OC2rNe3jl& zzB}a$r`JK4!8+*bzjWOo@j?2p0X-sF8J}o+LEs{RqQ5eHVg2%o^TH#UFRxSBqU2tX z96&Ggo7Y$3U56(y24y9Q9gb*`C_|ya0PXfSmlmNtEgHZbPMqdOeyBX^dL&9q}T)9+;7o|RG=D45cMB) zO6~cCqhipTtup|T$GZa}qhG?}a%WGWYSis>P#tJ=E%USC7f0L=Tf0p!23w7|WADQt z@~}3Gco8qK?}ZV!!{(}t4ON-+0%u+vaXW0Z&SUAIO?r{T&JDL6s_}N84N(tOfTkl} zPXwXg-;b}V23JHu!B|Ec8v zXG#89l7E)upC$QcN&Z=qf0pE*CHZGb{-(w;3E0VEkx=c_k3W6-NS^$U|MJn%wa2k4 z!6uHWGYHPN(fDU)|M0CW^;=c-M%*oRMw)4MJL>jsC$uO3Q-j}~|Ix7rKYhAhC!eC^ z_7(@{|0kRE_1i!F(f!?@zWc-L_jO0Rac`O)ntA`_UwD7bDF1cZkIV@F{}S_VSGR0F z-lSB@0Yg5qI0$irD2vw4e7#;}x2+Z?HZ(vAyldV?>-lEdj1vBgl@9*B)0}jh?G}bO zd}+?t%f)YTuNRn|L=C|){Rl%q1%8~Y!&~QL<2#23xxH17H`L<|eEcI7jEuN27e4;k zOHmrlKIRs(PE3W;+*6Jh03!VMXR0H6U4)gN+RcZLH6AVvG4Y=3h3>{H>zEs7A2W{f zk0!9}=pke>>Pq;@X2G#BsqidH>Am^Z!#3wAU#7sO3xHHy`zxGlRHM?UsNg zcNCvJH9%xAXpV*%hiSf*K)X$h*&*122yqN+i>28%fzkIsi*E6dtstCk?%@9`TcUFn zVRV&_)SGl?LvJ)3_v9<8FKq0?jUXS1viSZ+Z^VX$}leW3d5ouoMNTR z&q)tC{WVqXcBOWxyH4;|4D?LpMOXJA!xr1gryYti-rejWTZc_*Dq9QL$(uh(=`*AM%<d!gj@S>@*c5ap#|Uk*=1G|3G?a3N2$B376aaDCqV_X^2EI zbFupx9>u~XW7WO4IDavPyLjqa4hLA`4LOo`5P3gh@>ftlk6oQN=b~czb_KZO~Mx@JrFC#41T{+HPk1Ea$tN^(G zas@(Kyr$|JagwYIO)v}H4|5UCLjM8tQUsz-S25r0030MCa}p}0p3OBno&}nFgt{oM zp><^w;MYAe)B_iZFD}Sc z9a+wq0v`?1-G>!szF90lZ6-?|%2lXtJ|4L0CS^~6I2u-kMKz}eWIKagxLPv`T{Y0 zvGA6jzgoHMvan&1gelvuq1YeN{0zEMy*7*ClZHg}fS#ig2KM+`0d;f8Kd=Om4~o^-`C6X&@}=V| zumz+M?tXphvdPA5-S~=ia|SQ)`xqE~YTx^v3qNBLIkF=pN9lgR&{pex6h{|zl-rS5 zBv#!QP*1#1uIUmqCu*7#psDI2RU|zg4hoBw+$3f66m)ZNWMl%-elwea;D#R{Jl?5` zLnSWCqK|R8qZboYzxagBEQ+;e>Z~A_rR#m<>HuKo$f#tet6Dd@T=+=QOOn0tOpk{I z60J}@JRdB(MP0=C4jQD`d;1Pp%x6ME984ZPYTt^cU;f)-=rNTu(?TwaGa;6WG{$1A ziEzx2s)eUAe@CR3DJckbVp5aXk(A?RQE(I>`P;=ZxC&UN?1^x)85wLy`XQ=VG4IyB0)~AG$+94%k2_Qo%|k*7B2iqxgKeYA8|Hk}W>ZZX*9s~W0ic4a?io90 zBao))hrDm9=Nd_#8LF!ax06l@cX8>VVeF7Wb-Q>hKMEvCg%1&4f?^gRJENA`O18TL z_Ik+3So9WIf?9SI&w&@RP(tSVJJO4YLZI^?WqFq51TC-dL#Ke#_)o+-GolgP2LIC` zBdY7BmFT)qSPTQ-?m!LcU|oxfn}`yFGsRwSt& z*9!p0P?lv><9)??w;BmG-myrat_C6H$>72myadD$md6~3d5Q8#n{zVC#<#mPZ0 zzo*kg;euKUv4H^vWo+$u>gXB`mA0$Thh=f5A~r1xu#EHKXn>4DctFWwK@hE{*fyw2 zW9usRyyTN1Swu2KSv+vJQIlODI8@o9>spKCyN11OM6fk49dPD_aV=YlUK4MCtImo- zR+RMaiVsTA`r)#md@rS&!gd&=+ytAnykYzJzUJmGcYm^k7wRs$OL#eZB|(Z_18Ox- z)+U!iAr$o~NH73WFy(Qw@{~{H-Hp1jI}8C^St2R78wnp%+5ok|uPI1R0rZ z7*x6=Vhp_%nP3N#gmz=%aD10pr%(98HlAL*1U=25zIzs4jk58aHYx}ozVB8gSt<3}2v zk*eTw75+0}6(myXu%mX^g2Gi)FAIyM-yD#8rHpF|evaV14e}#N1KYqYy_IpmF^?*e zkE(!)uVA;Jssr!yfLDty+LDbfXdG=_{>eIdOUu|Jw zS+9b;D6(?07Pl1^(H2;S68tJ}%{c$o< zIJXDCs4_KH4p;n!@d!hhIAoH+VJjs(BQJBS1>PgZX4Fyk0kSH?uv{3PKRjl5akpp? zdPge2Ao$$aChJ7W2s#hUhzR_55bCh^Or!zvhQr)V{#h{uIahq?M9`M=TD(>&dMDTs z(tHYl+-P|BIFNuNGH5wl)W{=%6(f{%{*9MC4xozs97Qvc+>sTiDrWj5P~D_tz6Mc3<55X-4eb|RCU9IUGlK!DN7$hET-IgxT9lcl)EMRG@~nH85~MO9v! z&5+(%bfg~4Z4O$P_+--b!31%q;S6aqyM`_Gg2v-cttSAgif*acPK^~9ntZtpWzshz zoeaRQk~j;Q>v*4)uhpM#;!h{+p%_)ovUKzoIZHr3!MK>r77Z`8FgA6WQ2T;la{OAT z#}7LJij&uAIBBv>*5Q^wl2ZDjb#teog?HE)gs(m~H7kW8U?Z4|4b8H-*l=inR2rq> z9j7gX;J_taQs{g}n*^F z<5YkWx6g?(8w{h`k!@53v6y!E$1ZxQOJ&3AO&y|Po+W!l}cFYmRemGMnlpm1rK>vZHJ z-ri!EJdcScqo8c+9iB;(bTU}->pBYdct#;@*H@9HkQY

CsLU`mK3qj+6@(R=03g#MAQlgUyZ&%0Z#jftz4j;xr^7&HW?Tt=D z!Cv@=8c9pm3`IgKuA~m$^qMVkp);nl@Zj(n0N*UL8TLsN9$4LO^|X$dhjjuZ_D6&V zG)h)Up=2L`hWfB)Iv_a@QiVcVp{k{FES5p0Iuac?&0G--imGPqq$0w3Cpcc2nL5xlV7I4)Q!(2tI!21VktAd+d0v7L@O4yT;47_v#(cT2vQXM^g~va*%}Q8H>v$2ba^3N2ctl<}$TM zoOTK<1ZCD;Anq3n4zyk_zF_K#AI^dO0ahOYrfT?nuDFT3-gR})0Qq2|7C0yqMcoIy zuhCs>vR;&rw|aG2>NAB>O4)^2rT}?>PnoNB%@*3lxt9iZ^gWUTN(H29eJ~B8=q@Hw zZ5EuE&iw7<37M~g)SIm})yN*=H82r0E)^5^=xj``SlN1Z7JQCJXE|C?Mox!ZCzYsp zInaXBHdN#{G^5j@7-2+837EH%%&t?$=@LQRk(^c#gdBdwQLi}oibJn_gR^jy9bxg{ zpls^g(^spq^^>9PTwue=T;W;FY^Hru8K9tAZd z4atIr!De~{T`MLs8HVS>%$u4Kpp9=f%&JON7X)dE^mB?E)|Sp<{KAER=KBOZ(MnAW zBT1=`0#&7L;)PHt`qstKEQo|rq*zpUY4Jcc`znk!r_2HMFN?`wemy{3n?bf}>bi=0!Hu4uv&EZO%k;wIO@iSLyEDpyEDWQ~EcN1S7N%5OY6BY+ zJnWl~R&uuZUK5Mm&C)Q`Sf**?LCk137{yfe3u*+b*c^YM`+HpkUJ;Cv?%~p&y&_eq zS2ik44H4Qiwz{~5)L-qDQUtpE#(CqSZG09<=E1=N)YehaoW+c;K!Vk7A54R{fl$Zz z*yAhd%R-OK3}~^#%M6&~I~N*KnRjun80Q;aW?WOpN}_De8`ehNU3o}H54=UtKW|Xm z(O^m+u)ufT$W-2>V3pZDqAincjV;2sOkhD|QtDTG2{w0auCp|W9Dtd5`7gZKj!qfsp~A( z%6W@jDv!vBlfe2AD(GK7C0bHji$X(F&uJs9<&#`3Ba* z=U}R6NoC~LTVnoCir+28HmQ*R>e-^K!9`BXL2iXAsOW0Ip{MA5U~O4yz_J!B@g&A| zak1DX4osr0jA%#Jz>0);Dk`A8V^jxMIjWha&ZDZJZwk*7_qAQg&flb5(e*P2j|$&0 zK5t|a6h~mf+bQOVqVo#z<)>`4iXYipW0qSQ=(;u(^32SW3p|~F)+R>RW{$`AK#Eqmm~`|yr}?7dvKQMS8&7pby+KouogP&nD@!)2+TOWR zW?CxYs^pj0@mvvgy;jD33WAUc5cNl6CU;5x#F2}xCa_=Rm$v{-mz&p&8ryhe< z6jyCT07@TT0q+j<*PK;FmxkW1mhYVhnUgu!!aOD&6Oh|!PZcg%vS)Wd(z!M{t~O-} z0vR_yA(tEb6MXg_T>c&*d`_dap}6}IeJ?z7p)A8b53hNNnudMMTrkE)NG?W5qZ7P6{?g+wJ97;Xoi-Ss${a)Zq|yu*l<=b}BJO1#r>`@gLZUm@ z9JJ;GpqjcMifJq2r3@+C^3;z8WyB!Kjt9Mo*$CEmI&*LrX+zGZ`A3aY?}dE zWYUQ26xx7*E@R5no^hlL?(2FUE{}(34C*Ss-y+0OYK2x<7Y)H-6bSaO*=HHE2F!I; zF=CeG<1(CFD+s$inOi~dYXulZeT@Ax+~3v+yZMe$6=f;*0x!86jn_+YS$bEh3+~o@ zssPvywVhzt!?uU|A8fp|^=L0ra!L5X=uVWskQ8BpcS*0qCx^(1yL_yajKfDbQ`K@S$!}t)s94cNh?lO z$qKf@=fB+POgjsnD6PD1RYS;jI@@)6PXljCS4dM}S!iBNlJZ2{9dtV&tAufN(-$`I z#yX)A)&xSlNhzC#_@^r_k>dbiK`xTH*e8SJkd66~RmD47SS~zjd@WR3ZrZLJS-CoG zDYsqd>Rtpo5tM3ZCGjq#tXxx?tXAAc6Z4f8WHg^`){OsLkj9$=5Gm$V>~TI0 zGGAzAuYt=O>!Lk5-ls}Wi1ip?<2g!;oKpRc!x#K{j&ME86~T86c9%K>=V}FT%$V7S z<6v6ix_yX}8D-5N^YFLh1~ET?^9g)bBfg?wQi1?xK?rmU!(1yt9_x|ek&-b-xO6Pr)dHsbh@F)kVgaKKw#4Y0g>C2wJg8*eurZh^Y( z5p(bcBMt8^#W2!$j{rOkmx&RtxibpyOGWXI{SeFZ)`sZ4;dO@$Yvb}#W$YRqM8^#T zVv#)>5XJN4?~;|Id&ml;qidyN4|pf`cY21xi(%KjO-y%&`6@d>Vsib+gOro3*uZ`b zXX_M9xdeXV%;<&_VO~%v*~e_6CHH*NDPLHTl}ZW{s5LNcYE*ZDbyc|V$pTj8$Ipj0 zTmZPKz9D4>1p>F+qCV>h=C=yv6l!0XBf#{_R^C^Sead8tzL)B)TldZj7YQ z(3-8zEow%WK;U`kf65Ae(7Z8%*So7q#BPw5e^j1<%`K!R<3X~;I5t7rvP}3lO#Pkr zm0qo|>PpH+r`_$l(}%SVF_UAKglu=YS*#=czGyOB0~Fu85Uns_ma5M+r%Q?Ac}i@~ zmUU|nF@4W2qFldaA{W$_bP+ABbO0owN(p1%ReiFO(Qp<)R(n+cc*&d4f!$z#<4SNZ!`B!#-ZH$_5_+_$0(DhZ< z7kIzewr#oAo!zx+l||0*b0@87$0_G*Ga*B&2%k_lU3!bWV3m&{5;12T-cbYK6J{#aPbcuO&{ zMt`jRAsEX+#vQ4;fR)EW>GVc5RaB)Yv}i?q=T90ck|V8;~lmsH@ZSoZLd!KwVECxK=q-=KB%Fkl)Co=GyBF`9*6RzQzY#8O_O6h4GTt;7$gCNORC}pB&KR|LeMYoc{ zJ$s1#N1lVRe@mSLWI@qZ-DV$PT~^wvVyX&YbXm=`BE@!R7Iz7#l|hP>%ns$v)f6w!gc}!RrZ0n) zgni`7PoIPiM#r>KGlA;X5SIs!XQYDH<<;XsZerW#AXoJm$h*S99vAYixT!sm3xn$V zXf(Qo;QIC*4TOcwh35UH=>M6W3kYqywt@*Je3pXzi%K~LxN`@`Yq#i|0kJ(k-X4%Wir zGLyT^RwK&@>|PrRc*eZ#fvx5X`x+j{;ZFh0N=}*DM8S#Z&G*$U(Gzu#tv0@U%Np(h zW|ej-(sjE$kqWJ5?X7sRq)6ZHTEhD#k{94?(upMq@HZ;VzF7s-K2_^0`wBCa;O3%$ zD%BxF9CI-vR5&=ZIu`x+2Drs6I`jr_1B@OQ5)L!&9F_yBP%tV^GCB~Wr5VtnLYl-N zQPDd6C5OE}3cOr2s1!J)qIAjXI8p6LxXh*sS4_zVj|j0WaXc#`2Wa zrGZQcWSR+8Ps*GhBdDl)ybYGm#jO;E16vHzgsLox;c}XwVhWf+lfiDks^AW3YllOE z3$^lO*VqQj%f!kS)I@mceTkNy6#;EX8d~M%a6qaI@nPG@k^P+7K|6)W7Tv|#xutw* zaLr>T*%ZXhh1hk(kv~VV*PUVTZ*UM~v!BXQhF1GhmqK#TXkQwwnUl5SM2zfY{o#kP zRr_JkP5nx%K%uDEI+b3kjPUK?%@%xvuRk9O$~qqoQV(>04qZ7B3w>oeG*$ctG+Y`c zD|EI~%ESeh7Hr6=>!In)G|){CS>REjqtsY;?qze3azNCwI&-Y%4;crh+j$G7ej*3W zO8e4-QW*A3#e~ICIHv@>aO&KG9B;;RRp=A4ZNoM4mV%0Ao)7X=A$Lb@ZZ6gi@By7- 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�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 Date: Wed, 21 Oct 2026 07:09:47 +0000 Subject: [PATCH 3/4] test(cpu-scheduler): distinguish runtime candidates from custody --- ...l_cpu_residency_key_reuse_qualification.rs | 63 +++++++++- docs/plans/cpu-scheduler/execution-ledger.md | 41 +++++++ docs/plans/cpu-scheduler/issues.md | 2 + docs/plans/cpu-scheduler/plan.md | 2 +- .../2026-10-21-m5-m6-completion-checklist.md | 4 +- ...6-10-21-m5-native-key-reuse-protocol-v2.md | 114 ++++++++++++++++++ 6 files changed, 219 insertions(+), 7 deletions(-) create mode 100644 docs/plans/cpu-scheduler/reports/2026-10-21-m5-native-key-reuse-protocol-v2.md diff --git a/crates/pantograph-embedded-runtime/src/serial_cpu_residency_key_reuse_qualification.rs b/crates/pantograph-embedded-runtime/src/serial_cpu_residency_key_reuse_qualification.rs index 9888e3909..dbc8dc637 100644 --- a/crates/pantograph-embedded-runtime/src/serial_cpu_residency_key_reuse_qualification.rs +++ b/crates/pantograph-embedded-runtime/src/serial_cpu_residency_key_reuse_qualification.rs @@ -188,7 +188,6 @@ fn verify_arm(arm: &Value, enabled: bool, golden: &Value) -> Result<(), String> "task_id", "attempt_id", "execution_request_id", - "candidate_id", "reservation_lease_id", ] { require( @@ -200,6 +199,11 @@ fn verify_arm(arm: &Value, enabled: bool, golden: &Value) -> Result<(), String> let mut task_ids = Vec::new(); for (index, row) in drained.iter().enumerate() { let native = &row["record"]; + // Candidate identifies the selected runtime alternative, not an attempt. + require( + native["candidate_id"] == "runtime.candle", + "native candidate does not identify the Candle runtime", + )?; let (previous, current) = (&native["previous_owner"], &native["current_owner"]); verify_owner(previous)?; verify_owner(current)?; @@ -425,7 +429,7 @@ mod held { }; type Outcome = Result>; - const PROTOCOL: &str = "m5-native-two-ready-key-reuse-v1"; + const PROTOCOL: &str = "m5-native-two-ready-key-reuse-v2"; const TEXTS: [&str; 2] = ["hello world", "hello"]; const RUN_BUDGET: Duration = Duration::from_secs(60); const SHUTDOWN_BUDGET: Duration = Duration::from_secs(30); @@ -974,7 +978,7 @@ mod held { #[tokio::test] #[ignore = "one held native protocol; requires separate exact-source admission and evidence root"] - async fn fixed_two_ready_native_key_reuse_comparison() -> Outcome<()> { + async fn fixed_two_ready_native_key_reuse_comparison_v2() -> Outcome<()> { let root = PathBuf::from( std::env::var_os("PANTOGRAPH_M5_KEY_REUSE_EVIDENCE_ROOT") .ok_or("mandatory evidence root missing")?, @@ -1069,7 +1073,7 @@ mod oracle_tests { let lease = 10 + index; logs.push(json!({"sequence":index*10,"record":{"phase":"service_opportunity","workflow_run_id":run,"task_id":task,"ticket":index+1}})); let native = json!({"phase":"native_drained","workflow_id":WORKFLOW,"workflow_run_id":run,"node_id":node,"task_id":task, - "attempt_id":attempt,"execution_request_id":format!("request-{index}"),"candidate_id":format!("candidate-{index}"),"reservation_lease_id":lease, + "attempt_id":attempt,"execution_request_id":format!("request-{index}"),"candidate_id":"runtime.candle","reservation_lease_id":lease, "previous_owner":{"loaded_instance":vec![7;16],"loaded_profile":vec![8;32],"effective_settings":vec![9;32],"generation":2+index*2,"cpu_threads":1}, "current_owner":{"loaded_instance":vec![7;16],"loaded_profile":vec![8;32],"effective_settings":vec![9;32],"generation":4+index*2,"cpu_threads":1}}); logs.push(json!({"sequence":index*10+4,"record":native})); @@ -1139,6 +1143,57 @@ mod oracle_tests { assert!(verify_arm(&changed, true, &golden).is_err()); } + #[test] + fn runtime_candidate_can_repeat_but_coordinated_foreign_candidates_are_refused() { + let (arm, golden) = positive(true); + for native_index in [1, 4] { + assert_eq!( + arm["logs"][native_index]["record"]["candidate_id"], + "runtime.candle" + ); + } + assert_eq!(verify_arm(&arm, true, &golden), Ok(())); + let mut changed = arm; + for row in [1, 2] { + changed["logs"][row]["record"]["candidate_id"] = json!("runtime.foreign"); + } + assert_eq!( + verify_arm(&changed, true, &golden), + Err("native candidate does not identify the Candle runtime".into()) + ); + } + + #[test] + fn runtime_candidate_must_match_its_member_registry_ack() { + let (mut arm, golden) = positive(true); + arm["logs"][2]["record"]["candidate_id"] = json!("runtime.foreign"); + assert_eq!( + verify_arm(&arm, true, &golden), + Err("registry ACK identity differs".into()) + ); + } + + #[test] + fn repeating_an_attempt_custody_identity_still_refuses_before_member_joins() { + let (arm, golden) = positive(true); + for field in [ + "task_id", + "attempt_id", + "execution_request_id", + "reservation_lease_id", + ] { + let mut changed = arm.clone(); + let repeated = arm["logs"][1]["record"][field].clone(); + for row in [4, 5] { + changed["logs"][row]["record"][field] = repeated.clone(); + } + assert_eq!( + verify_arm(&changed, true, &golden), + Err("native identity reused".into()) + ); + } + } + #[test] fn phase_oracle_refuses_missing_unavailable_or_unobserved_spans_and_baseline_clocks() { let (arm, golden) = positive(true); diff --git a/docs/plans/cpu-scheduler/execution-ledger.md b/docs/plans/cpu-scheduler/execution-ledger.md index 4f6430048..887578787 100644 --- a/docs/plans/cpu-scheduler/execution-ledger.md +++ b/docs/plans/cpu-scheduler/execution-ledger.md @@ -2,6 +2,47 @@ +## 2026-10-21 — Separately authorized prospective v2 correction + +- Fresh user delegation explicitly authorizes a corrected oracle, independent + full source/protocol review and one bounded new baseline/enabled cohort. V1's + failed source, protocol, archive and marker remain unchanged; neither its + baseline nor verdict is reused. Parent's second disconnect report was followed + by successful pwd/Git/metadata recovery, clean source AEA, unchanged v1 archive + e6edef6c/result77a24b38 and provided actor MrScripty. Remote main ecfed47d and + PR91 source AEA match. No write or native launch was pending/uncertain. +- Independent pre-code review admitted removing only candidate_id from across- + member uniqueness, adding exact runtime.candle per-native validation, and + retaining exact within-member candidate ACK tuples and ledger selected-runtime + joins. All task/attempt/execution-request/reservation and grant-ticket custody + distinctions remain. New positive/negative oracles must decide this contract + directly, including coordinated foreign candidates and intended failure cause. +- Existing branch/worktree test/cpu-scheduler-native-key-reuse is retained and + remains the sole publication owner. Root owns canonical docs, new prospective + v2 document/supervisor, compilation, commits/publication, freeze and one run. + review_m3_merge owns only the existing held producer file; review_c2a_m6 owns + independent read-only review. No helper/default/admission/allocator/manifest/ + lockfile/CI or unrelated change is selected. V1 evidence paths are excluded + from this write set. V2 outcome report/archive may be added after the run. +- [V2](reports/2026-10-21-m5-native-key-reuse-protocol-v2.md) retains unchanged + baseline6/0 versus enabled4/4 mechanism targets, vector/genuine Ready/captured + pair/five phase/owner/Start/ACK/cleanup requirements and all execution/log bounds. + Exact cross-arm output equality is stated explicitly to match existing source. + Conservative VRAM claims are not zero reservation or physical GPU evidence. + No v2 physical execution has occurred; full source/protocol/supervisor review, + model-free checks, exact source/binary/fixtures freeze and manifest admission + still gate the single new run. Publication stays draft while unqualified. +- Correction checks passed: ten inventory-enabled model-free oracle cases + (held v2 compiled, never executed), full default embedded library617 with two + existing ignored probes, strict all-feature/all-target own-package Clippy, + warning-deny own-package Rustdoc, formatting and declared pre-push261/one + existing ignore+168. Workflow-service source/helper is byte-unchanged from + reviewed AEA and its previous1048 passes; no unrelated suite is relabeled as + new v2 evidence. Source/protocol/supervisor review approved freezing after + prerequisites. The apparent missing cgroup/affinity check review finding was + withdrawn after confirming the existing pre-marker assertions in exact bytes; + no unnecessary supervisor behavior change was introduced. + ## 2026-10-21 — Single native cohort terminal failure and finite stop - PR90 actual main ecfed47d completed all20 checks/four workflows successfully, diff --git a/docs/plans/cpu-scheduler/issues.md b/docs/plans/cpu-scheduler/issues.md index 37eebf9eb..fcef3c77a 100644 --- a/docs/plans/cpu-scheduler/issues.md +++ b/docs/plans/cpu-scheduler/issues.md @@ -55,3 +55,5 @@ are bounded implementation corrections, not default-policy or recovery expansion | CPU-39 | Actual native baseline-versus-key-reuse evidence remains missing despite controlled-worker and constructor coverage. | User authorized the [prospectively fixed protocol](reports/2026-10-21-m5-native-key-reuse-protocol.md), source/oracle review and one frozen retained execution. Do not run before prerequisites or choose criteria after outcomes. Counts/CPU outputs qualify only the disclosed two-member untrained-fixture envelope; representative model/hardware performance remains separate. | | CPU-40 | The frozen qualification oracle confuses stable runtime-alternative candidate identity with distinct member custody identity. | Actual provider correctly uses runtime.candle for both members. One retained v1 cohort failed after the baseline; enabled never started. Independent source/raw review confirms the software-oracle defect. Preserve the frozen source/criteria and [failure evidence](reports/2026-10-21-m5-native-key-reuse-result.md); no rerun or retrospective acceptance. Any correction/new cohort requires separate prospective replanning. This is not a missing external hardware/model input or a production authority-reuse finding. | + +| CPU-41 | A reviewed successor qualification must distinguish stable provider identity from unique custody without dropping candidate receipt matching or changing other acceptance after outcomes. | User separately authorized prospective v2. Require every native candidate runtime.candle plus exact within-member ACK/ledger joins, and all distinct custody IDs/tickets. New root/protocol/test identity and one new fresh baseline/enabled execution; preserve original failed v1 and all other criteria. [V2 protocol](reports/2026-10-21-m5-native-key-reuse-protocol-v2.md) owns prerequisites and stop conditions. No execution yet. | diff --git a/docs/plans/cpu-scheduler/plan.md b/docs/plans/cpu-scheduler/plan.md index bbb4f9e3d..3bb6afb9c 100644 --- a/docs/plans/cpu-scheduler/plan.md +++ b/docs/plans/cpu-scheduler/plan.md @@ -4,7 +4,7 @@ **Current phase:** PR90 merged normally as `ecfed47da7c51d03b968bed739e2abc06eb4a6de`, exact reviewed tree `540618b75e7ebbde9a5713c8ac14f05e77936f80`, preserving main `dc64b895` and source `c45d103f` as parents. Independent source approval extended to merge and all 22 source checks/four PR workflows passed. All20 actual-main post-merge checks and all four workflows passed. PR89 main `dc64b895` completed all20 post-merge checks/four workflows. CodeRabbit supplies no independent source-review credit. Prior branches, PR84 lineage and unrelated work remain retained-protected. -**Finite disposition:** The [single frozen native cohort](reports/2026-10-21-m5-native-key-reuse-result.md) failed at source fb7ba0e3 after baseline teardown: its oracle incorrectly required provider candidate IDs to differ across members. Production correctly repeats runtime.candle; enabled never ran. Preserve original source/protocol, raw evidence and failure; no rerun or retrospective acceptance. INT-89/M5-SW/M6-SW are complete within their limits; M5-CPU failed v1 and M6-CLOSE remains unaccepted under the [finite checklist](reports/2026-10-21-m5-m6-completion-checklist.md). Publish the independently reviewed producer and failure as draft evidence. Any oracle correction/new cohort requires separate prospective replanning; this is a software qualification defect, not missing hardware input. No admission/default/allocator/native-batching change or optional instrumentation slice is selected. +**Current finite task:** V1 remains failed and immutable in the [original result](reports/2026-10-21-m5-native-key-reuse-result.md). The user separately authorized correcting provider-versus-custody identity and one prospectively frozen [v2 protocol](reports/2026-10-21-m5-native-key-reuse-protocol-v2.md). Each native candidate must be runtime.candle and match its own ACK; task/attempt/request/lease/grant identities remain distinct. All other mechanism, output, ownership, phase, cleanup and resource criteria remain. Review the complete correction, pass model-free/static prerequisites, publish normally on isolated PR91, freeze exact source/binary/fixtures/environment in a new root, review the manifest, then execute both fresh arms once. M5-CPU/M6-CLOSE remain unaccepted until actual v2 evidence and exact-head integration checks decide them. No admission/default/allocator or broad performance/hardware claim changes. **Acceptance status:** M1 merged as PR73 in main `07b23d47`; the original negative cohort and the separately accepted C3 supplement remain unchanged. diff --git a/docs/plans/cpu-scheduler/reports/2026-10-21-m5-m6-completion-checklist.md b/docs/plans/cpu-scheduler/reports/2026-10-21-m5-m6-completion-checklist.md index 78b93ece1..b47f77ab8 100644 --- a/docs/plans/cpu-scheduler/reports/2026-10-21-m5-m6-completion-checklist.md +++ b/docs/plans/cpu-scheduler/reports/2026-10-21-m5-m6-completion-checklist.md @@ -29,8 +29,8 @@ advisory grouping proposal as executing a group. | INT-89 | PR89 exact head `48717570004be87735c4b693212fdadf154d8738`, tree `2d59d369f11b89e119c54afce9f0a6df86ada4bd`, independently approved for merge; normal merge preserves both parents; actual merge CI terminal. | Source had 22 successful checks/four PR workflows. Merged as `dc64b895180260ceef8619bedd1ac6d8b756a3ec`, parents `dc926783` and `48717570`, identical tree. All20 post-merge checks/four workflows passed at dc64b895; the integration receipt and merged PR89 own final run identities. Stop integration on an actual failed required check and diagnose permitted fresh evidence. | | M5-SW | Bounded C1 library API and C2a ordinary-worker key reuse preserve fresh per-member authority, fallback, bounds and cleanup. | Implemented/merged PR85/86; independently reviewed focused and controlled-worker evidence exists. Do not add another scheduler, forecast store or allocator observer to close this row. | | M6-SW | One supported owning host can explicitly choose that existing key-reuse mode and read its immutable configuration without exposing private authority. Existing constructor remains unchanged; shutdown/reconstruction is rollback. | Concrete missing production capability after PR89: `EmbeddedSerialCpuResidency::new` fixes fair+residency with reuse off and offers no choice/query. The reviewed implementation adds the explicit constructor and delegates the existing query. PR90 source c45d103f passed all22 checks/four workflows and both new hosted cases (607 library passes/two existing ignores), then merged normally as ecfed47d with identical approved tree. All20 actual-main post-merge checks and all four workflows passed at ecfed47d. This software-consumer row is complete within its existing evidence limits. | -| M5-CPU | One prospectively fixed actual CPU baseline-versus-key-reuse comparison through public sessions verifies exact outputs, member/attempt identities, separate grants/Starts and matched cleanup, with fresh owner/proof checks. Capture actual cache behavior and all five existing phase spans; report elapsed observations descriptively. | The [prospective protocol](2026-10-21-m5-native-key-reuse-protocol.md) fixes two Ready members/arm and strict baseline6encodings/0hits versus enabled4encodings/4hits before execution. Independent source and exact-manifest review preceded one frozen execution at source fb7ba0e3. **FAILED v1**: baseline completed with6encodings/0hits/0retained and acknowledged teardown, then the frozen oracle wrongly required distinct provider candidate IDs; actual runtime.candle correctly repeats. Enabled arm never started. The [retained result](2026-10-21-m5-native-key-reuse-result.md) and unchanged protocol own this outcome. No rerun or retrospective acceptance change. Correcting the software oracle and any new cohort require separate prospective replanning; representative hardware was not the cause. Existing controlled counts are not native acceptance. Stop on the fixed protocol's terminal outcome, any missing criterion or infrastructure failure; preserve all outcomes and do not tune/retry for a winner. | -| M6-CLOSE | Independent exact source/consumer/evidence review, required exact-head CI and post-merge checks support the bounded host choice and operator instructions. | **Unaccepted:** M6-SW is complete, but the required M5-CPU comparison failed v1. No enabled native evidence exists. Stop this cohort and separately re-plan any evidenced oracle repair/fresh qualification. Close only the named ordinary-member envelope after its actual gates pass; retain other qualifications below. No UI, IPC, persistence, deployment or default activation is implied. | +| M5-CPU | One prospectively fixed actual CPU baseline-versus-key-reuse comparison through public sessions verifies exact outputs, member/attempt identities, separate grants/Starts and matched cleanup, with fresh owner/proof checks. Capture actual cache behavior and all five existing phase spans; report elapsed observations descriptively. | The [prospective protocol](2026-10-21-m5-native-key-reuse-protocol.md) fixes two Ready members/arm and strict baseline6encodings/0hits versus enabled4encodings/4hits before execution. Independent source and exact-manifest review preceded one frozen execution at source fb7ba0e3. **FAILED v1**: baseline completed with6encodings/0hits/0retained and acknowledged teardown, then the frozen oracle wrongly required distinct provider candidate IDs; actual runtime.candle correctly repeats. Enabled arm never started. The [retained result](2026-10-21-m5-native-key-reuse-result.md) and unchanged protocol own this outcome. No rerun or retrospective acceptance change. The user now separately authorized the [prospective v2 correction/cohort](2026-10-21-m5-native-key-reuse-protocol-v2.md); v1 stays failed. V2 source review, exact freeze and actual execution remain pending; no old baseline is reused. Representative hardware was not the cause. Existing controlled counts are not native acceptance. Stop on the fixed protocol's terminal outcome, any missing criterion or infrastructure failure; preserve all outcomes and do not tune/retry for a winner. | +| M6-CLOSE | Independent exact source/consumer/evidence review, required exact-head CI and post-merge checks support the bounded host choice and operator instructions. | **Unaccepted:** M6-SW is complete, but the required M5-CPU comparison failed v1. No enabled native evidence exists. V1 is stopped. Separately authorized v2 qualification and exact source/evidence/integration review must decide this row; do not inherit v1 as passing. Close only the named ordinary-member envelope after its actual gates pass; retain other qualifications below. No UI, IPC, persistence, deployment or default activation is implied. | These five rows are the completion boundary. After they pass, stop implementation of this envelope and mark only these scoped claims accepted. If a row fails, diff --git a/docs/plans/cpu-scheduler/reports/2026-10-21-m5-native-key-reuse-protocol-v2.md b/docs/plans/cpu-scheduler/reports/2026-10-21-m5-native-key-reuse-protocol-v2.md new file mode 100644 index 000000000..61510e0ea --- /dev/null +++ b/docs/plans/cpu-scheduler/reports/2026-10-21-m5-native-key-reuse-protocol-v2.md @@ -0,0 +1,114 @@ +# Fixed native CPU key-reuse comparison v2: prospective contract + +Authority: continue docs/plans/cpu-scheduler/plan.md and finite checklist M5-CPU. +The user separately authorized correcting the reviewed candidate-identity oracle, +independent review, a prospective v2 freeze and one bounded new execution. +[The original v1 cohort](2026-10-21-m5-native-key-reuse-result.md) remains failed; +its source fb7ba0e3, protocol, archive, marker and outcomes are immutable. V2 uses +newly constructed baseline and enabled arms; no v1 baseline is reused. This +prospective document is not an execution receipt. + +One baseline arm then one enabled arm. Each constructs a fresh protected +EmbeddedSerialCpuResidency using the existing baseline or explicit key-reuse +constructor, authors one two-branch graph, opens one authenticated attributed +session and executes exactly one run. Both arms use the committed untrained +BERT-8 fixture and golden texts[0]="hello world", texts[1]="hello", paired with +single_vectors[0] and [1]. Exactly two forwards per arm/four overall; minimum +three history samples prevents trained ranking. No seeded timing/Ready/proofs, +downloaded model, external backend or fake native delegate is admitted. + +Each arm must observe a genuine two-Ready proposal. Enabled capture must contain +two compatible members. Mechanism oracle fixed before execution: baseline six +key encodings/zero hits, enabled four encodings/four hits, both healthy retained +entries zero after completed scope. These are the existing source-derived +n=2 controlled-worker formulas, not elapsed-time or total CPU improvement claims. +Poison/absent mode is unavailable and fails. A changed snapshot that defeats this +specific target is a retained failure, not permission to reinterpret the target. + +Both returned and retained vectors must match their corresponding frozen golden +within fixed absolute tolerance <=1e-5 and identical dimensions. Corresponding +baseline/enabled returned vectors must also be exactly equal, as required by +the unchanged comparison oracle. Require exactly +two distinct member grants/Starts/drains/registry receipt ACKs with bijective +run/task/attempt/lease joins and observed native previous/current owner identity, +settings, one-thread and generation continuity checks; no injected capability. +The reviewed correction distinguishes provider identity from member custody: +production runtime_candidate_draft constructs candidate_id as runtime.. +Each native drain must therefore have candidate_id exactly runtime.candle, and +that field must match its own registry ACK within the full unchanged identity +tuple. Ledger selected runtime candle / variant candle.cpu / device cpu checks +remain required. Candidate IDs may legitimately be shared across members; no +cross-member uniqueness is required for that provider field. Task, attempt, +execution-request, reservation-lease and grant-ticket identities must still be +distinct. Negative oracles must reject coordinated foreign candidates, mismatched +ACK candidates and each repeated custody field for the intended invariant. +Registry ACK is not relabeled +scheduler ACK. Scheduler matching remains explicitly source-assisted through the +existing adapter and successful public completion. Full raw private readiness +proof/owner lineage is not independently observed. Independent source and focused +negative tests retain the final owner/Start/cleanup fence proof. + +Enabled diagnostics must contain available positive-call observations for all +five existing grouping phases and the actual captured pair. Nested spans overlap +and must not be summed; logging/observer overhead remains uncalibrated. Baseline +grouping instrumentation is disabled and reported absent, never measured zero. +No duration threshold or winner is chosen. Counts and correctness decide only +the disclosed two-member synthetic mechanism/ownership envelope. + +Resource/termination bounds: one configured CPU thread, existing explicit +operator declarations (2 GiB RAM budget, 1 GiB VRAM budget, 32 MiB +resident and 600 MiB load envelope), eight graph nodes/six edges per arm, two short +fixed texts, four native forwards total. Declarations are not allocation +measurements. CPU dispatch may still carry conservative nonzero VRAM +reservation claims under existing policy; neither those claims nor declarations +are physical RAM/GPU allocation measurements. Record actual cgroup/affinity and fixture/binary sizes. Logger +capacity2048rows/4MiB; raw structured rows persist incrementally with sync so a +watchdog retains the observed prefix. Parse/overflow/I/O failure vetoes success. Each arm run plus +readiness resume waits at most60seconds, public shutdown at most30seconds. Session/graph closes share a five-second +absolute budget before the independent shutdown attempt. +A180second outer own-process execution watchdog is a hard global ceiling, not a guarantee +that both arms plus setup/teardown fit. At the deadline the supervisor kills only its own new process group and +attempts reaping for at most five more seconds. Watchdog failure/unknown shutdown +cannot be labeled cleanup success. Attempt public shutdown after every post-construction +body/oracle/I/O error; never start the next arm before acknowledged first teardown. + +All actual actions use public facade graph/session/run/resume/readback/artifact/ +close/shutdown methods. Private access is read-only scalar test-support evidence. +Pumas metadata uses one fresh process-local registry override, shared across arms; +each owns distinct local project/library/appdata and native RuntimeRegistry. The child has an8GiB virtual-address-space ceiling and the current observed +cgroup ceilings remain in force; this execution limit is not a footprint +measurement. No HOME, authentication, permission, sandbox or admission setting +changes. + +Before execution: PR90 actual-main post-merge checks/workflows successful; +independent source/oracle/protocol review; ordinary model-free +oracles including shared candidate identity, foreign/mismatched candidates, +repeated custody identities, missing hits/phases/outputs/cleanup and poisoned +counter negatives; exact source commit/tree and clean checkout; compile without +running the held test; copy/hash the exact producer binary; hash every fixture +and protocol; record toolchain, settings, environment allowlist, limits and input +oracle into a create-new manifest/evidence root. Review actual binary discovery +with --list (no native execution). No code/build changes or concurrent local +compilation during the held run. Execute exactly the discovered held test +serial_cpu_residency::tests::key_reuse_qualification::held::fixed_two_ready_native_key_reuse_comparison_v2. +Use protocol ID m5-native-two-ready-key-reuse-v2 and the create-new evidence root +/workspace/scratch/pantograph-recovery/native-key-reuse-cohort-v2. Require the +static metadata override at that root/metadata.db. V1 paths and marker must never +be reused, overwritten or removed. The frozen +supervisor uses an exclusive execution-started marker, no automatic retry, +immutable hashes and the same cgroup/affinity at execution. Launch only the exact ignored v2 held test once, after independent review of +the full source/protocol/supervisor change and exact frozen manifest/binary. +Publish the correction through the existing isolated PR91 branch with normal +commits; keep it draft while qualification is incomplete. Hosted CI runs on +separate runners may overlap; no local compilation may overlap the held run. + +Retain progress, raw rows, body error, teardown outcome and oracle outcome even +when failure occurs. Stop on the single terminal outcome, missing/unknown facts, +overflow, infrastructure failure or uncertain teardown. No rerun, post-outcome +input tuning, population growth, continued failed owners or retrospective +acceptance change. A genuine evidenced implementation defect may be repaired +separately only after re-planning; original cohort remains failed. + +After execution independently review raw evidence against these frozen criteria. +Do not close overall M5/M6, performance, complete memory, native batching, +representative model quality or hardware claims from this narrow comparison. From 6adf0ca7010fc2ab1e8bbe3db30673f27a3856f9 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Wed, 21 Oct 2026 07:19:28 +0000 Subject: [PATCH 4/4] docs(cpu-scheduler): retain qualified native v2 comparison --- docs/plans/cpu-scheduler/execution-ledger.md | 28 ++++ docs/plans/cpu-scheduler/issues.md | 2 + docs/plans/cpu-scheduler/plan.md | 2 +- .../2026-10-21-m5-m6-completion-checklist.md | 4 +- ...026-10-21-m5-native-key-reuse-result-v2.md | 139 +++++++++++++++ .../archive-sha256.json | 10 ++ .../original-file-sha256.json | 158 ++++++++++++++++++ .../retained-cohort.tar.gz | Bin 0 -> 131938 bytes 8 files changed, 340 insertions(+), 3 deletions(-) create mode 100644 docs/plans/cpu-scheduler/reports/2026-10-21-m5-native-key-reuse-result-v2.md create mode 100644 docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v2/archive-sha256.json create mode 100644 docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v2/original-file-sha256.json create mode 100644 docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v2/retained-cohort.tar.gz diff --git a/docs/plans/cpu-scheduler/execution-ledger.md b/docs/plans/cpu-scheduler/execution-ledger.md index 887578787..aff5045be 100644 --- a/docs/plans/cpu-scheduler/execution-ledger.md +++ b/docs/plans/cpu-scheduler/execution-ledger.md @@ -2,6 +2,34 @@ +## 2026-10-21 — Single v2 cohort passed narrow qualification + +- Exact staged six-path correction ffc8ddc4 passed independent commit/draft + review, committed/published normally as1f6af8a2/tree0368ee2e on PR91. Recovery + after capacity/environment interruption checked all preserved bytes, completed + build, process absence, provided actor and remote tips before any work retry. + No native launch was pending/uncertain; v2 root/marker were absent. +- Independent exact-manifest/binary review admitted one v2 run: manifest331e55de, + producerc41b0a57, protocol780f42c2 and supervisorcdc2efb9. All15 hashes, exact + discovery, cgroups and affinity matched. No local compilation overlapped. +- Root executed that held v2 test once at07:11:49Z; terminal exit0, reaped, no + timeout/error. Both fresh arms ran two native forwards. Baseline6enc/0hits and + enabled4enc/4hits both finished with zero healthy retained cache entries. + Public closes/shutdown acknowledged, final reservations empty/no idle owner. +- Independent raw review confirmed the frozen criteria, actual artifact bytes/ + golden/cross-arm equality, genuine Ready/captured pair, distinct per-member + custody/ACK joins, fresh loaded instances, one-thread owners4→6→8, all five + enabled final phase observations, and28 persisted rows within25965bytes. + Cold history remained unavailable; no trained ranking or timing win is claimed. +- The [successor v2 result](reports/2026-10-21-m5-native-key-reuse-result-v2.md) + and39-file durable archive retain exact originals plus preparation/admission/ + independent review. V1 source/protocol/archive/result/marker remain unchanged + and failed. No rerun or retrospective acceptance change occurred. +- M5-CPU now has independent narrow v2 evidence. M6-CLOSE awaits final source/ + report/archive review and exact-candidate CI/normal integration/post-merge + gates. Existing source/branches/worktrees and PR84 stay protected. No admission, + default, allocator, security, dependency/lockfile or CI change is selected. + ## 2026-10-21 — Separately authorized prospective v2 correction - Fresh user delegation explicitly authorizes a corrected oracle, independent diff --git a/docs/plans/cpu-scheduler/issues.md b/docs/plans/cpu-scheduler/issues.md index fcef3c77a..aed3ff2e2 100644 --- a/docs/plans/cpu-scheduler/issues.md +++ b/docs/plans/cpu-scheduler/issues.md @@ -57,3 +57,5 @@ are bounded implementation corrections, not default-policy or recovery expansion | CPU-40 | The frozen qualification oracle confuses stable runtime-alternative candidate identity with distinct member custody identity. | Actual provider correctly uses runtime.candle for both members. One retained v1 cohort failed after the baseline; enabled never started. Independent source/raw review confirms the software-oracle defect. Preserve the frozen source/criteria and [failure evidence](reports/2026-10-21-m5-native-key-reuse-result.md); no rerun or retrospective acceptance. Any correction/new cohort requires separate prospective replanning. This is not a missing external hardware/model input or a production authority-reuse finding. | | CPU-41 | A reviewed successor qualification must distinguish stable provider identity from unique custody without dropping candidate receipt matching or changing other acceptance after outcomes. | User separately authorized prospective v2. Require every native candidate runtime.candle plus exact within-member ACK/ledger joins, and all distinct custody IDs/tickets. New root/protocol/test identity and one new fresh baseline/enabled execution; preserve original failed v1 and all other criteria. [V2 protocol](reports/2026-10-21-m5-native-key-reuse-protocol-v2.md) owns prerequisites and stop conditions. No execution yet. | + +| CPU-42 | Corrected native qualification needs actual retained evidence and independent integration gates before finite closure. | One separately frozen v2 cohort passed the [narrow protocol/result](reports/2026-10-21-m5-native-key-reuse-result-v2.md), including baseline6/0 versus enabled4/4 and acknowledged cleanup. Independent raw review confirms criteria; original failed v1 remains unchanged. Final report/archive/source review and exact-candidate CI/integration remain pending. No real-model/hardware or complete-memory/admission claim is inferred. | diff --git a/docs/plans/cpu-scheduler/plan.md b/docs/plans/cpu-scheduler/plan.md index 3bb6afb9c..d8914c173 100644 --- a/docs/plans/cpu-scheduler/plan.md +++ b/docs/plans/cpu-scheduler/plan.md @@ -4,7 +4,7 @@ **Current phase:** PR90 merged normally as `ecfed47da7c51d03b968bed739e2abc06eb4a6de`, exact reviewed tree `540618b75e7ebbde9a5713c8ac14f05e77936f80`, preserving main `dc64b895` and source `c45d103f` as parents. Independent source approval extended to merge and all 22 source checks/four PR workflows passed. All20 actual-main post-merge checks and all four workflows passed. PR89 main `dc64b895` completed all20 post-merge checks/four workflows. CodeRabbit supplies no independent source-review credit. Prior branches, PR84 lineage and unrelated work remain retained-protected. -**Current finite task:** V1 remains failed and immutable in the [original result](reports/2026-10-21-m5-native-key-reuse-result.md). The user separately authorized correcting provider-versus-custody identity and one prospectively frozen [v2 protocol](reports/2026-10-21-m5-native-key-reuse-protocol-v2.md). Each native candidate must be runtime.candle and match its own ACK; task/attempt/request/lease/grant identities remain distinct. All other mechanism, output, ownership, phase, cleanup and resource criteria remain. Review the complete correction, pass model-free/static prerequisites, publish normally on isolated PR91, freeze exact source/binary/fixtures/environment in a new root, review the manifest, then execute both fresh arms once. M5-CPU/M6-CLOSE remain unaccepted until actual v2 evidence and exact-head integration checks decide them. No admission/default/allocator or broad performance/hardware claim changes. +**Current finite task:** The separately authorized [v2 cohort](reports/2026-10-21-m5-native-key-reuse-result-v2.md), frozen at source1f6af8a2/tree0368ee2e, passed the unchanged narrow mechanism/output/ownership/phase/cleanup criteria after correcting provider identity. Independent raw review confirmed actual artifact bytes, distinct custody, genuine two-Ready/captured pair, fresh owners, baseline6/0 versus enabled4/4 with empty healthy caches, and acknowledged teardown. [V1](reports/2026-10-21-m5-native-key-reuse-result.md) remains failed and unchanged. M5-CPU has scoped v2 evidence; M6-CLOSE awaits final source/report/archive review, exact-candidate CI and normal integration/post-merge checks under the [finite checklist](reports/2026-10-21-m5-m6-completion-checklist.md). Do not add another instrumentation/allocator slice or extend admission/defaults. No representative performance, complete-memory, trained-ranking or broader model/hardware qualification follows. **Acceptance status:** M1 merged as PR73 in main `07b23d47`; the original negative cohort and the separately accepted C3 supplement remain unchanged. diff --git a/docs/plans/cpu-scheduler/reports/2026-10-21-m5-m6-completion-checklist.md b/docs/plans/cpu-scheduler/reports/2026-10-21-m5-m6-completion-checklist.md index b47f77ab8..8b07c50b5 100644 --- a/docs/plans/cpu-scheduler/reports/2026-10-21-m5-m6-completion-checklist.md +++ b/docs/plans/cpu-scheduler/reports/2026-10-21-m5-m6-completion-checklist.md @@ -29,8 +29,8 @@ advisory grouping proposal as executing a group. | INT-89 | PR89 exact head `48717570004be87735c4b693212fdadf154d8738`, tree `2d59d369f11b89e119c54afce9f0a6df86ada4bd`, independently approved for merge; normal merge preserves both parents; actual merge CI terminal. | Source had 22 successful checks/four PR workflows. Merged as `dc64b895180260ceef8619bedd1ac6d8b756a3ec`, parents `dc926783` and `48717570`, identical tree. All20 post-merge checks/four workflows passed at dc64b895; the integration receipt and merged PR89 own final run identities. Stop integration on an actual failed required check and diagnose permitted fresh evidence. | | M5-SW | Bounded C1 library API and C2a ordinary-worker key reuse preserve fresh per-member authority, fallback, bounds and cleanup. | Implemented/merged PR85/86; independently reviewed focused and controlled-worker evidence exists. Do not add another scheduler, forecast store or allocator observer to close this row. | | M6-SW | One supported owning host can explicitly choose that existing key-reuse mode and read its immutable configuration without exposing private authority. Existing constructor remains unchanged; shutdown/reconstruction is rollback. | Concrete missing production capability after PR89: `EmbeddedSerialCpuResidency::new` fixes fair+residency with reuse off and offers no choice/query. The reviewed implementation adds the explicit constructor and delegates the existing query. PR90 source c45d103f passed all22 checks/four workflows and both new hosted cases (607 library passes/two existing ignores), then merged normally as ecfed47d with identical approved tree. All20 actual-main post-merge checks and all four workflows passed at ecfed47d. This software-consumer row is complete within its existing evidence limits. | -| M5-CPU | One prospectively fixed actual CPU baseline-versus-key-reuse comparison through public sessions verifies exact outputs, member/attempt identities, separate grants/Starts and matched cleanup, with fresh owner/proof checks. Capture actual cache behavior and all five existing phase spans; report elapsed observations descriptively. | The [prospective protocol](2026-10-21-m5-native-key-reuse-protocol.md) fixes two Ready members/arm and strict baseline6encodings/0hits versus enabled4encodings/4hits before execution. Independent source and exact-manifest review preceded one frozen execution at source fb7ba0e3. **FAILED v1**: baseline completed with6encodings/0hits/0retained and acknowledged teardown, then the frozen oracle wrongly required distinct provider candidate IDs; actual runtime.candle correctly repeats. Enabled arm never started. The [retained result](2026-10-21-m5-native-key-reuse-result.md) and unchanged protocol own this outcome. No rerun or retrospective acceptance change. The user now separately authorized the [prospective v2 correction/cohort](2026-10-21-m5-native-key-reuse-protocol-v2.md); v1 stays failed. V2 source review, exact freeze and actual execution remain pending; no old baseline is reused. Representative hardware was not the cause. Existing controlled counts are not native acceptance. Stop on the fixed protocol's terminal outcome, any missing criterion or infrastructure failure; preserve all outcomes and do not tune/retry for a winner. | -| M6-CLOSE | Independent exact source/consumer/evidence review, required exact-head CI and post-merge checks support the bounded host choice and operator instructions. | **Unaccepted:** M6-SW is complete, but the required M5-CPU comparison failed v1. No enabled native evidence exists. V1 is stopped. Separately authorized v2 qualification and exact source/evidence/integration review must decide this row; do not inherit v1 as passing. Close only the named ordinary-member envelope after its actual gates pass; retain other qualifications below. No UI, IPC, persistence, deployment or default activation is implied. | +| M5-CPU | One prospectively fixed actual CPU baseline-versus-key-reuse comparison through public sessions verifies exact outputs, member/attempt identities, separate grants/Starts and matched cleanup, with fresh owner/proof checks. Capture actual cache behavior and all five existing phase spans; report elapsed observations descriptively. | **Scoped v2 evidence passed**, independently reviewed against the [unchanged prospective criteria](2026-10-21-m5-native-key-reuse-protocol-v2.md): fresh baseline6encodings/0hits versus enabled4encodings/4hits, zero retained entries, four native forwards, exact outputs/readbacks, genuine two-Ready/captured pair, owners/joins/five phases and acknowledged cleanup. The [v2 result/archive](2026-10-21-m5-native-key-reuse-result-v2.md) owns exact provenance and limits. V1 remains **FAILED**, with its original [result/evidence](2026-10-21-m5-native-key-reuse-result.md) unchanged; no retrospective acceptance. V2 was separately authorized/frozen and executed once after correction of provider identity, preserving distinct member custody. No model/hardware performance claim or trained ranking follows. | +| M6-CLOSE | Independent exact source/consumer/evidence review, required exact-head CI and post-merge checks support the bounded host choice and operator instructions. | **Verifying integration:** M6-SW is complete and M5-CPU v2 passed independent raw review. Final successor report/archive/source review, required exact-candidate CI and normal integration/post-merge checks remain. Close only the named ordinary-member envelope after those gates pass. V1 stays failed; broader qualifications below are not accepted by this result. No UI, IPC, persistence, deployment or default activation is implied. | These five rows are the completion boundary. After they pass, stop implementation of this envelope and mark only these scoped claims accepted. If a row fails, diff --git a/docs/plans/cpu-scheduler/reports/2026-10-21-m5-native-key-reuse-result-v2.md b/docs/plans/cpu-scheduler/reports/2026-10-21-m5-native-key-reuse-result-v2.md new file mode 100644 index 000000000..f35f5609e --- /dev/null +++ b/docs/plans/cpu-scheduler/reports/2026-10-21-m5-native-key-reuse-result-v2.md @@ -0,0 +1,139 @@ +# Native CPU key-reuse v2: bounded comparison result + +The single separately authorized v2 cohort passed its prospectively frozen +producer oracle. Both fresh arms completed. Independent raw-evidence review +and exact-head integration checks decide scoped acceptance separately below. +[V1](2026-10-21-m5-native-key-reuse-result.md) remains failed; its original +source, protocol, marker, evidence and archive are unchanged. + +## Prospective correction and provenance + +The reviewed correction requires every native candidate to identify +`runtime.candle` and match its own member's registry ACK. It preserves distinct +task, attempt, execution-request, reservation-lease and grant-ticket custody +identities within each arm, along with all other original criteria. Stable +graph task names and registry-local lease numbers may repeat across fresh runs; +their run/attempt/owner/registry context supplies the namespace. V2 does not +reuse v1's baseline. No acceptance criterion was selected after v2 execution. + +- Frozen source `1f6af8a25440d6a4049a3e86c86785689b71cf70`, tree + `0368ee2e945976ec84930f3a779995b4cc6f473a`, published normally on PR91 before + execution, preserving v1 commits `fb7ba0e3` and `aea54f7f` as ancestors. +- Producer source SHA256 + `f088036bfed607633c3fa9e93d019444c105ba7f6d1380e080fadc9a4fc480c2`; + copied executable SHA256 + `c41b0a573cc834595118545d70c723085ee33afdcd012971b5d6fc96cb88b8f0`. +- [Prospective v2 protocol](2026-10-21-m5-native-key-reuse-protocol-v2.md) + SHA256 `780f42c20dcc69ff210a08bac8208df3b6b30492db65667960b79bbe63327c91`; + supervisor SHA256 + `cdc2efb9e0b3a715ce47b71a7433c23c5776eb0bb0a62b238257fb6dfeaae51f`. +- Frozen manifest SHA256 + `331e55de0b7854484fa45527b57e95dd792baab5f8000a34c8bff310c0a51d53`. + Independent source/protocol/supervisor and exact manifest/binary review + preceded the single run. Discovery listed exactly one v2 held test without + facade startup, metadata or native work. +- Evidence root: + `/workspace/scratch/pantograph-recovery/native-key-reuse-cohort-v2`. + The exclusive execution marker remains. V1 uses its separate retained root. +- Actual execution: 2026-10-21T07:11:49.339705Z to 07:11:55.326203Z; + supervised elapsed 5,986,517,955 ns, exit 0, reaped, no timeout or supervisor + error. The owned process is absent. No second v2 execution was performed. + +The build is a debug/test executable on accessible CPU hardware using the same +committed untrained BERT-8 fixture and fixed two texts as v1. One configured CPU +thread, 8 GiB virtual-address-space ceiling, 180-second outer watchdog and all +per-arm/log/cleanup bounds were fixed before execution. Actual cgroup/affinity, +toolchain, fixture and binary hashes are in the frozen manifest. Resource +declarations and reservation claims are not physical allocation measurements. + +## Observed mechanism, correctness and lifecycle + +| Fixed criterion | Baseline | Enabled | +| --- | --- | --- | +| Explicit key reuse | false | true | +| Genuine Ready proposal | infer_a, infer_b | infer_a, infer_b | +| Encodings / hits / healthy retained entries | 6 / 0 / 0 | 4 / 4 / 0 | +| Loads / retains / native forwards / stops | 1 / 1 / 2 / 1 | 1 / 1 / 2 / 1 | +| Session/graph closes and public shutdown | acknowledged | acknowledged | +| Final reservations / idle owner | empty / false | empty / false | +| Body / collector / event / diagnostic-I/O errors | null | null | +| Native owner generations | 4→6→8, one thread | 4→6→8, one thread | +| Structured rows / ledger events | 12 / 19 | 16 / 19 | + +Both arms used distinct fresh run identities, private runtime registries and +loaded-instance identities. Every member kept its own grant, Start, attempt, +execution request, reservation and matching registry ACK; within each arm the +two lease numbers were 3 and 5. Candidate IDs correctly repeated +`runtime.candle`. Native current/previous owner identity, settings and generation +continuity were retained. The complete vectors were returned and read back +through actual retained artifacts, met the frozen golden tolerance (maximum +absolute error 5.960464477539063e-8), and were +exactly equal between arms. Numerical evidence covers these fixed untrained +fixture outputs only. + +The enabled compatible prefix contains both members. Its forecast diagnostics +report zero eligible samples and `no_fresh_samples`; proposals report +`insufficient_fresh_samples` with sample counts [0,0]. Minimum three samples +remains in force. This is no trained-ranking or forecast-accuracy evidence. + +| Enabled grouping phase | Observed calls | Inclusive elapsed ns | +| --- | --- | --- | +| probe | 2 | 49254 | +| capture | 1 | 598840 | +| fill | 1 | 127322 | +| lookup | 4 | 48874 | +| key_calculation | 4 | 154894 | + +All five aggregates were Available. Baseline grouping observations were absent, +not measured zero. These are service-lifetime, monotonic, inclusive spans with +uncalibrated observer/logging overhead; they overlap and must not be summed. +No timing threshold, latency/throughput gain or representative speedup is +inferred from this one debug-build synthetic comparison. + +Each native drain retained conservative member RAM and VRAM claims of +536895107 bytes, alongside the existing load/resident claims. Those claims +remained charged through drain until member cleanup. Final reservations were +empty after acknowledged shutdown. No reservation arithmetic or RSS was used +as incremental-allocation evidence. Scheduler cleanup matching and final +readiness/Start fence validation remain source-assisted through the existing +adapter; raw registry ACKs are not relabeled independent scheduler ACK proof. + +## Evidence retention and finite disposition + +Original v2 execution result SHA256: +`d09e727c3b1c6cb6315cd20b83e439a3d9064d087a0828c4dd398ee65c197a2c`. +Comparison SHA256: +`0930afc7e8f7c437b08549b764098fa70efc66914051587c8a22a90795266a64`. +Preparation receipt SHA256: +`19e5268c012970dcee68e7b1a649ef412641db15e78c2ad7bbb3a6c380bf81b1`. +It records ten model-free oracle passes, default embedded 617 passes/two +existing ignores, strict own-package Clippy/Rustdoc, formatting, traceability +and declared pre-push checks. The environment/model-capacity interruption was +reconciled before committing: preserved staged bytes and completed no-run build, +no active producer or v2 root/marker, and unchanged v1 hashes. No uncertain +native launch was retried. No credentials, permissions or security settings +changed. + +Independent raw-evidence review confirmed all frozen criteria and found no +material issue. Review receipt SHA256: +`07e9636205e7bdd8bd6f0d41d0988a326b497e30b7f1b2657ce30b11daf0dc56`. +The [retained original archive](m5-native-key-reuse-v2/retained-cohort.tar.gz) +contains 39 files / 131938 bytes, SHA256 +`d7cd6334bcec3b2a72c9f4eee026b0a507d62f7388db9739e611d4c179b98828`. +Its [per-file manifest](m5-native-key-reuse-v2/original-file-sha256.json) and +[archive identity](m5-native-key-reuse-v2/archive-sha256.json) preserve both raw +arms, the actual artifact bodies, journal, prospective protocol/manifest/ +supervisor, source/preparation/review receipts and check logs. All entry bytes +were matched to originals and their hashes without executing them. Executable +binaries, databases and client credentials are excluded; full local originals +remain protected. + +M5-CPU is supported by the narrow v2 evidence and independent review. M6-CLOSE +remains verifying until final source/report/archive review, exact-candidate CI +and actual integration checks pass. Acceptance, if earned, is limited to the finite ordinary-member +bounded pure-key-reuse envelope in the [checklist](2026-10-21-m5-m6-completion-checklist.md). +Broader C1 memory-aware dispatch, complete incremental allocation, native +batching, trained-model quality, forecast usefulness, deployed performance, +GPU/remote and representative hardware qualification remain separate. No +allocator expansion, admission-policy extension or default activation is +selected to close this finite task. diff --git a/docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v2/archive-sha256.json b/docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v2/archive-sha256.json new file mode 100644 index 000000000..53e701007 --- /dev/null +++ b/docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v2/archive-sha256.json @@ -0,0 +1,10 @@ +{ + "archive": "retained-cohort.tar.gz", + "bytes": 131938, + "sha256": "d7cd6334bcec3b2a72c9f4eee026b0a507d62f7388db9739e611d4c179b98828", + "member_count": 39, + "scope": "original once-only v2 cohort, both raw arms/actual artifact bodies, journal, prospective protocol/supervisor/frozen manifest, pre-run source/review/check receipts and independent outcome review; no binary/databases/client credentials", + "source_head": "1f6af8a25440d6a4049a3e86c86785689b71cf70", + "result": "producer oracle passed; independent narrow raw evidence qualified; integration gates separate", + "v1_remains_failed_and_unchanged": true +} diff --git a/docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v2/original-file-sha256.json b/docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v2/original-file-sha256.json new file mode 100644 index 000000000..27951fb21 --- /dev/null +++ b/docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v2/original-file-sha256.json @@ -0,0 +1,158 @@ +{ + "baseline/app-data/serial-cpu-artifacts/bodies/workflow-io-132d038a0c24c49f2047a0fc13dba14bbe033b798a89a29b80c7f6ab8b1e2846.bin": { + "bytes": 160, + "sha256": "4a688224ef6edeb30360652fa2b8953fa94120f6dfd649c22fe49494021effce" + }, + "baseline/app-data/serial-cpu-artifacts/bodies/workflow-io-1454cceee6b3b7c2d5a2fe70748e50b576a61042e05b4e81ae505e12e9b36eb2.bin": { + "bytes": 11, + "sha256": "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9" + }, + "baseline/app-data/serial-cpu-artifacts/bodies/workflow-io-5b020b5022215befaab7d0a4bff27e2111f9a01d4cf1c96cbc0fc1e843ad5e8c.bin": { + "bytes": 160, + "sha256": "d3692d4df22e61e4e2c965304a642d323d05f42dc7d4f87018126b9672050494" + }, + "baseline/app-data/serial-cpu-artifacts/bodies/workflow-io-8bd75b6f5175b6e588882eea3536bf4f5ce96514f87df617d8a5b52f211ef87a.bin": { + "bytes": 5, + "sha256": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824" + }, + "baseline/app-data/serial-cpu-artifacts/manifest.json": { + "bytes": 5012, + "sha256": "1460adf95832bae5eba519bfd4d872ee299826f9c5feef43baf7a06b9f67d867" + }, + "baseline/arm.json": { + "bytes": 133695, + "sha256": "d8f7ca384c79d2cb5e44e930807f8c14015642e13713a08034e025d77f052dd4" + }, + "comparison.json": { + "bytes": 308564, + "sha256": "0930afc7e8f7c437b08549b764098fa70efc66914051587c8a22a90795266a64" + }, + "discovery.stderr": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "discovery.stdout": { + "bytes": 135, + "sha256": "28a325a30686d65652b0e594cd547ea83f5b783365ddffb9644302705246e38f" + }, + "enabled/app-data/serial-cpu-artifacts/bodies/workflow-io-1c635f453cae2bf86e347d2d25ffabed2a6d28c7fa9d414f72c4c2fcef19f697.bin": { + "bytes": 160, + "sha256": "4a688224ef6edeb30360652fa2b8953fa94120f6dfd649c22fe49494021effce" + }, + "enabled/app-data/serial-cpu-artifacts/bodies/workflow-io-594bcdd18efb41543a33e20d202244bd60ecddfa2a70d9ce719ae4e7298eb9ba.bin": { + "bytes": 11, + "sha256": "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9" + }, + "enabled/app-data/serial-cpu-artifacts/bodies/workflow-io-83bb444a586d18f85e1b2e15322a58338a05d32d7a405abe8581b1b22f9dd21a.bin": { + "bytes": 160, + "sha256": "d3692d4df22e61e4e2c965304a642d323d05f42dc7d4f87018126b9672050494" + }, + "enabled/app-data/serial-cpu-artifacts/bodies/workflow-io-a5fd5ac272efd46cc3063afb80e6e4f26fa5b3c5616d49ef47c1283247218ec2.bin": { + "bytes": 5, + "sha256": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824" + }, + "enabled/app-data/serial-cpu-artifacts/manifest.json": { + "bytes": 5012, + "sha256": "3d27462c9847cc9a8fb4cccbec00163d650141f89262e1d8aaea474f70d7b939" + }, + "enabled/arm.json": { + "bytes": 140403, + "sha256": "72de6049a835a92b64770ce44ae3c5e57655b393b317be190af98fd97de7e3ae" + }, + "execution-result.json": { + "bytes": 574, + "sha256": "d09e727c3b1c6cb6315cd20b83e439a3d9064d087a0828c4dd398ee65c197a2c" + }, + "execution-started.json": { + "bytes": 145, + "sha256": "c83a33d983acfa44b11fc4e2505ee24b1876c9aef9efd1a96a3cd1300f4e1c46" + }, + "frozen-manifest.json": { + "bytes": 6019, + "sha256": "331e55de0b7854484fa45527b57e95dd792baab5f8000a34c8bff310c0a51d53" + }, + "native-rows.jsonl": { + "bytes": 25965, + "sha256": "2647ad1d6eccfc179534fa8512fb2de639f94476421e0f9a8c998f93058402c5" + }, + "producer.stdout.log": { + "bytes": 233, + "sha256": "9d18ca56e458ece847bfb897f9af75ea680b7dee1781cd615b87348f14b4ce39" + }, + "progress.jsonl": { + "bytes": 1834, + "sha256": "f00cfa862bc16c4ea312e187fbb26fc32601787817a13d2fe87115fb1b7e189d" + }, + "prospective-protocol.md": { + "bytes": 8182, + "sha256": "780f42c20dcc69ff210a08bac8208df3b6b30492db65667960b79bbe63327c91" + }, + "protocol.json": { + "bytes": 680, + "sha256": "eb8a8cc87a558e099bd764e149b6e4d908a2d2870efc6ff244778a2679f0e94b" + }, + "supervisor.py": { + "bytes": 10783, + "sha256": "cdc2efb9e0b3a715ce47b71a7433c23c5776eb0bb0a62b238257fb6dfeaae51f" + }, + "support/logs/native-key-reuse-v2-build.log": { + "bytes": 61, + "sha256": "fbab1cf5fbfcfda9e9235ad8750457194c4bc2068ff21d557440977d0d4c8f5f" + }, + "support/logs/native-key-reuse-v2-clippy.log": { + "bytes": 2389, + "sha256": "9d73d6465f9d76fe203de90468e2a65afa3c1907666f1c5f18a47627358fe0d7" + }, + "support/logs/native-key-reuse-v2-embedded.log": { + "bytes": 71819, + "sha256": "9f4a9da63b4c8892eda86bdf7b1973c0b097e9ecabfbd1020931f7c30ceb1dbd" + }, + "support/logs/native-key-reuse-v2-fmt.log": { + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "support/logs/native-key-reuse-v2-oracles.log": { + "bytes": 2577, + "sha256": "0b05ddef1803ee95097aaadabf0bc86e795644dd103cd4f5e595c5846e73ff1c" + }, + "support/logs/native-key-reuse-v2-prepush.log": { + "bytes": 34017, + "sha256": "c0b0e2aedd80889a98b1b94d9e556e112701b948cbf6646349af59bce4b3c1f4" + }, + "support/logs/native-key-reuse-v2-rustdoc.log": { + "bytes": 400, + "sha256": "6d693761959915e9c43293c657db7ff0e782b8c44911d1e1b7edcfb51fe0a4e7" + }, + "support/logs/native-key-reuse-v2-traceability.log": { + "bytes": 277, + "sha256": "abb3b972432409dd87ae7acef30f66f90b4f85d871bcb9c3ace9de5d918aff32" + }, + "support/native-key-reuse-v2-build-artifacts.jsonl": { + "bytes": 444410, + "sha256": "861a15483a7a735d9cfb501efcd837a290f6386b88f20851db90d774a47dc5be" + }, + "support/native-key-reuse-v2-frozen-admission.json": { + "bytes": 682, + "sha256": "ab40e602b4ae5463686bf532daef59742cb918ced8c8759daf00c9828e3ea567" + }, + "support/native-key-reuse-v2-outcome-review.json": { + "bytes": 2160, + "sha256": "07e9636205e7bdd8bd6f0d41d0988a326b497e30b7f1b2657ce30b11daf0dc56" + }, + "support/native-key-reuse-v2-preparation.json": { + "bytes": 3208, + "sha256": "19e5268c012970dcee68e7b1a649ef412641db15e78c2ad7bbb3a6c380bf81b1" + }, + "support/native-key-reuse-v2-reviewed-source.patch": { + "bytes": 28672, + "sha256": "ffc8ddc4e89d8c3771dce929d265da910b9536b28b921146701bad0df7a68dc3" + }, + "support/native-key-reuse-v2-selected-artifact.json": { + "bytes": 244, + "sha256": "efa6e342c25b3555f7067e4a81ed12a6ad5a86c846433e3ce35861d286cf747e" + }, + "support/pr90-integration-final-receipt.json": { + "bytes": 14133, + "sha256": "9d7e20d34d5a1a55811134dd35058f3795f0f966a0fdf49b0c05b95b84a38daf" + } +} diff --git a/docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v2/retained-cohort.tar.gz b/docs/plans/cpu-scheduler/reports/m5-native-key-reuse-v2/retained-cohort.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..76c9549921b70221c252b1fe3d3cdba18dd60087 GIT binary patch literal 131938 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 literal 0 HcmV?d00001