From b0a4978da21ec8bbf50d786e8679495d5110dfa1 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 01:19:16 +0200 Subject: [PATCH 001/340] Delete duplicate Proposal Modeling launch binding --- .../src/bin/epiphany-mvp-coordinator.rs | 9 +- epiphany-core/src/current_work.rs | 139 ++++++++---------- epiphany-core/src/repo_model_gateway.rs | 18 --- epiphany-core/src/runtime_spine.rs | 42 +----- 4 files changed, 69 insertions(+), 139 deletions(-) diff --git a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs index 33f5f3e6..43855ce9 100644 --- a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs +++ b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs @@ -498,11 +498,10 @@ fn run_coordinator(args: &Args) -> Result { "explicit proposal Modeling request does not match current keyed work" )); } - let binding = epiphany_core::launch_current_proposal_modeling_work( + let worker_job_id = epiphany_core::launch_current_proposal_modeling_work( &runtime_store, epiphany_core::EpiphanyProposalModelingLaunchOptions { created_at: now() }, )?; - let worker_job_id = binding.job_id.clone(); startup_proposal_modeling_job_id = Some(worker_job_id.clone()); let worker_run = launch_worker_runtime_detached( &model_runtime_bin, @@ -526,7 +525,6 @@ fn run_coordinator(args: &Args) -> Result { "type": "proposalModelingLaunch", "requestId": request_id, "runtimeJobId": worker_job_id, - "launch": binding, "worker": worker_run, "authority": "proposal-modeling-only" })); @@ -1150,7 +1148,7 @@ fn run_coordinator(args: &Args) -> Result { "Self-derived proposal Modeling request changed before launch" )); } - let binding = epiphany_core::launch_current_proposal_modeling_work( + let job_id = epiphany_core::launch_current_proposal_modeling_work( &runtime_store, epiphany_core::EpiphanyProposalModelingLaunchOptions { created_at: now(), @@ -1158,8 +1156,7 @@ fn run_coordinator(args: &Args) -> Result { )?; json!({ "bindingId": epiphany_core::EPIPHANY_MODELING_ROLE_BINDING_ID, - "backendJobId": binding.job_id, - "proposalModelingLaunchBinding": binding, + "backendJobId": job_id, }) } else if role_id == "modeling" && status["currentWork"]["bodyModeling"].is_object() diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index 156ef266..34160efd 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -872,42 +872,44 @@ fn current_proposal_modeling_work( ) -> Result> { let mut requests = cache.get_all::()?; requests.sort_by(|left, right| left.request_id.cmp(&right.request_id)); - let bindings = cache.get_all::()?; + let launches = cache.get_all::()?; let receipts = cache.get_all::()?; let admission_refusals = cache.get_all::()?; 'requests: for request in requests { crate::runtime_spine::validate_repo_frontier_proposal_modeling_request(&request)?; - let mut request_bindings = bindings + let mut request_launches = launches .iter() - .filter(|binding| binding.proposal_modeling_request_id == request.request_id) - .map(|binding| { + .filter(|launch| { + launch.proposal_modeling_request_id.as_deref() == Some(request.request_id.as_str()) + }) + .map(|launch| { Ok(( - proposal_modeling_attempt_ordinal(&request.request_id, &binding.job_id)?, - binding, + proposal_modeling_attempt_ordinal(&request.request_id, &launch.job_id)?, + launch, )) }) .collect::>>()?; - request_bindings.sort_by_key(|(ordinal, _)| *ordinal); - for (expected, (ordinal, _)) in request_bindings.iter().enumerate() { + request_launches.sort_by_key(|(ordinal, _)| *ordinal); + for (expected, (ordinal, _)) in request_launches.iter().enumerate() { if *ordinal != expected { return Err(anyhow!( "proposal Modeling request has noncontiguous attempt identity" )); } } - if request_bindings.is_empty() { + if request_launches.is_empty() { return Ok(Some(EpiphanyProposalModelingWorkProjection { request, attempt: EpiphanyAgentPassAttemptProjection::unattempted(), })); } - let latest_ordinal = request_bindings + let latest_ordinal = request_launches .last() - .expect("checked nonempty bindings") + .expect("checked nonempty launches") .0; let mut admitted_ordinal = None; - for (ordinal, binding) in &request_bindings { - let result = cache.get::(&binding.job_id)?; + for (ordinal, launch) in &request_launches { + let result = cache.get::(&launch.job_id)?; if let Some(result) = result.as_ref() { if result.proposal_modeling_request_id.as_deref() != Some(request.request_id.as_str()) @@ -934,12 +936,12 @@ fn current_proposal_modeling_work( } } let job = cache - .get::(&binding.job_id)? - .ok_or_else(|| anyhow!("proposal Modeling launch binding lost its runtime job"))?; + .get::(&launch.job_id)? + .ok_or_else(|| anyhow!("proposal Modeling launch lost its runtime job"))?; let admission_refused = admission_refusals.iter().any(|refusal| { refusal.pass_family == EpiphanyAgentPassFamily::ProposalModeling && refusal.request_id == request.request_id - && refusal.job_id == binding.job_id + && refusal.job_id == launch.job_id && result.as_ref().is_some_and(|result| { refusal.result_id == result.result_id && refusal.decision_context_id == result.decision_context_id @@ -972,11 +974,11 @@ fn current_proposal_modeling_work( } continue 'requests; } - let (_, latest) = request_bindings.last().expect("checked nonempty bindings"); + let (_, latest) = request_launches.last().expect("checked nonempty launches"); let result = cache.get::(&latest.job_id)?; let job = cache .get::(&latest.job_id)? - .ok_or_else(|| anyhow!("proposal Modeling launch binding lost its runtime job"))?; + .ok_or_else(|| anyhow!("proposal Modeling launch lost its runtime job"))?; let admission_refused = result.as_ref().is_some_and(|result| { admission_refusals.iter().any(|refusal| { refusal.pass_family == EpiphanyAgentPassFamily::ProposalModeling @@ -3090,7 +3092,7 @@ pub fn launch_current_body_modeling_work( pub fn launch_current_proposal_modeling_work( store_path: impl AsRef, options: EpiphanyProposalModelingLaunchOptions, -) -> Result { +) -> Result { let store_path = store_path.as_ref(); if chrono::DateTime::parse_from_rfc3339(&options.created_at).is_err() { return Err(anyhow!("proposal Modeling launch options are invalid")); @@ -3125,9 +3127,11 @@ pub fn launch_current_proposal_modeling_work( .as_ref() .ok_or_else(|| anyhow!("proposal Modeling launch requires keyed RepoModel state"))?; let attempt_ordinal = cache - .get_all::()? + .get_all::()? .into_iter() - .filter(|binding| binding.proposal_modeling_request_id == request.request_id) + .filter(|launch| { + launch.proposal_modeling_request_id.as_deref() == Some(request.request_id.as_str()) + }) .count() + cache .get_all::()? @@ -3149,7 +3153,6 @@ pub fn launch_current_proposal_modeling_work( "proposal-modeling-{}-attempt-{attempt_ordinal}", request.request_id ); - let binding_record_id = format!("repo-frontier-proposal-modeling-launch-{job_id}"); let launch_document = crate::EpiphanyWorkerLaunchDocument::Role(crate::EpiphanyRoleWorkerLaunchDocument { thread_id: request.thread_id.clone(), @@ -3166,10 +3169,6 @@ pub fn launch_current_proposal_modeling_work( imagination_consideration_context: None, admitted_model_direction_consideration_context: None, }); - let worker_launch_document_sha256 = format!( - "{:x}", - Sha256::digest(rmp_serde::to_vec_named(&launch_document)?) - ); let authority_scope = "epiphany.role.modeling".to_string(); let output_contract_id = launch_document.output_contract_id().to_string(); let prepared = crate::prepare_runtime_spine_heartbeat_job( @@ -3198,15 +3197,9 @@ pub fn launch_current_proposal_modeling_work( created_at: options.created_at.clone(), }, )?; - let binding = crate::RepoFrontierProposalModelingLaunchBinding { - schema_version: crate::REPO_FRONTIER_PROPOSAL_MODELING_LAUNCH_BINDING_SCHEMA_VERSION.into(), - proposal_modeling_request_id: request.request_id.clone(), - job_id: job_id.clone(), - worker_launch_document_sha256, - }; let grant = crate::substrate_gate::substrate_gate_repo_access_grant_for_worker( - format!("substrate-grant-{}", binding.job_id), - binding.job_id.clone(), + format!("substrate-grant-{job_id}"), + job_id.clone(), crate::EPIPHANY_MODELING_ROLE_BINDING_ID.into(), crate::EPIPHANY_MODELING_OWNER_ROLE.into(), authority_scope, @@ -3243,13 +3236,10 @@ pub fn launch_current_proposal_modeling_work( &cache, expected, prepared, - vec![ - cache.prepare_entry(&binding_record_id, &binding)?.0, - cache.prepare_entry(&grant.receipt_id, &grant)?.0, - ], + vec![cache.prepare_entry(&grant.receipt_id, &grant)?.0], "proposal Modeling", )?; - Ok(binding) + Ok(job_id) } pub fn launch_current_frontier_verdict_modeling_work( @@ -4172,7 +4162,7 @@ mod tests { .into_iter() .map(|racer| racer.join().expect("proposal launch racer panicked")) .collect::>(); - let proposal_launch = race_results + let proposal_job_id = race_results .iter() .find_map(|result| result.as_ref().ok()) .cloned() @@ -4180,15 +4170,11 @@ mod tests { assert!(race_results.iter().all(|result| { result .as_ref() - .map(|binding| binding == &proposal_launch) + .map(|job_id| job_id == &proposal_job_id) .unwrap_or(true) })); assert_eq!( - proposal_launch.proposal_modeling_request_id, - request.request_id - ); - assert_eq!( - proposal_launch.job_id, + proposal_job_id, format!("proposal-modeling-{}-attempt-0", request.request_id) ); assert_eq!( @@ -4211,8 +4197,8 @@ mod tests { crate::complete_runtime_job( &store, crate::RuntimeSpineJobResultOptions { - result_id: format!("runtime-result-failed-{}", proposal_launch.job_id), - job_id: proposal_launch.job_id.clone(), + result_id: format!("runtime-result-failed-{proposal_job_id}"), + job_id: proposal_job_id.clone(), completed_at: "2026-08-17T00:00:09.100Z".into(), verdict: "failed".into(), summary: "provider returned no terminal decision".into(), @@ -4230,7 +4216,7 @@ mod tests { .map(|work| (work.attempt.action, work.attempt.job_id.as_deref())), Some(( EpiphanyAgentPassContinuationAction::Launch, - Some(proposal_launch.job_id.as_str()), + Some(proposal_job_id.as_str()), )) ); assert_ne!( @@ -4251,23 +4237,26 @@ mod tests { )?, "unchanged proposal failure must remain idempotent" ); - let proposal_launch = launch_current_proposal_modeling_work( + let proposal_job_id = launch_current_proposal_modeling_work( &store, EpiphanyProposalModelingLaunchOptions { created_at: "2026-08-17T00:00:09.200Z".into(), }, )?; assert_eq!( - proposal_launch.job_id, + proposal_job_id, format!("proposal-modeling-{}-attempt-1", request.request_id) ); let mut final_cache = crate::runtime_spine_cache(&store)?; final_cache.pull_all_backing_stores()?; assert_eq!( final_cache - .get_all::()? + .get_all::()? .into_iter() - .filter(|binding| binding.proposal_modeling_request_id == request.request_id) + .filter(|launch| { + launch.proposal_modeling_request_id.as_deref() + == Some(request.request_id.as_str()) + }) .count(), 2 ); @@ -4278,7 +4267,7 @@ mod tests { .all(|envelope| envelope.r#type != "epiphany.thread_state") ); let proposal_runtime_launch = final_cache - .get::(&proposal_launch.job_id)? + .get::(&proposal_job_id)? .expect("proposal runtime launch"); let proposal_document = proposal_runtime_launch.launch_document()?; let crate::EpiphanyWorkerLaunchDocument::Role(proposal_document) = proposal_document else { @@ -4302,7 +4291,7 @@ mod tests { "model", ); proposal_native.reasoning_basis_id = Some(proposal_reasoning_basis.basis_id.clone()); - proposal_native.source_worker_job_id = Some(proposal_launch.job_id.clone()); + proposal_native.source_worker_job_id = Some(proposal_job_id.clone()); let proposal_context = crate::EpiphanyDecisionContext::new( &proposal_reasoning_basis, proposal_native, @@ -4311,7 +4300,7 @@ mod tests { final_cache.put(&proposal_context.context_id, &proposal_context)?; let result_id = "proposal-result"; let mutation = crate::EpiphanyRepoModelMutationProposal::new( - format!("repo-model-mutation-proposal-{}", proposal_launch.job_id), + format!("repo-model-mutation-proposal-{proposal_job_id}"), request.request_id.clone(), result_id, vec![proposal.proposal_id.clone()], @@ -4335,7 +4324,7 @@ mod tests { let proposal_result = crate::EpiphanyRuntimeRoleWorkerResult { schema_version: crate::RUNTIME_ROLE_WORKER_RESULT_SCHEMA_VERSION.into(), result_id: result_id.into(), - job_id: proposal_launch.job_id.clone(), + job_id: proposal_job_id.clone(), role_id: "modeling".into(), verdict: "checkpoint-update-needed".into(), summary: "proposal modeled".into(), @@ -4378,14 +4367,14 @@ mod tests { let activation_token = "proposal-activation"; crate::claim_runtime_worker_process( &store, - &proposal_launch.job_id, + &proposal_job_id, &process, &format!("{:x}", Sha256::digest(activation_token.as_bytes())), "2026-08-17T00:00:10Z", )?; crate::activate_runtime_worker_process( &store, - &proposal_launch.job_id, + &proposal_job_id, &process, activation_token, "2026-08-17T00:00:11Z", @@ -4394,8 +4383,8 @@ mod tests { crate::complete_runtime_job( &store, crate::RuntimeSpineJobResultOptions { - result_id: format!("runtime-result-{}", proposal_launch.job_id), - job_id: proposal_launch.job_id.clone(), + result_id: format!("runtime-result-{proposal_job_id}"), + job_id: proposal_job_id.clone(), completed_at: "2026-08-17T00:00:12Z".into(), verdict: proposal_result.verdict.clone(), summary: proposal_result.summary.clone(), @@ -4406,7 +4395,7 @@ mod tests { }, )?; assert_eq!( - crate::runtime_worker_process_claim(&store, &proposal_launch.job_id)? + crate::runtime_worker_process_claim(&store, &proposal_job_id)? .expect("structured Modeling result terminalizes its process claim") .status, crate::WorkerProcessStatus::TerminalResult.as_str() @@ -4421,7 +4410,7 @@ mod tests { ); let proposal_outcome = accept_proposal_modeling_result( &store, - &proposal_launch.job_id, + &proposal_job_id, "2026-08-17T00:00:13Z", )?; let EpiphanyAgentPassAdmissionOutcome::Refused { @@ -4457,23 +4446,23 @@ mod tests { ); assert_eq!( refused_work.attempt.job_id.as_deref(), - Some(proposal_launch.job_id.as_str()) + Some(proposal_job_id.as_str()) ); - let proposal_launch = launch_current_proposal_modeling_work( + let proposal_job_id = launch_current_proposal_modeling_work( &store, EpiphanyProposalModelingLaunchOptions { created_at: "2026-08-17T00:00:13.100Z".into(), }, )?; assert_eq!( - proposal_launch.job_id, + proposal_job_id, format!("proposal-modeling-{}-attempt-2", request.request_id) ); let mut retry_cache = crate::runtime_spine_cache(&store)?; retry_cache.pull_all_backing_stores()?; let retry_launch = retry_cache - .get::(&proposal_launch.job_id)? + .get::(&proposal_job_id)? .expect("refused proposal retry launch"); let crate::EpiphanyWorkerLaunchDocument::Role(retry_document) = retry_launch.launch_document()? @@ -4494,12 +4483,12 @@ mod tests { "model", ); retry_native.reasoning_basis_id = Some(retry_basis.basis_id.clone()); - retry_native.source_worker_job_id = Some(proposal_launch.job_id.clone()); + retry_native.source_worker_job_id = Some(proposal_job_id.clone()); let retry_context = crate::EpiphanyDecisionContext::new(&retry_basis, retry_native, Vec::new())?; retry_cache.put(&retry_context.context_id, &retry_context)?; let valid_mutation = crate::EpiphanyRepoModelMutationProposal::new( - format!("repo-model-mutation-proposal-{}", proposal_launch.job_id), + format!("repo-model-mutation-proposal-{proposal_job_id}"), request.request_id.clone(), "proposal-result-retry", vec![proposal.proposal_id.clone()], @@ -4521,7 +4510,7 @@ mod tests { )?; let mut proposal_result = proposal_result; proposal_result.result_id = "proposal-result-retry".into(); - proposal_result.job_id = proposal_launch.job_id.clone(); + proposal_result.job_id = proposal_job_id.clone(); proposal_result.repo_model_mutation_proposal_msgpack = Some(rmp_serde::to_vec_named(&valid_mutation)?); proposal_result.decision_context_id = retry_context.context_id.clone(); @@ -4534,14 +4523,14 @@ mod tests { let retry_activation = "proposal-retry-activation"; crate::claim_runtime_worker_process( &store, - &proposal_launch.job_id, + &proposal_job_id, &retry_process, &format!("{:x}", Sha256::digest(retry_activation.as_bytes())), "2026-08-17T00:00:13.200Z", )?; crate::activate_runtime_worker_process( &store, - &proposal_launch.job_id, + &proposal_job_id, &retry_process, retry_activation, "2026-08-17T00:00:13.300Z", @@ -4550,8 +4539,8 @@ mod tests { crate::complete_runtime_job( &store, crate::RuntimeSpineJobResultOptions { - result_id: format!("runtime-result-{}", proposal_launch.job_id), - job_id: proposal_launch.job_id.clone(), + result_id: format!("runtime-result-{proposal_job_id}"), + job_id: proposal_job_id.clone(), completed_at: "2026-08-17T00:00:13.400Z".into(), verdict: proposal_result.verdict.clone(), summary: proposal_result.summary.clone(), @@ -4571,7 +4560,7 @@ mod tests { ); let proposal_outcome = accept_proposal_modeling_result( &store, - &proposal_launch.job_id, + &proposal_job_id, "2026-08-17T00:00:14Z", )?; let EpiphanyAgentPassAdmissionOutcome::Committed(proposal_commit) = proposal_outcome else { diff --git a/epiphany-core/src/repo_model_gateway.rs b/epiphany-core/src/repo_model_gateway.rs index fb511642..3783677a 100644 --- a/epiphany-core/src/repo_model_gateway.rs +++ b/epiphany-core/src/repo_model_gateway.rs @@ -71,8 +71,6 @@ pub const REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_SCHEMA_VERSION: &str = "epiphany.coordinator.repo_frontier_proposal_modeling_request.v0"; pub const REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_CONTRACT: &str = "epiphany.repo_frontier_proposal_modeling_request.v0"; -pub const REPO_FRONTIER_PROPOSAL_MODELING_LAUNCH_BINDING_SCHEMA_VERSION: &str = - "epiphany.coordinator.repo_frontier_proposal_modeling_launch_binding.v2"; pub const REPO_FRONTIER_PLANNING_LAUNCH_BINDING_SCHEMA_VERSION: &str = "epiphany.coordinator.repo_frontier_planning_launch_binding.v0"; pub const REPO_FRONTIER_PLANNING_LAUNCH_BINDING_CONTRACT: &str = @@ -194,22 +192,6 @@ pub struct RepoFrontierProposalModelingRequest { pub contract: String, } -#[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] -#[cultcache( - type = "epiphany.coordinator.repo_frontier_proposal_modeling_launch_binding", - schema = "RepoFrontierProposalModelingLaunchBinding" -)] -pub struct RepoFrontierProposalModelingLaunchBinding { - #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] - pub proposal_modeling_request_id: String, - #[cultcache(key = 2)] - pub job_id: String, - #[cultcache(key = 3)] - pub worker_launch_document_sha256: String, -} - #[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] #[cultcache( type = "epiphany.self.repo_frontier_planning_request", diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index 3b01587f..bdb7398c 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -22,7 +22,6 @@ use crate::repo_model_gateway::{ REPO_FRONTIER_PLANNING_LAUNCH_BINDING_CONTRACT, REPO_FRONTIER_PLANNING_LAUNCH_BINDING_SCHEMA_VERSION, REPO_FRONTIER_PLANNING_REQUEST_SCHEMA_VERSION, - REPO_FRONTIER_PROPOSAL_MODELING_LAUNCH_BINDING_SCHEMA_VERSION, REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_CONTRACT, REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_SCHEMA_VERSION, REPO_FRONTIER_RESEARCH_REQUEST_CONTRACT, REPO_FRONTIER_RESEARCH_REQUEST_SCHEMA_VERSION, @@ -35,7 +34,7 @@ use crate::repo_model_gateway::{ RepoFrontierPlanMindDecision, RepoFrontierPlanMindLaunchBinding, RepoFrontierPlanMindRequest, RepoFrontierPlanningFailureReview, RepoFrontierPlanningLaunchBinding, RepoFrontierPlanningLifecycle, RepoFrontierPlanningLifecycleStage, RepoFrontierPlanningRequest, - RepoFrontierProposalModelingLaunchBinding, RepoFrontierProposalModelingRequest, + RepoFrontierProposalModelingRequest, RepoFrontierResearchRequest, RepoFrontierRoute, RepoFrontierVerdictDisposition, RepoFrontierWorkProposal, RuntimeRepositoryDomainBinding, }; @@ -95,7 +94,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v16"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v17"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; pub const RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.model_execution_binding.v0"; @@ -867,7 +866,6 @@ fn runtime_spine_schema_cache() -> Result { cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; - cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; @@ -4746,13 +4744,6 @@ fn validated_proposal_modeling_worker_fulfillment( .ok_or_else(|| anyhow!("proposal Modeling fulfillment proposal is missing"))?; validate_repo_frontier_work_proposal(&proposal)?; validate_autonomous_proposal_origin_binding(cache, &proposal)?; - let binding_id = format!( - "repo-frontier-proposal-modeling-launch-{}", - result.job_id - ); - let binding = cache - .get::(&binding_id)? - .ok_or_else(|| anyhow!("proposal Modeling fulfillment lost its launch binding"))?; let launch = cache .get::(&result.job_id)? .ok_or_else(|| anyhow!("proposal Modeling fulfillment worker launch is missing"))?; @@ -4796,7 +4787,6 @@ fn validated_proposal_modeling_worker_fulfillment( }; projection == &expected }); - let launch_sha256 = format!("{:x}", Sha256::digest(&launch.launch_document_msgpack)); let mismatches = [ ( "request.payload", @@ -4816,19 +4806,6 @@ fn validated_proposal_modeling_worker_fulfillment( proposal.payload_sha256 != proposal_payload_sha256, ), ("request.runtime", request.runtime_id != identity.runtime_id), - ( - "binding.schema", - binding.schema_version != REPO_FRONTIER_PROPOSAL_MODELING_LAUNCH_BINDING_SCHEMA_VERSION, - ), - ( - "binding.request", - binding.proposal_modeling_request_id != request.request_id, - ), - ("binding.job", binding.job_id != result.job_id), - ( - "binding.hash", - binding.worker_launch_document_sha256 != launch_sha256, - ), ( "launch.schema", launch.schema_version != RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION, @@ -8648,13 +8625,6 @@ fn validate_archivable_typed_worker_launch( .ok_or_else(|| anyhow!("archived proposal Modeling launch lost its proposal"))?; validate_repo_frontier_work_proposal(&proposal)?; validate_autonomous_proposal_origin_binding(cache, &proposal)?; - let binding_id = format!( - "repo-frontier-proposal-modeling-launch-{}", - launch.job_id - ); - let binding = cache - .get::(&binding_id)? - .ok_or_else(|| anyhow!("archived proposal Modeling launch lost its binding"))?; let projection = match &document { EpiphanyWorkerLaunchDocument::Role(document) => { document.proposal_modeling_context.as_ref() @@ -8664,11 +8634,6 @@ fn validate_archivable_typed_worker_launch( .ok_or_else(|| anyhow!("archived proposal Modeling launch lost its context"))?; if request.runtime_id != identity.runtime_id || request.proposal_payload_sha256 != proposal.payload_sha256 - || binding.schema_version - != REPO_FRONTIER_PROPOSAL_MODELING_LAUNCH_BINDING_SCHEMA_VERSION - || binding.proposal_modeling_request_id != request.request_id - || binding.job_id != launch.job_id - || binding.worker_launch_document_sha256 != launch_sha256 || projection.request_id != request.request_id || projection.proposal_id != proposal.proposal_id || projection.proposal_payload_sha256 != proposal.payload_sha256 @@ -8955,7 +8920,6 @@ fn archive_runtime_worker_attempt( } } let snapshot = cache.snapshot_envelopes(); - let proposal_binding_id = format!("repo-frontier-proposal-modeling-launch-{job_id}"); let imagination_bindings = cache .get_all::()? .into_iter() @@ -9012,8 +8976,6 @@ fn archive_runtime_worker_attempt( || (entry.r#type == EpiphanyRuntimeJob::TYPE && entry.key == job_id) || (entry.r#type == EpiphanyRuntimeJobResult::TYPE && job_results.contains(&entry.key)) - || (entry.r#type == RepoFrontierProposalModelingLaunchBinding::TYPE - && entry.key == proposal_binding_id) || (entry.r#type == crate::ImaginationConsiderationLaunchBinding::TYPE && imagination_bindings.contains(&entry.key)) }) From bae9d338e4a3d1e06b4342acc5cb5ef0c5ecde0d Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 01:20:59 +0200 Subject: [PATCH 002/340] Record sole Proposal launch authority --- notes/epiphany-current-algorithmic-map.md | 18 +++++++++-------- notes/epiphany-fork-implementation-plan.md | 7 ++----- notes/fresh-workspace-handoff.md | 22 ++++++++++----------- state/ledgers.msgpack | Bin 694225 -> 694871 bytes state/map.yaml | 10 +++++----- state/scratch.md | 13 ++++++++++-- 6 files changed, 39 insertions(+), 31 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 997f0eee..3a177b32 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `6831eb69` on `codex/epiphany-shakedown-live` -Current worktree cut: Proposal-Modeling launch-binding subtraction; Ox17 remains paused +Latest committed implementation cut: `b0a4978d` on `codex/epiphany-shakedown-live` +Current worktree cut: Proposal-Modeling launch-authority deletion; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and proof chronology belong in git, `state/ledgers.msgpack`, and bounded smoke @@ -212,11 +212,13 @@ Body/domain binding, and canonical Modeling request; validation reads those facts from their owning immutable documents instead of copying them into the join record. -Proposal-Modeling launch provenance is also a narrow join. Exact `6831eb69` -reduces its persisted binding from twelve fields to schema, request ID, job ID, -and exact launch-document digest. The request owns proposal/runtime/thread; the -launch owns role/binding/document; the binding key derives from the job ID. -Fulfillment and archival read that exact key rather than scanning every binding. +Proposal-Modeling has no second launch record. Exact `b0a4978d` deletes the +persisted binding after its minimized form proved to own nothing. The immutable +worker launch carries the typed request reference, job, role, binding, and sealed +document; current-work, retry counting, fulfillment, coordinator actuation, and +archival all read that owner directly. Body Modeling, Planning, PlanMind, +Imagination consideration, and Reorientation bindings remain under the same +audit; family-specific semantic requests remain mandatory. Bifrost owns its private feedback-signing identity. Exact `94098223` deletes Epiphany's host-identity executable and the private signer, persisted identity, @@ -827,7 +829,7 @@ Accepted through the local `5b799b12` source boundary: Open before Model Atlas Gate 1 resumes: -1. let Idunn compile, test, and seal exact build-affecting source `6831eb69`; +1. let Idunn compile, test, and seal exact build-affecting source `b0a4978d`; 2. use that exact package in private fresh-store Ox17; stop after three provider failures total, and prove direct Body Modeling, typed refusal-to-retry if exercised, Hands through Verification, exact context diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 26da65b4..e9956fe7 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -224,7 +224,7 @@ Delete or demote: Keep the five-day shakedown, Ox17 deployment, and Model Atlas operational Gate 1 paused. Continue the source-subtraction and test-authority audit from exact -`6831eb69`. The current sequence has deleted the semantic-memory/workspace-coverage +`b0a4978d`. The current sequence has deleted the semantic-memory/workspace-coverage projection system, its local daemon supervisor, and the surviving generic RepoModel profile, impossible lifecycle, producerless receipt/summary, and decorative scoring axes. Modeling consumes typed Body and keyed RepoModel state @@ -302,10 +302,7 @@ Cut in this order: admission are landed. Current-work no longer reads the external Body store; status consumes the shared projection. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. -4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, exact launch binding, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. - Exact `6831eb69` later reduces that launch binding from twelve mirrored fields - to request ID, job ID, and exact launch digest under its schema; validators - fetch the deterministic job-derived key directly. +4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. 6. **Dormant claim-repair authority deleted at `20dd66c8`:** no request/binding/context schema, runtime carrier, coordinator branch, result cargo, export, or model lowering survives. The independent Eyes challenge fact remains. The same pass fixed two-snapshot Body/Proposal launch derivation and stress-proved single Proposal launch 20/20. 7. **Frontier-verdict Modeling landed at `d367e525`:** one exact Soul verdict diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index f5b09382..25a05264 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `6831eb69` -Current worktree: documentation/evidence for Proposal-Modeling launch-binding subtraction; +Latest committed implementation cut: `b0a4978d` +Current worktree: documentation/evidence for Proposal-Modeling launch-authority deletion; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `6831eb69` is the current +production symlink body and is inactive. Exact `b0a4978d` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,14 +45,14 @@ authorize the next capstone or Gate 1. ## What just landed -Exact `6831eb69` reduces the Proposal-Modeling launch binding from twelve -persisted fields to four: schema, exact request ID, job ID, and launch-document -digest. The request owns proposal/runtime/thread identity; the launch owns -role/binding/document identity; the CultCache key derives from the job ID. -Fulfillment and archival now fetch that exact document rather than scanning all -bindings. The full keyed retry/admission/archive lifecycle and old-epoch refusal -pass, OpenAI runtime checks cleanly, and 71 net source lines are gone. Runtime -writable state is v16. +Exact `b0a4978d` deletes the Proposal-Modeling launch-binding document family. +The immutable worker launch already owns the exact typed request reference, job, +role, binding, and sealed launch document. Current-work, retry counting, +fulfillment, coordinator actuation, and archival now consume it directly. The +registry entry, launch-digest mirror, deletion choreography, and operator JSON +echo are gone. The broad keyed lifecycle, coordinator target, OpenAI runtime, +and old-epoch refusal pass. The cut removes 70 net source lines and advances +runtime writable state to v17. Exact `6ccc7dd2` deletes the private 20-field Hands receipt-chain summary. The Hands commit owner now derives the deterministic Verification request directly diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index f930b7b5955c05d13b57431f349e595e8443fc58..7a88c2d5273481dc23dd5412a1988e74d9375a1a 100644 GIT binary patch delta 651 zcmYjOO=}cE6m-__^&*}ExjgU|X2LMLniv&P@DL<1Xz<{zxBJa*Yky2$_v~gw$iahu zAj{yNP(eXFdGqc`@a8}9jk_xzitc`NRaaI2_^|Qw^Tx-u)20KOG{(h9K zpZw}Qdw48lgi$Vrx3;zwC^Q%`K%5{Pkgt3YCfoBo)@}?&)J{&ak#?#(Dlcn`E+NwePH(W;weZ2<%!I6njL5b(G%T5_n> JpVmsp%|CkY=sy4e delta 73 zcmcb Date: Mon, 24 Aug 2026 01:33:28 +0200 Subject: [PATCH 003/340] Delete duplicate Planning launch bindings --- epiphany-core/src/current_work.rs | 212 +++++++++++++----------- epiphany-core/src/repo_model_gateway.rs | 72 -------- epiphany-core/src/runtime_spine.rs | 192 +++++++++++---------- 3 files changed, 216 insertions(+), 260 deletions(-) diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index 34160efd..67a41b62 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -1099,6 +1099,24 @@ pub fn current_frontier_verification_review_job_id( .and_then(|work| work.attempt.job_id)) } +pub(crate) fn frontier_planning_attempt_ordinal(request_id: &str, job_id: &str) -> Result { + let prefix = format!("frontier-planning-{request_id}-attempt-"); + job_id + .strip_prefix(&prefix) + .ok_or_else(|| anyhow!("frontier Planning job identity is not canonical"))? + .parse::() + .map_err(|_| anyhow!("frontier Planning attempt ordinal is invalid")) +} + +pub(crate) fn frontier_plan_mind_attempt_ordinal(request_id: &str, job_id: &str) -> Result { + let prefix = format!("frontier-plan-mind-{request_id}-attempt-"); + job_id + .strip_prefix(&prefix) + .ok_or_else(|| anyhow!("frontier plan Mind job identity is not canonical"))? + .parse::() + .map_err(|_| anyhow!("frontier plan Mind attempt ordinal is invalid")) +} + pub fn launch_current_frontier_planning_work( store_path: impl AsRef, created_at: &str, @@ -1123,25 +1141,39 @@ pub fn launch_current_frontier_planning_work( .get::(crate::RUNTIME_IDENTITY_KEY)? .ok_or_else(|| anyhow!("frontier Planning launch requires runtime identity"))?; let mut prior = cache - .get_all::()? + .get_all::()? .into_iter() - .filter(|binding| binding.planning_request_id == request.request_id) - .collect::>(); - prior.sort_by_key(|binding| binding.attempt_ordinal); - let attempt_ordinal = prior.len() as u64; - let superseded_failure_result_id = if let Some(latest) = prior.last() { + .filter(|launch| { + launch.frontier_planning_request_id.as_deref() == Some(request.request_id.as_str()) + }) + .map(|launch| { + Ok(( + frontier_planning_attempt_ordinal(&request.request_id, &launch.job_id)?, + launch, + )) + }) + .collect::>>()?; + prior.sort_by_key(|(ordinal, _)| *ordinal); + for (expected, (ordinal, _)) in prior.iter().enumerate() { + if *ordinal != expected { + return Err(anyhow!( + "frontier Planning request has noncontiguous attempt identity" + )); + } + } + let attempt_ordinal = prior.len(); + let retry_authority = if let Some((_, latest)) = prior.last() { let result = cache .get::(&latest.job_id)? .ok_or_else(|| anyhow!("frontier Planning retry lost its failure result"))?; - crate::runtime_spine::repo_frontier_planning_failure_review( + let review = crate::runtime_spine::repo_frontier_planning_failure_review( &cache, &request.request_id, "imagination", &result, )? - .map(|review| review.result_id) - .ok_or_else(|| anyhow!("frontier Planning retry is not reviewed"))? - .into() + .ok_or_else(|| anyhow!("frontier Planning retry is not reviewed"))?; + Some((result, review)) } else { None }; @@ -1195,40 +1227,6 @@ pub fn launch_current_frontier_planning_work( created_at: created_at.into(), }, )?; - let launch = prepared - .iter() - .find(|envelope| { - envelope.r#type == crate::EpiphanyRuntimeWorkerLaunchRequest::TYPE - && envelope.key == job_id - }) - .ok_or_else(|| anyhow!("frontier Planning launch preparation lost its worker"))?; - let worker_launch: crate::EpiphanyRuntimeWorkerLaunchRequest = - rmp_serde::from_slice(&launch.payload)?; - let binding_record_id = if attempt_ordinal == 0 { - format!("repo-frontier-planning-launch-{}", request.request_id) - } else { - format!( - "repo-frontier-planning-launch-{}-attempt-{attempt_ordinal}", - request.request_id - ) - }; - let binding = crate::RepoFrontierPlanningLaunchBinding { - schema_version: crate::REPO_FRONTIER_PLANNING_LAUNCH_BINDING_SCHEMA_VERSION.into(), - binding_record_id, - planning_request_id: request.request_id.clone(), - job_id: job_id.clone(), - binding_id: crate::EPIPHANY_IMAGINATION_ROLE_BINDING_ID.into(), - runtime_id: identity.runtime_id, - thread_id: job_id.clone(), - launched_at: created_at.into(), - worker_launch_document_sha256: format!( - "{:x}", - Sha256::digest(&worker_launch.launch_document_msgpack) - ), - contract: crate::REPO_FRONTIER_PLANNING_LAUNCH_BINDING_CONTRACT.into(), - attempt_ordinal, - superseded_failure_result_id, - }; let snapshot = cache.snapshot_envelopes(); let mut expected = vec![ cache @@ -1251,12 +1249,31 @@ pub fn launch_current_frontier_planning_work( } expected.push(envelope.clone()); } + for (_, launch) in &prior { + expected.push( + cache + .get_envelope::(&launch.job_id)? + .ok_or_else(|| anyhow!("frontier Planning retry lost its prior launch envelope"))?, + ); + } + if let Some((result, review)) = retry_authority { + expected.push( + cache + .get_envelope::(&result.job_id)? + .ok_or_else(|| anyhow!("frontier Planning retry lost its result envelope"))?, + ); + expected.push( + cache + .get_envelope::(&review.review_id)? + .ok_or_else(|| anyhow!("frontier Planning retry lost its review envelope"))?, + ); + } commit_current_work_launch( store_path, &cache, expected, prepared, - vec![cache.prepare_entry(&binding.binding_record_id, &binding)?.0], + Vec::new(), "frontier Planning", )?; Ok(job_id) @@ -1295,25 +1312,39 @@ pub fn launch_current_frontier_plan_mind_work( .get::(crate::RUNTIME_IDENTITY_KEY)? .ok_or_else(|| anyhow!("frontier plan Mind launch requires runtime identity"))?; let mut prior = cache - .get_all::()? + .get_all::()? .into_iter() - .filter(|binding| binding.mind_request_id == request.request_id) - .collect::>(); - prior.sort_by_key(|binding| binding.attempt_ordinal); - let attempt_ordinal = prior.len() as u64; - let superseded_failure_result_id = if let Some(latest) = prior.last() { + .filter(|launch| { + launch.frontier_plan_mind_request_id.as_deref() == Some(request.request_id.as_str()) + }) + .map(|launch| { + Ok(( + frontier_plan_mind_attempt_ordinal(&request.request_id, &launch.job_id)?, + launch, + )) + }) + .collect::>>()?; + prior.sort_by_key(|(ordinal, _)| *ordinal); + for (expected, (ordinal, _)) in prior.iter().enumerate() { + if *ordinal != expected { + return Err(anyhow!( + "frontier plan Mind request has noncontiguous attempt identity" + )); + } + } + let attempt_ordinal = prior.len(); + let retry_authority = if let Some((_, latest)) = prior.last() { let result = cache .get::(&latest.job_id)? .ok_or_else(|| anyhow!("frontier plan Mind retry lost its failure result"))?; - crate::runtime_spine::repo_frontier_planning_failure_review( + let review = crate::runtime_spine::repo_frontier_planning_failure_review( &cache, &planning.request_id, "mind", &result, )? - .map(|review| review.result_id) - .ok_or_else(|| anyhow!("frontier plan Mind retry is not reviewed"))? - .into() + .ok_or_else(|| anyhow!("frontier plan Mind retry is not reviewed"))?; + Some((result, review)) } else { None }; @@ -1367,40 +1398,6 @@ pub fn launch_current_frontier_plan_mind_work( created_at: created_at.into(), }, )?; - let worker_envelope = prepared - .iter() - .find(|envelope| { - envelope.r#type == crate::EpiphanyRuntimeWorkerLaunchRequest::TYPE - && envelope.key == job_id - }) - .ok_or_else(|| anyhow!("frontier plan Mind preparation lost its worker"))?; - let worker_launch: crate::EpiphanyRuntimeWorkerLaunchRequest = - rmp_serde::from_slice(&worker_envelope.payload)?; - let binding_record_id = if attempt_ordinal == 0 { - format!("repo-frontier-plan-mind-launch-{}", request.request_id) - } else { - format!( - "repo-frontier-plan-mind-launch-{}-attempt-{attempt_ordinal}", - request.request_id - ) - }; - let binding = crate::RepoFrontierPlanMindLaunchBinding { - schema_version: crate::REPO_FRONTIER_PLAN_MIND_LAUNCH_BINDING_SCHEMA_VERSION.into(), - binding_record_id, - mind_request_id: request.request_id.clone(), - job_id: job_id.clone(), - binding_id: crate::EPIPHANY_MIND_ROLE_BINDING_ID.into(), - runtime_id: identity.runtime_id, - thread_id: job_id.clone(), - launched_at: created_at.into(), - worker_launch_document_sha256: format!( - "{:x}", - Sha256::digest(&worker_launch.launch_document_msgpack) - ), - contract: crate::REPO_FRONTIER_PLAN_MIND_LAUNCH_BINDING_CONTRACT.into(), - attempt_ordinal, - superseded_failure_result_id, - }; let snapshot = cache.snapshot_envelopes(); let mut expected = Vec::new(); for (document_type, document_key) in [ @@ -1441,12 +1438,33 @@ pub fn launch_current_frontier_plan_mind_work( } expected.push(envelope.clone()); } + for (_, launch) in &prior { + expected.push( + cache + .get_envelope::(&launch.job_id)? + .ok_or_else(|| { + anyhow!("frontier plan Mind retry lost its prior launch envelope") + })?, + ); + } + if let Some((result, review)) = retry_authority { + expected.push( + cache + .get_envelope::(&result.job_id)? + .ok_or_else(|| anyhow!("frontier plan Mind retry lost its result envelope"))?, + ); + expected.push( + cache + .get_envelope::(&review.review_id)? + .ok_or_else(|| anyhow!("frontier plan Mind retry lost its review envelope"))?, + ); + } commit_current_work_launch( store_path, &cache, expected, prepared, - vec![cache.prepare_entry(&binding.binding_record_id, &binding)?.0], + Vec::new(), "frontier plan Mind", )?; Ok(job_id) @@ -4408,11 +4426,8 @@ mod tests { .action, EpiphanyAgentPassContinuationAction::Review ); - let proposal_outcome = accept_proposal_modeling_result( - &store, - &proposal_job_id, - "2026-08-17T00:00:13Z", - )?; + let proposal_outcome = + accept_proposal_modeling_result(&store, &proposal_job_id, "2026-08-17T00:00:13Z")?; let EpiphanyAgentPassAdmissionOutcome::Refused { refusal, commit: refusal_commit, @@ -4558,11 +4573,8 @@ mod tests { .action, EpiphanyAgentPassContinuationAction::Review ); - let proposal_outcome = accept_proposal_modeling_result( - &store, - &proposal_job_id, - "2026-08-17T00:00:14Z", - )?; + let proposal_outcome = + accept_proposal_modeling_result(&store, &proposal_job_id, "2026-08-17T00:00:14Z")?; let EpiphanyAgentPassAdmissionOutcome::Committed(proposal_commit) = proposal_outcome else { panic!("corrected proposal Modeling result must commit") }; diff --git a/epiphany-core/src/repo_model_gateway.rs b/epiphany-core/src/repo_model_gateway.rs index 3783677a..477c2f03 100644 --- a/epiphany-core/src/repo_model_gateway.rs +++ b/epiphany-core/src/repo_model_gateway.rs @@ -71,18 +71,10 @@ pub const REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_SCHEMA_VERSION: &str = "epiphany.coordinator.repo_frontier_proposal_modeling_request.v0"; pub const REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_CONTRACT: &str = "epiphany.repo_frontier_proposal_modeling_request.v0"; -pub const REPO_FRONTIER_PLANNING_LAUNCH_BINDING_SCHEMA_VERSION: &str = - "epiphany.coordinator.repo_frontier_planning_launch_binding.v0"; -pub const REPO_FRONTIER_PLANNING_LAUNCH_BINDING_CONTRACT: &str = - "epiphany.repo_frontier_planning_launch_binding.v0"; pub const REPO_FRONTIER_PLAN_MIND_REQUEST_SCHEMA_VERSION: &str = "epiphany.self.repo_frontier_plan_mind_request.v1"; pub const REPO_FRONTIER_PLAN_MIND_REQUEST_CONTRACT: &str = "epiphany.repo_frontier_plan_mind_request.v1"; -pub const REPO_FRONTIER_PLAN_MIND_LAUNCH_BINDING_SCHEMA_VERSION: &str = - "epiphany.coordinator.repo_frontier_plan_mind_launch_binding.v0"; -pub const REPO_FRONTIER_PLAN_MIND_LAUNCH_BINDING_CONTRACT: &str = - "epiphany.repo_frontier_plan_mind_launch_binding.v0"; #[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] #[cultcache( @@ -230,38 +222,6 @@ pub struct RepoFrontierPlanningRequest { pub claim_obligation_documents: Vec, } -#[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] -#[cultcache( - type = "epiphany.coordinator.repo_frontier_planning_launch_binding", - schema = "RepoFrontierPlanningLaunchBinding" -)] -pub struct RepoFrontierPlanningLaunchBinding { - #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] - pub binding_record_id: String, - #[cultcache(key = 2)] - pub planning_request_id: String, - #[cultcache(key = 3)] - pub job_id: String, - #[cultcache(key = 4)] - pub binding_id: String, - #[cultcache(key = 5)] - pub runtime_id: String, - #[cultcache(key = 6)] - pub thread_id: String, - #[cultcache(key = 7)] - pub launched_at: String, - #[cultcache(key = 8)] - pub worker_launch_document_sha256: String, - #[cultcache(key = 9)] - pub contract: String, - #[cultcache(key = 10, default)] - pub attempt_ordinal: u64, - #[cultcache(key = 11, default)] - pub superseded_failure_result_id: Option, -} - #[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] #[cultcache( type = "epiphany.self.repo_frontier_research_request", @@ -405,38 +365,6 @@ pub struct RepoFrontierPlanMindRequest { pub contract: String, } -#[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] -#[cultcache( - type = "epiphany.coordinator.repo_frontier_plan_mind_launch_binding", - schema = "RepoFrontierPlanMindLaunchBinding" -)] -pub struct RepoFrontierPlanMindLaunchBinding { - #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] - pub binding_record_id: String, - #[cultcache(key = 2)] - pub mind_request_id: String, - #[cultcache(key = 3)] - pub job_id: String, - #[cultcache(key = 4)] - pub binding_id: String, - #[cultcache(key = 5)] - pub runtime_id: String, - #[cultcache(key = 6)] - pub thread_id: String, - #[cultcache(key = 7)] - pub launched_at: String, - #[cultcache(key = 8)] - pub worker_launch_document_sha256: String, - #[cultcache(key = 9)] - pub contract: String, - #[cultcache(key = 10, default)] - pub attempt_ordinal: u64, - #[cultcache(key = 11, default)] - pub superseded_failure_result_id: Option, -} - #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct RepoFrontierPlanMindDecision { pub mind_request_id: String, diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index bdb7398c..182b6d12 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -14,13 +14,9 @@ use crate::repo_model_gateway::{ REPO_FRONTIER_HANDS_AUTHORITY_CONTRACT, REPO_FRONTIER_HANDS_AUTHORITY_SCHEMA_VERSION, REPO_FRONTIER_MODELING_REQUEST_CONTRACT, REPO_FRONTIER_MODELING_REQUEST_SCHEMA_VERSION, REPO_FRONTIER_PLAN_CANDIDATE_SCHEMA_VERSION, REPO_FRONTIER_PLAN_DECISION_CONTRACT, - REPO_FRONTIER_PLAN_DECISION_RECEIPT_SCHEMA_VERSION, - REPO_FRONTIER_PLAN_MIND_LAUNCH_BINDING_CONTRACT, - REPO_FRONTIER_PLAN_MIND_LAUNCH_BINDING_SCHEMA_VERSION, - REPO_FRONTIER_PLAN_MIND_REQUEST_CONTRACT, REPO_FRONTIER_PLAN_MIND_REQUEST_SCHEMA_VERSION, - REPO_FRONTIER_PLANNING_CONTRACT, REPO_FRONTIER_PLANNING_FAILURE_REVIEW_SCHEMA_VERSION, - REPO_FRONTIER_PLANNING_LAUNCH_BINDING_CONTRACT, - REPO_FRONTIER_PLANNING_LAUNCH_BINDING_SCHEMA_VERSION, + REPO_FRONTIER_PLAN_DECISION_RECEIPT_SCHEMA_VERSION, REPO_FRONTIER_PLAN_MIND_REQUEST_CONTRACT, + REPO_FRONTIER_PLAN_MIND_REQUEST_SCHEMA_VERSION, REPO_FRONTIER_PLANNING_CONTRACT, + REPO_FRONTIER_PLANNING_FAILURE_REVIEW_SCHEMA_VERSION, REPO_FRONTIER_PLANNING_REQUEST_SCHEMA_VERSION, REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_CONTRACT, REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_SCHEMA_VERSION, @@ -31,12 +27,10 @@ use crate::repo_model_gateway::{ RUNTIME_REPOSITORY_DOMAIN_BINDING_SCHEMA_VERSION, RepoFrontierAutonomousProposalBinding, RepoFrontierHandsAuthority, RepoFrontierModelingRequest, RepoFrontierNextOrgan, RepoFrontierPlanCandidate, RepoFrontierPlanDecision, RepoFrontierPlanDecisionReceipt, - RepoFrontierPlanMindDecision, RepoFrontierPlanMindLaunchBinding, RepoFrontierPlanMindRequest, - RepoFrontierPlanningFailureReview, RepoFrontierPlanningLaunchBinding, + RepoFrontierPlanMindDecision, RepoFrontierPlanMindRequest, RepoFrontierPlanningFailureReview, RepoFrontierPlanningLifecycle, RepoFrontierPlanningLifecycleStage, RepoFrontierPlanningRequest, - RepoFrontierProposalModelingRequest, - RepoFrontierResearchRequest, RepoFrontierRoute, RepoFrontierVerdictDisposition, - RepoFrontierWorkProposal, RuntimeRepositoryDomainBinding, + RepoFrontierProposalModelingRequest, RepoFrontierResearchRequest, RepoFrontierRoute, + RepoFrontierVerdictDisposition, RepoFrontierWorkProposal, RuntimeRepositoryDomainBinding, }; use crate::runtime_store_backend::{ RuntimeSpineBackingStore as SingleFileMessagePackBackingStore, runtime_spine_backing_store, @@ -94,7 +88,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v17"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v18"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; pub const RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.model_execution_binding.v0"; @@ -868,7 +862,6 @@ fn runtime_spine_schema_cache() -> Result { cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; - cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; @@ -882,7 +875,6 @@ fn runtime_spine_schema_cache() -> Result { cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; - cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; @@ -2497,6 +2489,12 @@ pub fn prepare_runtime_spine_heartbeat_job( options.frontier_planning_request_id.as_deref(), &options.launch_document, )?; + validate_frontier_plan_mind_launch_carrier( + &options.role, + &options.binding_id, + options.frontier_plan_mind_request_id.as_deref(), + &options.launch_document, + )?; validate_frontier_research_launch_carrier( &options.role, &options.binding_id, @@ -2846,6 +2844,40 @@ fn validate_frontier_planning_launch_carrier( Ok(()) } +fn validate_frontier_plan_mind_launch_carrier( + role: &str, + binding_id: &str, + request_id: Option<&str>, + launch_document: &EpiphanyWorkerLaunchDocument, +) -> Result<()> { + let projection = match launch_document { + EpiphanyWorkerLaunchDocument::Role(document) => { + document.frontier_plan_mind_context.as_ref() + } + EpiphanyWorkerLaunchDocument::Reorient(_) => None, + }; + let Some(request_id) = request_id else { + if projection.is_some() { + return Err(anyhow!( + "frontier plan Mind context requires its typed request id" + )); + } + return Ok(()); + }; + validate_non_empty(request_id, "frontier plan Mind request id")?; + if role != EPIPHANY_MIND_OWNER_ROLE || binding_id != EPIPHANY_MIND_ROLE_BINDING_ID { + return Err(anyhow!( + "frontier plan Mind request may only be transported by the Mind role launch" + )); + } + let projection = projection + .ok_or_else(|| anyhow!("frontier plan Mind request requires its typed context"))?; + if projection.request.request_id != request_id { + return Err(anyhow!("frontier plan Mind context/request mismatch")); + } + Ok(()) +} + fn validate_imagination_consideration_launch_carrier( role: &str, binding_id: &str, @@ -4265,19 +4297,6 @@ pub fn put_runtime_role_worker_result( .frontier_plan_candidate()? .ok_or_else(|| anyhow!("frontier planning candidate disappeared"))?; validate_repo_frontier_plan_candidate_against_request(&cache, &candidate, &request)?; - let bindings = cache - .get_all::()? - .into_iter() - .filter(|binding| { - binding.planning_request_id == request.request_id && binding.job_id == result.job_id - }) - .collect::>(); - if bindings.len() != 1 { - return Err(anyhow!( - "frontier planning result requires exactly one coordinator launch binding" - )); - } - let binding = &bindings[0]; let worker_launch = cache .get::(&result.job_id)? .ok_or_else(|| anyhow!("frontier planning result requires its worker launch"))?; @@ -4290,36 +4309,22 @@ pub fn put_runtime_role_worker_result( }; let expected_projection = crate::RepoFrontierPlanningContextProjection::from_request(&request); - let launch_hash = format!( - "{:x}", - Sha256::digest(&worker_launch.launch_document_msgpack) - ); - let expected_binding_record_id = if binding.attempt_ordinal == 0 { - format!("repo-frontier-planning-launch-{}", request.request_id) - } else { - format!( - "repo-frontier-planning-launch-{}-attempt-{}", - request.request_id, binding.attempt_ordinal - ) - }; - if binding.schema_version != REPO_FRONTIER_PLANNING_LAUNCH_BINDING_SCHEMA_VERSION - || binding.contract != REPO_FRONTIER_PLANNING_LAUNCH_BINDING_CONTRACT - || binding.binding_record_id != expected_binding_record_id - || binding.job_id != result.job_id - || binding.binding_id != EPIPHANY_IMAGINATION_ROLE_BINDING_ID - || binding.runtime_id != request.runtime_id - || binding.thread_id != launch_document.thread_id() - || binding.worker_launch_document_sha256 != launch_hash + crate::current_work::frontier_planning_attempt_ordinal( + &request.request_id, + &result.job_id, + )?; + if worker_launch.schema_version != RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION || worker_launch.job_id != result.job_id || worker_launch.role != EPIPHANY_IMAGINATION_OWNER_ROLE || worker_launch.binding_id != EPIPHANY_IMAGINATION_ROLE_BINDING_ID || worker_launch.frontier_planning_request_id.as_deref() != Some(request.request_id.as_str()) || worker_launch.proposal_modeling_request_id.is_some() + || launch_document.thread_id() != result.job_id || projection != Some(&expected_projection) { return Err(anyhow!( - "frontier planning result does not exactly bind request, launch, runtime, launch provenance, and candidate" + "frontier planning result does not exactly bind request, immutable launch, and candidate" )); } } @@ -4529,19 +4534,6 @@ pub fn put_runtime_role_worker_result( "Mind decision substituted request echo or immutable candidate identity" )); } - let bindings = cache - .get_all::()? - .into_iter() - .filter(|binding| { - binding.mind_request_id == request.request_id && binding.job_id == result.job_id - }) - .collect::>(); - if bindings.len() != 1 { - return Err(anyhow!( - "Mind result requires exactly one coordinator launch binding" - )); - } - let binding = &bindings[0]; let launch = cache .get::(&result.job_id)? .ok_or_else(|| anyhow!("Mind result launch disappeared"))?; @@ -4551,21 +4543,20 @@ pub fn put_runtime_role_worker_result( _ => None, }; let expected = RepoFrontierPlanMindContextProjection::new(&request, &planning, &candidate); - let hash = format!("{:x}", Sha256::digest(&launch.launch_document_msgpack)); - if binding.schema_version != REPO_FRONTIER_PLAN_MIND_LAUNCH_BINDING_SCHEMA_VERSION - || binding.contract != REPO_FRONTIER_PLAN_MIND_LAUNCH_BINDING_CONTRACT - || binding.job_id != result.job_id - || binding.binding_id != EPIPHANY_MIND_ROLE_BINDING_ID - || binding.runtime_id != request.runtime_id - || binding.thread_id != document.thread_id() - || binding.worker_launch_document_sha256 != hash + crate::current_work::frontier_plan_mind_attempt_ordinal( + &request.request_id, + &result.job_id, + )?; + if launch.schema_version != RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION + || launch.job_id != result.job_id || launch.role != EPIPHANY_MIND_OWNER_ROLE || launch.binding_id != EPIPHANY_MIND_ROLE_BINDING_ID || launch.frontier_plan_mind_request_id.as_deref() != Some(request.request_id.as_str()) + || document.thread_id() != result.job_id || projection != Some(&expected) { return Err(anyhow!( - "Mind result does not exactly bind request, launch, runtime, launch provenance, and candidate" + "Mind result does not exactly bind request, immutable launch, and candidate" )); } } @@ -6425,7 +6416,9 @@ fn frontier_item_is_actionable_for_organ( /// admitted exactly once and contains an item the route committer can hand to /// Hands. Status projection must use this instead of assuming that a clear /// CRRC lane implies implementation authority. -pub(crate) fn runtime_has_actionable_hands_frontier(runtime_store: impl AsRef) -> Result { +pub(crate) fn runtime_has_actionable_hands_frontier( + runtime_store: impl AsRef, +) -> Result { runtime_has_actionable_frontier_for_organ(runtime_store, "Hands") } @@ -7271,20 +7264,31 @@ pub fn runtime_repo_frontier_planning_lifecycle( decision_id: None, }; let mut imagination_launches = cache - .get_all::()? + .get_all::()? .into_iter() - .filter(|binding| binding.planning_request_id == request.request_id) - .collect::>(); - imagination_launches.sort_by_key(|binding| binding.attempt_ordinal); - for (expected, binding) in imagination_launches.iter().enumerate() { - if binding.attempt_ordinal != expected as u64 { + .filter(|launch| { + launch.frontier_planning_request_id.as_deref() == Some(request.request_id.as_str()) + }) + .map(|launch| { + Ok(( + crate::current_work::frontier_planning_attempt_ordinal( + &request.request_id, + &launch.job_id, + )?, + launch, + )) + }) + .collect::>>()?; + imagination_launches.sort_by_key(|(ordinal, _)| *ordinal); + for (expected, (ordinal, _)) in imagination_launches.iter().enumerate() { + if *ordinal != expected { return Err(anyhow!( "Self found noncontiguous frontier planning attempt identity" )); } } - if let Some(binding) = imagination_launches.last() { - lifecycle.imagination_job_id = Some(binding.job_id.clone()); + if let Some((_, launch)) = imagination_launches.last() { + lifecycle.imagination_job_id = Some(launch.job_id.clone()); } let imagination_results = cache .get_all::()? @@ -7351,18 +7355,30 @@ pub fn runtime_repo_frontier_planning_lifecycle( lifecycle.mind_request_id = Some(mind_request.request_id.clone()); lifecycle.stage = RepoFrontierPlanningLifecycleStage::MindLaunchReady; let mut mind_launches = cache - .get_all::()? + .get_all::()? .into_iter() - .filter(|binding| binding.mind_request_id == mind_request.request_id) - .collect::>(); - mind_launches.sort_by_key(|binding| binding.attempt_ordinal); - for (expected, binding) in mind_launches.iter().enumerate() { - if binding.attempt_ordinal != expected as u64 { + .filter(|launch| { + launch.frontier_plan_mind_request_id.as_deref() + == Some(mind_request.request_id.as_str()) + }) + .map(|launch| { + Ok(( + crate::current_work::frontier_plan_mind_attempt_ordinal( + &mind_request.request_id, + &launch.job_id, + )?, + launch, + )) + }) + .collect::>>()?; + mind_launches.sort_by_key(|(ordinal, _)| *ordinal); + for (expected, (ordinal, _)) in mind_launches.iter().enumerate() { + if *ordinal != expected { return Err(anyhow!("Self found noncontiguous Mind attempt identity")); } } - if let Some(binding) = mind_launches.last() { - lifecycle.mind_job_id = Some(binding.job_id.clone()); + if let Some((_, launch)) = mind_launches.last() { + lifecycle.mind_job_id = Some(launch.job_id.clone()); } let mind_results = cache .get_all::()? From 80afb67cd5fa1d698d51a59315364763d6874974 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 01:35:57 +0200 Subject: [PATCH 004/340] docs: Record sole Planning launch authority --- notes/epiphany-current-algorithmic-map.md | 18 ++++++++++----- notes/epiphany-fork-implementation-plan.md | 5 ++++- notes/fresh-workspace-handoff.md | 25 ++++++++++++++++++--- state/ledgers.msgpack | Bin 694871 -> 695476 bytes state/map.yaml | 9 ++++---- 5 files changed, 44 insertions(+), 13 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 3a177b32..cb820917 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `b0a4978d` on `codex/epiphany-shakedown-live` -Current worktree cut: Proposal-Modeling launch-authority deletion; Ox17 remains paused +Latest committed implementation cut: `b55e96ea` on `codex/epiphany-shakedown-live` +Current worktree cut: Planning/PlanMind launch-authority deletion; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and proof chronology belong in git, `state/ledgers.msgpack`, and bounded smoke @@ -216,9 +216,17 @@ Proposal-Modeling has no second launch record. Exact `b0a4978d` deletes the persisted binding after its minimized form proved to own nothing. The immutable worker launch carries the typed request reference, job, role, binding, and sealed document; current-work, retry counting, fulfillment, coordinator actuation, and -archival all read that owner directly. Body Modeling, Planning, PlanMind, -Imagination consideration, and Reorientation bindings remain under the same -audit; family-specific semantic requests remain mandatory. +archival all read that owner directly. Family-specific semantic requests remain +mandatory. + +Planning and PlanMind likewise have no second launch record. Exact `b55e96ea` +deletes both persisted binding families and derives contiguous attempts and the +current job from the family references on immutable worker launches. A retry is +authorized only by the exact typed failed result and its failure review; the +launch transaction now strongly reads those documents and every prior launch. +The semantic Planning and PlanMind requests, sealed projections, result +validation, and two-stage adoption boundary remain family-owned. Body Modeling, +Imagination consideration, and Reorientation bindings remain under audit. Bifrost owns its private feedback-signing identity. Exact `94098223` deletes Epiphany's host-identity executable and the private signer, persisted identity, diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index e9956fe7..24fae5b2 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -340,7 +340,10 @@ Cut in this order: planning conflicts without turning unrelated graph writes into a global head. Thread provenance, generic coordinator validators/constructors, aggregate role lanes, and accepted-at/latest-result behavior no longer own - this family. + this family. Exact `b55e96ea` deletes both later duplicate launch-binding + document families. Immutable worker launches now own attempt identity and + current jobs; exact failed results plus typed failure reviews own retry + ancestry and are strong reads of the retry launch transaction. 11. **Reorientation landed at `d5df53ae`:** one keyed request seals the exact continuity projection and source document versions; deterministic attempts bind an exact reasoning basis and terminal decision context. The family diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 25a05264..4cd2ccab 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `b0a4978d` -Current worktree: documentation/evidence for Proposal-Modeling launch-authority deletion; +Latest committed implementation cut: `b55e96ea` +Current worktree: documentation/evidence for Planning/PlanMind launch-authority deletion; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `b0a4978d` is the current +production symlink body and is inactive. Exact `b55e96ea` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,25 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `b55e96ea` deletes the persisted Planning and PlanMind launch-binding +families. Their twenty-four fields duplicated the immutable worker launch, +typed requests, runtime job, canonical attempt identity, and typed failure +review. Self now derives contiguous attempts and current jobs from the family +references on worker launches. Retry launch CAS strongly reads every prior +launch plus the exact failed result and review, so stale retry authority cannot +be summarized and silently reused. The complete keyed Planning-to-PlanMind +lifecycle, v17 refusal, release-owned coordinator, and model-runtime checks +pass. The cut removes 44 net source lines and advances runtime writable state +to v18. + +Continue with the three remaining persisted launch-binding families: Body +Modeling, Imagination consideration, and Reorientation. Preserve their typed +semantic requests, projections, result validation, and refusal/retry +invariants; delete any sibling launch record whose state is derivable from the +immutable worker launch and owning receipts. Model Atlas remains protected for +the first real inter-swarm collaboration trial; component tests are not that +trial. + Exact `b0a4978d` deletes the Proposal-Modeling launch-binding document family. The immutable worker launch already owns the exact typed request reference, job, role, binding, and sealed launch document. Current-work, retry counting, diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 7a88c2d5273481dc23dd5412a1988e74d9375a1a..ea9c21b34dc32250a98427246af7a0a05c2e04d6 100644 GIT binary patch delta 611 zcmZWmO=}cE5Ovm%Bv+2#M&)fM^8q*4tCF+ip+y*wsCoIV~iI zoP#clc=0C)210J)!K+7qL;gi-CU^)Q9@X{1d#|eho-Ci7Eq|YnZYRm+{g>qQu1#SXQ~P*zgo11KM@Gj|q9=;@z>_R{qHboS0$IY2q&4FvH4cP)PvY RI}mdKG3WNFOk9Vi0{~Xm7O4OL diff --git a/state/map.yaml b/state/map.yaml index 891350db..7dd9a804 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -52,11 +52,12 @@ current_status: summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Runtime status aggregates, global revisions, generic role/event authority, duplicate prompt-state cargo, and Epiphany-owned Rider/Unity organs are absent. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. Completed model-session tombstones retain only resurrection fences and an exact deletion digest. Archived worker attempts retain the exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records needed for audit. Mind/runtime writable epochs are v8/v17; archived-session schema is v1 and archived-worker-attempt schema/type is v2. Old writable stores refuse with no migrator or dual reader. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Runtime status aggregates, global revisions, generic role/event authority, duplicate prompt-state cargo, and Epiphany-owned Rider/Unity organs are absent. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. Completed model-session tombstones retain only resurrection fences and an exact deletion digest. Archived worker attempts retain the exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records needed for audit. Mind/runtime writable epochs are v8/v18; archived-session schema is v1 and archived-worker-attempt schema/type is v2. Old writable stores refuse with no migrator or dual reader. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. atlas_authoring_cut: Exact ce306e23 preserves the complete inter-swarm Atlas vertical slice while deleting its duplicate local offer/claim authoring authority. Ordinary Modeling through RepoModel operations is the sole owner of provider offers and consumer claims; Atlas retains signed publication, trust, transport, deterministic projection, Soul verification, Self impact admission, Resident Self wake, brakes, and Eve lowering. Two direct write-intent types, their runtime commit APIs and registry entries, 518 planner lines, and two tests that animated only that duplicate path are gone. The runtime proof now creates offers/claims through RepoModel before proving exact verification admission and Body-drift refusal. The cut removes 593 net source lines; the three-repository direct/transitive Modeling proof passes. These are component proofs only: no live inter-swarm collaboration has yet run, so the Atlas vertical slice remains protected until Gate 1 exercises it end to end. Runtime writable epoch is v14. autonomous_proposal_binding_cut: Exact 5d507bfd reduces Self's autonomous Imagination-to-Modeling origin binding from a 22-field duplicate archive to six causal join fields: schema, exact direction-result identity, selected option ordinal, worker job identity, and exact worker-result/launch digests. Proposal identity and payload, direction request, runtime/thread, typed model projection, Body/domain binding, selected option content, and canonical Modeling-request identity are checked directly from their owning immutable documents. The atomic proposal plus binding plus Modeling-request commit and its broad keyed-lifecycle proof remain; 60 net source lines are gone. Runtime writable epoch is v15. hands_verification_derivation_cut: Exact 6ccc7dd2 deletes the 20-field transient Hands receipt-chain summary. The Hands commit owner now derives the exact Verification request directly from the persisted patch, command, and commit receipts plus the frontier authority; no copied schema, job, grant, command-output, Git, path, summary, or timestamp fields mediate that handoff. Atomic Hands-to-Verification admission and the concurrent Persona/Hands lifecycle proof remain. The cut removes 43 net source lines without adding state, schema, or tests. proposal_modeling_launch_authority_cut: Exact b0a4978d deletes the Proposal-Modeling launch-binding document family after exact 6831eb69 exposed that even its four-field form owned nothing. The immutable worker launch already carries the exact request reference, role, binding, job identity, and sealed typed document. Current-work, retry counting, fulfillment, archival, and coordinator actuation now consume that owner directly; the registry entry and operator JSON echo are gone. The keyed lifecycle, coordinator target, OpenAI runtime, and old-epoch refusal pass; 70 net source lines are gone. Runtime writable epoch is v17. + planning_launch_authority_cut: Exact b55e96ea deletes both persisted Planning and PlanMind launch-binding families. Their twenty-four fields copied the immutable worker launch, typed requests, runtime job, timestamp, canonical attempt identity, or typed failure review without owning a consequence. Self now derives contiguous attempts and current jobs from family-referenced worker launches. A retry launch strongly reads every prior launch plus the exact failed result and review, so stale retry authority conflicts instead of being summarized into decorative cargo. The complete keyed Planning-to-PlanMind lifecycle, v17 refusal, packaged coordinator, and model-runtime checks pass; 44 net source lines are gone. Runtime writable epoch is v18. supervisor_subtraction: Exact 856648de completes the supervisor deletion. Epiphany owns no local generic daemon supervisor, semantic projector service, workspace-coverage projector, Windows Task Scheduler integration, or service-policy/lifecycle/heartbeat/recovery mirror. Idunn on Yggdrasil owns source-triggered compilation, testing, packaging, deployment, signed health, and daemon survival. The canonical Epiphany brake gates Epiphany cognition and consequence authority, not Idunn startup or unrelated lifecycle. launch_dependency_cut: Exact 2aeab7a9 deletes the generic organ dependency matrix, generic receipt catalogue/proof profiles, persisted worker-launch cargo, Persona prompt injection, evaluator, and three self-certifying tests: 700 net lines. Family admission owners derive exact dependencies from typed state. Worker-launch schema v2 and Persona projector prompt v1 refuse the old writable shape. Core 378/378, OpenRouter runtime 27/27, packaged runtime 13/13, and Persona re-entry 1/1 pass. operator_surface_subtraction: Exact ef92e853 deletes the callerless view-lens registry, legacy acceptance-bundle builders, test-only raw-JSON result interpreters, and six tests: 797 net lines. Exact a292979d and 77e817c1 delete the duplicate CRRC recommendation algorithm, its unused input model, and four tests: 206 lines. Exact 3b94bf6e and 59c5e3a6 delete the nested duplicate status view, false auxiliary mode, and ignored status arguments. Exact 7c9b0cf3 deletes the fixed synthetic job table, role-board job cargo/mappers, and its test: 338 net lines. Exact 2ce91461 deletes the scene/planning Mind reconstructions, duplicate self-policy crate, unused prompt templates, four counterfeit schemas, and ten producer/source-text tests: 1,723 net lines. Exact 78836f3b deletes eight unconsumed status tableaux, the pressure calculator production only called without telemetry, its unreachable compaction action, one counterfeit schema, and six tests: 518 net lines. Exact f10f7fb3 deletes the final twelve epiphany.surface.* schemas and ten catalog entries after every one proved producerless and consumerless: 692 pure deletions. Exact ab3cacfb deletes thirty-one more producerless contracts, the false runtime-session mutation mouth, every Epiphany-owned Rider/Unity command schema, a callerless prompt-context module, its test-only specialist prompt system, and four self-affirming tests: 3,514 net lines. Exact 16d85b1b deletes six duplicate JSON-schema builder tests and two OpenAI-runtime self-source searches: 209 pure test-line deletions. Exact 06f93f70 deletes the test-only inverse OpenAI-to-native request mapper and makes two retained tests follow canonical native-to-provider derivation: sixty net lines. The local catalog now has twenty-three live or portable contracts. Brokkr owns Unity capabilities through CultMesh/Eve; a future Rider daemon owns Rider. Status retains Mind identity, exact current work, one action/reason decision, readable role lanes, and operator thought sealing. Core checks cleanly; retained provider and focused request-flow tests pass. @@ -118,10 +119,10 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,879 lines, 55 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Five persisted family launch-binding types remain beside the immutable worker launch and must prove unique authority or be deleted. Continue splitting only by deleting callerless or duplicate authority; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Continue the launch-authority deletion after exact b0a4978d. Audit Body Modeling, Planning, PlanMind, Imagination consideration, and Reorientation bindings against the immutable worker launch; delete every field and document family whose attempt, request, role, timestamp, projection, or failure ancestry is already derivable from the launch, runtime job/result, typed request, or admission refusal. Keep family-specific semantic requests and validation; do not create a generic registry or mutable role-lane owner. Preserve the unrun inter-swarm Atlas vertical slice and do not mistake component tests for acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,895 lines, 55 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Body Modeling, Imagination consideration, and Reorientation still persist family launch bindings beside the immutable worker launch and must prove unique authority or be deleted. Continue splitting only by deleting callerless or duplicate authority; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Continue the launch-authority deletion after exact b55e96ea. Audit Body Modeling, Imagination consideration, and Reorientation bindings against the immutable worker launch; delete every field and document family whose attempt, request, role, timestamp, projection, or failure ancestry is already derivable from the launch, runtime job/result, typed request, or admission refusal. Keep family-specific semantic requests and validation; do not create a generic registry or mutable role-lane owner. Preserve the unrun inter-swarm Atlas vertical slice and do not mistake component tests for acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. It exposes no aggregate status head, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, or public typed-fulfillment machinery. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Mind/runtime writable epochs are v8/v17, archived-session schema is v1, archived-worker-attempt schema/type is v2, and claim-obligation schema is v3. The spine is 9,879 lines with 55 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. It exposes no aggregate status head, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, or public typed-fulfillment machinery. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Mind/runtime writable epochs are v8/v18, archived-session schema is v1, archived-worker-attempt schema/type is v2, and claim-obligation schema is v3. The spine is 9,895 lines with 55 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. From 8dbfcf6365218d0c07882c25b376fa2bbda9007b Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 02:20:01 +0200 Subject: [PATCH 005/340] Delete final duplicate launch bindings --- .../src/bin/epiphany-mvp-coordinator.rs | 10 +- epiphany-core/src/current_work.rs | 496 +++++++++--------- .../src/imagination_consideration.rs | 28 - epiphany-core/src/lib.rs | 31 +- epiphany-core/src/reorientation_work.rs | 203 ++++--- epiphany-core/src/runtime_spine.rs | 50 +- 6 files changed, 397 insertions(+), 421 deletions(-) diff --git a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs index 43855ce9..4264ecf1 100644 --- a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs +++ b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs @@ -1161,17 +1161,13 @@ fn run_coordinator(args: &Args) -> Result { } else if role_id == "modeling" && status["currentWork"]["bodyModeling"].is_object() { - let binding = epiphany_core::launch_current_body_modeling_work( + let job_id = epiphany_core::launch_current_body_modeling_work( &runtime_store, - epiphany_core::EpiphanyBodyModelingLaunchOptions { - job_id: Uuid::new_v4().to_string(), - created_at: now(), - }, + &now(), )?; json!({ "bindingId": epiphany_core::EPIPHANY_MODELING_ROLE_BINDING_ID, - "backendJobId": binding.job_id, - "bodyModelingLaunchBinding": binding, + "backendJobId": job_id, }) } else if role_id == "modeling" && status["currentWork"]["frontierVerdictModeling"].is_object() diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index 67a41b62..c952c553 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -14,8 +14,6 @@ use crate::RepoFrontierResearchContinuationAction; pub const BODY_MODELING_DECISION_RECEIPT_SCHEMA_VERSION: &str = "epiphany.mind.body_modeling_decision.v1"; -pub const BODY_MODELING_LAUNCH_BINDING_SCHEMA_VERSION: &str = - "epiphany.runtime.body_modeling_launch.v1"; pub const AGENT_PASS_ADMISSION_REFUSAL_SCHEMA_VERSION: &str = "epiphany.mind.agent_pass_admission_refusal.v1"; @@ -233,36 +231,6 @@ pub struct EpiphanyBodyModelingCurrentWorkProjection { pub attempt: EpiphanyAgentPassAttemptProjection, } -#[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] -#[cultcache( - type = "epiphany.runtime.body_modeling_launch.v1", - schema = "EpiphanyBodyModelingLaunchBinding" -)] -pub struct EpiphanyBodyModelingLaunchBinding { - #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] - pub binding_record_id: String, - #[cultcache(key = 2)] - pub work_id: String, - #[cultcache(key = 3)] - pub job_id: String, - #[cultcache(key = 4)] - pub attempt_ordinal: u64, - #[cultcache(key = 5)] - pub body_document_sha256: String, - #[cultcache(key = 6)] - pub observed_repo_model_projection_digest: String, - #[cultcache(key = 7)] - pub launched_at: String, -} - -#[derive(Clone, Debug, PartialEq, Eq)] -pub struct EpiphanyBodyModelingLaunchOptions { - pub job_id: String, - pub created_at: String, -} - #[derive(Clone, Debug, PartialEq, Eq)] pub struct EpiphanyProposalModelingLaunchOptions { pub created_at: String, @@ -373,7 +341,6 @@ impl EpiphanyBodyModelingDecisionReceipt { pub(crate) fn register_current_work_types(cache: &mut CultCache) -> Result<()> { cache.register_entry_type::()?; - cache.register_entry_type::()?; cache.register_entry_type::()?; Ok(()) } @@ -482,7 +449,7 @@ pub fn project_current_work(store_path: impl AsRef) -> Result Some(EpiphanyBodyModelingCurrentWorkProjection { - attempt: body_modeling_attempt(&cache, &work.work_id)?, + attempt: body_modeling_attempt(&cache, &work)?, work, }), None => None, @@ -532,7 +499,7 @@ fn consideration_attempt( Ok(EpiphanyAgentPassAttemptProjection::from_job(&job, false)) } -fn consideration_attempt_ordinal(request_id: &str, job_id: &str) -> Result { +pub(crate) fn consideration_attempt_ordinal(request_id: &str, job_id: &str) -> Result { let prefix = format!("consideration-{request_id}-attempt-"); job_id .strip_prefix(&prefix) @@ -547,7 +514,7 @@ fn current_imagination_consideration_work( let model_basis = crate::repo_model_documents::assemble_repo_model_view_from_cache(cache)?.reasoning_basis(); let candidates = cache.get_all::()?; - let bindings = cache.get_all::()?; + let launches = cache.get_all::()?; let mut requests = cache.get_all::()?; requests.sort_by(|left, right| left.request_id.cmp(&right.request_id)); let mut work = Vec::new(); @@ -561,22 +528,32 @@ fn current_imagination_consideration_work( continue; } crate::validate_current_imagination_consideration_request(cache, &request)?; - let mut launches = bindings + let mut job_ids = launches .iter() - .filter(|binding| binding.request_id == request.request_id) - .map(|binding| { + .filter(|launch| { + launch.imagination_consideration_request_id.as_deref() + == Some(request.request_id.as_str()) + }) + .map(|launch| { Ok(( - consideration_attempt_ordinal(&request.request_id, &binding.job_id)?, - binding.job_id.clone(), + consideration_attempt_ordinal(&request.request_id, &launch.job_id)?, + launch.job_id.clone(), )) }) .collect::>>()?; - launches.sort_by_key(|(ordinal, _)| *ordinal); - let launches = launches + job_ids.sort_by_key(|(ordinal, _)| *ordinal); + for (expected, (ordinal, _)) in job_ids.iter().enumerate() { + if *ordinal != expected { + return Err(anyhow!( + "Persona feedback consideration has noncontiguous attempt identity" + )); + } + } + let job_ids = job_ids .into_iter() .map(|(_, job_id)| job_id) .collect::>(); - let attempt = consideration_attempt(cache, &launches)?; + let attempt = consideration_attempt(cache, &job_ids)?; work.push(EpiphanyImaginationConsiderationWorkProjection { request, attempt }); } Ok(work) @@ -819,30 +796,87 @@ fn current_frontier_verdict_modeling_work( Ok(None) } +fn body_modeling_attempt_ordinal(work_id: &str, job_id: &str) -> Result { + let prefix = format!("{work_id}-attempt-"); + job_id + .strip_prefix(&prefix) + .ok_or_else(|| anyhow!("Body Modeling job identity is not canonical"))? + .parse::() + .map_err(|_| anyhow!("Body Modeling attempt ordinal is invalid")) +} + +fn body_modeling_launches( + cache: &CultCache, + work: &EpiphanyBodyModelingWorkProjection, +) -> Result> { + let prefix = format!("{}-attempt-", work.work_id); + let mut launches = cache + .get_all::()? + .into_iter() + .filter(|launch| launch.job_id.starts_with(&prefix)) + .map(|launch| { + let ordinal = body_modeling_attempt_ordinal(&work.work_id, &launch.job_id)?; + let document = launch.launch_document()?; + let role = match &document { + crate::EpiphanyWorkerLaunchDocument::Role(role) => role, + crate::EpiphanyWorkerLaunchDocument::Reorient(_) => { + return Err(anyhow!("Body Modeling launch used reorientation authority")); + } + }; + if launch.schema_version != crate::RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION + || launch.role != crate::EPIPHANY_MODELING_OWNER_ROLE + || launch.binding_id != crate::EPIPHANY_MODELING_ROLE_BINDING_ID + || document.thread_id() != launch.job_id + || role.role_id != "modeling" + || role.repository_body_observation_basis.as_ref() != Some(&work.body_basis) + || launch.proposal_modeling_request_id.is_some() + || launch.repo_frontier_modeling_request_id.is_some() + || launch.frontier_planning_request_id.is_some() + || launch.frontier_plan_mind_request_id.is_some() + || launch.imagination_consideration_request_id.is_some() + || launch + .admitted_model_direction_consideration_request_id + .is_some() + || launch.repo_frontier_research_request_id.is_some() + || launch.repo_frontier_verification_request_id.is_some() + { + return Err(anyhow!( + "Body Modeling immutable launch crossed family authority" + )); + } + Ok((ordinal, launch)) + }) + .collect::>>()?; + launches.sort_by_key(|(ordinal, _)| *ordinal); + for (expected, (ordinal, _)) in launches.iter().enumerate() { + if *ordinal != expected { + return Err(anyhow!( + "Body Modeling request has noncontiguous attempt identity" + )); + } + } + Ok(launches) +} + fn body_modeling_attempt( cache: &CultCache, - work_id: &str, + work: &EpiphanyBodyModelingWorkProjection, ) -> Result { - let mut bindings = cache - .get_all::()? - .into_iter() - .filter(|binding| binding.work_id == work_id) - .collect::>(); - bindings.sort_by_key(|binding| binding.attempt_ordinal); - let Some(binding) = bindings.last() else { + let launches = body_modeling_launches(cache, work)?; + let Some((_, launch)) = launches.last() else { return Ok(EpiphanyAgentPassAttemptProjection::unattempted()); }; let job = cache - .get::(&binding.job_id)? - .ok_or_else(|| anyhow!("Body Modeling launch binding lost its runtime job"))?; - let result = cache.get::(&binding.job_id)?; + .get::(&launch.job_id)? + .ok_or_else(|| anyhow!("Body Modeling launch lost its runtime job"))?; + let result = cache.get::(&launch.job_id)?; let reviewable = result.is_some(); let admission_refusals = cache.get_all::()?; let admission_refused = result.as_ref().is_some_and(|result| { admission_refusals.iter().any(|refusal| { refusal.pass_family == EpiphanyAgentPassFamily::BodyModeling - && refusal.request_id == work_id - && refusal.job_id == binding.job_id + && refusal.request_id == work.work_id + && refusal.job_id == launch.job_id && refusal.result_id == result.result_id && refusal.decision_context_id == result.decision_context_id }) @@ -850,7 +884,7 @@ fn body_modeling_attempt( if admission_refused { return Ok(EpiphanyAgentPassAttemptProjection::with( EpiphanyAgentPassContinuationAction::Launch, - Some(binding.job_id.clone()), + Some(launch.job_id.clone()), )); } Ok(EpiphanyAgentPassAttemptProjection::from_job( @@ -1008,30 +1042,10 @@ pub fn body_modeling_continuation_action_for_job( store_path: impl AsRef, job_id: &str, ) -> Result> { - let mut cache = crate::runtime_spine_cache(store_path)?; - cache.pull_all_backing_stores()?; - let bindings = cache - .get_all::()? - .into_iter() - .filter(|binding| binding.job_id == job_id) - .collect::>(); - let [binding] = bindings.as_slice() else { - if bindings.is_empty() { - return Ok(None); - } - return Err(anyhow!( - "runtime job has multiple Body Modeling launch bindings" - )); - }; - if cache - .get::(&binding.work_id)? - .is_some() - { - return Ok(None); - } - Ok(Some( - body_modeling_attempt(&cache, &binding.work_id)?.action, - )) + Ok(project_current_work(store_path)? + .body_modeling + .filter(|work| work.attempt.job_id.as_deref() == Some(job_id)) + .map(|work| work.attempt.action)) } pub fn current_body_modeling_review_job_id(store_path: impl AsRef) -> Result> { @@ -2737,68 +2751,76 @@ fn launch_consideration_work( .get::(crate::RUNTIME_IDENTITY_KEY)? .ok_or_else(|| anyhow!("consideration launch requires runtime identity"))?; let model = crate::repo_model_documents::assemble_repo_model_view_from_cache(&cache)?; - let (attempt_ordinal, dynamic_prompt_context, imagination_context, direction_context) = - match launch { - ConsiderationLaunch::PersonaFeedback(request) => { - crate::validate_current_imagination_consideration_request(&cache, request)?; - let current = current_imagination_consideration_work(&cache)? - .into_iter() - .find(|work| work.request.request_id == request.request_id) - .ok_or_else(|| anyhow!("Persona feedback consideration is not current"))?; - if current.attempt.action != EpiphanyAgentPassContinuationAction::Launch { - return Err(anyhow!("Persona feedback consideration is not launchable")); - } - let ordinal = cache - .get_all::()? - .into_iter() - .filter(|binding| binding.request_id == request.request_id) - .count(); - ( - ordinal, - crate::render_imagination_consideration_prompt(request)?, - Some(crate::ImaginationConsiderationContextProjection::new( - request, &model, - )), - None, - ) - } - ConsiderationLaunch::AdmittedModelDirection(request) => { - crate::validate_current_admitted_model_direction_consideration_request( - &cache, request, - )?; - let current = current_admitted_model_direction_consideration_work(&cache)? - .filter(|work| work.request.request_id == request.request_id) - .ok_or_else(|| { - anyhow!("admitted model direction consideration is not current") - })?; - if current.attempt.action != EpiphanyAgentPassContinuationAction::Launch { - return Err(anyhow!( - "admitted model direction consideration is not launchable" - )); - } - let ordinal = cache - .get_all::()? - .into_iter() - .filter(|worker| { - worker - .admitted_model_direction_consideration_request_id - .as_deref() - == Some(request.request_id.as_str()) - }) - .count(); - ( - ordinal, - crate::render_admitted_model_direction_consideration_prompt(request), - None, - Some( - crate::AdmittedModelDirectionConsiderationContextProjection::new( - request, &model, - ), - ), - ) - } - }; let request_id = launch.request_id().to_string(); + let is_feedback = matches!(launch, ConsiderationLaunch::PersonaFeedback(_)); + let mut prior_launches = cache + .get_all::()? + .into_iter() + .filter(|worker| { + if is_feedback { + worker.imagination_consideration_request_id.as_deref() == Some(request_id.as_str()) + } else { + worker + .admitted_model_direction_consideration_request_id + .as_deref() + == Some(request_id.as_str()) + } + }) + .map(|worker| { + Ok(( + consideration_attempt_ordinal(&request_id, &worker.job_id)?, + worker, + )) + }) + .collect::>>()?; + prior_launches.sort_by_key(|(ordinal, _)| *ordinal); + for (expected, (ordinal, _)) in prior_launches.iter().enumerate() { + if *ordinal != expected { + return Err(anyhow!("consideration has noncontiguous attempt identity")); + } + } + let attempt_ordinal = prior_launches.len(); + let (dynamic_prompt_context, imagination_context, direction_context) = match launch { + ConsiderationLaunch::PersonaFeedback(request) => { + crate::validate_current_imagination_consideration_request(&cache, request)?; + let current = current_imagination_consideration_work(&cache)? + .into_iter() + .find(|work| work.request.request_id == request.request_id) + .ok_or_else(|| anyhow!("Persona feedback consideration is not current"))?; + if current.attempt.action != EpiphanyAgentPassContinuationAction::Launch { + return Err(anyhow!("Persona feedback consideration is not launchable")); + } + ( + crate::render_imagination_consideration_prompt(request)?, + Some(crate::ImaginationConsiderationContextProjection::new( + request, &model, + )), + None, + ) + } + ConsiderationLaunch::AdmittedModelDirection(request) => { + crate::validate_current_admitted_model_direction_consideration_request( + &cache, request, + )?; + let current = current_admitted_model_direction_consideration_work(&cache)? + .filter(|work| work.request.request_id == request.request_id) + .ok_or_else(|| anyhow!("admitted model direction consideration is not current"))?; + if current.attempt.action != EpiphanyAgentPassContinuationAction::Launch { + return Err(anyhow!( + "admitted model direction consideration is not launchable" + )); + } + ( + crate::render_admitted_model_direction_consideration_prompt(request), + None, + Some( + crate::AdmittedModelDirectionConsiderationContextProjection::new( + request, &model, + ), + ), + ) + } + }; let job_id = format!("consideration-{request_id}-attempt-{attempt_ordinal}"); let launch_document = crate::EpiphanyWorkerLaunchDocument::Role(crate::EpiphanyRoleWorkerLaunchDocument { @@ -2823,7 +2845,6 @@ fn launch_consideration_work( } .to_string(); let output_contract_id = launch_document.output_contract_id().to_string(); - let is_feedback = matches!(launch, ConsiderationLaunch::PersonaFeedback(_)); let prepared = crate::prepare_runtime_spine_heartbeat_job( &cache, crate::RuntimeSpineHeartbeatJobOptions { @@ -2874,42 +2895,11 @@ fn launch_consideration_work( &cache, launch.model_source_documents(), )?); - let mut companions = Vec::new(); - if let ConsiderationLaunch::PersonaFeedback(request) = launch { - let worker = prepared - .iter() - .find(|envelope| { - envelope.r#type == crate::EpiphanyRuntimeWorkerLaunchRequest::TYPE - && envelope.key == job_id - }) - .ok_or_else(|| anyhow!("consideration launch preparation lost its worker"))?; - let worker: crate::EpiphanyRuntimeWorkerLaunchRequest = - rmp_serde::from_slice(&worker.payload)?; - let binding_record_id = format!( - "imagination-consideration-launch-{}-attempt-{attempt_ordinal}", - request.request_id - ); - companions.push( + for (_, worker) in &prior_launches { + expected.push( cache - .prepare_entry( - &binding_record_id, - &crate::ImaginationConsiderationLaunchBinding { - schema_version: - crate::IMAGINATION_CONSIDERATION_LAUNCH_BINDING_SCHEMA_VERSION.into(), - binding_record_id: binding_record_id.clone(), - request_id: request.request_id.clone(), - job_id: job_id.clone(), - binding_id: crate::EPIPHANY_IMAGINATION_ROLE_BINDING_ID.into(), - runtime_id: request.runtime_id.clone(), - thread_id: request.thread_id.clone(), - launched_at: created_at.into(), - worker_launch_document_sha256: format!( - "{:x}", - Sha256::digest(&worker.launch_document_msgpack) - ), - }, - )? - .0, + .get_envelope::(&worker.job_id)? + .ok_or_else(|| anyhow!("consideration retry lost its prior launch envelope"))?, ); } commit_current_work_launch( @@ -2917,7 +2907,7 @@ fn launch_consideration_work( &cache, expected, prepared, - companions, + Vec::new(), "consideration", )?; Ok(job_id) @@ -2961,14 +2951,11 @@ pub fn launch_current_admitted_model_direction_consideration_work( pub fn launch_current_body_modeling_work( store_path: impl AsRef, - options: EpiphanyBodyModelingLaunchOptions, -) -> Result { + created_at: &str, +) -> Result { let store_path = store_path.as_ref(); - if options.job_id.trim().is_empty() - || chrono::DateTime::parse_from_rfc3339(&options.created_at).is_err() - { - return Err(anyhow!("Body Modeling launch options are invalid")); - } + chrono::DateTime::parse_from_rfc3339(created_at) + .map_err(|_| anyhow!("Body Modeling launch time is invalid"))?; let mind = crate::assemble_mind_view(store_path)?; let body_basis = mind .repository_body_observation @@ -2990,7 +2977,7 @@ pub fn launch_current_body_modeling_work( cache.get::(&work.work_id)?, )? .is_none() - || body_modeling_attempt(&cache, &work.work_id)?.action + || body_modeling_attempt(&cache, &work)?.action != EpiphanyAgentPassContinuationAction::Launch { return Err(anyhow!("Mind has no launchable Body Modeling work")); @@ -3004,20 +2991,12 @@ pub fn launch_current_body_modeling_work( }) .cloned() .ok_or_else(|| anyhow!("Body Modeling launch lost its admitted Body source"))?; - let attempt_ordinal = cache - .get_all::()? - .into_iter() - .filter(|binding| binding.work_id == work.work_id) - .map(|binding| binding.attempt_ordinal) - .max() - .map_or(0, |ordinal| ordinal + 1); - let binding_record_id = format!( - "body-modeling-launch-{}-attempt-{attempt_ordinal}", - work.work_id - ); + let prior_launches = body_modeling_launches(&cache, &work)?; + let attempt_ordinal = prior_launches.len(); + let job_id = format!("{}-attempt-{attempt_ordinal}", work.work_id); let launch_document = crate::EpiphanyWorkerLaunchDocument::Role(crate::EpiphanyRoleWorkerLaunchDocument { - thread_id: binding_record_id.clone(), + thread_id: job_id.clone(), role_id: "modeling".into(), objective: None, dynamic_prompt_context: None, @@ -3042,7 +3021,7 @@ pub fn launch_current_body_modeling_work( objective: "Model the admitted repository Body".into(), coordinator_note: "Keyed Mind current-work launch transaction opened this session." .into(), - job_id: options.job_id.clone(), + job_id: job_id.clone(), role: crate::EPIPHANY_MODELING_OWNER_ROLE.into(), binding_id: crate::EPIPHANY_MODELING_ROLE_BINDING_ID.into(), authority_scope: authority_scope.clone(), @@ -3057,27 +3036,17 @@ pub fn launch_current_body_modeling_work( repo_frontier_modeling_request_id: None, repo_frontier_research_request_id: None, repo_frontier_verification_request_id: None, - created_at: options.created_at.clone(), + created_at: created_at.into(), }, )?; - let binding = EpiphanyBodyModelingLaunchBinding { - schema_version: BODY_MODELING_LAUNCH_BINDING_SCHEMA_VERSION.into(), - binding_record_id, - work_id: work.work_id, - job_id: options.job_id, - attempt_ordinal, - body_document_sha256: body_source.payload_sha256.clone(), - observed_repo_model_projection_digest: work.repo_model_basis.projection_digest.clone(), - launched_at: options.created_at.clone(), - }; let grant = crate::substrate_gate::substrate_gate_repo_access_grant_for_worker( - format!("substrate-grant-{}", binding.job_id), - binding.job_id.clone(), + format!("substrate-grant-{job_id}"), + job_id.clone(), crate::EPIPHANY_MODELING_ROLE_BINDING_ID.into(), crate::EPIPHANY_MODELING_OWNER_ROLE.into(), authority_scope, false, - options.created_at, + created_at.into(), ); let snapshot = cache.snapshot_envelopes(); let mut expected = Vec::new(); @@ -3093,18 +3062,55 @@ pub fn launch_current_body_modeling_work( expected.push(envelope.clone()); } } + for (_, launch) in &prior_launches { + expected.push( + cache + .get_envelope::(&launch.job_id)? + .ok_or_else(|| anyhow!("Body Modeling retry lost its prior launch envelope"))?, + ); + } + if let Some((_, latest)) = prior_launches.last() { + expected.push( + cache + .get_envelope::(&latest.job_id)? + .ok_or_else(|| anyhow!("Body Modeling retry lost its prior job envelope"))?, + ); + if let Some(result) = cache.get::(&latest.job_id)? { + expected.push( + cache + .get_envelope::(&latest.job_id)? + .ok_or_else(|| anyhow!("Body Modeling retry lost its result envelope"))?, + ); + if let Some(refusal) = cache + .get_all::()? + .into_iter() + .find(|refusal| { + refusal.pass_family == EpiphanyAgentPassFamily::BodyModeling + && refusal.request_id == work.work_id + && refusal.job_id == latest.job_id + && refusal.result_id == result.result_id + && refusal.decision_context_id == result.decision_context_id + }) + { + expected.push( + cache + .get_envelope::(&refusal.refusal_id)? + .ok_or_else(|| { + anyhow!("Body Modeling retry lost its admission refusal envelope") + })?, + ); + } + } + } commit_current_work_launch( store_path, &cache, expected, prepared, - vec![ - cache.prepare_entry(&binding.binding_record_id, &binding)?.0, - cache.prepare_entry(&grant.receipt_id, &grant)?.0, - ], + vec![cache.prepare_entry(&grant.receipt_id, &grant)?.0], "Body Modeling", )?; - Ok(binding) + Ok(job_id) } pub fn launch_current_proposal_modeling_work( @@ -3702,15 +3708,8 @@ mod tests { ); assert_eq!(crate::repository_body_read_counters(), (0, 0)); assert_current_work_reentry_is_read_only(&store, ¤t_work)?; - let scheduled = launch_current_body_modeling_work( - &store, - EpiphanyBodyModelingLaunchOptions { - job_id: "body-scheduled-job".into(), - created_at: "2026-08-17T00:00:02Z".into(), - }, - )?; - assert_eq!(scheduled.work_id, projected_work.work_id); - assert_eq!(scheduled.attempt_ordinal, 0); + let scheduled = launch_current_body_modeling_work(&store, "2026-08-17T00:00:02Z")?; + assert_eq!(scheduled, format!("{}-attempt-0", projected_work.work_id)); let scheduled_work = project_current_work(&store)?; assert_eq!( scheduled_work @@ -3719,7 +3718,7 @@ mod tests { .map(|work| (work.attempt.action, work.attempt.job_id.as_deref())), Some(( EpiphanyAgentPassContinuationAction::Wait, - Some("body-scheduled-job") + Some(scheduled.as_str()) )) ); let resident_policy = crate::ResidentSelfPolicy { @@ -3766,31 +3765,22 @@ mod tests { ); assert!( scheduled_cache - .get::("body-scheduled-job")? + .get::(&scheduled)? .is_some() ); assert!( scheduled_cache - .get::( - "substrate-grant-body-scheduled-job" - )? + .get::(&format!( + "substrate-grant-{scheduled}" + ))? .is_some() ); - assert!( - launch_current_body_modeling_work( - &store, - EpiphanyBodyModelingLaunchOptions { - job_id: "body-scheduled-job-duplicate".into(), - created_at: "2026-08-17T00:00:03Z".into(), - }, - ) - .is_err() - ); + assert!(launch_current_body_modeling_work(&store, "2026-08-17T00:00:03Z").is_err()); assert_eq!(crate::repository_body_read_counters(), (0, 0)); let mut cache = crate::runtime_spine_cache(&store)?; cache.pull_all_backing_stores()?; let failed_launch = cache - .get::("body-scheduled-job")? + .get::(&scheduled)? .expect("scheduled Body launch exists"); drop(cache); let failed_basis = crate::worker_reasoning_basis(&store, &failed_launch)?; @@ -3851,7 +3841,7 @@ mod tests { let mut death_cache = crate::runtime_spine_cache(&store)?; death_cache.pull_all_backing_stores()?; let death = death_cache - .get::("result-worker-death-body-scheduled-job")? + .get::(&format!("result-worker-death-{scheduled}"))? .expect("worker death emits its terminal runtime result"); assert_eq!(death.verdict, "failed"); let death_context = death @@ -3873,7 +3863,7 @@ mod tests { .map(|work| (work.attempt.action, work.attempt.job_id.as_deref())), Some(( EpiphanyAgentPassContinuationAction::Launch, - Some("body-scheduled-job") + Some(scheduled.as_str()) )) ); assert_ne!( @@ -3901,18 +3891,12 @@ mod tests { "/launchModeling" ) ); - let retried = launch_current_body_modeling_work( - &store, - EpiphanyBodyModelingLaunchOptions { - job_id: "body-retry-job".into(), - created_at: "2026-08-17T00:00:04Z".into(), - }, - )?; - assert_eq!(retried.attempt_ordinal, 1); + let retried = launch_current_body_modeling_work(&store, "2026-08-17T00:00:04Z")?; + assert_eq!(retried, format!("{}-attempt-1", projected_work.work_id)); let mut cache = crate::runtime_spine_cache(&store)?; cache.pull_all_backing_stores()?; let launch = cache - .get::("body-retry-job")? + .get::(&retried)? .unwrap(); crate::reset_repository_body_read_counters(); let reasoning_basis = crate::worker_reasoning_basis(&store, &launch)?; diff --git a/epiphany-core/src/imagination_consideration.rs b/epiphany-core/src/imagination_consideration.rs index 2f303540..05f5548e 100644 --- a/epiphany-core/src/imagination_consideration.rs +++ b/epiphany-core/src/imagination_consideration.rs @@ -8,8 +8,6 @@ pub const REQUEST_SCHEMA: &str = "epiphany.self.imagination_consideration_reques pub const REQUEST_CONTRACT: &str = "epiphany.imagination_consideration_request.v1"; pub const CANDIDATE_SCHEMA: &str = "epiphany.imagination.consideration_candidate.v1"; pub const CANDIDATE_CONTRACT: &str = "epiphany.imagination_consideration_candidate.v1"; -pub const LAUNCH_BINDING_SCHEMA: &str = - "epiphany.coordinator.imagination_consideration_launch_binding.v0"; pub const REVIEW_REQUEST_SCHEMA: &str = "epiphany.self.imagination_consideration_review_request.v0"; #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] @@ -149,32 +147,6 @@ pub struct ImaginationConsiderationCandidate { pub data_classification: String, } -#[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] -#[cultcache( - type = "epiphany.coordinator.imagination_consideration_launch_binding", - schema = "ImaginationConsiderationLaunchBinding" -)] -pub struct ImaginationConsiderationLaunchBinding { - #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] - pub binding_record_id: String, - #[cultcache(key = 2)] - pub request_id: String, - #[cultcache(key = 3)] - pub job_id: String, - #[cultcache(key = 4)] - pub binding_id: String, - #[cultcache(key = 5)] - pub runtime_id: String, - #[cultcache(key = 6)] - pub thread_id: String, - #[cultcache(key = 7)] - pub launched_at: String, - #[cultcache(key = 8)] - pub worker_launch_document_sha256: String, -} - #[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] #[cultcache( type = "epiphany.self.imagination_consideration_review_request", diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index 8f380c45..2d543236 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -100,11 +100,11 @@ pub use cultmesh_integration::EPIPHANY_CANONICAL_SWARM_BRAKE_ID; pub use cultmesh_integration::EPIPHANY_CANONICAL_SWARM_BRAKE_OWNER; pub use cultmesh_integration::{ EPIPHANY_CULTMESH_SWARM_BRAKE_KEY, EPIPHANY_CULTMESH_SWARM_BRAKE_SCHEMA_VERSION, - EPIPHANY_CULTMESH_SWARM_BRAKE_TYPE, EpiphanyCultMeshDocuments, - EpiphanyCultMeshSwarmBrakeEntry, canonical_epiphany_swarm_brake_protected_surfaces, - default_epiphany_cultmesh_swarm_brake, engage_epiphany_cultmesh_swarm_brake, - load_epiphany_cultmesh_swarm_brake, open_epiphany_cultmesh_node, - release_epiphany_cultmesh_swarm_brake, write_epiphany_cultmesh_swarm_brake, + EPIPHANY_CULTMESH_SWARM_BRAKE_TYPE, EpiphanyCultMeshDocuments, EpiphanyCultMeshSwarmBrakeEntry, + canonical_epiphany_swarm_brake_protected_surfaces, default_epiphany_cultmesh_swarm_brake, + engage_epiphany_cultmesh_swarm_brake, load_epiphany_cultmesh_swarm_brake, + open_epiphany_cultmesh_node, release_epiphany_cultmesh_swarm_brake, + write_epiphany_cultmesh_swarm_brake, }; pub use current_work::*; @@ -138,11 +138,10 @@ pub use imagination_consideration::{ CANDIDATE_CONTRACT as IMAGINATION_CONSIDERATION_CANDIDATE_CONTRACT, CANDIDATE_SCHEMA as IMAGINATION_CONSIDERATION_CANDIDATE_SCHEMA_VERSION, ImaginationConsiderationCandidate, ImaginationConsiderationDisposition, - ImaginationConsiderationLaunchBinding, ImaginationConsiderationQuestion, - ImaginationConsiderationRequest, ImaginationConsiderationReviewRequest, - ImaginationConsiderationReviewRoute, ImaginationOptionDraft, - LAUNCH_BINDING_SCHEMA as IMAGINATION_CONSIDERATION_LAUNCH_BINDING_SCHEMA_VERSION, - QuotedPersonaFeedbackEvidence, REQUEST_CONTRACT as IMAGINATION_CONSIDERATION_REQUEST_CONTRACT, + ImaginationConsiderationQuestion, ImaginationConsiderationRequest, + ImaginationConsiderationReviewRequest, ImaginationConsiderationReviewRoute, + ImaginationOptionDraft, QuotedPersonaFeedbackEvidence, + REQUEST_CONTRACT as IMAGINATION_CONSIDERATION_REQUEST_CONTRACT, REQUEST_SCHEMA as IMAGINATION_CONSIDERATION_REQUEST_SCHEMA_VERSION, candidate_id_for_launch as imagination_consideration_candidate_id_for_launch, commit_request as commit_imagination_consideration_request, @@ -176,13 +175,11 @@ pub use persona_discord_crossing::*; pub use persona_discord_permit::*; pub use persona_feedback_admission::{ BIFROST_PERSONA_FEEDBACK_ADMISSION_SCHEMA_VERSION, BIFROST_PERSONA_FEEDBACK_DELIVERY_TYPE, - BifrostPersonaFeedbackAdmission, - LOCAL_PERSONA_FEEDBACK_SCHEMA_VERSION, LocalAdmittedPersonaFeedback, - PERSONA_FEEDBACK_SOCIAL_ADMISSION_SCHEMA_VERSION, PersonaFeedbackPacket, - PersonaFeedbackSocialAdmissionReceipt, admit_persona_feedback_to_social, + BifrostPersonaFeedbackAdmission, LOCAL_PERSONA_FEEDBACK_SCHEMA_VERSION, + LocalAdmittedPersonaFeedback, PERSONA_FEEDBACK_SOCIAL_ADMISSION_SCHEMA_VERSION, + PersonaFeedbackPacket, PersonaFeedbackSocialAdmissionReceipt, admit_persona_feedback_to_social, admitted_persona_feedback, import_bifrost_persona_feedback_deliveries, - persona_feedback_ready_for_cognition, - validate_persona_feedback_store_separation, + persona_feedback_ready_for_cognition, validate_persona_feedback_store_separation, }; pub use persona_social_state::*; pub use persona_turn::PERSONA_INTERPRETER_EFFECT_DOCUMENT_SCHEMA_VERSION; @@ -325,8 +322,8 @@ pub use runtime_spine::runtime_hands_command_receipt; pub use runtime_spine::runtime_hands_commit_receipt; pub use runtime_spine::runtime_hands_patch_receipt; pub(crate) use runtime_spine::runtime_has_actionable_hands_frontier; -pub use runtime_spine::runtime_job_snapshot; pub use runtime_spine::runtime_identity; +pub use runtime_spine::runtime_job_snapshot; pub use runtime_spine::runtime_registered_document_types; pub(crate) use runtime_spine::runtime_reorient_worker_result; pub use runtime_spine::runtime_repo_frontier_planning_lifecycle; diff --git a/epiphany-core/src/reorientation_work.rs b/epiphany-core/src/reorientation_work.rs index 588f5441..24d3b009 100644 --- a/epiphany-core/src/reorientation_work.rs +++ b/epiphany-core/src/reorientation_work.rs @@ -9,8 +9,6 @@ use crate::{ }; pub const REORIENTATION_REQUEST_SCHEMA_VERSION: &str = "epiphany.self.reorientation_request.v1"; -pub const REORIENTATION_LAUNCH_BINDING_SCHEMA_VERSION: &str = - "epiphany.runtime.reorientation_launch.v1"; pub const MIND_REORIENTATION_DECISION_SCHEMA_VERSION: &str = "epiphany.mind.reorientation_decision.v1"; pub const MIND_REORIENTATION_PASS_FAILURE_SCHEMA_VERSION: &str = @@ -48,26 +46,6 @@ pub struct EpiphanyReorientationRequest { pub requested_at: String, } -#[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] -#[cultcache( - type = "epiphany.runtime.reorientation_launch.v1", - schema = "EpiphanyReorientationLaunchBinding" -)] -pub struct EpiphanyReorientationLaunchBinding { - #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] - pub binding_id: String, - #[cultcache(key = 2)] - pub request_id: String, - #[cultcache(key = 3)] - pub job_id: String, - #[cultcache(key = 4)] - pub attempt_ordinal: u64, - #[cultcache(key = 5)] - pub launched_at: String, -} - #[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] #[cultcache( type = "epiphany.mind.reorientation_decision.v1", @@ -210,6 +188,81 @@ pub fn request_current_reorientation( Ok(request) } +fn reorientation_attempt_ordinal(request_id: &str, job_id: &str) -> Result { + let prefix = format!("reorientation-{request_id}-attempt-"); + job_id + .strip_prefix(&prefix) + .ok_or_else(|| anyhow!("reorientation job identity is not canonical"))? + .parse::() + .map_err(|_| anyhow!("reorientation attempt ordinal is invalid")) +} + +fn reorientation_launch_document( + launch: &crate::EpiphanyRuntimeWorkerLaunchRequest, +) -> Result { + let document = match launch.launch_document()? { + crate::EpiphanyWorkerLaunchDocument::Reorient(document) => document, + crate::EpiphanyWorkerLaunchDocument::Role(_) => { + return Err(anyhow!("reorientation owner carried a role launch")); + } + }; + if launch.schema_version != crate::RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION + || launch.role != crate::EPIPHANY_REORIENT_OWNER_ROLE + || launch.binding_id != crate::EPIPHANY_REORIENT_LAUNCH_BINDING_ID + || document.schema_version != "epiphany.reorientation_launch_projection.v1" + || document.request_id.trim().is_empty() + || document.creation_thread_id != launch.job_id + || launch.proposal_modeling_request_id.is_some() + || launch.frontier_planning_request_id.is_some() + || launch.frontier_plan_mind_request_id.is_some() + || launch.imagination_consideration_request_id.is_some() + || launch + .admitted_model_direction_consideration_request_id + .is_some() + || launch.repo_frontier_modeling_request_id.is_some() + || launch.repo_frontier_research_request_id.is_some() + || launch.repo_frontier_verification_request_id.is_some() + { + return Err(anyhow!( + "reorientation immutable launch crossed family authority" + )); + } + reorientation_attempt_ordinal(&document.request_id, &launch.job_id)?; + Ok(document) +} + +fn reorientation_launches( + cache: &CultCache, + request_id: &str, +) -> Result> { + let mut launches = Vec::new(); + for launch in cache + .get_all::()? + .into_iter() + .filter(|launch| { + launch.role == crate::EPIPHANY_REORIENT_OWNER_ROLE + || launch.binding_id == crate::EPIPHANY_REORIENT_LAUNCH_BINDING_ID + }) + { + let document = reorientation_launch_document(&launch)?; + if document.request_id == request_id { + launches.push(( + reorientation_attempt_ordinal(request_id, &launch.job_id)?, + launch, + )); + } + } + launches.sort_by_key(|(ordinal, _)| *ordinal); + for (expected, (ordinal, _)) in launches.iter().enumerate() { + if *ordinal != expected { + return Err(anyhow!( + "reorientation request has noncontiguous attempt identity" + )); + } + } + Ok(launches) +} + pub(crate) fn current_reorientation_work( cache: &CultCache, ) -> Result> { @@ -225,33 +278,28 @@ pub(crate) fn current_reorientation_work( { continue; } - let mut bindings = cache - .get_all::()? - .into_iter() - .filter(|binding| binding.request_id == request.request_id) - .collect::>(); - bindings.sort_by_key(|binding| binding.attempt_ordinal); - let Some(binding) = bindings.last() else { + let launches = reorientation_launches(cache, &request.request_id)?; + let Some((_, launch)) = launches.last() else { return Ok(Some(EpiphanyReorientationWorkProjection { request, attempt: crate::EpiphanyAgentPassAttemptProjection::unattempted(), })); }; let job = cache - .get::(&binding.job_id)? + .get::(&launch.job_id)? .ok_or_else(|| anyhow!("reorientation launch lost its runtime job"))?; - let result = cache.get::(&binding.job_id)?; + let result = cache.get::(&launch.job_id)?; let action = match job.status { EpiphanyRuntimeJobStatus::Completed if result.is_some() => { EpiphanyAgentPassContinuationAction::Review } EpiphanyRuntimeJobStatus::Failed => { - let terminal = exact_runtime_job_result(cache, &binding.job_id)?; + let terminal = exact_runtime_job_result(cache, &launch.job_id)?; match terminal.decision_context_id.as_deref() { Some(context_id) if failures.iter().any(|failure| { failure.request_id == request.request_id - && failure.job_id == binding.job_id + && failure.job_id == launch.job_id && failure.runtime_result_id == terminal.result_id && failure.decision_context_id == context_id }) => @@ -269,7 +317,7 @@ pub(crate) fn current_reorientation_work( request, attempt: crate::EpiphanyAgentPassAttemptProjection::with( action, - Some(binding.job_id.clone()), + Some(launch.job_id.clone()), ), })); } @@ -283,13 +331,12 @@ pub fn record_reorientation_pass_failure( let store_path = store_path.as_ref(); let mut cache = crate::runtime_spine_cache(store_path)?; cache.pull_all_backing_stores()?; - let binding = cache - .get_all::()? - .into_iter() - .find(|binding| binding.job_id == job_id) - .ok_or_else(|| anyhow!("reorientation failure has no exact launch binding"))?; + let launch = cache + .get::(job_id)? + .ok_or_else(|| anyhow!("reorientation failure has no immutable launch"))?; + let launch_document = reorientation_launch_document(&launch)?; let request = cache - .get::(&binding.request_id)? + .get::(&launch_document.request_id)? .ok_or_else(|| anyhow!("reorientation failure lost its request"))?; validate_reorientation_request_intrinsic(&request)?; let job = cache @@ -349,10 +396,6 @@ pub fn record_reorientation_pass_failure( EpiphanyReorientationRequest::TYPE, request.request_id.as_str(), ), - ( - EpiphanyReorientationLaunchBinding::TYPE, - binding.binding_id.as_str(), - ), (crate::EpiphanyRuntimeWorkerLaunchRequest::TYPE, job_id), (crate::EpiphanyRuntimeJob::TYPE, job_id), ( @@ -408,11 +451,8 @@ pub fn launch_current_reorientation_work( return Err(anyhow!("reorientation request is not launchable")); } validate_reorientation_request_current(&cache, &work.request)?; - let attempt_ordinal = cache - .get_all::()? - .into_iter() - .filter(|binding| binding.request_id == work.request.request_id) - .count() as u64; + let prior_launches = reorientation_launches(&cache, &work.request.request_id)?; + let attempt_ordinal = prior_launches.len(); let job_id = format!( "reorientation-{}-attempt-{attempt_ordinal}", work.request.request_id @@ -450,28 +490,56 @@ pub fn launch_current_reorientation_work( created_at: created_at.into(), }, )?; - let binding = EpiphanyReorientationLaunchBinding { - schema_version: REORIENTATION_LAUNCH_BINDING_SCHEMA_VERSION.into(), - binding_id: format!("reorientation-launch-{job_id}"), - request_id: work.request.request_id.clone(), - job_id: job_id.clone(), - attempt_ordinal, - launched_at: created_at.into(), - }; - let expected = exact_source_envelopes(&cache, &work.request.source_documents)? + let mut expected = exact_source_envelopes(&cache, &work.request.source_documents)? .into_iter() .chain( cache .get_envelope::(&work.request.request_id)? .into_iter(), ) - .collect(); + .collect::>(); + for (_, launch) in &prior_launches { + expected.push( + cache + .get_envelope::(&launch.job_id)? + .ok_or_else(|| anyhow!("reorientation retry lost its prior launch envelope"))?, + ); + } + if let Some((_, latest)) = prior_launches.last() { + expected.push( + cache + .get_envelope::(&latest.job_id)? + .ok_or_else(|| anyhow!("reorientation retry lost its prior job envelope"))?, + ); + for failure in cache + .get_all::()? + .into_iter() + .filter(|failure| { + failure.request_id == work.request.request_id && failure.job_id == latest.job_id + }) + { + expected.push( + cache + .get_envelope::( + &failure.failure_id, + )? + .ok_or_else(|| anyhow!("reorientation retry lost its failure envelope"))?, + ); + expected.push( + cache + .get_envelope::(&failure.runtime_result_id)? + .ok_or_else(|| { + anyhow!("reorientation retry lost its terminal result envelope") + })?, + ); + } + } crate::current_work::commit_current_work_launch( store_path, &cache, expected, prepared, - vec![cache.prepare_entry(&binding.binding_id, &binding)?.0], + Vec::new(), "reorientation", )?; Ok(job_id) @@ -487,13 +555,12 @@ pub fn accept_reorientation_result( let store_path = store_path.as_ref(); let mut cache = crate::runtime_spine_cache(store_path)?; cache.pull_all_backing_stores()?; - let binding = cache - .get_all::()? - .into_iter() - .find(|binding| binding.job_id == job_id) - .ok_or_else(|| anyhow!("reorientation result has no exact launch binding"))?; + let launch = cache + .get::(job_id)? + .ok_or_else(|| anyhow!("reorientation result has no immutable launch"))?; + let launch_document = reorientation_launch_document(&launch)?; let request = cache - .get::(&binding.request_id)? + .get::(&launch_document.request_id)? .ok_or_else(|| anyhow!("reorientation result lost its request"))?; validate_reorientation_request_intrinsic(&request)?; let job = cache @@ -567,10 +634,6 @@ pub fn accept_reorientation_result( EpiphanyReorientationRequest::TYPE, request.request_id.as_str(), ), - ( - EpiphanyReorientationLaunchBinding::TYPE, - binding.binding_id.as_str(), - ), (crate::EpiphanyRuntimeWorkerLaunchRequest::TYPE, job_id), (crate::EpiphanyRuntimeJob::TYPE, job_id), (crate::EpiphanyRuntimeReorientWorkerResult::TYPE, job_id), diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index 182b6d12..6d027d0d 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -88,7 +88,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v18"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v19"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; pub const RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.model_execution_binding.v0"; @@ -864,7 +864,6 @@ fn runtime_spine_schema_cache() -> Result { cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; - cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; @@ -872,7 +871,6 @@ fn runtime_spine_schema_cache() -> Result { cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; - cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; @@ -4448,17 +4446,6 @@ pub fn put_runtime_role_worker_result( "consideration candidate identity was not assigned by exact launch" )); } - let bindings = cache - .get_all::()? - .into_iter() - .filter(|binding| binding.request_id == request_id && binding.job_id == result.job_id) - .collect::>(); - if bindings.len() != 1 { - return Err(anyhow!( - "consideration result requires one exact attempt binding" - )); - } - let binding = &bindings[0]; let worker = cache .get::(&result.job_id)? .ok_or_else(|| anyhow!("consideration result requires worker launch"))?; @@ -4469,15 +4456,13 @@ pub fn put_runtime_role_worker_result( } EpiphanyWorkerLaunchDocument::Reorient(_) => None, }; - let launch_hash = format!("{:x}", Sha256::digest(&worker.launch_document_msgpack)); - if binding.job_id != result.job_id - || binding.binding_id != EPIPHANY_IMAGINATION_ROLE_BINDING_ID - || binding.runtime_id != request.runtime_id - || binding.thread_id != request.thread_id - || binding.worker_launch_document_sha256 != launch_hash + crate::current_work::consideration_attempt_ordinal(request_id, &result.job_id)?; + if worker.schema_version != RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION + || worker.job_id != result.job_id || worker.role != EPIPHANY_IMAGINATION_OWNER_ROLE || worker.binding_id != EPIPHANY_IMAGINATION_ROLE_BINDING_ID || worker.imagination_consideration_request_id.as_deref() != Some(request_id) + || document.thread_id() != result.job_id || projection.map(|projection| &projection.request) != Some(&request) || projection.map(|projection| projection.model.reasoning_basis()) != Some(crate::EpiphanyRepoModelBasis { @@ -8622,7 +8607,6 @@ fn validate_archivable_typed_worker_launch( } let document = launch.launch_document()?; let identity = require_identity(cache)?; - let launch_sha256 = format!("{:x}", Sha256::digest(&launch.launch_document_msgpack)); match request_kind { "proposal-modeling" => { validate_proposal_modeling_launch_carrier( @@ -8726,15 +8710,6 @@ fn validate_archivable_typed_worker_launch( { return Err(anyhow!("archived Imagination launch request is invalid")); } - let bindings = cache - .get_all::()? - .into_iter() - .filter(|binding| binding.job_id == launch.job_id) - .collect::>(); - if bindings.len() != 1 { - return Err(anyhow!("archived Imagination launch requires one binding")); - } - let binding = &bindings[0]; let projection = match &document { EpiphanyWorkerLaunchDocument::Role(document) => { document.imagination_consideration_context.as_ref() @@ -8743,11 +8718,8 @@ fn validate_archivable_typed_worker_launch( } .ok_or_else(|| anyhow!("archived Imagination launch lost its context"))?; if request.runtime_id != identity.runtime_id - || binding.request_id != request.request_id - || binding.binding_id != EPIPHANY_IMAGINATION_ROLE_BINDING_ID - || binding.runtime_id != request.runtime_id - || binding.thread_id != request.thread_id - || binding.worker_launch_document_sha256 != launch_sha256 + || launch.job_id.trim().is_empty() + || document.thread_id() != launch.job_id || projection.request != request || projection.model.reasoning_basis() != (crate::EpiphanyRepoModelBasis { @@ -8936,12 +8908,6 @@ fn archive_runtime_worker_attempt( } } let snapshot = cache.snapshot_envelopes(); - let imagination_bindings = cache - .get_all::()? - .into_iter() - .filter(|item| item.job_id == job_id) - .map(|item| item.binding_record_id) - .collect::>(); let worker_job_results = cache .get_all::()? .into_iter() @@ -8992,8 +8958,6 @@ fn archive_runtime_worker_attempt( || (entry.r#type == EpiphanyRuntimeJob::TYPE && entry.key == job_id) || (entry.r#type == EpiphanyRuntimeJobResult::TYPE && job_results.contains(&entry.key)) - || (entry.r#type == crate::ImaginationConsiderationLaunchBinding::TYPE - && imagination_bindings.contains(&entry.key)) }) .cloned() .collect::>(); From 1fca52de4f6e60ef6d4881280a9bb0b48e90138d Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 02:22:08 +0200 Subject: [PATCH 006/340] docs: Record sole immutable launch authority --- notes/epiphany-current-algorithmic-map.md | 21 +++++++++-- notes/epiphany-fork-implementation-plan.md | 11 +++++- notes/fresh-workspace-handoff.md | 41 ++++++++++++--------- state/ledgers.msgpack | Bin 695476 -> 696270 bytes state/map.yaml | 9 +++-- 5 files changed, 55 insertions(+), 27 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index cb820917..1ecd2c57 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,9 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `b55e96ea` on `codex/epiphany-shakedown-live` -Current worktree cut: Planning/PlanMind launch-authority deletion; Ox17 remains paused +Latest committed implementation cut: `8dbfcf63` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for the final duplicate launch-binding deletion; +Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and proof chronology belong in git, `state/ledgers.msgpack`, and bounded smoke @@ -225,8 +226,20 @@ current job from the family references on immutable worker launches. A retry is authorized only by the exact typed failed result and its failure review; the launch transaction now strongly reads those documents and every prior launch. The semantic Planning and PlanMind requests, sealed projections, result -validation, and two-stage adoption boundary remain family-owned. Body Modeling, -Imagination consideration, and Reorientation bindings remain under audit. +validation, and two-stage adoption boundary remain family-owned. + +Body Modeling, Imagination consideration, and Reorientation also have no +second launch record. Exact `8dbfcf63` deletes all three persisted binding +families. Canonical worker job identities now encode contiguous attempt order; +the immutable worker launch carries the exact family reference, role, binding, +and typed launch projection. Body retry CAS reads the prior launches, latest +job, exact structured result, and matching admission refusal. Reorientation +retry CAS reads the prior launches, latest job, typed pass failure, and exact +terminal runtime result. Imagination retry CAS reads every prior launch. Family +requests, sealed reasoning projections, result validation, substrate grants, +typed failures, and Mind admission remain with their existing owners. Runtime +writable state is v19. This cut does not touch Model Atlas or narrow the still- +unrun inter-swarm path. Bifrost owns its private feedback-signing identity. Exact `94098223` deletes Epiphany's host-identity executable and the private signer, persisted identity, diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 24fae5b2..b51c268d 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -352,7 +352,16 @@ Cut in this order: coordinator routing use the same current-work projection. Aggregate launch/acceptance, checkpoint/freshness recommendation, latest binding, global revision acceptance, and accepted-at comparison no longer own this - family. + family. Exact `8dbfcf63` deletes its later duplicate launch-binding document; + the immutable worker launch owns request/job/attempt identity, while retry + CAS strongly reads the typed failure and exact terminal runtime result. + The same cut deletes the duplicate Body Modeling and Imagination + consideration binding families. Canonical job identities and immutable + family-referenced worker launches now own all three attempt sequences. + Their semantic requests, sealed projections, result admission, substrate + grants, typed failures, and refusal/retry invariants remain family-owned. + Runtime writable state advances to v19. Model Atlas and the unrun + inter-swarm collaboration path are unchanged. 12. **Landed at `1662a012`, `07d891ba`, and `ec1431ff`:** coordinator policy now projects keyed current work; persisted `EpiphanyThreadStateEntry`, `coordinator_state_transaction`, generic coordinator services, the diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 4cd2ccab..be397bfd 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `b55e96ea` -Current worktree: documentation/evidence for Planning/PlanMind launch-authority deletion; +Latest committed implementation cut: `8dbfcf63` +Current worktree: documentation/evidence for the final duplicate launch-binding deletion; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `b55e96ea` is the current +production symlink body and is inactive. Exact `8dbfcf63` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,24 +45,29 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `8dbfcf63` deletes the persisted Body Modeling, Imagination consideration, +and Reorientation launch-binding families. Their attempt, request, role, +binding, timestamp, Body/projection, and launch-digest fields duplicated the +immutable worker launch, typed family request/projection, runtime job/result, +admission refusal, or typed pass failure. Canonical worker job identities now +own contiguous attempt order. Retry CAS strong-reads prior launches and each +family's exact terminal ancestry; stale model output is not rebased. The broad +keyed Body/Imagination lifecycle, Reorientation success/failure/retry proof, +old-epoch refusal, release-owned coordinator, and OpenAI runtime checks pass. +The cut removes 24 net source lines and advances runtime writable state to v19. + +No live inter-swarm collaboration has yet run. Model Atlas remains protected +for the first real Gate 1 trial; its isolated component proofs are not +acceptance. Continue the public runtime-spine and test-liability audit without +narrowing Atlas publication, trust, transport, verification, admission, wake, +brake, or Eve behavior. + Exact `b55e96ea` deletes the persisted Planning and PlanMind launch-binding families. Their twenty-four fields duplicated the immutable worker launch, typed requests, runtime job, canonical attempt identity, and typed failure -review. Self now derives contiguous attempts and current jobs from the family -references on worker launches. Retry launch CAS strongly reads every prior -launch plus the exact failed result and review, so stale retry authority cannot -be summarized and silently reused. The complete keyed Planning-to-PlanMind -lifecycle, v17 refusal, release-owned coordinator, and model-runtime checks -pass. The cut removes 44 net source lines and advances runtime writable state -to v18. - -Continue with the three remaining persisted launch-binding families: Body -Modeling, Imagination consideration, and Reorientation. Preserve their typed -semantic requests, projections, result validation, and refusal/retry -invariants; delete any sibling launch record whose state is derivable from the -immutable worker launch and owning receipts. Model Atlas remains protected for -the first real inter-swarm collaboration trial; component tests are not that -trial. +review. Self derives contiguous attempts and current jobs from immutable worker +launches, and retry CAS strongly reads each failed result and review. Runtime +writable state advanced to v18. Exact `b0a4978d` deletes the Proposal-Modeling launch-binding document family. The immutable worker launch already owns the exact typed request reference, job, diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index ea9c21b34dc32250a98427246af7a0a05c2e04d6..acb3f97d06847c58e6933a97a2df1a6394e390cf 100644 GIT binary patch delta 698 zcmY+C&ubGw6vy4D)$T=6K|!HUyv5BXO-o55D7F5;gCN?Ix5@6?_Tm%LWO0@n*OKdNXN8l*uRgo9b+_GI5y^o0_ts)RA1u06E zj9MuT`50t`GPN*4gUn@UECv!GGb=jxeD$*r;k7B7Rs|!@QL2;1|2dmd`NpuX2W^A4 zl*}d4oUG->T#=Pl$OyDqS{1@t_9IyujA2(Ottb)F*8`=%D&&>$@MrxE6228<)0Yc&hofVaG`^ zhpFYe@cILTxgZ5RGF>JkCh(Z066{_0r%>SH>iq-B$nZ5u8Y4Uw4q+XfAtB?xj@9=` delta 78 zcmX@NUu(-wtqsDA0>&Xm##YA0Rwm|A#~8R~Pu#4`Sjfm|*F2S}eJT?p5QAuDAZ7t# WRv=~rVs;?r0AkMVQ<=ErX8{1rd>5Di diff --git a/state/map.yaml b/state/map.yaml index 7dd9a804..0fd105d9 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -52,12 +52,13 @@ current_status: summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Runtime status aggregates, global revisions, generic role/event authority, duplicate prompt-state cargo, and Epiphany-owned Rider/Unity organs are absent. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. Completed model-session tombstones retain only resurrection fences and an exact deletion digest. Archived worker attempts retain the exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records needed for audit. Mind/runtime writable epochs are v8/v18; archived-session schema is v1 and archived-worker-attempt schema/type is v2. Old writable stores refuse with no migrator or dual reader. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Runtime status aggregates, global revisions, generic role/event authority, duplicate prompt-state cargo, duplicate family launch bindings, and Epiphany-owned Rider/Unity organs are absent. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. Completed model-session tombstones retain only resurrection fences and an exact deletion digest. Archived worker attempts retain the exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records needed for audit. Mind/runtime writable epochs are v8/v19; archived-session schema is v1 and archived-worker-attempt schema/type is v2. Old writable stores refuse with no migrator or dual reader. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. atlas_authoring_cut: Exact ce306e23 preserves the complete inter-swarm Atlas vertical slice while deleting its duplicate local offer/claim authoring authority. Ordinary Modeling through RepoModel operations is the sole owner of provider offers and consumer claims; Atlas retains signed publication, trust, transport, deterministic projection, Soul verification, Self impact admission, Resident Self wake, brakes, and Eve lowering. Two direct write-intent types, their runtime commit APIs and registry entries, 518 planner lines, and two tests that animated only that duplicate path are gone. The runtime proof now creates offers/claims through RepoModel before proving exact verification admission and Body-drift refusal. The cut removes 593 net source lines; the three-repository direct/transitive Modeling proof passes. These are component proofs only: no live inter-swarm collaboration has yet run, so the Atlas vertical slice remains protected until Gate 1 exercises it end to end. Runtime writable epoch is v14. autonomous_proposal_binding_cut: Exact 5d507bfd reduces Self's autonomous Imagination-to-Modeling origin binding from a 22-field duplicate archive to six causal join fields: schema, exact direction-result identity, selected option ordinal, worker job identity, and exact worker-result/launch digests. Proposal identity and payload, direction request, runtime/thread, typed model projection, Body/domain binding, selected option content, and canonical Modeling-request identity are checked directly from their owning immutable documents. The atomic proposal plus binding plus Modeling-request commit and its broad keyed-lifecycle proof remain; 60 net source lines are gone. Runtime writable epoch is v15. hands_verification_derivation_cut: Exact 6ccc7dd2 deletes the 20-field transient Hands receipt-chain summary. The Hands commit owner now derives the exact Verification request directly from the persisted patch, command, and commit receipts plus the frontier authority; no copied schema, job, grant, command-output, Git, path, summary, or timestamp fields mediate that handoff. Atomic Hands-to-Verification admission and the concurrent Persona/Hands lifecycle proof remain. The cut removes 43 net source lines without adding state, schema, or tests. proposal_modeling_launch_authority_cut: Exact b0a4978d deletes the Proposal-Modeling launch-binding document family after exact 6831eb69 exposed that even its four-field form owned nothing. The immutable worker launch already carries the exact request reference, role, binding, job identity, and sealed typed document. Current-work, retry counting, fulfillment, archival, and coordinator actuation now consume that owner directly; the registry entry and operator JSON echo are gone. The keyed lifecycle, coordinator target, OpenAI runtime, and old-epoch refusal pass; 70 net source lines are gone. Runtime writable epoch is v17. planning_launch_authority_cut: Exact b55e96ea deletes both persisted Planning and PlanMind launch-binding families. Their twenty-four fields copied the immutable worker launch, typed requests, runtime job, timestamp, canonical attempt identity, or typed failure review without owning a consequence. Self now derives contiguous attempts and current jobs from family-referenced worker launches. A retry launch strongly reads every prior launch plus the exact failed result and review, so stale retry authority conflicts instead of being summarized into decorative cargo. The complete keyed Planning-to-PlanMind lifecycle, v17 refusal, packaged coordinator, and model-runtime checks pass; 44 net source lines are gone. Runtime writable epoch is v18. + remaining_launch_authority_cut: Exact 8dbfcf63 deletes the persisted Body Modeling, Imagination consideration, and Reorientation launch-binding families. Their attempt, request, role/binding, timestamp, Body/projection, and launch-digest fields were derivable from the immutable worker launch, typed family request/projection, runtime job/result, admission refusal, or typed pass failure. Canonical job identities own contiguous attempt order. Body retry CAS strongly reads prior launches, latest job, exact result, and matching refusal; Reorientation retry CAS strongly reads prior launches, latest job, typed failure, and exact terminal result; Imagination retry CAS strongly reads prior launches. Family semantic requests, sealed projections, result validation, substrate grants, typed failures, and Mind admission remain. Focused Body/Imagination lifecycle, Reorientation success/failure/retry, old-epoch refusal, coordinator, and OpenAI runtime checks pass; 24 net source lines are gone. Runtime writable epoch is v19. Model Atlas and its unrun inter-swarm path are untouched. supervisor_subtraction: Exact 856648de completes the supervisor deletion. Epiphany owns no local generic daemon supervisor, semantic projector service, workspace-coverage projector, Windows Task Scheduler integration, or service-policy/lifecycle/heartbeat/recovery mirror. Idunn on Yggdrasil owns source-triggered compilation, testing, packaging, deployment, signed health, and daemon survival. The canonical Epiphany brake gates Epiphany cognition and consequence authority, not Idunn startup or unrelated lifecycle. launch_dependency_cut: Exact 2aeab7a9 deletes the generic organ dependency matrix, generic receipt catalogue/proof profiles, persisted worker-launch cargo, Persona prompt injection, evaluator, and three self-certifying tests: 700 net lines. Family admission owners derive exact dependencies from typed state. Worker-launch schema v2 and Persona projector prompt v1 refuse the old writable shape. Core 378/378, OpenRouter runtime 27/27, packaged runtime 13/13, and Persona re-entry 1/1 pass. operator_surface_subtraction: Exact ef92e853 deletes the callerless view-lens registry, legacy acceptance-bundle builders, test-only raw-JSON result interpreters, and six tests: 797 net lines. Exact a292979d and 77e817c1 delete the duplicate CRRC recommendation algorithm, its unused input model, and four tests: 206 lines. Exact 3b94bf6e and 59c5e3a6 delete the nested duplicate status view, false auxiliary mode, and ignored status arguments. Exact 7c9b0cf3 deletes the fixed synthetic job table, role-board job cargo/mappers, and its test: 338 net lines. Exact 2ce91461 deletes the scene/planning Mind reconstructions, duplicate self-policy crate, unused prompt templates, four counterfeit schemas, and ten producer/source-text tests: 1,723 net lines. Exact 78836f3b deletes eight unconsumed status tableaux, the pressure calculator production only called without telemetry, its unreachable compaction action, one counterfeit schema, and six tests: 518 net lines. Exact f10f7fb3 deletes the final twelve epiphany.surface.* schemas and ten catalog entries after every one proved producerless and consumerless: 692 pure deletions. Exact ab3cacfb deletes thirty-one more producerless contracts, the false runtime-session mutation mouth, every Epiphany-owned Rider/Unity command schema, a callerless prompt-context module, its test-only specialist prompt system, and four self-affirming tests: 3,514 net lines. Exact 16d85b1b deletes six duplicate JSON-schema builder tests and two OpenAI-runtime self-source searches: 209 pure test-line deletions. Exact 06f93f70 deletes the test-only inverse OpenAI-to-native request mapper and makes two retained tests follow canonical native-to-provider derivation: sixty net lines. The local catalog now has twenty-three live or portable contracts. Brokkr owns Unity capabilities through CultMesh/Eve; a future Rider daemon owns Rider. Status retains Mind identity, exact current work, one action/reason decision, readable role lanes, and operator thought sealing. Core checks cleanly; retained provider and focused request-flow tests pass. @@ -119,10 +120,10 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,895 lines, 55 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Body Modeling, Imagination consideration, and Reorientation still persist family launch bindings beside the immutable worker launch and must prove unique authority or be deleted. Continue splitting only by deleting callerless or duplicate authority; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Continue the launch-authority deletion after exact b55e96ea. Audit Body Modeling, Imagination consideration, and Reorientation bindings against the immutable worker launch; delete every field and document family whose attempt, request, role, timestamp, projection, or failure ancestry is already derivable from the launch, runtime job/result, typed request, or admission refusal. Keep family-specific semantic requests and validation; do not create a generic registry or mutable role-lane owner. Preserve the unrun inter-swarm Atlas vertical slice and do not mistake component tests for acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,859 lines, 55 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. All persisted family launch-binding documents are gone; immutable worker launches plus typed family requests and receipts own launch ancestry. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Resume the public runtime-spine and test-liability audit after exact 8dbfcf63. Trace each remaining public surface and test to a live consumer and consequential invariant; delete duplicate summaries, wrappers, and implementation-spelling proofs, but preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. It exposes no aggregate status head, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, or public typed-fulfillment machinery. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Mind/runtime writable epochs are v8/v18, archived-session schema is v1, archived-worker-attempt schema/type is v2, and claim-obligation schema is v3. The spine is 9,895 lines with 55 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. It exposes no aggregate status head, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, or public typed-fulfillment machinery. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Mind/runtime writable epochs are v8/v19, archived-session schema is v1, archived-worker-attempt schema/type is v2, and claim-obligation schema is v3. The spine is 9,859 lines with 55 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. From 3ed1d5649fb7327ed2efed6627a1b1b49def662d Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 02:46:12 +0200 Subject: [PATCH 007/340] Delete duplicate frontier Modeling writer --- epiphany-core/src/lib.rs | 1 - epiphany-core/src/runtime_spine.rs | 40 ----- epiphany-openai-runtime/src/lib.rs | 242 +++++------------------------ 3 files changed, 39 insertions(+), 244 deletions(-) diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index 2d543236..05b56896 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -284,7 +284,6 @@ pub use runtime_spine::bind_runtime_to_swarm; pub use runtime_spine::canonical_repo_frontier_plan_candidate_id; pub use runtime_spine::claim_runtime_worker_process; pub use runtime_spine::close_runtime_session; -pub use runtime_spine::commit_repo_frontier_modeling_request; pub use runtime_spine::commit_repo_frontier_plan_decision; pub use runtime_spine::commit_repo_frontier_plan_mind_request; pub use runtime_spine::complete_runtime_job; diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index 6d027d0d..af2245c3 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -8131,46 +8131,6 @@ pub(crate) fn validate_repo_frontier_modeling_request( Ok(()) } -pub fn commit_repo_frontier_modeling_request( - store_path: impl AsRef, - verdict: &SoulVerdictReceipt, -) -> Result { - let store_path = store_path.as_ref(); - let mut cache = runtime_spine_cache(store_path)?; - cache.pull_all_backing_stores()?; - let persisted = cache - .get::(&verdict.receipt_id)? - .ok_or_else(|| anyhow!("frontier Modeling request requires its persisted Soul verdict"))?; - if persisted != *verdict { - return Err(anyhow!("frontier Modeling request Soul verdict changed")); - } - let request = derive_repo_frontier_modeling_request(&cache, verdict)?; - let request_id = request.request_id.clone(); - let (envelope, _) = cache.prepare_entry(&request_id, &request)?; - let verdict_envelope = cache - .get_envelope::(&verdict.receipt_id)? - .ok_or_else(|| anyhow!("frontier Modeling request lost its Soul verdict envelope"))?; - let frontier_envelope = cache - .get_envelope::(&request.frontier_item_id)? - .ok_or_else(|| anyhow!("frontier Modeling request lost its frontier envelope"))?; - let expected = vec![verdict_envelope, frontier_envelope]; - let mut writes = expected.clone(); - writes.push(envelope); - if SingleFileMessagePackBackingStore::new(store_path) - .compare_and_swap_batch(&expected, writes)? - { - return Ok(request); - } - let mut reloaded = runtime_spine_cache(store_path)?; - reloaded.pull_all_backing_stores()?; - match reloaded.get::(&request_id)? { - Some(existing) if existing == request => Ok(existing), - _ => Err(anyhow!( - "frontier Modeling request deterministic identity collision" - )), - } -} - fn derive_repo_frontier_verification_request_for_chain( cache: &CultCache, patch: &HandsPatchReceipt, diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index 43f99f41..a0b065fb 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -3600,180 +3600,26 @@ mod tests { epiphany_core::bind_runtime_to_swarm(&store, "swarm-test", "2026-08-08T00:00:00Z")?; epiphany_core::bind_repository_body(&repo, &body_store, &store, "workspace-test")?; let body_basis = epiphany_core::observe_runtime_repository_body_basis(&store)?; - let frontier_item = epiphany_core::RepoFrontierItem { - id: "frontier-1".to_string(), - migration_body: "runtime".to_string(), - question: "Did the verified consequence hold?".to_string(), - gap: "Awaiting verdict incorporation.".to_string(), - target_claim_ids: vec!["claim-1".to_string()], - repository_scope: vec!["epiphany-core".to_string()], - recommended_next_organ: "Hands".to_string(), - adopted_plan: None, - dependency_item_ids: Vec::new(), - status: epiphany_core::RepoFrontierStatus::Active, - evidence_refs: vec!["prior-evidence".to_string()], - public_source_refs: Vec::new(), - created_at: Some("2026-08-07T00:00:00Z".to_string()), - updated_at: Some("2026-08-07T00:00:00Z".to_string()), - retired_at: None, - superseded_by: None, - }; - let frontier_item_hash = format!( - "{:x}", - sha2::Sha256::digest(rmp_serde::to_vec_named(&frontier_item)?) - ); - let mut authority_cache = runtime_spine_cache(&store)?; - authority_cache.put( - &frontier_item.id, - &epiphany_core::EpiphanyRepoModelFrontierDocument::new(&frontier_item)?, - )?; - let frontier_version = epiphany_core::EpiphanyMindDocumentVersion::from_envelope( - "epiphany-mind", - &authority_cache - .get_envelope::( - &frontier_item.id, - )? - .expect("persisted frontier envelope"), - )?; - let route = epiphany_core::RepoFrontierRoute { - schema_version: epiphany_core::REPO_FRONTIER_ROUTE_SCHEMA_VERSION.into(), - route_id: "route-1".into(), - next_organ: epiphany_core::RepoFrontierNextOrgan::Hands, - model_projection_digest: "model-projection".into(), - model_source_documents: vec![frontier_version], - frontier_item_id: frontier_item.id.clone(), - frontier_item_hash, - migration_body: frontier_item.migration_body.clone(), - question: frontier_item.question.clone(), - gap: frontier_item.gap.clone(), - target_claim_ids: frontier_item.target_claim_ids.clone(), - authorized_paths: frontier_item.repository_scope.clone(), - adopted_plan: frontier_item.adopted_plan.clone(), - selected_at: "2026-08-08T00:00:00Z".into(), - contract: epiphany_core::REPO_FRONTIER_ROUTE_CONTRACT.into(), - }; - let verification_request = epiphany_core::RepoFrontierVerificationRequest { - schema_version: epiphany_core::REPO_FRONTIER_VERIFICATION_REQUEST_SCHEMA_VERSION.into(), - request_id: "verification-request-1".into(), - route_id: route.route_id.clone(), - model_projection_digest: route.model_projection_digest.clone(), - model_source_documents: route.model_source_documents.clone(), - frontier_item_id: route.frontier_item_id.clone(), - frontier_item_hash: route.frontier_item_hash.clone(), - hands_intent_id: "hands-intent-1".into(), - hands_review_id: "hands-review-1".into(), - hands_patch_receipt_id: "hands-patch-1".into(), - hands_command_receipt_id: "hands-command-1".into(), - hands_commit_receipt_id: "hands-commit-1".into(), - requested_at: "2026-08-08T00:00:00Z".into(), - contract: epiphany_core::REPO_FRONTIER_VERIFICATION_REQUEST_CONTRACT.into(), - frontier_authority_documents: route.model_source_documents.clone(), - }; - let verification_result = EpiphanyRuntimeRoleWorkerResult { - schema_version: epiphany_core::RUNTIME_ROLE_WORKER_RESULT_SCHEMA_VERSION.into(), - result_id: "verification-result-1".into(), - job_id: "verification-job-1".into(), - role_id: "verification".into(), - verdict: "pass".into(), - summary: "verified".into(), - next_safe_move: "incorporate".into(), - checkpoint_summary: None, - scratch_summary: None, - files_inspected: Vec::new(), - frontier_node_ids: vec![frontier_item.id.clone()], - evidence_ids: Vec::new(), - artifact_refs: Vec::new(), - open_questions: Vec::new(), - evidence_gaps: Vec::new(), - risks: Vec::new(), - research_decision_msgpack: None, - item_error: None, - metadata: Default::default(), - repo_model_mutation_proposal_msgpack: None, - verification_request_id: Some(verification_request.request_id.clone()), - frontier_route_id: Some(route.route_id.clone()), - repo_frontier_modeling_request_id: None, - proposal_modeling_request_id: None, - repo_frontier_research_request_id: None, - frontier_planning_request_id: None, - frontier_plan_candidate_msgpack: None, - frontier_plan_mind_request_id: None, - frontier_plan_mind_decision_msgpack: None, - repository_body_observation_basis: None, - imagination_consideration_request_id: None, - imagination_consideration_candidate_msgpack: None, - admitted_model_direction_consideration_request_id: None, - admitted_model_direction_consideration_result_msgpack: None, - decision_context_id: "verification-context-1".into(), - }; - let soul_verdict = epiphany_core::SoulVerdictReceipt { - schema_version: epiphany_core::SOUL_VERDICT_RECEIPT_SCHEMA_VERSION.into(), - receipt_id: "soul-verdict-1".into(), - source_result_id: verification_result.result_id.clone(), - source_job_id: verification_result.job_id.clone(), - verdict: verification_result.verdict.clone(), - summary: verification_result.summary.clone(), - evidence_ids: verification_result.evidence_ids.clone(), - risks: verification_result.risks.clone(), - emitted_at: "2026-08-08T00:00:00Z".into(), - contract: "test Soul verdict".into(), - verification_request_id: verification_request.request_id.clone(), - frontier_route_id: route.route_id.clone(), - }; - authority_cache.put(&route.route_id, &route)?; - authority_cache.put(&verification_request.request_id, &verification_request)?; - authority_cache.put(&verification_result.job_id, &verification_result)?; - authority_cache.put(&soul_verdict.receipt_id, &soul_verdict)?; - let frontier_request = - epiphany_core::commit_repo_frontier_modeling_request(&store, &soul_verdict)?; - seed_test_runtime_job( + epiphany_core::initialize_keyed_repo_model( &store, - RuntimeSpineHeartbeatJobOptions { - runtime_id: "epiphany-test".to_string(), - session_id: "epiphany-main".to_string(), - objective: "Run typed worker.".to_string(), - coordinator_note: "test".to_string(), - job_id: "worker-job-1".to_string(), - role: epiphany_core::EPIPHANY_MODELING_OWNER_ROLE.to_string(), - binding_id: "modeling-checkpoint-worker".to_string(), - authority_scope: "epiphany.role.modeling".to_string(), - instruction: "Return the required role-result JSON.".to_string(), - launch_document: EpiphanyWorkerLaunchDocument::Role( - epiphany_core::EpiphanyRoleWorkerLaunchDocument { - thread_id: "thread-1".to_string(), - role_id: "modeling".to_string(), - objective: Some("Map the machine.".to_string()), - dynamic_prompt_context: None, - repository_body_observation_basis: Some(body_basis.clone()), - proposal_modeling_context: None, - frontier_verdict_modeling_context: Some( - epiphany_core::RepoFrontierVerdictModelingLaunchAuthority { - request: frontier_request.clone(), - frontier_item: frontier_item.clone(), - soul_verdict: soul_verdict.clone(), - }, - ), - frontier_planning_context: None, - frontier_research_context: None, - frontier_verification_context: None, - frontier_plan_mind_context: None, - imagination_consideration_context: None, - admitted_model_direction_consideration_context: None, - }, - ), - output_contract_id: epiphany_core::ROLE_WORKER_OUTPUT_CONTRACT_ID.to_string(), - proposal_modeling_request_id: None, - frontier_planning_request_id: None, - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: Some(frontier_request.request_id.clone()), - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, - created_at: now(), - }, + &epiphany_core::EpiphanyRepoModelSeed::new( + "body-seed", + "body-graph", + "swarm-test", + "workspace-test", + body_basis.body_binding_sha256.clone(), + epiphany_core::EpiphanyRepoModelSeedDocuments { + domains: Vec::new(), + nodes: Vec::new(), + edges: Vec::new(), + frontier: Vec::new(), + }, + )?, + "2026-08-08T00:00:01Z", )?; - let launch_request = load_worker_launch_request(&store, "worker-job-1")?; + let worker_job_id = + epiphany_core::launch_current_body_modeling_work(&store, "2026-08-08T00:00:02Z")?; + let launch_request = load_worker_launch_request(&store, &worker_job_id)?; let reasoning_basis = epiphany_core::worker_reasoning_basis(&store, &launch_request)?; epiphany_core::put_reasoning_basis(&store, &reasoning_basis)?; let model_request = build_worker_model_request( @@ -3813,7 +3659,7 @@ mod tests { assert!( output_schema_value["properties"] .get("frontierVerdictGap") - .is_some() + .is_none() ); assert!( output_schema_value["properties"] @@ -3823,12 +3669,11 @@ mod tests { assert!( output_schema_value["properties"] .get("repoModelOperations") - .is_none() + .is_some() ); - assert!(!output_schema.contains(&frontier_request.request_id)); assert!(!output_schema.contains("incorporate_frontier_verdict")); assert!(!model_request.instructions.contains("Output schema JSON")); - assert!(model_request.instructions.contains("frontierVerdictGap")); + assert!(model_request.instructions.contains("repoModelOperations")); assert!( model_request .instructions @@ -3844,16 +3689,13 @@ mod tests { let epiphany_core::EpiphanyReasoningProjection::RolePass(sealed_projection) = reasoning_basis.projection()? else { - panic!("frontier verdict Modeling must seal a role projection") + panic!("Body Modeling must seal a role projection") }; - assert_eq!( + assert!( sealed_projection .authority .frontier_verdict_modeling_context - .as_ref() - .expect("sealed frontier verdict authority") - .frontier_item, - frontier_item + .is_none() ); let sealed_body = sealed_projection .modeling_body @@ -3923,7 +3765,7 @@ mod tests { "provider_or_transport_failure" ); assert!( - epiphany_core::runtime_role_worker_result(&provider_failure_store, "worker-job-1")? + epiphany_core::runtime_role_worker_result(&provider_failure_store, &worker_job_id)? .is_none() ); @@ -3953,7 +3795,7 @@ mod tests { "output_contract_failure" ); assert!( - epiphany_core::runtime_role_worker_result(&contract_failure_store, "worker-job-1")? + epiphany_core::runtime_role_worker_result(&contract_failure_store, &worker_job_id)? .is_none() ); @@ -3971,14 +3813,14 @@ mod tests { }; let assistant_text = serde_json::json!({ "roleId": "modeling", - "verdict": "checkpoint-update-needed", + "verdict": "checkpoint-ready", "summary": "Mapped.", - "nextSafeMove": "Review the runtime-owned verdict mutation.", + "nextSafeMove": "Review the runtime-owned Body model.", "filesInspected": ["src/lib.rs"], - "frontierNodeIds": ["frontier-1"], - "evidenceIds": ["soul-verdict-1"], + "frontierNodeIds": [], + "evidenceIds": ["body-evidence"], "artifactRefs": ["artifact:model"], - "frontierVerdictGap": "Soul verified the consequence; close the exact frontier." + "repoModelOperations": [] }) .to_string(); let result = complete_worker_job_from_assistant_text( @@ -3989,33 +3831,27 @@ mod tests { &assistant_text, )?; - assert_eq!(result.job_id, "worker-job-1"); - assert_eq!(result.verdict, "checkpoint-update-needed"); + assert_eq!(result.job_id, worker_job_id); + assert_eq!(result.verdict, "checkpoint-ready"); assert_eq!(result.summary, "Mapped."); assert_eq!( result.next_safe_move, - "Review the runtime-owned verdict mutation." + "Review the runtime-owned Body model." ); let runtime_evidence_id = format!("openai-request:{}", model_request.request_id); assert!(result.evidence_refs.contains(&runtime_evidence_id)); - let typed_result = epiphany_core::runtime_role_worker_result(&store, "worker-job-1")? + let typed_result = epiphany_core::runtime_role_worker_result(&store, &worker_job_id)? .expect("typed role worker result"); - assert_eq!(typed_result.verdict, "checkpoint-update-needed"); + assert_eq!(typed_result.verdict, "checkpoint-ready"); assert_eq!(typed_result.files_inspected, vec!["src/lib.rs".to_string()]); assert_eq!( typed_result.evidence_ids, - vec![runtime_evidence_id, "soul-verdict-1".to_string()] + vec!["body-evidence".to_string(), runtime_evidence_id] ); assert_eq!(typed_result.artifact_refs, result.artifact_refs); - assert_eq!( - typed_result - .repo_model_mutation_proposal()? - .expect("repo model mutation proposal") - .proposal_id, - "repo-model-mutation-proposal-worker-job-1" - ); + assert!(typed_result.repo_model_mutation_proposal()?.is_none()); assert!( - runtime_job_snapshot(&store, "worker-job-1")? + runtime_job_snapshot(&store, &worker_job_id)? .expect("snapshot") .result .is_some() From 5a9f6593c7c8bb5d1fc0210dbce60f7f6f76bf83 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 02:47:42 +0200 Subject: [PATCH 008/340] docs: Record atomic Verification ownership --- notes/epiphany-current-algorithmic-map.md | 14 +++++++++++-- notes/epiphany-fork-implementation-plan.md | 7 +++++++ notes/fresh-workspace-handoff.md | 22 ++++++++++++++++++--- state/ledgers.msgpack | Bin 696270 -> 697114 bytes state/map.yaml | 7 ++++--- 5 files changed, 42 insertions(+), 8 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 1ecd2c57..b9b003a6 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `8dbfcf63` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for the final duplicate launch-binding deletion; +Latest committed implementation cut: `3ed1d564` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for duplicate frontier-Modeling writer deletion; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -241,6 +241,16 @@ typed failures, and Mind admission remain with their existing owners. Runtime writable state is v19. This cut does not touch Model Atlas or narrow the still- unrun inter-swarm path. +Verdict-driven Modeling has one writer. Exact `3ed1d564` deletes the public +`commit_repo_frontier_modeling_request` API that production never called. +Accepted Verification already commits its audit, Soul verdict, and canonical +frontier-Modeling request atomically through the Mind owner; the deleted API +reopened the store and offered a second mutation path solely for one OpenAI +test fixture. That test now launches ordinary Body Modeling through current +work and still proves exact sealed input, structured completion, typed result +and job terminality, provider failure, and output-contract failure. Its +fabricated frontier, route, Verification, and Soul tableau is gone. + Bifrost owns its private feedback-signing identity. Exact `94098223` deletes Epiphany's host-identity executable and the private signer, persisted identity, enrollment, platform protection, and anchor-export implementation behind it. diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index b51c268d..4ea1273b 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -362,6 +362,13 @@ Cut in this order: grants, typed failures, and refusal/retry invariants remain family-owned. Runtime writable state advances to v19. Model Atlas and the unrun inter-swarm collaboration path are unchanged. + Exact `3ed1d564` then deletes the standalone public writer for the derived + frontier-Modeling request. Accepted Verification is the sole writer and + atomically commits its audit, Soul verdict, and request. The deleted path had + no production caller and survived only because an OpenAI test fabricated a + parallel Verification/Soul tableau; that test now uses ordinary Body + Modeling while preserving provider, contract, structured-result, and job- + terminality proofs. 12. **Landed at `1662a012`, `07d891ba`, and `ec1431ff`:** coordinator policy now projects keyed current work; persisted `EpiphanyThreadStateEntry`, `coordinator_state_transaction`, generic coordinator services, the diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index be397bfd..486d446e 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `8dbfcf63` -Current worktree: documentation/evidence for the final duplicate launch-binding deletion; +Latest committed implementation cut: `3ed1d564` +Current worktree: documentation/evidence for duplicate frontier-Modeling writer deletion; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `8dbfcf63` is the current +production symlink body and is inactive. Exact `3ed1d564` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,22 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `3ed1d564` deletes the public +`commit_repo_frontier_modeling_request` mutation path. Production had no +caller: accepted Verification already atomically commits its audit, Soul +verdict, and derived frontier-Modeling request through one Mind transaction. +The deleted writer reopened the store and existed only to feed an OpenAI test. +That test now uses the real Body Modeling launcher and retains its consequential +proofs for sealed input, structured completion, typed result/job persistence, +provider failure, and output-contract failure. Its fabricated frontier, route, +Verification result, and Soul verdict are gone. The cut removes 205 net source +lines; `runtime_spine.rs` is 9,819 lines with 54 public functions. The atomic +Verification-to-Modeling lifecycle and release-owned model runtime pass. + +Continue auditing public runtime-spine mutation/read wrappers and tests against +real consumers and consequences. Preserve the unrun Atlas inter-swarm vertical +slice until Gate 1. + Exact `8dbfcf63` deletes the persisted Body Modeling, Imagination consideration, and Reorientation launch-binding families. Their attempt, request, role, binding, timestamp, Body/projection, and launch-digest fields duplicated the diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index acb3f97d06847c58e6933a97a2df1a6394e390cf..9d45f0ca02aff6fd286de38bbef52ccbc4d00b61 100644 GIT binary patch delta 868 zcmYk4yKYlK5QcFAAvhHh5-C6$i7xUj#K@UI<1iqX03>_7i}GrxZBe7fBEx?S1obPw8{H1Mi?NG*=1A7W%rZNt-k|b?Ws4#F`+ClED35wmIu*g(qgx{x; zeW1hsQH@ma#FNsxP$OY7+Jz#rpl5T+#n34!0%x?6DVom4z|Gg}RG!Y1HO*HxYRc6l zM8_mz7+a^pv_XAmvnW#v89rl2QfLjaWc3^=><&ms$z`f=U6F)#EVAjG%*MT0N?(+K zM5fStGAf0!1_n_0s>Ay6Rfn|dP#Lm@=~y8@IAJ`%!Ayfrp!l+6b9j_kl>nGLf?^v@R{f)#0)+ z5p01axX!a4?0-61 Date: Mon, 24 Aug 2026 03:15:12 +0200 Subject: [PATCH 009/340] Minimize coordinator terminal receipts --- .../src/bin/epiphany-mvp-coordinator.rs | 49 ++----------------- epiphany-core/src/runtime_spine.rs | 42 ++++++---------- ...iphany.coordinator-run-receipt.schema.json | 30 +++++------- schemas/cultnet/index.json | 4 +- 4 files changed, 33 insertions(+), 92 deletions(-) diff --git a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs index 4264ecf1..a7eb507a 100644 --- a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs +++ b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs @@ -246,6 +246,9 @@ impl Args { "coordinator requires exact --runtime-id for local Verse authority" )); } + if !matches!(parsed.mode.as_str(), "plan" | "execute") { + return Err(anyhow!("--mode must be plan or execute")); + } if parsed.required_action.is_some() && (parsed.mode != "execute" || parsed.max_steps != 1) { return Err(anyhow!( "--required-action requires execute mode with exactly one step" @@ -1324,7 +1327,6 @@ fn run_coordinator(args: &Args) -> Result { "coordinator-final-action.txt".to_string(), "agent-function-telemetry.json".to_string(), ]; - let sealed_artifact_manifest = Vec::new(); let receipt_created_at = now(); let coordinator_run_receipt = EpiphanyCoordinatorRunReceipt { schema_version: COORDINATOR_RUN_RECEIPT_SCHEMA_VERSION.to_string(), @@ -1339,30 +1341,7 @@ fn run_coordinator(args: &Args) -> Result { status: coordinator_receipt_status(&args.mode, &final_action), final_action: final_action_name(&final_action), final_reason: final_action_reason(&final_action), - step_count: operator_steps - .as_array() - .map_or(0, |items| items.len() as u64), created_at: receipt_created_at, - model_provider: Some(args.model_provider.clone()), - runtime_store: runtime_store.display().to_string(), - artifact_refs: artifact_manifest.clone(), - sealed_artifact_refs: sealed_artifact_manifest.clone(), - metadata: BTreeMap::from([ - ( - "artifactDir".to_string(), - artifact_dir.display().to_string(), - ), - ( - "modelRuntimeBin".to_string(), - model_runtime_bin.display().to_string(), - ), - ( - "toolAdapterBin".to_string(), - tool_adapter_bin.display().to_string(), - ), - ("mcpConfig".to_string(), mcp_config.display().to_string()), - ("autoTools".to_string(), args.auto_tools.to_string()), - ]), resident_grant_id: args.resident_binding.get("grant-id").cloned(), resident_launch_digest: args.resident_binding.get("launch-digest").cloned(), resident_policy_digest: args.resident_binding.get("policy-digest").cloned(), @@ -1374,7 +1353,6 @@ fn run_coordinator(args: &Args) -> Result { .get("release-manifest-digest") .cloned(), resident_executable_digest: args.resident_binding.get("executable-digest").cloned(), - final_runtime_job_id: final_action["runtimeJobId"].as_str().map(str::to_string), }; finalize_coordinator_run(&runtime_store, &coordinator_run_receipt)?; let summary = json!({ @@ -1401,7 +1379,6 @@ fn run_coordinator(args: &Args) -> Result { "store": runtime_store, }, "artifactManifest": artifact_manifest, - "sealedArtifactManifest": [] }); write_json(&artifact_dir.join("coordinator-summary.json"), &summary)?; write_json( @@ -1433,13 +1410,8 @@ fn run_coordinator(args: &Args) -> Result { match run_result { Ok(summary) => Ok(summary), Err(run_error) => { - let failure_receipt = failed_coordinator_run_receipt( - args, - &runtime_session_id, - &thread_id, - &runtime_store, - &run_error, - ); + let failure_receipt = + failed_coordinator_run_receipt(args, &runtime_session_id, &thread_id, &run_error); match finalize_coordinator_run(&runtime_store, &failure_receipt) { Ok(_) => Err(anyhow!( "coordinator run failed after opening and was terminalized by receipt {:?}: {run_error:#}", @@ -1457,7 +1429,6 @@ fn failed_coordinator_run_receipt( args: &Args, session_id: &str, thread_id: &str, - runtime_store: &Path, error: &anyhow::Error, ) -> EpiphanyCoordinatorRunReceipt { let created_at = now(); @@ -1474,16 +1445,7 @@ fn failed_coordinator_run_receipt( status: "failed".to_string(), final_action: "failed".to_string(), final_reason: Some(format!("{error:#}")), - step_count: 0, created_at, - model_provider: Some(args.model_provider.clone()), - runtime_store: runtime_store.display().to_string(), - artifact_refs: Vec::new(), - sealed_artifact_refs: Vec::new(), - metadata: BTreeMap::from([( - "terminalizationOwner".to_string(), - "epiphany-mvp-coordinator-error-boundary".to_string(), - )]), resident_grant_id: args.resident_binding.get("grant-id").cloned(), resident_launch_digest: args.resident_binding.get("launch-digest").cloned(), resident_policy_digest: args.resident_binding.get("policy-digest").cloned(), @@ -1495,7 +1457,6 @@ fn failed_coordinator_run_receipt( .get("release-manifest-digest") .cloned(), resident_executable_digest: args.resident_binding.get("executable-digest").cloned(), - final_runtime_job_id: None, } } diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index af2245c3..20949330 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -84,11 +84,11 @@ pub const ARCHIVED_RUNTIME_WORKER_ATTEMPT_TYPE: &str = pub const RUNTIME_ROLE_WORKER_RESULT_TYPE: &str = "epiphany.runtime.role_worker_result"; pub const RUNTIME_REORIENT_WORKER_RESULT_TYPE: &str = "epiphany.runtime.reorient_worker_result"; pub const RUNTIME_JOB_RESULT_TYPE: &str = "epiphany.runtime.job_result"; -pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt.v0"; +pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt.v1"; pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v19"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v20"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; pub const RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.model_execution_binding.v0"; @@ -105,7 +105,7 @@ pub const RUNTIME_ROLE_WORKER_RESULT_SCHEMA_VERSION: &str = "epiphany.runtime.role_worker_result.v4"; pub const RUNTIME_REORIENT_WORKER_RESULT_SCHEMA_VERSION: &str = "epiphany.runtime.reorient_worker_result.v0"; -pub const COORDINATOR_RUN_RECEIPT_SCHEMA_VERSION: &str = "epiphany.coordinator_run_receipt.v0"; +pub const COORDINATOR_RUN_RECEIPT_SCHEMA_VERSION: &str = "epiphany.coordinator_run_receipt.v1"; #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache(type = "epiphany.runtime.identity", schema = "EpiphanyRuntimeIdentity")] pub struct EpiphanyRuntimeIdentity { @@ -661,7 +661,7 @@ pub struct EpiphanyRuntimeJobResult { #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache( - type = "epiphany.coordinator_run_receipt.v0", + type = "epiphany.coordinator_run_receipt.v1", schema = "EpiphanyCoordinatorRunReceipt" )] pub struct EpiphanyCoordinatorRunReceipt { @@ -682,37 +682,23 @@ pub struct EpiphanyCoordinatorRunReceipt { #[cultcache(key = 7, default)] pub final_reason: Option, #[cultcache(key = 8)] - pub step_count: u64, - #[cultcache(key = 9)] pub created_at: String, - #[cultcache(key = 10, default)] - pub model_provider: Option, - #[cultcache(key = 11, default)] - pub runtime_store: String, - #[cultcache(key = 12, default)] - pub artifact_refs: Vec, - #[cultcache(key = 13, default)] - pub sealed_artifact_refs: Vec, - #[cultcache(key = 14, default)] - pub metadata: BTreeMap, - #[cultcache(key = 15, default)] + #[cultcache(key = 9, default)] pub resident_grant_id: Option, - #[cultcache(key = 16, default)] + #[cultcache(key = 10, default)] pub resident_launch_digest: Option, - #[cultcache(key = 17, default)] + #[cultcache(key = 11, default)] pub resident_policy_digest: Option, - #[cultcache(key = 18, default)] + #[cultcache(key = 12, default)] pub resident_argv_digest: Option, - #[cultcache(key = 19, default)] + #[cultcache(key = 13, default)] pub resident_objective_digest: Option, - #[cultcache(key = 20, default)] + #[cultcache(key = 14, default)] pub resident_release_commit: Option, - #[cultcache(key = 21, default)] + #[cultcache(key = 15, default)] pub resident_release_manifest_digest: Option, - #[cultcache(key = 22, default)] + #[cultcache(key = 16, default)] pub resident_executable_digest: Option, - #[cultcache(key = 23, default)] - pub final_runtime_job_id: Option, } #[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] @@ -8511,7 +8497,9 @@ fn validate_coordinator_run_receipt(receipt: &EpiphanyCoordinatorRunReceipt) -> validate_non_empty(&receipt.receipt_id, "coordinator run receipt id")?; validate_non_empty(&receipt.session_id, "coordinator run receipt session id")?; validate_non_empty(&receipt.thread_id, "coordinator run receipt thread id")?; - validate_non_empty(&receipt.mode, "coordinator run receipt mode")?; + if !matches!(receipt.mode.as_str(), "plan" | "execute") { + return Err(anyhow!("coordinator run receipt mode is invalid")); + } validate_non_empty(&receipt.status, "coordinator run receipt status")?; validate_non_empty( &receipt.final_action, diff --git a/schemas/cultnet/epiphany.coordinator-run-receipt.schema.json b/schemas/cultnet/epiphany.coordinator-run-receipt.schema.json index 96a6155a..00f061b5 100644 --- a/schemas/cultnet/epiphany.coordinator-run-receipt.schema.json +++ b/schemas/cultnet/epiphany.coordinator-run-receipt.schema.json @@ -2,7 +2,7 @@ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.coordinator-run-receipt.schema.json", "title": "Epiphany Coordinator Run Receipt", - "description": "Typed receipt emitted by the local coordinator after a plan/run/smoke pass. Artifact JSON may display the same facts, but this document is the durable coordinator decision receipt.", + "description": "Typed terminal decision and exact resident-launch provenance emitted by the local coordinator. Operator artifacts remain non-authoritative projections.", "type": "object", "required": [ "schema_version", @@ -12,34 +12,26 @@ "mode", "status", "final_action", - "step_count", "created_at" ], "properties": { - "schema_version": { "const": "epiphany.coordinator_run_receipt.v0" }, + "schema_version": { "const": "epiphany.coordinator_run_receipt.v1" }, "receipt_id": { "type": "string" }, "session_id": { "type": "string" }, "thread_id": { "type": "string" }, - "mode": { "enum": ["plan", "run", "smoke", "status"] }, + "mode": { "enum": ["plan", "execute"] }, "status": { "type": "string" }, "final_action": { "type": "string" }, "final_reason": { "type": ["string", "null"] }, - "step_count": { "type": "integer", "minimum": 0 }, "created_at": { "type": "string" }, - "model_provider": { "type": ["string", "null"] }, - "runtime_store": { "type": "string" }, - "artifact_refs": { - "type": "array", - "items": { "type": "string" } - }, - "sealed_artifact_refs": { - "type": "array", - "items": { "type": "string" } - }, - "metadata": { - "type": "object", - "additionalProperties": { "type": "string" } - } + "resident_grant_id": { "type": ["string", "null"] }, + "resident_launch_digest": { "type": ["string", "null"] }, + "resident_policy_digest": { "type": ["string", "null"] }, + "resident_argv_digest": { "type": ["string", "null"] }, + "resident_objective_digest": { "type": ["string", "null"] }, + "resident_release_commit": { "type": ["string", "null"] }, + "resident_release_manifest_digest": { "type": ["string", "null"] }, + "resident_executable_digest": { "type": ["string", "null"] } }, "additionalProperties": false } diff --git a/schemas/cultnet/index.json b/schemas/cultnet/index.json index 1402d915..8c970c99 100644 --- a/schemas/cultnet/index.json +++ b/schemas/cultnet/index.json @@ -95,8 +95,8 @@ "wireContracts": [ "cultnet.schema.v0" ], - "schemaVersion": "epiphany.coordinator_run_receipt.v0", - "documentType": "epiphany.coordinator_run_receipt.v0", + "schemaVersion": "epiphany.coordinator_run_receipt.v1", + "documentType": "epiphany.coordinator_run_receipt.v1", "title": "Epiphany Coordinator Run Receipt", "path": "epiphany.coordinator-run-receipt.schema.json" }, From 247271b4cc1962bf58a92185fc4f16b968013cc5 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 03:17:54 +0200 Subject: [PATCH 010/340] docs: Record minimal coordinator terminal state --- notes/epiphany-current-algorithmic-map.md | 15 ++++++++++++-- notes/epiphany-fork-implementation-plan.md | 6 ++++++ notes/fresh-workspace-handoff.md | 22 +++++++++++++++++---- state/ledgers.msgpack | Bin 697114 -> 697906 bytes state/map.yaml | 9 +++++---- 5 files changed, 42 insertions(+), 10 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index b9b003a6..1fff6e3c 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `3ed1d564` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for duplicate frontier-Modeling writer deletion; +Latest committed implementation cut: `63d2991e` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for coordinator terminal-receipt minimization; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -251,6 +251,17 @@ work and still proves exact sealed input, structured completion, typed result and job terminality, provider failure, and output-contract failure. Its fabricated frontier, route, Verification, and Soul tableau is gone. +Coordinator terminal state is not an artifact catalogue. Exact `63d2991e` +advances the receipt to v1 and removes its unread step count, model-provider +echo, runtime-store path, artifact and sealed-artifact lists, arbitrary +metadata, and final-job echo. The receipt retains its terminal status/action/ +reason, time, session/thread identity, plan-or-execute mode, and the exact +resident grant, launch, policy, argv, objective, release, manifest, and +executable provenance continuity authenticates. Operator artifacts remain in +the operator summary only. The published JSON schema now matches the Rust +contract instead of rejecting the live resident fields it omitted. Runtime +writable state is v20. + Bifrost owns its private feedback-signing identity. Exact `94098223` deletes Epiphany's host-identity executable and the private signer, persisted identity, enrollment, platform protection, and anchor-export implementation behind it. diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 4ea1273b..79ab5560 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -369,6 +369,12 @@ Cut in this order: parallel Verification/Soul tableau; that test now uses ordinary Body Modeling while preserving provider, contract, structured-result, and job- terminality proofs. + Exact `63d2991e` then reduces the coordinator terminal receipt to the + terminal Self decision and exact resident-launch provenance continuity + consumes. Operator artifact inventory, provider/store echoes, arbitrary + metadata, step count, and final-job echo stay in their existing owners or + disappear when unread. Receipt/schema version is v1 and runtime writable + state is v20; the published schema now describes the live resident fields. 12. **Landed at `1662a012`, `07d891ba`, and `ec1431ff`:** coordinator policy now projects keyed current work; persisted `EpiphanyThreadStateEntry`, `coordinator_state_transaction`, generic coordinator services, the diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 486d446e..e3bf5c27 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `3ed1d564` -Current worktree: documentation/evidence for duplicate frontier-Modeling writer deletion; +Latest committed implementation cut: `63d2991e` +Current worktree: documentation/evidence for coordinator terminal-receipt minimization; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `3ed1d564` is the current +production symlink body and is inactive. Exact `63d2991e` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,20 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `63d2991e` reduces `EpiphanyCoordinatorRunReceipt` v1 to its terminal +Self decision, timestamp, session/thread identity, plan-or-execute mode, and +exact resident grant/launch/policy/argv/objective/release/manifest/executable +provenance. Step count, provider echo, store path, artifact lists, arbitrary +metadata, and final-job echo had no reader and are gone. Operator artifacts +remain in the non-authoritative summary. The published JSON schema now matches +the Rust receipt; its previous `additionalProperties: false` contract omitted +the live resident fields. Runtime writable state advances to v20. JSON schemas +parse; core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass. The +cut removes 59 maintained lines and leaves `runtime_spine.rs` at 9,807 lines. + +Continue the runtime-spine/test-liability audit. Model Atlas remains protected +for its first live inter-swarm collaboration trial. + Exact `3ed1d564` deletes the public `commit_repo_frontier_modeling_request` mutation path. Production had no caller: accepted Verification already atomically commits its audit, Soul @@ -54,7 +68,7 @@ That test now uses the real Body Modeling launcher and retains its consequential proofs for sealed input, structured completion, typed result/job persistence, provider failure, and output-contract failure. Its fabricated frontier, route, Verification result, and Soul verdict are gone. The cut removes 205 net source -lines; `runtime_spine.rs` is 9,819 lines with 54 public functions. The atomic +lines; `runtime_spine.rs` reached 9,819 lines with 54 public functions. The atomic Verification-to-Modeling lifecycle and release-owned model runtime pass. Continue auditing public runtime-spine mutation/read wrappers and tests against diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 9d45f0ca02aff6fd286de38bbef52ccbc4d00b61..bab235856a9eac1de13c9c59c5071614ab9b4cca 100644 GIT binary patch delta 787 zcmYjOy>1gh5XK=S*nnsvBnqTKbkW%t8ym%;qM)GwDNaQ<-W}&Q?Cl=Ab52a-0wHP& z%Mt}bNc0E_-XK*Tgjb+r*5A`{h>SM)#mQIOy#^Kfl!aeDmAA z#>+shklvRCn}REXEy1?ns-XFOvC(?-aoN0RUfb>;?WIl2{KMv*+dm$k zp<;M&U-yQ?E>z)rkVNJaKJEwk{C5IuH{cw2?XH~*XnZS~$~U6h1A& znREw^3IbnIK#}o}|BoNJR-$ncyt6Yf4h%<_JMY?9bK!$wOgTWT%Tg4r*H!gcv=*e{ z$>`Zrh^mk!qTv)uWci4|LTb}Jo>ejyewUfVDeI-GRV%64%Ax~Nw$4?Ol!WfQO6j#7JlEX%vi|C=+HcsseLLFBM^gVW*}w(Vpbq# T17da{<^W>O?Ngb!S{DESo+B5T diff --git a/state/map.yaml b/state/map.yaml index e5e47b8f..92df0064 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -52,7 +52,7 @@ current_status: summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Runtime status aggregates, global revisions, generic role/event authority, duplicate prompt-state cargo, duplicate family launch bindings, and Epiphany-owned Rider/Unity organs are absent. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. Completed model-session tombstones retain only resurrection fences and an exact deletion digest. Archived worker attempts retain the exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records needed for audit. Mind/runtime writable epochs are v8/v19; archived-session schema is v1 and archived-worker-attempt schema/type is v2. Old writable stores refuse with no migrator or dual reader. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Runtime status aggregates, global revisions, generic role/event authority, duplicate prompt-state cargo, duplicate family launch bindings, and Epiphany-owned Rider/Unity organs are absent. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. Completed model-session tombstones retain only resurrection fences and an exact deletion digest. Archived worker attempts retain the exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records needed for audit. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v20; archived-session schema is v1, archived-worker-attempt schema/type is v2, and coordinator-run-receipt schema/type is v1. Old writable stores refuse with no migrator or dual reader. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. atlas_authoring_cut: Exact ce306e23 preserves the complete inter-swarm Atlas vertical slice while deleting its duplicate local offer/claim authoring authority. Ordinary Modeling through RepoModel operations is the sole owner of provider offers and consumer claims; Atlas retains signed publication, trust, transport, deterministic projection, Soul verification, Self impact admission, Resident Self wake, brakes, and Eve lowering. Two direct write-intent types, their runtime commit APIs and registry entries, 518 planner lines, and two tests that animated only that duplicate path are gone. The runtime proof now creates offers/claims through RepoModel before proving exact verification admission and Body-drift refusal. The cut removes 593 net source lines; the three-repository direct/transitive Modeling proof passes. These are component proofs only: no live inter-swarm collaboration has yet run, so the Atlas vertical slice remains protected until Gate 1 exercises it end to end. Runtime writable epoch is v14. autonomous_proposal_binding_cut: Exact 5d507bfd reduces Self's autonomous Imagination-to-Modeling origin binding from a 22-field duplicate archive to six causal join fields: schema, exact direction-result identity, selected option ordinal, worker job identity, and exact worker-result/launch digests. Proposal identity and payload, direction request, runtime/thread, typed model projection, Body/domain binding, selected option content, and canonical Modeling-request identity are checked directly from their owning immutable documents. The atomic proposal plus binding plus Modeling-request commit and its broad keyed-lifecycle proof remain; 60 net source lines are gone. Runtime writable epoch is v15. hands_verification_derivation_cut: Exact 6ccc7dd2 deletes the 20-field transient Hands receipt-chain summary. The Hands commit owner now derives the exact Verification request directly from the persisted patch, command, and commit receipts plus the frontier authority; no copied schema, job, grant, command-output, Git, path, summary, or timestamp fields mediate that handoff. Atomic Hands-to-Verification admission and the concurrent Persona/Hands lifecycle proof remain. The cut removes 43 net source lines without adding state, schema, or tests. @@ -60,6 +60,7 @@ current_status: planning_launch_authority_cut: Exact b55e96ea deletes both persisted Planning and PlanMind launch-binding families. Their twenty-four fields copied the immutable worker launch, typed requests, runtime job, timestamp, canonical attempt identity, or typed failure review without owning a consequence. Self now derives contiguous attempts and current jobs from family-referenced worker launches. A retry launch strongly reads every prior launch plus the exact failed result and review, so stale retry authority conflicts instead of being summarized into decorative cargo. The complete keyed Planning-to-PlanMind lifecycle, v17 refusal, packaged coordinator, and model-runtime checks pass; 44 net source lines are gone. Runtime writable epoch is v18. remaining_launch_authority_cut: Exact 8dbfcf63 deletes the persisted Body Modeling, Imagination consideration, and Reorientation launch-binding families. Their attempt, request, role/binding, timestamp, Body/projection, and launch-digest fields were derivable from the immutable worker launch, typed family request/projection, runtime job/result, admission refusal, or typed pass failure. Canonical job identities own contiguous attempt order. Body retry CAS strongly reads prior launches, latest job, exact result, and matching refusal; Reorientation retry CAS strongly reads prior launches, latest job, typed failure, and exact terminal result; Imagination retry CAS strongly reads prior launches. Family semantic requests, sealed projections, result validation, substrate grants, typed failures, and Mind admission remain. Focused Body/Imagination lifecycle, Reorientation success/failure/retry, old-epoch refusal, coordinator, and OpenAI runtime checks pass; 24 net source lines are gone. Runtime writable epoch is v19. Model Atlas and its unrun inter-swarm path are untouched. frontier_modeling_writer_cut: Exact 3ed1d564 deletes the public commit_repo_frontier_modeling_request API and export. Production had no caller because accepted Verification already atomically commits its audit, Soul verdict, and canonical frontier-Modeling request through one Mind transaction. The second writer reopened the store and survived only to feed one OpenAI test. That test now launches ordinary Body Modeling and still proves sealed reasoning input, structured completion, typed job/result persistence, provider failure, and output-contract failure; 164 lines of fabricated frontier, route, Verification, and Soul authority are gone. The atomic Verification-to-Modeling lifecycle, core library, OpenAI test, and release-owned model runtime pass. The cut removes 205 net source lines; runtime_spine.rs is 9,819 lines with 54 public functions. Model Atlas is untouched. + coordinator_terminal_receipt_cut: Exact 63d2991e advances EpiphanyCoordinatorRunReceipt to v1 and deletes seven unread cargo families: step count, model-provider echo, runtime-store path, artifact and sealed-artifact lists, arbitrary metadata, and final runtime-job echo. The receipt retains terminal status/action/reason, timestamp, session/thread identity, plan-or-execute mode, and exact resident grant/launch/policy/argv/objective/release/manifest/executable provenance. Operator artifacts remain only in the non-authoritative summary; model requests and runtime jobs retain their own provider and job truth. The published JSON schema now matches the live typed receipt instead of rejecting its omitted resident fields. Runtime writable epoch is v20. Core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass; 59 maintained lines are gone. Model Atlas is untouched. supervisor_subtraction: Exact 856648de completes the supervisor deletion. Epiphany owns no local generic daemon supervisor, semantic projector service, workspace-coverage projector, Windows Task Scheduler integration, or service-policy/lifecycle/heartbeat/recovery mirror. Idunn on Yggdrasil owns source-triggered compilation, testing, packaging, deployment, signed health, and daemon survival. The canonical Epiphany brake gates Epiphany cognition and consequence authority, not Idunn startup or unrelated lifecycle. launch_dependency_cut: Exact 2aeab7a9 deletes the generic organ dependency matrix, generic receipt catalogue/proof profiles, persisted worker-launch cargo, Persona prompt injection, evaluator, and three self-certifying tests: 700 net lines. Family admission owners derive exact dependencies from typed state. Worker-launch schema v2 and Persona projector prompt v1 refuse the old writable shape. Core 378/378, OpenRouter runtime 27/27, packaged runtime 13/13, and Persona re-entry 1/1 pass. operator_surface_subtraction: Exact ef92e853 deletes the callerless view-lens registry, legacy acceptance-bundle builders, test-only raw-JSON result interpreters, and six tests: 797 net lines. Exact a292979d and 77e817c1 delete the duplicate CRRC recommendation algorithm, its unused input model, and four tests: 206 lines. Exact 3b94bf6e and 59c5e3a6 delete the nested duplicate status view, false auxiliary mode, and ignored status arguments. Exact 7c9b0cf3 deletes the fixed synthetic job table, role-board job cargo/mappers, and its test: 338 net lines. Exact 2ce91461 deletes the scene/planning Mind reconstructions, duplicate self-policy crate, unused prompt templates, four counterfeit schemas, and ten producer/source-text tests: 1,723 net lines. Exact 78836f3b deletes eight unconsumed status tableaux, the pressure calculator production only called without telemetry, its unreachable compaction action, one counterfeit schema, and six tests: 518 net lines. Exact f10f7fb3 deletes the final twelve epiphany.surface.* schemas and ten catalog entries after every one proved producerless and consumerless: 692 pure deletions. Exact ab3cacfb deletes thirty-one more producerless contracts, the false runtime-session mutation mouth, every Epiphany-owned Rider/Unity command schema, a callerless prompt-context module, its test-only specialist prompt system, and four self-affirming tests: 3,514 net lines. Exact 16d85b1b deletes six duplicate JSON-schema builder tests and two OpenAI-runtime self-source searches: 209 pure test-line deletions. Exact 06f93f70 deletes the test-only inverse OpenAI-to-native request mapper and makes two retained tests follow canonical native-to-provider derivation: sixty net lines. The local catalog now has twenty-three live or portable contracts. Brokkr owns Unity capabilities through CultMesh/Eve; a future Rider daemon owns Rider. Status retains Mind identity, exact current work, one action/reason decision, readable role lanes, and operator thought sealing. Core checks cleanly; retained provider and focused request-flow tests pass. @@ -121,10 +122,10 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,819 lines, 54 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. All persisted family launch-binding documents and the standalone verdict-driven Modeling writer are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the public runtime-spine and test-liability audit after exact 3ed1d564. Trace each remaining public surface and test to a live consumer and consequential invariant; delete duplicate summaries, mutation wrappers, and implementation-spelling proofs, but preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,807 lines, 54 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, and coordinator artifact/status cargo are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Resume the public runtime-spine and test-liability audit after exact 63d2991e. Trace each remaining public surface and test to a live consumer and consequential invariant; delete duplicate summaries, mutation wrappers, and implementation-spelling proofs, but preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. It exposes no aggregate status head, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, or public typed-fulfillment machinery. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Mind/runtime writable epochs are v8/v19, archived-session schema is v1, archived-worker-attempt schema/type is v2, and claim-obligation schema is v3. The spine is 9,819 lines with 54 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. It exposes no aggregate status head, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, or public typed-fulfillment machinery. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v20, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,807 lines with 54 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. From 196222d991f525da3a10006a41bf99034dbc9542 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 03:46:29 +0200 Subject: [PATCH 011/340] Minimize runtime lifecycle documents --- epiphany-core/src/current_work.rs | 8 ---- epiphany-core/src/reasoning_context.rs | 8 ---- epiphany-core/src/reorientation_work.rs | 4 -- epiphany-core/src/runtime_spine.rs | 43 +------------------ .../src/bin/epiphany-openai-runtime.rs | 4 -- epiphany-openai-runtime/src/lib.rs | 8 ---- .../src/persona_executor.rs | 2 - epiphany-tool-mcp-runtime/src/main.rs | 4 -- .../cultnet/epiphany.runtime.job.schema.json | 15 +------ .../epiphany.runtime.session.schema.json | 9 ++-- schemas/cultnet/index.json | 4 +- 11 files changed, 7 insertions(+), 102 deletions(-) diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index c952c553..5f240fea 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -3807,8 +3807,6 @@ mod tests { session_id: "body-failed-model-session".into(), role: "openai-model".into(), created_at: "2026-08-17T00:00:02.100Z".into(), - summary: "Bound Body inference.".into(), - artifact_refs: Vec::new(), }, &failed_native, "2026-08-17T00:00:02.100Z", @@ -4837,8 +4835,6 @@ mod tests { session_id: "verification-model-session".into(), role: "openai-model".into(), created_at: "2026-08-17T00:00:14.750Z".into(), - summary: "Bound Verification inference.".into(), - artifact_refs: Vec::new(), }, &verification_native, "2026-08-17T00:00:14.750Z", @@ -5523,8 +5519,6 @@ mod tests { session_id: "planning-model-session".into(), role: "openai-model".into(), created_at: "2026-08-17T00:00:21.750Z".into(), - summary: "Bound Planning inference.".into(), - artifact_refs: Vec::new(), }, &planning_native, "2026-08-17T00:00:21.750Z", @@ -5666,8 +5660,6 @@ mod tests { session_id: "plan-mind-model-session".into(), role: "openai-model".into(), created_at: "2026-08-17T00:00:22.250Z".into(), - summary: "Bound plan Mind inference.".into(), - artifact_refs: Vec::new(), }, &mind_native, "2026-08-17T00:00:22.250Z", diff --git a/epiphany-core/src/reasoning_context.rs b/epiphany-core/src/reasoning_context.rs index 70f70241..6ff640e2 100644 --- a/epiphany-core/src/reasoning_context.rs +++ b/epiphany-core/src/reasoning_context.rs @@ -2262,8 +2262,6 @@ mod tests { session_id: "session-1".into(), role: "model-adapter".into(), created_at: "2026-08-17T00:00:01Z".into(), - summary: "Initial model request".into(), - artifact_refs: Vec::new(), }, &initial_native, "2026-08-17T00:00:01Z", @@ -2324,8 +2322,6 @@ mod tests { session_id: "session-1".into(), role: "model-adapter".into(), created_at: "2026-08-17T00:00:04Z".into(), - summary: "Terminal model request".into(), - artifact_refs: Vec::new(), }, &terminal_native, "2026-08-17T00:00:04Z", @@ -2415,8 +2411,6 @@ mod tests { session_id: "failed-pass-session".into(), role: "model-adapter".into(), created_at: "2026-08-18T00:00:01Z".into(), - summary: "Run the model pass".into(), - artifact_refs: Vec::new(), }, &native, "2026-08-18T00:00:01Z", @@ -2655,8 +2649,6 @@ mod tests { session_id: "session-1".into(), role: "model-adapter".into(), created_at: "2026-08-14T00:00:01Z".into(), - summary: "Test terminal request publication".into(), - artifact_refs: Vec::new(), }, &native, "2026-08-14T00:00:01Z", diff --git a/epiphany-core/src/reorientation_work.rs b/epiphany-core/src/reorientation_work.rs index 24d3b009..0f9e020f 100644 --- a/epiphany-core/src/reorientation_work.rs +++ b/epiphany-core/src/reorientation_work.rs @@ -1008,8 +1008,6 @@ mod tests { session_id: "reorientation-model-session".into(), role: "openai-model".into(), created_at: "2026-08-18T10:00:03Z".into(), - summary: "Bound reorientation inference".into(), - artifact_refs: Vec::new(), }, &native, "2026-08-18T10:00:03Z", @@ -1142,8 +1140,6 @@ mod tests { session_id: "failed-reorientation-model-session".into(), role: "openai-model".into(), created_at: "2026-08-18T10:00:10Z".into(), - summary: "Bound failing inference".into(), - artifact_refs: Vec::new(), }, &failed_native, "2026-08-18T10:00:10Z", diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index 20949330..eac820bf 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -88,7 +88,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v20"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v21"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; pub const RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.model_execution_binding.v0"; @@ -160,8 +160,6 @@ pub struct EpiphanyRuntimeSession { pub updated_at: String, #[cultcache(key = 6, default)] pub coordinator_note: String, - #[cultcache(key = 7, default)] - pub metadata: BTreeMap, } #[derive(Clone, Debug, PartialEq, DatabaseEntry)] @@ -181,12 +179,6 @@ pub struct EpiphanyRuntimeJob { pub created_at: String, #[cultcache(key = 6)] pub updated_at: String, - #[cultcache(key = 7, default)] - pub summary: String, - #[cultcache(key = 8, default)] - pub artifact_refs: Vec, - #[cultcache(key = 9, default)] - pub metadata: BTreeMap, } #[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] @@ -761,8 +753,6 @@ pub struct RuntimeSpineJobOptions { pub session_id: String, pub role: String, pub created_at: String, - pub summary: String, - pub artifact_refs: Vec, } #[derive(Clone, Debug, PartialEq, Eq)] @@ -1082,7 +1072,6 @@ pub fn create_runtime_session( created_at: options.created_at.clone(), updated_at: options.created_at, coordinator_note: options.coordinator_note, - metadata: BTreeMap::new(), }; cache.put(&options.session_id, &session)?; Ok(session) @@ -1119,7 +1108,6 @@ pub fn ensure_runtime_session( created_at: options.created_at.clone(), updated_at: options.created_at, coordinator_note: options.coordinator_note, - metadata: BTreeMap::new(), }; cache.put(&options.session_id, &session)?; Ok(session) @@ -1309,7 +1297,6 @@ pub fn terminalize_model_pass_failure_session( if model_job_is_live { model_job.status = EpiphanyRuntimeJobStatus::Failed; model_job.updated_at = options.failed_at.clone(); - model_job.summary = options.summary.clone(); let model_result = EpiphanyRuntimeJobResult { schema_version: RUNTIME_SPINE_SCHEMA_VERSION.to_string(), result_id: format!("result-model-pass-failure-{}", failure.failure_id), @@ -1413,9 +1400,6 @@ pub fn create_runtime_job( status: EpiphanyRuntimeJobStatus::Queued, created_at: options.created_at.clone(), updated_at: options.created_at.clone(), - summary: options.summary, - artifact_refs: options.artifact_refs, - metadata: BTreeMap::new(), }; cache.put(&options.job_id, &job)?; Ok(job) @@ -1523,7 +1507,6 @@ pub fn open_runtime_model_execution( created_at: session_options.created_at.clone(), updated_at: session_options.created_at.clone(), coordinator_note: session_options.coordinator_note.clone(), - metadata: BTreeMap::new(), }); if matches!( session.status, @@ -1551,9 +1534,6 @@ pub fn open_runtime_model_execution( status: EpiphanyRuntimeJobStatus::Queued, created_at: job_options.created_at.clone(), updated_at: job_options.created_at.clone(), - summary: job_options.summary, - artifact_refs: job_options.artifact_refs, - metadata: BTreeMap::new(), }; let binding_id = model_request.request_id.clone(); if cache @@ -2549,7 +2529,6 @@ pub fn prepare_runtime_spine_heartbeat_job( created_at: options.created_at.clone(), updated_at: options.created_at.clone(), coordinator_note: options.coordinator_note, - metadata: BTreeMap::new(), }, }; if cache.get::(&options.job_id)?.is_some() { @@ -2572,12 +2551,6 @@ pub fn prepare_runtime_spine_heartbeat_job( status: EpiphanyRuntimeJobStatus::Queued, created_at: options.created_at.clone(), updated_at: options.created_at.clone(), - summary: format!( - "Heartbeat activation queued for binding {} with authority {}.", - options.binding_id, options.authority_scope - ), - artifact_refs: Vec::new(), - metadata: BTreeMap::new(), }; let request = EpiphanyRuntimeWorkerLaunchRequest { schema_version: RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION.to_string(), @@ -3934,7 +3907,6 @@ fn commit_runtime_worker_process_death( let summary = "Runtime Continuity proved the exact worker process terminal before a structured outcome was admitted.".to_string(); job.status = EpiphanyRuntimeJobStatus::Failed; job.updated_at = terminal_at.to_string(); - job.summary = summary.clone(); let result = EpiphanyRuntimeJobResult { schema_version: RUNTIME_SPINE_SCHEMA_VERSION.to_string(), result_id: format!("result-worker-death-{job_id}"), @@ -9212,7 +9184,6 @@ pub fn open_coordinator_run( updated_at: started_at.to_string(), coordinator_note: "Coordinator owns native runtime receipts before process exit." .to_string(), - metadata: BTreeMap::new(), }; let snapshot = cache.snapshot_envelopes(); let replacements = vec![cache.prepare_entry(session_id, &session)?.0]; @@ -9497,8 +9468,6 @@ pub fn complete_runtime_job( let terminal_status = terminal_status_for_verdict(&options.verdict); job.status = terminal_status; job.updated_at = options.completed_at.clone(); - job.summary = options.summary.clone(); - job.artifact_refs = merge_refs(&job.artifact_refs, &options.artifact_refs); let result = EpiphanyRuntimeJobResult { schema_version: RUNTIME_SPINE_SCHEMA_VERSION.to_string(), result_id: options.result_id.clone(), @@ -9661,16 +9630,6 @@ fn terminal_status_for_verdict(verdict: &str) -> EpiphanyRuntimeJobStatus { } } -fn merge_refs(existing: &[String], incoming: &[String]) -> Vec { - let mut merged = existing.to_vec(); - for item in incoming { - if !merged.contains(item) { - merged.push(item.clone()); - } - } - merged -} - #[cfg(test)] pub(crate) mod tests { use super::*; diff --git a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs index 0791f100..797cf4a1 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs @@ -1433,8 +1433,6 @@ mod tests { session_id: session_id.clone(), role: OPENAI_RUNTIME_ROLE.to_string(), created_at: chrono::Utc::now().to_rfc3339(), - summary: "Pending tool fixture.".to_string(), - artifact_refs: Vec::new(), }, &model_request, &chrono::Utc::now().to_rfc3339(), @@ -1696,8 +1694,6 @@ mod tests { session_id: "openai-runtime-error".into(), role: OPENAI_RUNTIME_ROLE.into(), created_at: now(), - summary: "provider admitted request".into(), - artifact_refs: Vec::new(), }, &request, &now(), diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index a0b065fb..96b393a7 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -167,8 +167,6 @@ async fn run_openai_model_turn_bound( session_id: options.session_id.clone(), role: OPENAI_RUNTIME_ROLE.to_string(), created_at: now(), - summary: format!("OpenAI model request {}", request.request_id), - artifact_refs: Vec::new(), }, &model_request, &now(), @@ -3528,8 +3526,6 @@ mod tests { session_id: options.session_id.clone(), role: OPENAI_RUNTIME_ROLE.to_string(), created_at: now(), - summary: "test job".to_string(), - artifact_refs: Vec::new(), }, &native_request, &now(), @@ -3641,8 +3637,6 @@ mod tests { session_id: "openai-worker-session-modeling-checkpoint-worker".into(), role: "openai-model-adapter".into(), created_at: "2026-08-14T00:00:00Z".into(), - summary: "Execute the Modeling request.".into(), - artifact_refs: Vec::new(), }, &model_request, "2026-08-14T00:00:00Z", @@ -4024,8 +4018,6 @@ mod tests { session_id: options.session_id.clone(), role: OPENAI_RUNTIME_ROLE.to_string(), created_at: now(), - summary: "tool test job".to_string(), - artifact_refs: Vec::new(), }, &native_request, &now(), diff --git a/epiphany-openai-runtime/src/persona_executor.rs b/epiphany-openai-runtime/src/persona_executor.rs index bcb707ff..ef2c13e1 100644 --- a/epiphany-openai-runtime/src/persona_executor.rs +++ b/epiphany-openai-runtime/src/persona_executor.rs @@ -703,8 +703,6 @@ mod tests { session_id: format!("persona-turn-{turn_id}"), role: "openai-model-adapter".into(), created_at: "2026-08-14T00:00:00Z".into(), - summary: format!("Run Persona {stage} test stage"), - artifact_refs: Vec::new(), }, &request, "2026-08-14T00:00:00Z", diff --git a/epiphany-tool-mcp-runtime/src/main.rs b/epiphany-tool-mcp-runtime/src/main.rs index 11392a04..5237d6d6 100644 --- a/epiphany-tool-mcp-runtime/src/main.rs +++ b/epiphany-tool-mcp-runtime/src/main.rs @@ -285,8 +285,6 @@ mod tests { session_id: "native-tool-session".into(), role: "tool-runtime".into(), created_at: "2026-08-10T01:00:02Z".into(), - summary: "Owned native tool execution.".into(), - artifact_refs: Vec::new(), }, )?; epiphany_core::put_runtime_tool_execution_intent( @@ -372,8 +370,6 @@ mod tests { session_id: "state-tool-session".into(), role: "tool-runtime".into(), created_at: "2026-08-11T00:00:01Z".into(), - summary: "Observe resident state.".into(), - artifact_refs: vec![], }, )?; epiphany_core::put_runtime_tool_execution_intent( diff --git a/schemas/cultnet/epiphany.runtime.job.schema.json b/schemas/cultnet/epiphany.runtime.job.schema.json index d706f4c3..92509000 100644 --- a/schemas/cultnet/epiphany.runtime.job.schema.json +++ b/schemas/cultnet/epiphany.runtime.job.schema.json @@ -4,7 +4,7 @@ "title": "Epiphany Runtime Job", "description": "Native runtime-spine job state.", "type": "object", - "additionalProperties": true, + "additionalProperties": false, "properties": { "schemaVersion": { "type": "string" @@ -26,19 +26,6 @@ }, "updatedAt": { "type": "string" - }, - "summary": { - "type": "string" - }, - "artifactRefs": { - "type": "array", - "items": { - "type": "string" - } - }, - "metadata": { - "type": "object", - "additionalProperties": true } }, "required": [ diff --git a/schemas/cultnet/epiphany.runtime.session.schema.json b/schemas/cultnet/epiphany.runtime.session.schema.json index 05fe8987..c569faa4 100644 --- a/schemas/cultnet/epiphany.runtime.session.schema.json +++ b/schemas/cultnet/epiphany.runtime.session.schema.json @@ -4,7 +4,7 @@ "title": "Epiphany Runtime Session", "description": "Native runtime-spine session state.", "type": "object", - "additionalProperties": true, + "additionalProperties": false, "properties": { "schemaVersion": { "type": "string" @@ -26,10 +26,6 @@ }, "coordinatorNote": { "type": "string" - }, - "metadata": { - "type": "object", - "additionalProperties": true } }, "required": [ @@ -38,6 +34,7 @@ "objective", "status", "createdAt", - "updatedAt" + "updatedAt", + "coordinatorNote" ] } diff --git a/schemas/cultnet/index.json b/schemas/cultnet/index.json index 8c970c99..af94f78b 100644 --- a/schemas/cultnet/index.json +++ b/schemas/cultnet/index.json @@ -18,7 +18,7 @@ "wireContracts": [ "cultnet.schema.v0" ], - "schemaVersion": "epiphany.runtime_spine.v0", + "schemaVersion": "epiphany.runtime_spine.v1", "documentType": "epiphany.runtime.session", "title": "Epiphany Runtime Session", "path": "epiphany.runtime.session.schema.json" @@ -62,7 +62,7 @@ "wireContracts": [ "cultnet.schema.v0" ], - "schemaVersion": "epiphany.runtime_spine.v0", + "schemaVersion": "epiphany.runtime_spine.v1", "documentType": "epiphany.runtime.job", "title": "Epiphany Runtime Job", "path": "epiphany.runtime.job.schema.json" From e6fae8b076258251547756e0cc6c5a39b600410f Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 03:48:25 +0200 Subject: [PATCH 012/340] docs: Record minimal runtime lifecycle state --- notes/epiphany-current-algorithmic-map.md | 14 ++++++++++++-- notes/epiphany-fork-implementation-plan.md | 7 +++++++ notes/fresh-workspace-handoff.md | 21 +++++++++++++++++---- state/ledgers.msgpack | Bin 697906 -> 698298 bytes state/map.yaml | 9 +++++---- 5 files changed, 41 insertions(+), 10 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 1fff6e3c..8dd358b0 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `63d2991e` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for coordinator terminal-receipt minimization; +Latest committed implementation cut: `196222d9` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for runtime lifecycle-document minimization; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -262,6 +262,16 @@ the operator summary only. The published JSON schema now matches the Rust contract instead of rejecting the live resident fields it omitted. Runtime writable state is v20. +Runtime session and job documents are lifecycle state, not duplicate result +records. Exact `196222d9` removes their unread arbitrary metadata, and removes +job summary and artifact refs plus the corresponding launch-option inputs. +Every producer had emitted empty metadata and launch artifact lists; no reader +consumed any of the four fields. The terminal `EpiphanyRuntimeJobResult` +remains the sole owner of consequential summary, evidence, artifacts, and +decision-context identity. Sessions retain objective and coordinator note; +jobs retain exact session, role, status, and time identity. Runtime writable +state is v21 and the closed session/job catalog schemas are v1. + Bifrost owns its private feedback-signing identity. Exact `94098223` deletes Epiphany's host-identity executable and the private signer, persisted identity, enrollment, platform protection, and anchor-export implementation behind it. diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 79ab5560..d95f18da 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -375,6 +375,13 @@ Cut in this order: metadata, step count, and final-job echo stay in their existing owners or disappear when unread. Receipt/schema version is v1 and runtime writable state is v20; the published schema now describes the live resident fields. + Exact `196222d9` then makes runtime sessions/jobs minimal lifecycle records: + session metadata and job metadata, summary, and artifact refs disappear + because no reader consumed them and the terminal job result already owns + consequential summary/artifact truth. Launch options no longer accept those + echoes. Runtime writable state is v21 and the closed session/job catalog + schemas are v1. Model Atlas remains intact for the unrun live inter-swarm + Gate 1. 12. **Landed at `1662a012`, `07d891ba`, and `ec1431ff`:** coordinator policy now projects keyed current work; persisted `EpiphanyThreadStateEntry`, `coordinator_state_transaction`, generic coordinator services, the diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index e3bf5c27..e462d926 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `63d2991e` -Current worktree: documentation/evidence for coordinator terminal-receipt minimization; +Latest committed implementation cut: `196222d9` +Current worktree: documentation/evidence for runtime lifecycle-document minimization; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `63d2991e` is the current +production symlink body and is inactive. Exact `196222d9` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,19 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `196222d9` removes session metadata plus job summary, artifact refs, and +metadata from the live lifecycle documents. No reader consumed them, every +metadata map and launch artifact list was empty, and terminal +`EpiphanyRuntimeJobResult` already owns the summary and artifacts that matter. +Sessions retain objective/coordinator note; jobs retain exact session, role, +status, and time identity. The corresponding launch-option cargo, completion +merge, and caller literals are gone. Runtime writable state advances to v21; +the now-closed session/job catalog schemas are v1. Core and OpenAI libraries +compile; old-epoch refusal, model-failure audit, model-produced completion, +coordinator 5/5, and native tool-runtime 4/4 pass. The cut removes 95 net +maintained lines and leaves `runtime_spine.rs` at 9,766 lines. Model Atlas is +untouched; no live inter-swarm collaboration has yet run. + Exact `63d2991e` reduces `EpiphanyCoordinatorRunReceipt` v1 to its terminal Self decision, timestamp, session/thread identity, plan-or-execute mode, and exact resident grant/launch/policy/argv/objective/release/manifest/executable @@ -56,7 +69,7 @@ the live resident fields. Runtime writable state advances to v20. JSON schemas parse; core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass. The cut removes 59 maintained lines and leaves `runtime_spine.rs` at 9,807 lines. -Continue the runtime-spine/test-liability audit. Model Atlas remains protected +Continue the runtime-spine/test-liability audit after exact `196222d9`. Model Atlas remains protected for its first live inter-swarm collaboration trial. Exact `3ed1d564` deletes the public diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index bab235856a9eac1de13c9c59c5071614ab9b4cca..1051f7fa5915ddd05bfde637a69b81456b7c70ca 100644 GIT binary patch delta 389 zcmYL_Jxc>Y5Qe?;Bj!@5l_Cfub}4e)5hO8{f`XM`C3frXn5^FI#NEA%Rw*p}1@S7e z2&5J*1i{uy@GrUNXYsJjJMTO@kMH%DkNU%kS8KMmqWJi2Dwq^c8{UQI?Oc!io00E1 z%6Hl^x0d&#(ksJ$7-v1o(FlyWqXDUD2k zL1QE-NYOIEECZ$loY4uGEKQld3YoU@)HQ^E3C?tvI$%+!QnAD}nk=!VY-Un{p#=Y@ zhd<*$1BKc&;4o8GrU=+4-h(`jI=>EKxt2SJgt}mO&(#^oqXz5|&kPFSq%l0`quSmN zEm0D3A}ySQB@Hgm&&`)U%Y?My_kyZLI_B6BS0K3K1n*C=x+ F8lM6vh`s;- delta 73 zcmdmWUTf1Ctql^4+=ixBMix=W7`T@5Z&qe3WMp(~p32ldm5C9EK{PWEvj8zG5VHX> RI}mdKG3WNFOk8sp0{~aq7LWh{ diff --git a/state/map.yaml b/state/map.yaml index 92df0064..ccca7fbf 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -52,7 +52,7 @@ current_status: summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Runtime status aggregates, global revisions, generic role/event authority, duplicate prompt-state cargo, duplicate family launch bindings, and Epiphany-owned Rider/Unity organs are absent. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. Completed model-session tombstones retain only resurrection fences and an exact deletion digest. Archived worker attempts retain the exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records needed for audit. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v20; archived-session schema is v1, archived-worker-attempt schema/type is v2, and coordinator-run-receipt schema/type is v1. Old writable stores refuse with no migrator or dual reader. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Runtime status aggregates, global revisions, generic role/event authority, duplicate prompt-state cargo, duplicate family launch bindings, and Epiphany-owned Rider/Unity organs are absent. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. Completed model-session tombstones retain only resurrection fences and an exact deletion digest. Archived worker attempts retain the exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records needed for audit. Runtime sessions and jobs own lifecycle identity/status only; terminal job results own summaries and artifacts. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v21; runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, and coordinator-run-receipt schema/type is v1. Old writable stores refuse with no migrator or dual reader. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. atlas_authoring_cut: Exact ce306e23 preserves the complete inter-swarm Atlas vertical slice while deleting its duplicate local offer/claim authoring authority. Ordinary Modeling through RepoModel operations is the sole owner of provider offers and consumer claims; Atlas retains signed publication, trust, transport, deterministic projection, Soul verification, Self impact admission, Resident Self wake, brakes, and Eve lowering. Two direct write-intent types, their runtime commit APIs and registry entries, 518 planner lines, and two tests that animated only that duplicate path are gone. The runtime proof now creates offers/claims through RepoModel before proving exact verification admission and Body-drift refusal. The cut removes 593 net source lines; the three-repository direct/transitive Modeling proof passes. These are component proofs only: no live inter-swarm collaboration has yet run, so the Atlas vertical slice remains protected until Gate 1 exercises it end to end. Runtime writable epoch is v14. autonomous_proposal_binding_cut: Exact 5d507bfd reduces Self's autonomous Imagination-to-Modeling origin binding from a 22-field duplicate archive to six causal join fields: schema, exact direction-result identity, selected option ordinal, worker job identity, and exact worker-result/launch digests. Proposal identity and payload, direction request, runtime/thread, typed model projection, Body/domain binding, selected option content, and canonical Modeling-request identity are checked directly from their owning immutable documents. The atomic proposal plus binding plus Modeling-request commit and its broad keyed-lifecycle proof remain; 60 net source lines are gone. Runtime writable epoch is v15. hands_verification_derivation_cut: Exact 6ccc7dd2 deletes the 20-field transient Hands receipt-chain summary. The Hands commit owner now derives the exact Verification request directly from the persisted patch, command, and commit receipts plus the frontier authority; no copied schema, job, grant, command-output, Git, path, summary, or timestamp fields mediate that handoff. Atomic Hands-to-Verification admission and the concurrent Persona/Hands lifecycle proof remain. The cut removes 43 net source lines without adding state, schema, or tests. @@ -61,6 +61,7 @@ current_status: remaining_launch_authority_cut: Exact 8dbfcf63 deletes the persisted Body Modeling, Imagination consideration, and Reorientation launch-binding families. Their attempt, request, role/binding, timestamp, Body/projection, and launch-digest fields were derivable from the immutable worker launch, typed family request/projection, runtime job/result, admission refusal, or typed pass failure. Canonical job identities own contiguous attempt order. Body retry CAS strongly reads prior launches, latest job, exact result, and matching refusal; Reorientation retry CAS strongly reads prior launches, latest job, typed failure, and exact terminal result; Imagination retry CAS strongly reads prior launches. Family semantic requests, sealed projections, result validation, substrate grants, typed failures, and Mind admission remain. Focused Body/Imagination lifecycle, Reorientation success/failure/retry, old-epoch refusal, coordinator, and OpenAI runtime checks pass; 24 net source lines are gone. Runtime writable epoch is v19. Model Atlas and its unrun inter-swarm path are untouched. frontier_modeling_writer_cut: Exact 3ed1d564 deletes the public commit_repo_frontier_modeling_request API and export. Production had no caller because accepted Verification already atomically commits its audit, Soul verdict, and canonical frontier-Modeling request through one Mind transaction. The second writer reopened the store and survived only to feed one OpenAI test. That test now launches ordinary Body Modeling and still proves sealed reasoning input, structured completion, typed job/result persistence, provider failure, and output-contract failure; 164 lines of fabricated frontier, route, Verification, and Soul authority are gone. The atomic Verification-to-Modeling lifecycle, core library, OpenAI test, and release-owned model runtime pass. The cut removes 205 net source lines; runtime_spine.rs is 9,819 lines with 54 public functions. Model Atlas is untouched. coordinator_terminal_receipt_cut: Exact 63d2991e advances EpiphanyCoordinatorRunReceipt to v1 and deletes seven unread cargo families: step count, model-provider echo, runtime-store path, artifact and sealed-artifact lists, arbitrary metadata, and final runtime-job echo. The receipt retains terminal status/action/reason, timestamp, session/thread identity, plan-or-execute mode, and exact resident grant/launch/policy/argv/objective/release/manifest/executable provenance. Operator artifacts remain only in the non-authoritative summary; model requests and runtime jobs retain their own provider and job truth. The published JSON schema now matches the live typed receipt instead of rejecting its omitted resident fields. Runtime writable epoch is v20. Core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass; 59 maintained lines are gone. Model Atlas is untouched. + runtime_lifecycle_document_cut: Exact 196222d9 makes runtime sessions and jobs lifecycle documents rather than second result records. Session metadata and job metadata had no reader; every producer wrote an empty map. Job summary and artifact refs had no reader; every launch supplied empty artifacts, while the terminal EpiphanyRuntimeJobResult already owns the consequential summary and artifact references. Those four fields, the launch-option echoes, completion merges, and caller literals are gone. The session retains objective/coordinator note; the job retains exact session/role/status/time identity. Runtime writable epoch is v21 and the closed session/job catalog schemas are v1. Core and OpenAI libraries compile; old-epoch refusal, model-failure audit, model-produced completion, coordinator 5/5, and native tool-runtime 4/4 pass. The cut removes 95 net maintained lines, leaves runtime_spine.rs at 9,766 lines with the same 54 public functions and 25 public structs, and does not touch Model Atlas or claim collaboration acceptance. supervisor_subtraction: Exact 856648de completes the supervisor deletion. Epiphany owns no local generic daemon supervisor, semantic projector service, workspace-coverage projector, Windows Task Scheduler integration, or service-policy/lifecycle/heartbeat/recovery mirror. Idunn on Yggdrasil owns source-triggered compilation, testing, packaging, deployment, signed health, and daemon survival. The canonical Epiphany brake gates Epiphany cognition and consequence authority, not Idunn startup or unrelated lifecycle. launch_dependency_cut: Exact 2aeab7a9 deletes the generic organ dependency matrix, generic receipt catalogue/proof profiles, persisted worker-launch cargo, Persona prompt injection, evaluator, and three self-certifying tests: 700 net lines. Family admission owners derive exact dependencies from typed state. Worker-launch schema v2 and Persona projector prompt v1 refuse the old writable shape. Core 378/378, OpenRouter runtime 27/27, packaged runtime 13/13, and Persona re-entry 1/1 pass. operator_surface_subtraction: Exact ef92e853 deletes the callerless view-lens registry, legacy acceptance-bundle builders, test-only raw-JSON result interpreters, and six tests: 797 net lines. Exact a292979d and 77e817c1 delete the duplicate CRRC recommendation algorithm, its unused input model, and four tests: 206 lines. Exact 3b94bf6e and 59c5e3a6 delete the nested duplicate status view, false auxiliary mode, and ignored status arguments. Exact 7c9b0cf3 deletes the fixed synthetic job table, role-board job cargo/mappers, and its test: 338 net lines. Exact 2ce91461 deletes the scene/planning Mind reconstructions, duplicate self-policy crate, unused prompt templates, four counterfeit schemas, and ten producer/source-text tests: 1,723 net lines. Exact 78836f3b deletes eight unconsumed status tableaux, the pressure calculator production only called without telemetry, its unreachable compaction action, one counterfeit schema, and six tests: 518 net lines. Exact f10f7fb3 deletes the final twelve epiphany.surface.* schemas and ten catalog entries after every one proved producerless and consumerless: 692 pure deletions. Exact ab3cacfb deletes thirty-one more producerless contracts, the false runtime-session mutation mouth, every Epiphany-owned Rider/Unity command schema, a callerless prompt-context module, its test-only specialist prompt system, and four self-affirming tests: 3,514 net lines. Exact 16d85b1b deletes six duplicate JSON-schema builder tests and two OpenAI-runtime self-source searches: 209 pure test-line deletions. Exact 06f93f70 deletes the test-only inverse OpenAI-to-native request mapper and makes two retained tests follow canonical native-to-provider derivation: sixty net lines. The local catalog now has twenty-three live or portable contracts. Brokkr owns Unity capabilities through CultMesh/Eve; a future Rider daemon owns Rider. Status retains Mind identity, exact current work, one action/reason decision, readable role lanes, and operator thought sealing. Core checks cleanly; retained provider and focused request-flow tests pass. @@ -122,10 +123,10 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,807 lines, 54 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, and coordinator artifact/status cargo are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the public runtime-spine and test-liability audit after exact 63d2991e. Trace each remaining public surface and test to a live consumer and consequential invariant; delete duplicate summaries, mutation wrappers, and implementation-spelling proofs, but preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,766 lines, 54 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, and coordinator artifact/status cargo are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Resume the public runtime-spine and test-liability audit after exact 196222d9. Trace each remaining public surface and test to a live consumer and consequential invariant; delete duplicate summaries, mutation wrappers, and implementation-spelling proofs, but preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. It exposes no aggregate status head, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, or public typed-fulfillment machinery. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v20, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,807 lines with 54 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Session/job documents carry only lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. It exposes no aggregate status head, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, or public typed-fulfillment machinery. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v21, runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,766 lines with 54 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. From cd2177e834d52713f13d24e6cb2c294e9bc44ac2 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 04:09:56 +0200 Subject: [PATCH 013/340] Delete lenient session ensure writer --- epiphany-core/src/lib.rs | 1 - epiphany-core/src/runtime_spine.rs | 36 ------------------- .../src/bin/epiphany-openai-runtime.rs | 2 +- epiphany-openai-runtime/src/lib.rs | 2 +- 4 files changed, 2 insertions(+), 39 deletions(-) diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index 05b56896..7b875e9f 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -291,7 +291,6 @@ pub use runtime_spine::coordinator_run_receipts; pub use runtime_spine::coordinator_run_session_id; pub use runtime_spine::create_runtime_job; pub use runtime_spine::create_runtime_session; -pub use runtime_spine::ensure_runtime_session; pub use runtime_spine::finalize_coordinator_run; pub use runtime_spine::initialize_runtime_spine; pub use runtime_spine::model_pass_failure_for_request; diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index eac820bf..2cf781ed 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -1077,42 +1077,6 @@ pub fn create_runtime_session( Ok(session) } -pub fn ensure_runtime_session( - store_path: impl AsRef, - options: RuntimeSpineSessionOptions, -) -> Result { - validate_non_empty(&options.session_id, "session id")?; - validate_non_empty(&options.objective, "objective")?; - validate_non_empty(&options.created_at, "created at")?; - let mut cache = runtime_spine_cache(store_path.as_ref())?; - cache.pull_all_backing_stores()?; - require_identity(&cache)?; - require_runtime_identity_not_archived(&cache, "session", &options.session_id)?; - if let Some(existing) = cache.get::(&options.session_id)? { - if matches!( - existing.status, - EpiphanyRuntimeSessionStatus::Completed | EpiphanyRuntimeSessionStatus::Archived - ) { - return Err(anyhow!( - "runtime session {:?} is terminal and cannot accept jobs", - options.session_id - )); - } - return Ok(existing); - } - let session = EpiphanyRuntimeSession { - schema_version: RUNTIME_SPINE_SCHEMA_VERSION.to_string(), - session_id: options.session_id.clone(), - objective: options.objective, - status: EpiphanyRuntimeSessionStatus::Active, - created_at: options.created_at.clone(), - updated_at: options.created_at, - coordinator_note: options.coordinator_note, - }; - cache.put(&options.session_id, &session)?; - Ok(session) -} - pub fn close_runtime_session( store_path: impl AsRef, options: RuntimeSpineSessionClosureOptions, diff --git a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs index 797cf4a1..475eb7ef 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs @@ -1204,7 +1204,7 @@ mod tests { created_at: options.created_at.clone(), }, )?; - epiphany_core::ensure_runtime_session( + epiphany_core::create_runtime_session( store, epiphany_core::RuntimeSpineSessionOptions { session_id: options.session_id.clone(), diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index 96b393a7..3fb908bc 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -2463,7 +2463,7 @@ mod tests { created_at: options.created_at.clone(), }, )?; - epiphany_core::ensure_runtime_session( + epiphany_core::create_runtime_session( store, epiphany_core::RuntimeSpineSessionOptions { session_id: options.session_id.clone(), From 1e1012de0c126fb72462becade62c1c3584fab6d Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 04:11:28 +0200 Subject: [PATCH 014/340] docs: Record strict session ownership --- notes/epiphany-current-algorithmic-map.md | 12 ++++++++++-- notes/epiphany-fork-implementation-plan.md | 4 ++++ notes/fresh-workspace-handoff.md | 18 ++++++++++++++---- state/ledgers.msgpack | Bin 698298 -> 698722 bytes state/map.yaml | 7 ++++--- 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 8dd358b0..8e05df71 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `196222d9` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for runtime lifecycle-document minimization; +Latest committed implementation cut: `cd2177e8` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for strict runtime session ownership; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -272,6 +272,14 @@ decision-context identity. Sessions retain objective and coordinator note; jobs retain exact session, role, status, and time identity. Runtime writable state is v21 and the closed session/job catalog schemas are v1. +Standalone diagnostic session creation has one strict owner. Exact `cd2177e8` +deletes `ensure_runtime_session`, whose only consumers were test fixtures and +whose active-ID path returned a pre-existing session without comparing its +objective, creation time, or coordinator note. Those fixtures now use +`create_runtime_session`; an identity collision refuses instead of being +treated as a replay. Runtime schema remains v21 because the serialized shape is +unchanged. + Bifrost owns its private feedback-signing identity. Exact `94098223` deletes Epiphany's host-identity executable and the private signer, persisted identity, enrollment, platform protection, and anchor-export implementation behind it. diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index d95f18da..a1f2e23f 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -382,6 +382,10 @@ Cut in this order: echoes. Runtime writable state is v21 and the closed session/job catalog schemas are v1. Model Atlas remains intact for the unrun live inter-swarm Gate 1. + Exact `cd2177e8` then deletes the duplicate `ensure_runtime_session` writer. + Its two test consumers now use strict session creation; a reused active ID + can no longer substitute a different objective, creation time, or + coordinator note. No persisted shape changes and runtime remains v21. 12. **Landed at `1662a012`, `07d891ba`, and `ec1431ff`:** coordinator policy now projects keyed current work; persisted `EpiphanyThreadStateEntry`, `coordinator_state_transaction`, generic coordinator services, the diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index e462d926..9e4a0962 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `196222d9` -Current worktree: documentation/evidence for runtime lifecycle-document minimization; +Latest committed implementation cut: `cd2177e8` +Current worktree: documentation/evidence for strict runtime session ownership; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `196222d9` is the current +production symlink body and is inactive. Exact `cd2177e8` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,16 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `cd2177e8` deletes the duplicate public `ensure_runtime_session` writer. +Only two model-runtime test fixtures called it, and an active ID collision made +it return the existing session without comparing objective, creation time, or +coordinator note. The fixtures now use strict `create_runtime_session`, which +refuses identity collisions. Core checks, model-produced completion, and the +packaged model runtime 11/11 pass. The cut removes 37 net maintained lines and +leaves `runtime_spine.rs` at 9,730 lines with 53 public functions. Runtime stays +at v21. Model Atlas is untouched and live inter-swarm collaboration remains +unproven. + Exact `196222d9` removes session metadata plus job summary, artifact refs, and metadata from the live lifecycle documents. No reader consumed them, every metadata map and launch artifact list was empty, and terminal @@ -69,7 +79,7 @@ the live resident fields. Runtime writable state advances to v20. JSON schemas parse; core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass. The cut removes 59 maintained lines and leaves `runtime_spine.rs` at 9,807 lines. -Continue the runtime-spine/test-liability audit after exact `196222d9`. Model Atlas remains protected +Continue the runtime-spine/test-liability audit after exact `cd2177e8`. Model Atlas remains protected for its first live inter-swarm collaboration trial. Exact `3ed1d564` deletes the public diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 1051f7fa5915ddd05bfde637a69b81456b7c70ca..b848b78f68866ab5347801bd89d0568806a19acf 100644 GIT binary patch delta 425 zcmZXPu}T9$5Qe>|(HsbBp+cGgu?fi~dx#0Kun3kmVr3I9d!w$o?8e=_cvdMad;!Ci z79v;*7NVVvZNSn}U&Of(D~pdU{+Vz7eH)j)KTA(*&XV6`tm*s5A2aUb-t(q&;W(}9 zQSN4xbBOGnCFY2EB2O$3i$vjNlykQpR&QVZn!i)2H7fr0Q7!YO??3tC%9oSuCjqy> zL!Z^_*ht5TyFQFi3X~R5npk67$I^-(whbC1l!QwyENTx9RESY!n!<@lEKM7T4T7;+ zWLk}Z{U<1cQ9xJ406~OwNZ2djDvCs=H!$RZl*)pMJBG5@BB;(eP8OO?Ngb!RF?t(rbrh= diff --git a/state/map.yaml b/state/map.yaml index ccca7fbf..20c1ecdc 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -62,6 +62,7 @@ current_status: frontier_modeling_writer_cut: Exact 3ed1d564 deletes the public commit_repo_frontier_modeling_request API and export. Production had no caller because accepted Verification already atomically commits its audit, Soul verdict, and canonical frontier-Modeling request through one Mind transaction. The second writer reopened the store and survived only to feed one OpenAI test. That test now launches ordinary Body Modeling and still proves sealed reasoning input, structured completion, typed job/result persistence, provider failure, and output-contract failure; 164 lines of fabricated frontier, route, Verification, and Soul authority are gone. The atomic Verification-to-Modeling lifecycle, core library, OpenAI test, and release-owned model runtime pass. The cut removes 205 net source lines; runtime_spine.rs is 9,819 lines with 54 public functions. Model Atlas is untouched. coordinator_terminal_receipt_cut: Exact 63d2991e advances EpiphanyCoordinatorRunReceipt to v1 and deletes seven unread cargo families: step count, model-provider echo, runtime-store path, artifact and sealed-artifact lists, arbitrary metadata, and final runtime-job echo. The receipt retains terminal status/action/reason, timestamp, session/thread identity, plan-or-execute mode, and exact resident grant/launch/policy/argv/objective/release/manifest/executable provenance. Operator artifacts remain only in the non-authoritative summary; model requests and runtime jobs retain their own provider and job truth. The published JSON schema now matches the live typed receipt instead of rejecting its omitted resident fields. Runtime writable epoch is v20. Core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass; 59 maintained lines are gone. Model Atlas is untouched. runtime_lifecycle_document_cut: Exact 196222d9 makes runtime sessions and jobs lifecycle documents rather than second result records. Session metadata and job metadata had no reader; every producer wrote an empty map. Job summary and artifact refs had no reader; every launch supplied empty artifacts, while the terminal EpiphanyRuntimeJobResult already owns the consequential summary and artifact references. Those four fields, the launch-option echoes, completion merges, and caller literals are gone. The session retains objective/coordinator note; the job retains exact session/role/status/time identity. Runtime writable epoch is v21 and the closed session/job catalog schemas are v1. Core and OpenAI libraries compile; old-epoch refusal, model-failure audit, model-produced completion, coordinator 5/5, and native tool-runtime 4/4 pass. The cut removes 95 net maintained lines, leaves runtime_spine.rs at 9,766 lines with the same 54 public functions and 25 public structs, and does not touch Model Atlas or claim collaboration acceptance. + strict_session_writer_cut: Exact cd2177e8 deletes ensure_runtime_session, a duplicate public session writer used only by two model-runtime test fixtures. On an active ID collision it returned the existing session without comparing objective, creation time, or coordinator note, allowing stale fixture context to masquerade as exact replay. Both fixtures now use create_runtime_session, whose sole semantic is new diagnostic session creation with explicit collision refusal. No compatibility path or replacement abstraction was added. Core checks, the model-produced completion proof, and packaged model runtime 11/11 pass. The cut removes 37 net maintained lines; runtime_spine.rs is 9,730 lines with 53 public functions and 25 public structs. Runtime remains v21 and Model Atlas is untouched. supervisor_subtraction: Exact 856648de completes the supervisor deletion. Epiphany owns no local generic daemon supervisor, semantic projector service, workspace-coverage projector, Windows Task Scheduler integration, or service-policy/lifecycle/heartbeat/recovery mirror. Idunn on Yggdrasil owns source-triggered compilation, testing, packaging, deployment, signed health, and daemon survival. The canonical Epiphany brake gates Epiphany cognition and consequence authority, not Idunn startup or unrelated lifecycle. launch_dependency_cut: Exact 2aeab7a9 deletes the generic organ dependency matrix, generic receipt catalogue/proof profiles, persisted worker-launch cargo, Persona prompt injection, evaluator, and three self-certifying tests: 700 net lines. Family admission owners derive exact dependencies from typed state. Worker-launch schema v2 and Persona projector prompt v1 refuse the old writable shape. Core 378/378, OpenRouter runtime 27/27, packaged runtime 13/13, and Persona re-entry 1/1 pass. operator_surface_subtraction: Exact ef92e853 deletes the callerless view-lens registry, legacy acceptance-bundle builders, test-only raw-JSON result interpreters, and six tests: 797 net lines. Exact a292979d and 77e817c1 delete the duplicate CRRC recommendation algorithm, its unused input model, and four tests: 206 lines. Exact 3b94bf6e and 59c5e3a6 delete the nested duplicate status view, false auxiliary mode, and ignored status arguments. Exact 7c9b0cf3 deletes the fixed synthetic job table, role-board job cargo/mappers, and its test: 338 net lines. Exact 2ce91461 deletes the scene/planning Mind reconstructions, duplicate self-policy crate, unused prompt templates, four counterfeit schemas, and ten producer/source-text tests: 1,723 net lines. Exact 78836f3b deletes eight unconsumed status tableaux, the pressure calculator production only called without telemetry, its unreachable compaction action, one counterfeit schema, and six tests: 518 net lines. Exact f10f7fb3 deletes the final twelve epiphany.surface.* schemas and ten catalog entries after every one proved producerless and consumerless: 692 pure deletions. Exact ab3cacfb deletes thirty-one more producerless contracts, the false runtime-session mutation mouth, every Epiphany-owned Rider/Unity command schema, a callerless prompt-context module, its test-only specialist prompt system, and four self-affirming tests: 3,514 net lines. Exact 16d85b1b deletes six duplicate JSON-schema builder tests and two OpenAI-runtime self-source searches: 209 pure test-line deletions. Exact 06f93f70 deletes the test-only inverse OpenAI-to-native request mapper and makes two retained tests follow canonical native-to-provider derivation: sixty net lines. The local catalog now has twenty-three live or portable contracts. Brokkr owns Unity capabilities through CultMesh/Eve; a future Rider daemon owns Rider. Status retains Mind identity, exact current work, one action/reason decision, readable role lanes, and operator thought sealing. Core checks cleanly; retained provider and focused request-flow tests pass. @@ -123,10 +124,10 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,766 lines, 54 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, and coordinator artifact/status cargo are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the public runtime-spine and test-liability audit after exact 196222d9. Trace each remaining public surface and test to a live consumer and consequential invariant; delete duplicate summaries, mutation wrappers, and implementation-spelling proofs, but preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,730 lines, 53 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, and coordinator artifact/status cargo are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Resume the public runtime-spine and test-liability audit after exact cd2177e8. Trace each remaining public surface and test to a live consumer and consequential invariant; delete duplicate summaries, mutation wrappers, and implementation-spelling proofs, but preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Session/job documents carry only lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. It exposes no aggregate status head, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, or public typed-fulfillment machinery. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v21, runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,766 lines with 54 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Session/job documents carry only lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. The sole standalone diagnostic session creator refuses identity collisions; there is no lenient ensure/rebase mouth. It exposes no aggregate status head, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, or public typed-fulfillment machinery. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v21, runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,730 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. From 0a97eef8d867dceaa3fbdcbfabf76f07e48ae380 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 04:15:37 +0200 Subject: [PATCH 015/340] Collapse duplicate current-work projections --- epiphany-core/src/current_work.rs | 63 ++++--------------------------- 1 file changed, 7 insertions(+), 56 deletions(-) diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index 5f240fea..73115155 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -404,30 +404,6 @@ pub(crate) fn body_modeling_decision_envelope( Ok(cache.prepare_entry(&receipt.work_id, &receipt)?.0) } -pub fn current_body_modeling_work( - store_path: impl AsRef, -) -> Result { - let body_basis = crate::current_mind_repository_body_observation(store_path.as_ref())? - .ok_or_else(|| anyhow!("Mind has no admitted repository Body observation"))?; - let repo_model_basis = crate::assemble_repo_model_view(store_path.as_ref())?.reasoning_basis(); - EpiphanyBodyModelingWorkProjection::derive( - body_basis.runtime_id.clone(), - body_basis, - repo_model_basis, - ) -} - -pub fn unresolved_body_modeling_work( - store_path: impl AsRef, -) -> Result> { - let store_path = store_path.as_ref(); - let work = current_body_modeling_work(store_path)?; - let mut cache = crate::runtime_spine_cache(store_path)?; - cache.pull_all_backing_stores()?; - let decision = cache.get::(&work.work_id)?; - resolve_body_modeling_work(work, decision) -} - pub fn project_current_work(store_path: impl AsRef) -> Result { let store_path = store_path.as_ref(); let mind = crate::assemble_mind_view(store_path)?; @@ -1038,16 +1014,6 @@ fn current_proposal_modeling_work( Ok(None) } -pub fn body_modeling_continuation_action_for_job( - store_path: impl AsRef, - job_id: &str, -) -> Result> { - Ok(project_current_work(store_path)? - .body_modeling - .filter(|work| work.attempt.job_id.as_deref() == Some(job_id)) - .map(|work| work.attempt.action)) -} - pub fn current_body_modeling_review_job_id(store_path: impl AsRef) -> Result> { Ok(crate::project_current_work(store_path)? .body_modeling @@ -1055,16 +1021,6 @@ pub fn current_body_modeling_review_job_id(store_path: impl AsRef) -> Resu .and_then(|work| work.attempt.job_id)) } -pub fn proposal_modeling_continuation_action_for_job( - store_path: impl AsRef, - job_id: &str, -) -> Result> { - Ok(project_current_work(store_path)? - .proposal_modeling - .filter(|work| work.attempt.job_id.as_deref() == Some(job_id)) - .map(|work| work.attempt.action)) -} - pub fn current_proposal_modeling_review_job_id( store_path: impl AsRef, ) -> Result> { @@ -1074,16 +1030,6 @@ pub fn current_proposal_modeling_review_job_id( .and_then(|work| work.attempt.job_id)) } -pub fn frontier_verdict_modeling_continuation_action_for_job( - store_path: impl AsRef, - job_id: &str, -) -> Result> { - Ok(project_current_work(store_path)? - .frontier_verdict_modeling - .filter(|work| work.attempt.job_id.as_deref() == Some(job_id)) - .map(|work| work.attempt.action)) -} - pub fn current_frontier_verdict_modeling_review_job_id( store_path: impl AsRef, ) -> Result> { @@ -3647,10 +3593,15 @@ mod tests { "2026-08-17T00:00:01Z", )?; crate::reset_repository_body_read_counters(); - let projected_work = current_body_modeling_work(&store)?; + let current_work = project_current_work(&store)?; + let projected_work = current_work + .body_modeling + .as_ref() + .expect("current Mind projects Body Modeling work") + .work + .clone(); assert_eq!(projected_work.body_basis, body); assert_eq!(crate::repository_body_read_counters(), (0, 0)); - let current_work = project_current_work(&store)?; assert_eq!( current_work.body_modeling, Some(EpiphanyBodyModelingCurrentWorkProjection { From d15404c57bdf30ae913facd4b05d05bda554ef51 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 04:16:45 +0200 Subject: [PATCH 016/340] docs: Record sole current-work projection --- notes/epiphany-current-algorithmic-map.md | 12 ++++++++++-- notes/epiphany-fork-implementation-plan.md | 5 ++++- notes/fresh-workspace-handoff.md | 19 +++++++++++++++---- state/ledgers.msgpack | Bin 698722 -> 699175 bytes state/map.yaml | 3 ++- 5 files changed, 31 insertions(+), 8 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 8e05df71..2a645d4e 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `cd2177e8` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for strict runtime session ownership; +Latest committed implementation cut: `0a97eef8` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for sole current-work projection ownership; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -280,6 +280,14 @@ objective, creation time, or coordinator note. Those fixtures now use treated as a replay. Runtime schema remains v21 because the serialized shape is unchanged. +Current typed work has one assembler. Exact `0a97eef8` deletes the separate +Body-only and unresolved-Body projectors, which reopened Body, RepoModel, and +runtime state to reconstruct subsets already owned by `project_current_work`. +It also deletes three unused per-job continuation wrappers that each rebuilt +the entire projection. Live coordinator review selectors consume the one shared +slice directly. The retained lifecycle proof confirms projection remains +thread-free and performs no live Body scan. + Bifrost owns its private feedback-signing identity. Exact `94098223` deletes Epiphany's host-identity executable and the private signer, persisted identity, enrollment, platform protection, and anchor-export implementation behind it. diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index a1f2e23f..7ac8ceb8 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -300,7 +300,10 @@ Cut in this order: from explicit external-evidence obligations. Body-generation Modeling identity, typed Body-to-Mind admission, sealed reasoning, and atomic decision admission are landed. Current-work no longer reads the external Body store; - status consumes the shared projection. + status consumes the shared projection. Exact `0a97eef8` deletes the later + callerless Body-only/unresolved-Body reconstruction paths and three unused + per-job continuation wrappers, leaving `project_current_work` as the sole + slice assembler. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 9e4a0962..497b9f45 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `cd2177e8` -Current worktree: documentation/evidence for strict runtime session ownership; +Latest committed implementation cut: `0a97eef8` +Current worktree: documentation/evidence for sole current-work projection ownership; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `cd2177e8` is the current +production symlink body and is inactive. Exact `0a97eef8` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,17 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `0a97eef8` makes `project_current_work` the sole assembler of current +typed work. The callerless Body-only and unresolved-Body projectors separately +reopened Body, RepoModel, and runtime state to derive information already in +that slice. Three callerless per-job continuation wrappers also rebuilt the +whole projection; the live coordinator already uses the retained family review +selectors. All five duplicate mouths are gone. The keyed Modeling/Research +lifecycle still proves thread-free routing and zero live Body rescans; +coordinator 5/5 passes. The cut removes 49 net maintained lines without a +schema, target, test, or Atlas change. Live inter-swarm collaboration remains +unproven. + Exact `cd2177e8` deletes the duplicate public `ensure_runtime_session` writer. Only two model-runtime test fixtures called it, and an active ID collision made it return the existing session without comparing objective, creation time, or @@ -79,7 +90,7 @@ the live resident fields. Runtime writable state advances to v20. JSON schemas parse; core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass. The cut removes 59 maintained lines and leaves `runtime_spine.rs` at 9,807 lines. -Continue the runtime-spine/test-liability audit after exact `cd2177e8`. Model Atlas remains protected +Continue the public-API/test-liability audit after exact `0a97eef8`. Model Atlas remains protected for its first live inter-swarm collaboration trial. Exact `3ed1d564` deletes the public diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index b848b78f68866ab5347801bd89d0568806a19acf..d2d10e7566d04a66c6b8349dc8a24787e2ed203c 100644 GIT binary patch delta 460 zcmXX>u}&L75X~79$fZgdrJ0BhVH+tS0bC`43Xy^`jkWAO-yN)XotZs@)3~6>2O!HO zqQMdkktmSz0qN4D-~;%B{6Xd{inpVkdGp?zhrg?{`_-SXlJx!d+s&`PpQP7|w=2oF zB-uHeG=5APiK4Cxibcg!#WTf{Vp;M0Zqi8qTupz?(w7UWaen#l^?0&-YHXx+v-JV! zZBpMHLukO^2sUiJlgg%9A)UG^3 z*M`WN^`96vc!^xuScb6|GCosn2510o9)&|vLM(k{l;G)v%|HjrV^9W%h-{nQZIMSL zS9(Z`_Ao+5`$5O0&)WwO7`BCud$1#`nI)Fa)prf`yxPrV%^s^7aj4WRpU3zP4!ShN zJi0~|YrJ$cP~fceCI+UB_67~=d)4<#Ah8AdW{slZ98oJoU*&y_&IsAU_#BBf1^u>SKY^9d~ delta 72 zcmZ2}P3zGmtqqclT!vOgMp4HYxK`M2R%R?@WOQzx%G5rUi4llFG&2yh05K~NvjH(X Q5OV-A=k}>gTxXX709&*c=Kufz diff --git a/state/map.yaml b/state/map.yaml index 20c1ecdc..a9e9fa1f 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -63,6 +63,7 @@ current_status: coordinator_terminal_receipt_cut: Exact 63d2991e advances EpiphanyCoordinatorRunReceipt to v1 and deletes seven unread cargo families: step count, model-provider echo, runtime-store path, artifact and sealed-artifact lists, arbitrary metadata, and final runtime-job echo. The receipt retains terminal status/action/reason, timestamp, session/thread identity, plan-or-execute mode, and exact resident grant/launch/policy/argv/objective/release/manifest/executable provenance. Operator artifacts remain only in the non-authoritative summary; model requests and runtime jobs retain their own provider and job truth. The published JSON schema now matches the live typed receipt instead of rejecting its omitted resident fields. Runtime writable epoch is v20. Core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass; 59 maintained lines are gone. Model Atlas is untouched. runtime_lifecycle_document_cut: Exact 196222d9 makes runtime sessions and jobs lifecycle documents rather than second result records. Session metadata and job metadata had no reader; every producer wrote an empty map. Job summary and artifact refs had no reader; every launch supplied empty artifacts, while the terminal EpiphanyRuntimeJobResult already owns the consequential summary and artifact references. Those four fields, the launch-option echoes, completion merges, and caller literals are gone. The session retains objective/coordinator note; the job retains exact session/role/status/time identity. Runtime writable epoch is v21 and the closed session/job catalog schemas are v1. Core and OpenAI libraries compile; old-epoch refusal, model-failure audit, model-produced completion, coordinator 5/5, and native tool-runtime 4/4 pass. The cut removes 95 net maintained lines, leaves runtime_spine.rs at 9,766 lines with the same 54 public functions and 25 public structs, and does not touch Model Atlas or claim collaboration acceptance. strict_session_writer_cut: Exact cd2177e8 deletes ensure_runtime_session, a duplicate public session writer used only by two model-runtime test fixtures. On an active ID collision it returned the existing session without comparing objective, creation time, or coordinator note, allowing stale fixture context to masquerade as exact replay. Both fixtures now use create_runtime_session, whose sole semantic is new diagnostic session creation with explicit collision refusal. No compatibility path or replacement abstraction was added. Core checks, the model-produced completion proof, and packaged model runtime 11/11 pass. The cut removes 37 net maintained lines; runtime_spine.rs is 9,730 lines with 53 public functions and 25 public structs. Runtime remains v21 and Model Atlas is untouched. + current_work_projection_cut: Exact 0a97eef8 makes project_current_work the sole assembler of the current typed work slice. The callerless current_body_modeling_work and unresolved_body_modeling_work paths independently reopened Body, RepoModel, and runtime state to reconstruct subsets already derived by the aggregate projection. Three callerless per-job continuation-action wrappers likewise rebuilt the entire projection while the live coordinator consumes the retained family review-job selectors. All five duplicate mouths are gone. The keyed Modeling/Research lifecycle still proves thread-free routing and zero live Body rescans; coordinator 5/5 passes. The cut removes 49 net maintained lines from current_work.rs without changing schema, tests, targets, or Atlas. supervisor_subtraction: Exact 856648de completes the supervisor deletion. Epiphany owns no local generic daemon supervisor, semantic projector service, workspace-coverage projector, Windows Task Scheduler integration, or service-policy/lifecycle/heartbeat/recovery mirror. Idunn on Yggdrasil owns source-triggered compilation, testing, packaging, deployment, signed health, and daemon survival. The canonical Epiphany brake gates Epiphany cognition and consequence authority, not Idunn startup or unrelated lifecycle. launch_dependency_cut: Exact 2aeab7a9 deletes the generic organ dependency matrix, generic receipt catalogue/proof profiles, persisted worker-launch cargo, Persona prompt injection, evaluator, and three self-certifying tests: 700 net lines. Family admission owners derive exact dependencies from typed state. Worker-launch schema v2 and Persona projector prompt v1 refuse the old writable shape. Core 378/378, OpenRouter runtime 27/27, packaged runtime 13/13, and Persona re-entry 1/1 pass. operator_surface_subtraction: Exact ef92e853 deletes the callerless view-lens registry, legacy acceptance-bundle builders, test-only raw-JSON result interpreters, and six tests: 797 net lines. Exact a292979d and 77e817c1 delete the duplicate CRRC recommendation algorithm, its unused input model, and four tests: 206 lines. Exact 3b94bf6e and 59c5e3a6 delete the nested duplicate status view, false auxiliary mode, and ignored status arguments. Exact 7c9b0cf3 deletes the fixed synthetic job table, role-board job cargo/mappers, and its test: 338 net lines. Exact 2ce91461 deletes the scene/planning Mind reconstructions, duplicate self-policy crate, unused prompt templates, four counterfeit schemas, and ten producer/source-text tests: 1,723 net lines. Exact 78836f3b deletes eight unconsumed status tableaux, the pressure calculator production only called without telemetry, its unreachable compaction action, one counterfeit schema, and six tests: 518 net lines. Exact f10f7fb3 deletes the final twelve epiphany.surface.* schemas and ten catalog entries after every one proved producerless and consumerless: 692 pure deletions. Exact ab3cacfb deletes thirty-one more producerless contracts, the false runtime-session mutation mouth, every Epiphany-owned Rider/Unity command schema, a callerless prompt-context module, its test-only specialist prompt system, and four self-affirming tests: 3,514 net lines. Exact 16d85b1b deletes six duplicate JSON-schema builder tests and two OpenAI-runtime self-source searches: 209 pure test-line deletions. Exact 06f93f70 deletes the test-only inverse OpenAI-to-native request mapper and makes two retained tests follow canonical native-to-provider derivation: sixty net lines. The local catalog now has twenty-three live or portable contracts. Brokkr owns Unity capabilities through CultMesh/Eve; a future Rider daemon owns Rider. Status retains Mind identity, exact current work, one action/reason decision, readable role lanes, and operator thought sealing. Core checks cleanly; retained provider and focused request-flow tests pass. @@ -125,7 +126,7 @@ current_status: yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,730 lines, 53 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, and coordinator artifact/status cargo are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the public runtime-spine and test-liability audit after exact cd2177e8. Trace each remaining public surface and test to a live consumer and consequential invariant; delete duplicate summaries, mutation wrappers, and implementation-spelling proofs, but preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + next_action: Resume the public API and test-liability audit after exact 0a97eef8. Trace each remaining public surface and test to a live consumer and consequential invariant; delete duplicate projections, mutation wrappers, and implementation-spelling proofs, but preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Session/job documents carry only lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. The sole standalone diagnostic session creator refuses identity collisions; there is no lenient ensure/rebase mouth. It exposes no aggregate status head, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, or public typed-fulfillment machinery. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v21, runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,730 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. From 5a0479446ebf86301174aed592614bd30d96492c Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 04:20:27 +0200 Subject: [PATCH 017/340] Delete callerless helper APIs --- epiphany-core/src/agent_launch.rs | 43 ------------------------------ epiphany-core/src/lib.rs | 4 --- epiphany-core/src/resident_self.rs | 14 ---------- epiphany-core/src/state_ledger.rs | 29 -------------------- 4 files changed, 90 deletions(-) diff --git a/epiphany-core/src/agent_launch.rs b/epiphany-core/src/agent_launch.rs index b9031d72..20932392 100644 --- a/epiphany-core/src/agent_launch.rs +++ b/epiphany-core/src/agent_launch.rs @@ -13,35 +13,6 @@ pub const EPIPHANY_VERIFICATION_OWNER_ROLE: &str = "epiphany-verifier"; pub const EPIPHANY_REORIENT_LAUNCH_BINDING_ID: &str = "reorient-worker"; pub const EPIPHANY_REORIENT_OWNER_ROLE: &str = "epiphany-reorient"; -pub fn epiphany_role_binding_id(role_id: EpiphanyRoleResultRoleId) -> Result<&'static str, String> { - match role_id { - EpiphanyRoleResultRoleId::Imagination => Ok(EPIPHANY_IMAGINATION_ROLE_BINDING_ID), - EpiphanyRoleResultRoleId::Research => Ok(EPIPHANY_RESEARCH_ROLE_BINDING_ID), - EpiphanyRoleResultRoleId::Modeling => Ok(EPIPHANY_MODELING_ROLE_BINDING_ID), - EpiphanyRoleResultRoleId::Verification => Ok(EPIPHANY_VERIFICATION_ROLE_BINDING_ID), - EpiphanyRoleResultRoleId::Implementation => Err( - "implementation is owned by the main coding agent; no role specialist launch template exists" - .to_string(), - ), - EpiphanyRoleResultRoleId::Reorientation => Err( - "reorientation uses epiphany.coordinator.reorient.launch and epiphany.coordinator.reorient.result.read" - .to_string(), - ), - } -} - -pub fn epiphany_role_owner(role_id: EpiphanyRoleResultRoleId) -> Result<&'static str, String> { - match role_id { - EpiphanyRoleResultRoleId::Imagination => Ok(EPIPHANY_IMAGINATION_OWNER_ROLE), - EpiphanyRoleResultRoleId::Research => Ok(EPIPHANY_RESEARCH_OWNER_ROLE), - EpiphanyRoleResultRoleId::Modeling => Ok(EPIPHANY_MODELING_OWNER_ROLE), - EpiphanyRoleResultRoleId::Verification => Ok(EPIPHANY_VERIFICATION_OWNER_ROLE), - EpiphanyRoleResultRoleId::Implementation | EpiphanyRoleResultRoleId::Reorientation => { - Err(epiphany_role_binding_id(role_id).unwrap_err()) - } - } -} - pub fn epiphany_role_label(role_id: EpiphanyRoleResultRoleId) -> &'static str { match role_id { EpiphanyRoleResultRoleId::Implementation => "implementation", @@ -760,17 +731,3 @@ pub fn epiphany_reorient_launch_output_schema() -> serde_json::Value { "additionalProperties": true }) } - -pub fn unique_strings(values: impl IntoIterator) -> Vec { - let mut unique = Vec::new(); - extend_unique_strings(&mut unique, values); - unique -} - -fn extend_unique_strings(target: &mut Vec, values: impl IntoIterator) { - for value in values { - if !target.iter().any(|existing| existing == &value) { - target.push(value); - } - } -} diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index 7b875e9f..3cdc9dd4 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -71,11 +71,8 @@ pub use agent_launch::epiphany_frontier_verdict_modeling_output_schema; pub use agent_launch::epiphany_imagination_consideration_output_schema; pub use agent_launch::epiphany_proposal_modeling_output_schema; pub use agent_launch::epiphany_reorient_launch_output_schema; -pub use agent_launch::epiphany_role_binding_id; pub use agent_launch::epiphany_role_label; pub use agent_launch::epiphany_role_launch_output_schema; -pub use agent_launch::epiphany_role_owner; -pub use agent_launch::unique_strings; pub use atlas::*; pub use causal_work_identity::*; pub use continuity_gateway::*; @@ -347,7 +344,6 @@ pub use state_ledger::add_state_branch; pub use state_ledger::append_state_evidence; pub use state_ledger::close_state_branch; pub use state_ledger::load_state_ledger; -pub use state_ledger::state_ledger_status; pub use substrate_gate::SUBSTRATE_GATE_REPO_ACCESS_GRANT_RECEIPT_SCHEMA_VERSION; pub use substrate_gate::SUBSTRATE_GATE_REPO_ACCESS_GRANT_RECEIPT_TYPE; pub use substrate_gate::SubstrateGateRepoAccessGrantReceipt; diff --git a/epiphany-core/src/resident_self.rs b/epiphany-core/src/resident_self.rs index a516b73e..aee8a9a6 100644 --- a/epiphany-core/src/resident_self.rs +++ b/epiphany-core/src/resident_self.rs @@ -2333,20 +2333,6 @@ pub fn validate_resident_self_prepared_objective( )) } -pub fn validate_resident_self_coordinator_receipt( - lease: &ResidentSelfTurnLease, - coordinator: &crate::EpiphanyCoordinatorRunReceipt, -) -> Result<()> { - validate_resident_self_coordinator_receipt_binding(lease, coordinator)?; - if !matches!( - coordinator.status.as_str(), - "planned" | "needsReview" | "completed" - ) { - return Err(anyhow!("coordinator terminal receipt is not successful")); - } - Ok(()) -} - pub fn validate_resident_self_coordinator_receipt_binding( lease: &ResidentSelfTurnLease, coordinator: &crate::EpiphanyCoordinatorRunReceipt, diff --git a/epiphany-core/src/state_ledger.rs b/epiphany-core/src/state_ledger.rs index ed5c1f93..ac9f88a9 100644 --- a/epiphany-core/src/state_ledger.rs +++ b/epiphany-core/src/state_ledger.rs @@ -8,7 +8,6 @@ use serde::Serialize; use serde_json::Value; use std::path::Path; -pub const STATE_LEDGER_STORE_TYPE: &str = "epiphany.state_ledger"; pub const STATE_LEDGER_KEY: &str = "default"; pub const STATE_LEDGER_SCHEMA_VERSION: &str = "epiphany.state_ledger.v0"; @@ -43,34 +42,6 @@ pub struct EpiphanyLedgerEvidenceRecord { pub branch: Option, } -pub fn state_ledger_status(store_path: impl AsRef) -> Result { - let store_path = store_path.as_ref(); - if !store_path.exists() { - return Ok(serde_json::json!({ - "ok": false, - "present": false, - "store": store_path, - "entryType": STATE_LEDGER_STORE_TYPE, - })); - } - let entry = load_state_ledger(store_path)?; - let active = entry - .branches - .iter() - .filter(|branch| branch.status == "active") - .count(); - Ok(serde_json::json!({ - "ok": true, - "present": true, - "store": store_path, - "entryType": STATE_LEDGER_STORE_TYPE, - "branches": entry.branches.len(), - "activeBranches": active, - "evidence": entry.evidence.len(), - "latestEvidence": entry.evidence.iter().rev().take(8).collect::>(), - })) -} - pub fn load_state_ledger(store_path: impl AsRef) -> Result { let store_path = store_path.as_ref(); let mut cache = state_ledger_cache(store_path)?; From 92d1b8d6bded07454ddc86d17700574ea4a66729 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 04:21:33 +0200 Subject: [PATCH 018/340] docs: Record callerless helper deletion --- notes/epiphany-current-algorithmic-map.md | 10 ++++++++-- notes/epiphany-fork-implementation-plan.md | 3 +++ notes/fresh-workspace-handoff.md | 17 +++++++++++++---- state/ledgers.msgpack | Bin 699175 -> 699597 bytes state/map.yaml | 3 ++- 5 files changed, 26 insertions(+), 7 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 2a645d4e..a9b0d5d2 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `0a97eef8` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for sole current-work projection ownership; +Latest committed implementation cut: `5a047944` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for callerless helper deletion; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -288,6 +288,12 @@ the entire projection. Live coordinator review selectors consume the one shared slice directly. The retained lifecycle proof confirms projection remains thread-free and performs no live Body scan. +Exact `5a047944` removes the callerless generic helper shelf rather than +preserving API because it looks reusable: JSON ledger status, role binding and +owner lookups, unique-string accumulation, and a successful-coordinator +receipt wrapper. Typed owners and the exact coordinator binding validator stay +where live callers use them. No replacement utility layer exists. + Bifrost owns its private feedback-signing identity. Exact `94098223` deletes Epiphany's host-identity executable and the private signer, persisted identity, enrollment, platform protection, and anchor-export implementation behind it. diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 7ac8ceb8..761cd96f 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -304,6 +304,9 @@ Cut in this order: callerless Body-only/unresolved-Body reconstruction paths and three unused per-job continuation wrappers, leaving `project_current_work` as the sole slice assembler. + Exact `5a047944` also removes the callerless JSON ledger-status helper, + generic role lookup helpers, unique-string wrapper, and successful-receipt + wrapper. Live typed owners remain; no generic utility replacement is added. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 497b9f45..7bc39eb8 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `0a97eef8` -Current worktree: documentation/evidence for sole current-work projection ownership; +Latest committed implementation cut: `5a047944` +Current worktree: documentation/evidence for callerless helper deletion; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `0a97eef8` is the current +production symlink body and is inactive. Exact `5a047944` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,15 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `5a047944` deletes ninety pure lines of callerless helper API: a +JSON-shaped state-ledger status projection and its dead label, generic role +binding/owner lookups, a unique-string wrapper and implementation, and an +unused successful-coordinator receipt wrapper. Typed ledger reads, exact +role-family constants/schemas, and the live coordinator binding validator +remain with their actual consumers. Core and the state binary compile +warning-free; swarm remains 4/4. No durable contract, schema, target, test, or +Atlas path changed. Live inter-swarm collaboration remains unproven. + Exact `0a97eef8` makes `project_current_work` the sole assembler of current typed work. The callerless Body-only and unresolved-Body projectors separately reopened Body, RepoModel, and runtime state to derive information already in @@ -90,7 +99,7 @@ the live resident fields. Runtime writable state advances to v20. JSON schemas parse; core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass. The cut removes 59 maintained lines and leaves `runtime_spine.rs` at 9,807 lines. -Continue the public-API/test-liability audit after exact `0a97eef8`. Model Atlas remains protected +Continue the public-API/test-liability audit after exact `5a047944`. Model Atlas remains protected for its first live inter-swarm collaboration trial. Exact `3ed1d564` deletes the public diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index d2d10e7566d04a66c6b8349dc8a24787e2ed203c..711316811ae1e2b1af92ab744fe9c4d9aac56f17 100644 GIT binary patch delta 415 zcmX|+yGjE=6o%c6x5P%Yu@Mef8Io)gHb`P6l0pkFXrtY@d$Jjv%xq?M60K5L*b5<# z5Q&XoA@~3`Vk`IQfVhQr9*%1+bELw=EV;qG<|k6ftV*r!rPrgCQ6j1az@wMRD}g%&rfh#{>^q z!j&w+`E5))GY?a7`i;{()4PF^7`RrkY*uD0WMp({p32ldm5C9EK{PWEvj8zG5VHX> RI}mdKG3WNFOk9&z003Wp7Nr0H diff --git a/state/map.yaml b/state/map.yaml index a9e9fa1f..15b3a0fc 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -64,6 +64,7 @@ current_status: runtime_lifecycle_document_cut: Exact 196222d9 makes runtime sessions and jobs lifecycle documents rather than second result records. Session metadata and job metadata had no reader; every producer wrote an empty map. Job summary and artifact refs had no reader; every launch supplied empty artifacts, while the terminal EpiphanyRuntimeJobResult already owns the consequential summary and artifact references. Those four fields, the launch-option echoes, completion merges, and caller literals are gone. The session retains objective/coordinator note; the job retains exact session/role/status/time identity. Runtime writable epoch is v21 and the closed session/job catalog schemas are v1. Core and OpenAI libraries compile; old-epoch refusal, model-failure audit, model-produced completion, coordinator 5/5, and native tool-runtime 4/4 pass. The cut removes 95 net maintained lines, leaves runtime_spine.rs at 9,766 lines with the same 54 public functions and 25 public structs, and does not touch Model Atlas or claim collaboration acceptance. strict_session_writer_cut: Exact cd2177e8 deletes ensure_runtime_session, a duplicate public session writer used only by two model-runtime test fixtures. On an active ID collision it returned the existing session without comparing objective, creation time, or coordinator note, allowing stale fixture context to masquerade as exact replay. Both fixtures now use create_runtime_session, whose sole semantic is new diagnostic session creation with explicit collision refusal. No compatibility path or replacement abstraction was added. Core checks, the model-produced completion proof, and packaged model runtime 11/11 pass. The cut removes 37 net maintained lines; runtime_spine.rs is 9,730 lines with 53 public functions and 25 public structs. Runtime remains v21 and Model Atlas is untouched. current_work_projection_cut: Exact 0a97eef8 makes project_current_work the sole assembler of the current typed work slice. The callerless current_body_modeling_work and unresolved_body_modeling_work paths independently reopened Body, RepoModel, and runtime state to reconstruct subsets already derived by the aggregate projection. Three callerless per-job continuation-action wrappers likewise rebuilt the entire projection while the live coordinator consumes the retained family review-job selectors. All five duplicate mouths are gone. The keyed Modeling/Research lifecycle still proves thread-free routing and zero live Body rescans; coordinator 5/5 passes. The cut removes 49 net maintained lines from current_work.rs without changing schema, tests, targets, or Atlas. + callerless_helper_cut: Exact 5a047944 deletes ninety lines of public helper shelf with no consumer: JSON-shaped state-ledger status projection and its now-dead type label; generic role binding/owner lookups; unique-string wrapper and implementation; and a successful-coordinator receipt wrapper. The live state CLI reads typed ledger owners, role-family launch code uses exact constants and typed schemas, and Resident Self plus swarm retain the exact coordinator binding validator they actually call. Core and the native state binary compile warning-free; swarm remains 4/4. No durable contract, schema, target, test, or Atlas path changed. supervisor_subtraction: Exact 856648de completes the supervisor deletion. Epiphany owns no local generic daemon supervisor, semantic projector service, workspace-coverage projector, Windows Task Scheduler integration, or service-policy/lifecycle/heartbeat/recovery mirror. Idunn on Yggdrasil owns source-triggered compilation, testing, packaging, deployment, signed health, and daemon survival. The canonical Epiphany brake gates Epiphany cognition and consequence authority, not Idunn startup or unrelated lifecycle. launch_dependency_cut: Exact 2aeab7a9 deletes the generic organ dependency matrix, generic receipt catalogue/proof profiles, persisted worker-launch cargo, Persona prompt injection, evaluator, and three self-certifying tests: 700 net lines. Family admission owners derive exact dependencies from typed state. Worker-launch schema v2 and Persona projector prompt v1 refuse the old writable shape. Core 378/378, OpenRouter runtime 27/27, packaged runtime 13/13, and Persona re-entry 1/1 pass. operator_surface_subtraction: Exact ef92e853 deletes the callerless view-lens registry, legacy acceptance-bundle builders, test-only raw-JSON result interpreters, and six tests: 797 net lines. Exact a292979d and 77e817c1 delete the duplicate CRRC recommendation algorithm, its unused input model, and four tests: 206 lines. Exact 3b94bf6e and 59c5e3a6 delete the nested duplicate status view, false auxiliary mode, and ignored status arguments. Exact 7c9b0cf3 deletes the fixed synthetic job table, role-board job cargo/mappers, and its test: 338 net lines. Exact 2ce91461 deletes the scene/planning Mind reconstructions, duplicate self-policy crate, unused prompt templates, four counterfeit schemas, and ten producer/source-text tests: 1,723 net lines. Exact 78836f3b deletes eight unconsumed status tableaux, the pressure calculator production only called without telemetry, its unreachable compaction action, one counterfeit schema, and six tests: 518 net lines. Exact f10f7fb3 deletes the final twelve epiphany.surface.* schemas and ten catalog entries after every one proved producerless and consumerless: 692 pure deletions. Exact ab3cacfb deletes thirty-one more producerless contracts, the false runtime-session mutation mouth, every Epiphany-owned Rider/Unity command schema, a callerless prompt-context module, its test-only specialist prompt system, and four self-affirming tests: 3,514 net lines. Exact 16d85b1b deletes six duplicate JSON-schema builder tests and two OpenAI-runtime self-source searches: 209 pure test-line deletions. Exact 06f93f70 deletes the test-only inverse OpenAI-to-native request mapper and makes two retained tests follow canonical native-to-provider derivation: sixty net lines. The local catalog now has twenty-three live or portable contracts. Brokkr owns Unity capabilities through CultMesh/Eve; a future Rider daemon owns Rider. Status retains Mind identity, exact current work, one action/reason decision, readable role lanes, and operator thought sealing. Core checks cleanly; retained provider and focused request-flow tests pass. @@ -126,7 +127,7 @@ current_status: yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,730 lines, 53 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, and coordinator artifact/status cargo are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the public API and test-liability audit after exact 0a97eef8. Trace each remaining public surface and test to a live consumer and consequential invariant; delete duplicate projections, mutation wrappers, and implementation-spelling proofs, but preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + next_action: Resume the public API and test-liability audit after exact 5a047944. Trace each remaining public surface and test to a live consumer and consequential invariant; delete duplicate projections, mutation wrappers, JSON status shelves, and implementation-spelling proofs, but preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Session/job documents carry only lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. The sole standalone diagnostic session creator refuses identity collisions; there is no lenient ensure/rebase mouth. It exposes no aggregate status head, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, or public typed-fulfillment machinery. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v21, runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,730 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. From 6ccaf937046970c8d9e0483f5d1b1dfc5b819efd Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 04:31:46 +0200 Subject: [PATCH 019/340] Delete unowned Mind projection helpers --- epiphany-core/src/lib.rs | 1 - epiphany-core/src/persona_social_state.rs | 13 ------------ epiphany-core/src/repository_body_observer.rs | 8 +------- epiphany-core/src/substrate_gate.rs | 20 ------------------- 4 files changed, 1 insertion(+), 41 deletions(-) diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index 3cdc9dd4..f48668bc 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -350,7 +350,6 @@ pub use substrate_gate::SubstrateGateRepoAccessGrantReceipt; pub use substrate_gate::substrate_gate_coordinator_implementation_grant; pub use substrate_gate::substrate_gate_operation_for_governed_tool; pub use substrate_gate::substrate_gate_repo_access_grant_for_worker; -pub use substrate_gate::substrate_gate_repo_work_planning_grant; pub use surfaces::AdmittedModelDirectionConsiderationContextProjection; pub use surfaces::EpiphanyCoordinatorAction; pub use surfaces::EpiphanyCoordinatorDecision; diff --git a/epiphany-core/src/persona_social_state.rs b/epiphany-core/src/persona_social_state.rs index a2d955a4..23fafeae 100644 --- a/epiphany-core/src/persona_social_state.rs +++ b/epiphany-core/src/persona_social_state.rs @@ -742,19 +742,6 @@ pub fn persona_turn_request_source( crate::EpiphanyMindDocumentVersion::from_envelope("epiphany-persona-social", &envelope) } -pub fn blocked_persona_pressures( - store_path: impl AsRef, -) -> Result> { - let cache = persona_social_cache(store_path)?; - let mut pressures = cache - .get_all::()? - .into_iter() - .map(|document| document.pressure) - .collect::>(); - pressures.sort_by(|left, right| left.quarantine_id.cmp(&right.quarantine_id)); - Ok(pressures) -} - pub fn persona_retention_head( store_path: impl AsRef, ) -> Result> { diff --git a/epiphany-core/src/repository_body_observer.rs b/epiphany-core/src/repository_body_observer.rs index 82e4270d..27fcb370 100644 --- a/epiphany-core/src/repository_body_observer.rs +++ b/epiphany-core/src/repository_body_observer.rs @@ -367,12 +367,6 @@ pub fn admit_repository_body_observation( } } -pub fn current_mind_repository_body_observation( - runtime_store: &Path, -) -> Result> { - Ok(crate::assemble_mind_view(runtime_store)?.repository_body_observation) -} - /// Loads the authenticated current Repository Body basis already persisted for /// a runtime without observing the worktree or advancing the Body generation. pub fn load_current_runtime_repository_body_basis( @@ -1586,7 +1580,7 @@ mod tests { run(d.path(), &["add", "."])?; let observed = observe_runtime_repository_body_basis(&runtime)?; assert_eq!( - current_mind_repository_body_observation(&runtime)?, + crate::assemble_mind_view(&runtime)?.repository_body_observation, Some(observed.clone()) ); let mut mind = crate::runtime_spine_cache(&runtime)?; diff --git a/epiphany-core/src/substrate_gate.rs b/epiphany-core/src/substrate_gate.rs index 7e5feb00..4477c249 100644 --- a/epiphany-core/src/substrate_gate.rs +++ b/epiphany-core/src/substrate_gate.rs @@ -83,26 +83,6 @@ pub fn substrate_gate_operation_for_governed_tool( } } -pub fn substrate_gate_repo_work_planning_grant( - receipt_id: String, - runtime_job_id: String, - granted_paths: Vec, - granted_at: String, -) -> SubstrateGateRepoAccessGrantReceipt { - SubstrateGateRepoAccessGrantReceipt { - schema_version: SUBSTRATE_GATE_REPO_ACCESS_GRANT_RECEIPT_SCHEMA_VERSION.to_string(), - receipt_id, - runtime_job_id, - binding_id: "repo-work-runner".to_string(), - role: "epiphany-hands".to_string(), - authority_scope: "repo.branch_local_work".to_string(), - granted_operations: vec!["read".to_string(), "snapshot".to_string()], - granted_paths, - granted_at, - contract: "Substrate Gate grants read/snapshot access for repo-work planning only; mutation awaits an approved Hands review.".to_string(), - } -} - pub fn substrate_gate_coordinator_implementation_grant( receipt_id: String, runtime_job_id: String, From 47e0c413f1b5cac51bde9fa4cb84ba19665f608c Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 04:33:15 +0200 Subject: [PATCH 020/340] docs: Record unowned projection cut --- notes/epiphany-current-algorithmic-map.md | 12 ++++++++++-- notes/epiphany-fork-implementation-plan.md | 4 ++++ notes/fresh-workspace-handoff.md | 19 +++++++++++++++---- state/ledgers.msgpack | Bin 699597 -> 700104 bytes state/map.yaml | 3 ++- 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index a9b0d5d2..40b1d3d6 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `5a047944` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for callerless helper deletion; +Latest committed implementation cut: `6ccaf937` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for unowned projection deletion; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -294,6 +294,14 @@ owner lookups, unique-string accumulation, and a successful-coordinator receipt wrapper. Typed owners and the exact coordinator binding validator stay where live callers use them. No replacement utility layer exists. +Exact `6ccaf937` removes three more unowned mouths. Repository Body consumers +read the assembled typed Mind view rather than a one-field forwarding helper. +Persona quarantine remains keyed typed state rather than gaining a second +sorted-list projection. Substrate Gate no longer exposes a generic repo-work +planning grant that no admission or actuator consumed; exact coordinator and +worker grant constructors remain with their live authority paths. Nothing is +inserted between those owners and their consumers. + Bifrost owns its private feedback-signing identity. Exact `94098223` deletes Epiphany's host-identity executable and the private signer, persisted identity, enrollment, platform protection, and anchor-export implementation behind it. diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 761cd96f..5247d8b7 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -307,6 +307,10 @@ Cut in this order: Exact `5a047944` also removes the callerless JSON ledger-status helper, generic role lookup helpers, unique-string wrapper, and successful-receipt wrapper. Live typed owners remain; no generic utility replacement is added. + Exact `6ccaf937` removes the one-field repository Body Mind-view alias, the + unconsumed sorted Persona-quarantine projection, and the unconsumed generic + repo-work planning grant. Typed Mind/quarantine owners and exact live + coordinator/worker grants remain. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 7bc39eb8..1e6b9c29 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `5a047944` -Current worktree: documentation/evidence for callerless helper deletion; +Latest committed implementation cut: `6ccaf937` +Current worktree: documentation/evidence for unowned projection deletion; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `5a047944` is the current +production symlink body and is inactive. Exact `6ccaf937` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,17 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `6ccaf937` deletes three public surfaces with no live consumer. The +repository Body alias merely unwrapped `assemble_mind_view`; its proof now +reads the typed Mind view directly. The Persona blocked-pressure helper rebuilt +a sorted list already owned by keyed quarantine documents. The generic +repo-work planning grant could mint read/snapshot Hands authority but no +admission or actuator consumed it; exact coordinator and worker grant owners +remain. Core checks, the read-only Body-basis proof, the fixed governed-tool +operation proof, and coordinator 5/5 pass. The cut removes 41 net maintained +lines without a schema, target, or Atlas change. Live inter-swarm collaboration +remains unproven. + Exact `5a047944` deletes ninety pure lines of callerless helper API: a JSON-shaped state-ledger status projection and its dead label, generic role binding/owner lookups, a unique-string wrapper and implementation, and an @@ -99,7 +110,7 @@ the live resident fields. Runtime writable state advances to v20. JSON schemas parse; core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass. The cut removes 59 maintained lines and leaves `runtime_spine.rs` at 9,807 lines. -Continue the public-API/test-liability audit after exact `5a047944`. Model Atlas remains protected +Continue the public-API/test-liability audit after exact `6ccaf937`. Model Atlas remains protected for its first live inter-swarm collaboration trial. Exact `3ed1d564` deletes the public diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 711316811ae1e2b1af92ab744fe9c4d9aac56f17..2509ebf7641b4e40d9a09a4c666208bed8a91b3b 100644 GIT binary patch delta 497 zcmYjNKTA775cT5!6AJ~wMi>w*B$tFc_2(~E3ThruRNSc~gP(r=BAEnIzWUkd49 zO-j-DpZtRqGjwRdof_>6sNc?B;CB@2mb%^Hz-op;N#?C`n{er3G88dL1+afj*VPxvMfXNEViL2If8M zpg6J4c(1#@urF$G4Bz@A1*_Fn$c42P*dgP(5pfcY4lab!j=_={SIYq|sEz3c>=B<8 cHeDtxpVUzyPy5M3xHQ8POz@w)tc|+z3x-OscmMzZ delta 73 zcmX?cSL^Ietql^4+(w30hNe-+7`Rri+N{i2$jIp0Je8?^Dib3RgJ@ Date: Mon, 24 Aug 2026 04:42:09 +0200 Subject: [PATCH 021/340] Delete unconsumed release and trust readers --- epiphany-core/src/idunn_provider_health.rs | 16 ---------------- epiphany-core/src/lib.rs | 4 ++-- epiphany-core/src/packaged_release.rs | 7 ------- 3 files changed, 2 insertions(+), 25 deletions(-) diff --git a/epiphany-core/src/idunn_provider_health.rs b/epiphany-core/src/idunn_provider_health.rs index fa5e01af..b96b490c 100644 --- a/epiphany-core/src/idunn_provider_health.rs +++ b/epiphany-core/src/idunn_provider_health.rs @@ -107,22 +107,6 @@ pub struct IdunnProviderHealthAdmission { pub trust_anchor_bound_at_unix_millis: u64, } -pub fn read_idunn_provider_health_trust_anchor( - path: &Path, -) -> Result { - let rows = SingleFileMessagePackBackingStore::new(path).pull_all_read_only_snapshot()?; - if rows.len() != 1 { - bail!("Idunn provider-health trust anchor store must contain exactly one row"); - } - let row = &rows[0]; - if row.r#type != GameCultServiceTrustAnchorRecord::TYPE { - bail!("Idunn provider-health trust anchor store contains foreign authority"); - } - let anchor: GameCultServiceTrustAnchorRecord = rmp_serde::from_slice(&row.payload)?; - anchor.validate()?; - Ok(anchor) -} - pub fn provider_health_record_key(daemon_id: &str, health_contract: &str) -> String { format!( "provider-health:{:x}", diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index f48668bc..8b830e23 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -122,7 +122,7 @@ pub use idunn_provider_health::{ EPIPHANY_IDUNN_PROVIDER_HEALTH_ADMISSION_SCHEMA, EPIPHANY_IDUNN_PROVIDER_HEALTH_ADMISSION_TYPE, IdunnProviderHealthAdmission, ProviderReleaseBinding, RequiredProviderHealth, admit_required_idunn_provider_health, provider_health_record_key, - read_idunn_provider_health_trust_anchor, required_idunn_provider_health_query, + required_idunn_provider_health_query, verify_idunn_provider_health_candidate, }; pub use idunn_runtime_health::{ @@ -162,7 +162,7 @@ pub use packaged_release::{ EpiphanyPackagedReleaseEntry, EpiphanyPackagedReleaseHead, PackageReleaseRequest, authenticate_epiphany_packaged_release, epiphany_packaged_release_binary_path, epiphany_packaged_release_witness_sha256, inspect_epiphany_packaged_release_witness, - load_epiphany_packaged_release, load_epiphany_packaged_release_head, package_epiphany_release, + load_epiphany_packaged_release, package_epiphany_release, publish_epiphany_packaged_release, read_epiphany_packaged_release_witness, required_packaged_release_binaries, validate_epiphany_packaged_release, verify_epiphany_packaged_release_files, write_epiphany_packaged_release_witness, diff --git a/epiphany-core/src/packaged_release.rs b/epiphany-core/src/packaged_release.rs index dc857e88..0e5cdbcd 100644 --- a/epiphany-core/src/packaged_release.rs +++ b/epiphany-core/src/packaged_release.rs @@ -61,13 +61,6 @@ pub fn load_epiphany_packaged_release( .get(&format!("{RELEASE_KEY_PREFIX}{release_id}")) } -pub fn load_epiphany_packaged_release_head( - store: &Path, - runtime_id: &str, -) -> Result> { - open_epiphany_cultmesh_node(store, runtime_id.to_string())?.get(RELEASE_HEAD_KEY) -} - pub fn authenticate_epiphany_packaged_release( store: &Path, runtime_id: &str, From 3a0c7798a633028c9fb9925f109322c2440c4b3d Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 04:42:54 +0200 Subject: [PATCH 022/340] docs: Record unconsumed reader cut --- notes/epiphany-current-algorithmic-map.md | 12 ++++++++++-- notes/epiphany-fork-implementation-plan.md | 3 +++ notes/fresh-workspace-handoff.md | 17 +++++++++++++---- state/ledgers.msgpack | Bin 700104 -> 700539 bytes state/map.yaml | 3 ++- 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 40b1d3d6..522d2aee 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `6ccaf937` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for unowned projection deletion; +Latest committed implementation cut: `f6a2ad7f` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for unconsumed read-helper deletion; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -302,6 +302,14 @@ planning grant that no admission or actuator consumed; exact coordinator and worker grant constructors remain with their live authority paths. Nothing is inserted between those owners and their consumers. +Exact `f6a2ad7f` deletes two exported readers with no workspace consumer. +Packaged-release authentication remains exact-ID based; its current-head +document remains publication state, not a general query API. Idunn +provider-health admission continues to consume and validate typed trust +anchors supplied at its boundary; it no longer owns an unused file-loading +convenience path. The signed admission, continuity, and substitution laws are +unchanged. + Bifrost owns its private feedback-signing identity. Exact `94098223` deletes Epiphany's host-identity executable and the private signer, persisted identity, enrollment, platform protection, and anchor-export implementation behind it. diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 5247d8b7..c4b06c4d 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -311,6 +311,9 @@ Cut in this order: unconsumed sorted Persona-quarantine projection, and the unconsumed generic repo-work planning grant. Typed Mind/quarantine owners and exact live coordinator/worker grants remain. + Exact `f6a2ad7f` removes the callerless packaged-release-head and Idunn + trust-anchor file readers. Exact release authentication and typed signed + health admission remain with their live consumers. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 1e6b9c29..4b703f89 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `6ccaf937` -Current worktree: documentation/evidence for unowned projection deletion; +Latest committed implementation cut: `f6a2ad7f` +Current worktree: documentation/evidence for unconsumed read-helper deletion; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `6ccaf937` is the current +production symlink body and is inactive. Exact `f6a2ad7f` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,15 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `f6a2ad7f` deletes two exported read helpers with no workspace consumer. +Packaged-release publication still writes its current-head document atomically, +and release authentication still loads an exact release by ID; the unused +standalone head reader is gone. Idunn signed-health admission still validates +supplied typed trust anchors and preserves all continuity and substitution +proofs; the unused trust-anchor file reader is gone. Core checks and Idunn +provider-health 6/6 pass. The cut removes 25 net maintained lines without a +schema, target, or Atlas change. + Exact `6ccaf937` deletes three public surfaces with no live consumer. The repository Body alias merely unwrapped `assemble_mind_view`; its proof now reads the typed Mind view directly. The Persona blocked-pressure helper rebuilt @@ -110,7 +119,7 @@ the live resident fields. Runtime writable state advances to v20. JSON schemas parse; core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass. The cut removes 59 maintained lines and leaves `runtime_spine.rs` at 9,807 lines. -Continue the public-API/test-liability audit after exact `6ccaf937`. Model Atlas remains protected +Continue the public-API/test-liability audit after exact `f6a2ad7f`. Model Atlas remains protected for its first live inter-swarm collaboration trial. Exact `3ed1d564` deletes the public diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 2509ebf7641b4e40d9a09a4c666208bed8a91b3b..abadd60a2bacc97ec71b1ace4d425b7d1cf40d67 100644 GIT binary patch delta 417 zcmYk1&q~8U5XMdY*T$3JLGUurTS;1prHZ$LqCE%-J%|TknrxbdxQW@>+MGP}-~&j> zONbRb_y*$12M`3`!;4d~(!+0;*`4|3``$il-(R(-O>3>`?Kk%>UKi}i`E%8}wydMk zxO6uzSv?wS4fa<_8;Xebhj{(H1Z(^!hr04PrdpY!_$7|Y;KY-&l%z7oOIVoVYE3F{~$ zDQ{@g(mn_|@9N2vOu{sZ%@l1cyo delta 73 zcmezUK Date: Mon, 24 Aug 2026 04:45:31 +0200 Subject: [PATCH 023/340] Delete dead Imagination review contract --- .../src/imagination_consideration.rs | 67 ------------------- epiphany-core/src/lib.rs | 3 +- epiphany-core/src/runtime_spine.rs | 3 +- 3 files changed, 2 insertions(+), 71 deletions(-) diff --git a/epiphany-core/src/imagination_consideration.rs b/epiphany-core/src/imagination_consideration.rs index 05f5548e..d6c2bcc4 100644 --- a/epiphany-core/src/imagination_consideration.rs +++ b/epiphany-core/src/imagination_consideration.rs @@ -8,7 +8,6 @@ pub const REQUEST_SCHEMA: &str = "epiphany.self.imagination_consideration_reques pub const REQUEST_CONTRACT: &str = "epiphany.imagination_consideration_request.v1"; pub const CANDIDATE_SCHEMA: &str = "epiphany.imagination.consideration_candidate.v1"; pub const CANDIDATE_CONTRACT: &str = "epiphany.imagination_consideration_candidate.v1"; -pub const REVIEW_REQUEST_SCHEMA: &str = "epiphany.self.imagination_consideration_review_request.v0"; #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] @@ -147,26 +146,6 @@ pub struct ImaginationConsiderationCandidate { pub data_classification: String, } -#[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] -#[cultcache( - type = "epiphany.self.imagination_consideration_review_request", - schema = "ImaginationConsiderationReviewRequest" -)] -pub struct ImaginationConsiderationReviewRequest { - #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] - pub review_request_id: String, - #[cultcache(key = 2)] - pub candidate_id: String, - #[cultcache(key = 3)] - pub candidate_sha256: String, - #[cultcache(key = 4)] - pub requested_review_route: String, - #[cultcache(key = 5)] - pub selected_at: String, -} - pub fn commit_request( runtime_store: &Path, persona_feedback_store: &Path, @@ -379,52 +358,6 @@ pub fn render_consideration_prompt(request: &ImaginationConsiderationRequest) -> )) } -pub fn request_candidate_modeling_review( - runtime_store: &Path, - request: &ImaginationConsiderationRequest, - candidate: &ImaginationConsiderationCandidate, - selected_at: &str, -) -> Result { - chrono::DateTime::parse_from_rfc3339(selected_at) - .map_err(|_| anyhow!("consideration selection timestamp must be RFC3339"))?; - let mut cache = crate::runtime_spine_cache(runtime_store)?; - cache.pull_all_backing_stores()?; - validate_current_request(&cache, request)?; - validate_candidate(request, candidate)?; - if candidate.disposition != ImaginationConsiderationDisposition::Suggest - || candidate.recommended_review_route != ImaginationConsiderationReviewRoute::ModelingReview - { - bail!("only an explicit suggest/modeling_review candidate may be selected"); - } - let candidate_sha256 = format!("sha256-{:x}", Sha256::digest(rmp_serde::to_vec(candidate)?)); - let review_request_id = format!( - "imagination-consideration-review-{:x}", - Sha256::digest(format!("{}:{candidate_sha256}", request.request_id).as_bytes()) - ); - let review = ImaginationConsiderationReviewRequest { - schema_version: REVIEW_REQUEST_SCHEMA.into(), - review_request_id: review_request_id.clone(), - candidate_id: candidate.candidate_id.clone(), - candidate_sha256, - requested_review_route: "modeling_review_proposal_only".into(), - selected_at: selected_at.into(), - }; - if let Some(existing) = - cache.get::(&review_request_id)? - { - let mut replay = review; - replay.selected_at = existing.selected_at.clone(); - return if replay == existing { - Ok(existing) - } else { - bail!("consideration review request collision") - }; - } - let (entry, _) = cache.prepare_entry(&review_request_id, &review)?; - SingleFileMessagePackBackingStore::new(runtime_store).push(&entry)?; - Ok(review) -} - #[cfg(test)] mod tests { use super::*; diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index 8b830e23..2d523c9b 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -136,14 +136,13 @@ pub use imagination_consideration::{ CANDIDATE_SCHEMA as IMAGINATION_CONSIDERATION_CANDIDATE_SCHEMA_VERSION, ImaginationConsiderationCandidate, ImaginationConsiderationDisposition, ImaginationConsiderationQuestion, ImaginationConsiderationRequest, - ImaginationConsiderationReviewRequest, ImaginationConsiderationReviewRoute, + ImaginationConsiderationReviewRoute, ImaginationOptionDraft, QuotedPersonaFeedbackEvidence, REQUEST_CONTRACT as IMAGINATION_CONSIDERATION_REQUEST_CONTRACT, REQUEST_SCHEMA as IMAGINATION_CONSIDERATION_REQUEST_SCHEMA_VERSION, candidate_id_for_launch as imagination_consideration_candidate_id_for_launch, commit_request as commit_imagination_consideration_request, render_consideration_prompt as render_imagination_consideration_prompt, - request_candidate_modeling_review as request_imagination_consideration_modeling_review, validate_candidate as validate_imagination_consideration_candidate, validate_current_request as validate_current_imagination_consideration_request, }; diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index 2cf781ed..bff693be 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -88,7 +88,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v21"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v22"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; pub const RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.model_execution_binding.v0"; @@ -843,7 +843,6 @@ fn runtime_spine_schema_cache() -> Result { cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; - cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; From 14e3c44f5cc4b26df271b3b0344e74b9abb1127b Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 04:46:43 +0200 Subject: [PATCH 024/340] docs: Record Imagination contract cut --- notes/epiphany-current-algorithmic-map.md | 11 +++++++++-- notes/epiphany-fork-implementation-plan.md | 4 ++++ notes/fresh-workspace-handoff.md | 19 +++++++++++++++---- state/ledgers.msgpack | Bin 700539 -> 700977 bytes state/map.yaml | 7 ++++--- 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 522d2aee..268d299c 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `f6a2ad7f` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for unconsumed read-helper deletion; +Latest committed implementation cut: `be611f24` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for dead Imagination contract deletion; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -310,6 +310,13 @@ anchors supplied at its boundary; it no longer owns an unused file-loading convenience path. The signed admission, continuity, and substitution laws are unchanged. +Imagination consideration no longer writes a review-shaped cul-de-sac. Exact +`be611f24` deletes the producerless review request, its durable type, schema +constant, export, and runtime registry entry. The retained candidate remains a +typed proposal-only outcome; a real adopted Modeling proposal follows the +separate proposal lifecycle rather than this unread document. Runtime epoch +v22 refuses v21 stores instead of silently carrying the retired type forward. + Bifrost owns its private feedback-signing identity. Exact `94098223` deletes Epiphany's host-identity executable and the private signer, persisted identity, enrollment, platform protection, and anchor-export implementation behind it. diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index c4b06c4d..487d20f1 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -314,6 +314,10 @@ Cut in this order: Exact `f6a2ad7f` removes the callerless packaged-release-head and Idunn trust-anchor file readers. Exact release authentication and typed signed health admission remain with their live consumers. + Exact `be611f24` removes the producerless Imagination consideration-review + writer and durable contract together. Candidates remain proposal-only + outcomes; actual adopted proposal Modeling stays in its existing lifecycle. + Runtime writable epoch is v22. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 4b703f89..e4ee6d83 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `f6a2ad7f` -Current worktree: documentation/evidence for unconsumed read-helper deletion; +Latest committed implementation cut: `be611f24` +Current worktree: documentation/evidence for dead Imagination contract deletion; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `f6a2ad7f` is the current +production symlink body and is inactive. Exact `be611f24` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,17 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `be611f24` deletes the producerless Imagination consideration-review +request as one authority cut: writer, durable document, schema constant, +public export, and runtime registration are all gone. It had no caller, reader, +test, or Modeling admission path. Imagination requests and candidates retain +their quoted-evidence, substitution, chronology, disposition, and route +validation; adopted proposal Modeling remains owned by its actual lifecycle. +Runtime writable epoch advances to v22 so a v21 store cannot carry the retired +contract into current authority. Core checks, Imagination 8/8, old-epoch +refusal, and coordinator 5/5 pass. The cut removes 71 net maintained lines and +does not touch Atlas. + Exact `f6a2ad7f` deletes two exported read helpers with no workspace consumer. Packaged-release publication still writes its current-head document atomically, and release authentication still loads an exact release by ID; the unused @@ -119,7 +130,7 @@ the live resident fields. Runtime writable state advances to v20. JSON schemas parse; core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass. The cut removes 59 maintained lines and leaves `runtime_spine.rs` at 9,807 lines. -Continue the public-API/test-liability audit after exact `f6a2ad7f`. Model Atlas remains protected +Continue the public-API/test-liability audit after exact `be611f24`. Model Atlas remains protected for its first live inter-swarm collaboration trial. Exact `3ed1d564` deletes the public diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index abadd60a2bacc97ec71b1ace4d425b7d1cf40d67..6e565a8061df76d0668b1fd6e8955fa99669c3a1 100644 GIT binary patch delta 322 zcmWm8KT88a5Qky!{F^N_79t4<16qYMk{Du$HVT3%tn6%Layupmm)&G{FNuwfptVZa z##Sp8gNWb2&hKC$*7i2;6%TJS{FuM5!uY%JlJi)#zPWY$F~P?3ud80q^A0XX{?*9$ zoV1h9lr!zjIJ3^2lX)Nc?B~gTKC-M|sowq`tt?#b4>2^*q-v>jTCUjqIm_Fip2_X4 zE9yry07boow1I(&45|KvBdt=$M<gT+h}50CtNPa{vGU diff --git a/state/map.yaml b/state/map.yaml index d20c33ee..28d611f2 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -52,7 +52,7 @@ current_status: summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Runtime status aggregates, global revisions, generic role/event authority, duplicate prompt-state cargo, duplicate family launch bindings, and Epiphany-owned Rider/Unity organs are absent. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. Completed model-session tombstones retain only resurrection fences and an exact deletion digest. Archived worker attempts retain the exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records needed for audit. Runtime sessions and jobs own lifecycle identity/status only; terminal job results own summaries and artifacts. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v21; runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, and coordinator-run-receipt schema/type is v1. Old writable stores refuse with no migrator or dual reader. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Runtime status aggregates, global revisions, generic role/event authority, duplicate prompt-state cargo, duplicate family launch bindings, and Epiphany-owned Rider/Unity organs are absent. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. Completed model-session tombstones retain only resurrection fences and an exact deletion digest. Archived worker attempts retain the exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records needed for audit. Runtime sessions and jobs own lifecycle identity/status only; terminal job results own summaries and artifacts. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v22; runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, and coordinator-run-receipt schema/type is v1. Old writable stores refuse with no migrator or dual reader. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. atlas_authoring_cut: Exact ce306e23 preserves the complete inter-swarm Atlas vertical slice while deleting its duplicate local offer/claim authoring authority. Ordinary Modeling through RepoModel operations is the sole owner of provider offers and consumer claims; Atlas retains signed publication, trust, transport, deterministic projection, Soul verification, Self impact admission, Resident Self wake, brakes, and Eve lowering. Two direct write-intent types, their runtime commit APIs and registry entries, 518 planner lines, and two tests that animated only that duplicate path are gone. The runtime proof now creates offers/claims through RepoModel before proving exact verification admission and Body-drift refusal. The cut removes 593 net source lines; the three-repository direct/transitive Modeling proof passes. These are component proofs only: no live inter-swarm collaboration has yet run, so the Atlas vertical slice remains protected until Gate 1 exercises it end to end. Runtime writable epoch is v14. autonomous_proposal_binding_cut: Exact 5d507bfd reduces Self's autonomous Imagination-to-Modeling origin binding from a 22-field duplicate archive to six causal join fields: schema, exact direction-result identity, selected option ordinal, worker job identity, and exact worker-result/launch digests. Proposal identity and payload, direction request, runtime/thread, typed model projection, Body/domain binding, selected option content, and canonical Modeling-request identity are checked directly from their owning immutable documents. The atomic proposal plus binding plus Modeling-request commit and its broad keyed-lifecycle proof remain; 60 net source lines are gone. Runtime writable epoch is v15. hands_verification_derivation_cut: Exact 6ccc7dd2 deletes the 20-field transient Hands receipt-chain summary. The Hands commit owner now derives the exact Verification request directly from the persisted patch, command, and commit receipts plus the frontier authority; no copied schema, job, grant, command-output, Git, path, summary, or timestamp fields mediate that handoff. Atomic Hands-to-Verification admission and the concurrent Persona/Hands lifecycle proof remain. The cut removes 43 net source lines without adding state, schema, or tests. @@ -67,6 +67,7 @@ current_status: callerless_helper_cut: Exact 5a047944 deletes ninety lines of public helper shelf with no consumer: JSON-shaped state-ledger status projection and its now-dead type label; generic role binding/owner lookups; unique-string wrapper and implementation; and a successful-coordinator receipt wrapper. The live state CLI reads typed ledger owners, role-family launch code uses exact constants and typed schemas, and Resident Self plus swarm retain the exact coordinator binding validator they actually call. Core and the native state binary compile warning-free; swarm remains 4/4. No durable contract, schema, target, test, or Atlas path changed. unowned_projection_and_grant_cut: Exact 6ccaf937 deletes three public surfaces with no live consumer. The repository Body helper merely unwrapped assemble_mind_view and its proof now reads the typed Mind view directly. The Persona blocked-pressure helper reconstructed a sorted list already owned by keyed quarantine documents. The generic repo-work planning grant could mint read/snapshot Hands authority but no admission or actuator consumed it; exact coordinator and worker grant constructors remain. Core checks, the read-only Body-basis proof, the fixed governed-tool operation proof, and coordinator 5/5 pass. The cut removes 41 net maintained lines without changing a schema, target, or Atlas path. Live inter-swarm collaboration remains unproven. unconsumed_read_helper_cut: Exact f6a2ad7f deletes two exported readers with no workspace consumer. Packaged-release publication retains its atomically written current-head document and authentication retains exact release-by-ID reads; only the unused standalone head reader is gone. Idunn provider-health admission retains typed supplied trust-anchor validation plus continuity and substitution proofs; only the unused trust-anchor file reader is gone. Core checks and Idunn provider-health 6/6 pass. The cut removes 25 net maintained lines without changing a schema, target, or Atlas path. + imagination_review_contract_cut: Exact be611f24 deletes the producerless Imagination consideration-review request as one authority cut: its writer, durable document, schema constant, public export, and runtime registration are all gone. It had no caller, reader, test, or Modeling admission path. Imagination requests and candidates retain quoted-evidence, substitution, chronology, disposition, and route validation; adopted proposal Modeling remains owned by its actual lifecycle. Runtime writable epoch advances to v22 so v21 stores cannot carry the retired contract into current authority. Core checks, Imagination 8/8, old-epoch refusal, and coordinator 5/5 pass. The cut removes 71 net maintained lines without touching Atlas. supervisor_subtraction: Exact 856648de completes the supervisor deletion. Epiphany owns no local generic daemon supervisor, semantic projector service, workspace-coverage projector, Windows Task Scheduler integration, or service-policy/lifecycle/heartbeat/recovery mirror. Idunn on Yggdrasil owns source-triggered compilation, testing, packaging, deployment, signed health, and daemon survival. The canonical Epiphany brake gates Epiphany cognition and consequence authority, not Idunn startup or unrelated lifecycle. launch_dependency_cut: Exact 2aeab7a9 deletes the generic organ dependency matrix, generic receipt catalogue/proof profiles, persisted worker-launch cargo, Persona prompt injection, evaluator, and three self-certifying tests: 700 net lines. Family admission owners derive exact dependencies from typed state. Worker-launch schema v2 and Persona projector prompt v1 refuse the old writable shape. Core 378/378, OpenRouter runtime 27/27, packaged runtime 13/13, and Persona re-entry 1/1 pass. operator_surface_subtraction: Exact ef92e853 deletes the callerless view-lens registry, legacy acceptance-bundle builders, test-only raw-JSON result interpreters, and six tests: 797 net lines. Exact a292979d and 77e817c1 delete the duplicate CRRC recommendation algorithm, its unused input model, and four tests: 206 lines. Exact 3b94bf6e and 59c5e3a6 delete the nested duplicate status view, false auxiliary mode, and ignored status arguments. Exact 7c9b0cf3 deletes the fixed synthetic job table, role-board job cargo/mappers, and its test: 338 net lines. Exact 2ce91461 deletes the scene/planning Mind reconstructions, duplicate self-policy crate, unused prompt templates, four counterfeit schemas, and ten producer/source-text tests: 1,723 net lines. Exact 78836f3b deletes eight unconsumed status tableaux, the pressure calculator production only called without telemetry, its unreachable compaction action, one counterfeit schema, and six tests: 518 net lines. Exact f10f7fb3 deletes the final twelve epiphany.surface.* schemas and ten catalog entries after every one proved producerless and consumerless: 692 pure deletions. Exact ab3cacfb deletes thirty-one more producerless contracts, the false runtime-session mutation mouth, every Epiphany-owned Rider/Unity command schema, a callerless prompt-context module, its test-only specialist prompt system, and four self-affirming tests: 3,514 net lines. Exact 16d85b1b deletes six duplicate JSON-schema builder tests and two OpenAI-runtime self-source searches: 209 pure test-line deletions. Exact 06f93f70 deletes the test-only inverse OpenAI-to-native request mapper and makes two retained tests follow canonical native-to-provider derivation: sixty net lines. The local catalog now has twenty-three live or portable contracts. Brokkr owns Unity capabilities through CultMesh/Eve; a future Rider daemon owns Rider. Status retains Mind identity, exact current work, one action/reason decision, readable role lanes, and operator thought sealing. Core checks cleanly; retained provider and focused request-flow tests pass. @@ -129,9 +130,9 @@ current_status: yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,730 lines, 53 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, and coordinator artifact/status cargo are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the public API and test-liability audit after exact f6a2ad7f. Trace each remaining public surface and test to a live consumer and consequential invariant; next inspect the producerless Imagination consideration-review request as a durable schema cut rather than deleting its writer alone. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + next_action: Resume the public API and test-liability audit after exact be611f24. Trace each remaining public surface and test to a live consumer and consequential invariant; delete only complete dead authority slices, not isolated writers whose durable types remain registered. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Session/job documents carry only lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. The sole standalone diagnostic session creator refuses identity collisions; there is no lenient ensure/rebase mouth. It exposes no aggregate status head, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, or public typed-fulfillment machinery. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v21, runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,730 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Session/job documents carry only lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. The sole standalone diagnostic session creator refuses identity collisions; there is no lenient ensure/rebase mouth. It exposes no aggregate status head, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, public typed-fulfillment machinery, or producerless Imagination review contract. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v22, runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,729 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. From 3140d3054affec5e2196e31d51f4d5341f50ef6d Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 04:51:24 +0200 Subject: [PATCH 025/340] Delete dead Resident Self receipt contract --- epiphany-core/src/lib.rs | 1 - epiphany-core/src/resident_self.rs | 51 +++++++------------ .../src/surfaces/coordinator_contract.rs | 14 ----- 3 files changed, 17 insertions(+), 49 deletions(-) diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index 2d523c9b..f8888625 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -353,7 +353,6 @@ pub use surfaces::AdmittedModelDirectionConsiderationContextProjection; pub use surfaces::EpiphanyCoordinatorAction; pub use surfaces::EpiphanyCoordinatorDecision; pub use surfaces::EpiphanyCoordinatorInput; -pub use surfaces::EpiphanyCoordinatorRoleResultStatus; pub use surfaces::EpiphanyCoordinatorRoleStatus; pub use surfaces::EpiphanyCrrcAction; pub use surfaces::EpiphanyCrrcResultStatus; diff --git a/epiphany-core/src/resident_self.rs b/epiphany-core/src/resident_self.rs index aee8a9a6..692cd8bf 100644 --- a/epiphany-core/src/resident_self.rs +++ b/epiphany-core/src/resident_self.rs @@ -8,9 +8,7 @@ use std::collections::{BTreeSet, HashSet}; use std::path::{Path, PathBuf}; pub const RESIDENT_SELF_STATE_KEY: &str = "resident-self"; -pub const RESIDENT_SELF_STATE_SCHEMA_VERSION: &str = "epiphany.resident_self.state.v1"; -pub const RESIDENT_SELF_RUNTIME_RECEIPT_SCHEMA_VERSION: &str = - "epiphany.resident_self.runtime_receipt.v0"; +pub const RESIDENT_SELF_STATE_SCHEMA_VERSION: &str = "epiphany.resident_self.state.v2"; pub const RESIDENT_SELF_PRESSURE_SCHEMA_VERSION: &str = "epiphany.resident_self.pressure.v0"; pub const RESIDENT_SELF_COORDINATOR_CONTINUATION_PRESSURE_KIND: &str = "coordinator-internal-continuation"; @@ -530,32 +528,6 @@ impl Default for ResidentSelfState { } } -#[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] -#[cultcache( - type = "epiphany.resident_self.runtime_receipt.v0", - schema = "ResidentSelfRuntimeReceipt" -)] -pub struct ResidentSelfRuntimeReceipt { - #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] - pub receipt_id: String, - #[cultcache(key = 2)] - pub occurred_at_millis: u64, - #[cultcache(key = 3)] - pub status: String, - #[cultcache(key = 4)] - pub reason: String, - #[cultcache(key = 5, default)] - pub turn_id: Option, - #[cultcache(key = 6, default)] - pub coordinator_receipt_id: Option, - #[cultcache(key = 7, default)] - pub process_id: Option, - #[cultcache(key = 8, default)] - pub private_state_exposed: bool, -} - #[derive(Clone, Debug, PartialEq, Eq)] pub enum ChildObservation { Running, @@ -785,7 +757,6 @@ pub fn resident_prepared_launch_thread_id(prepared: &ResidentSelfPreparedLaunch) fn state_cache(path: &Path) -> Result { let mut cache = CultCache::new(); cache.register_entry_type::()?; - cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; @@ -802,7 +773,6 @@ fn state_cache(path: &Path) -> Result { )); } let owned = envelope.r#type == ResidentSelfState::TYPE - || envelope.r#type == ResidentSelfRuntimeReceipt::TYPE || envelope.r#type == ResidentSelfPressure::TYPE || envelope.r#type == ResidentSelfGrant::TYPE || envelope.r#type == ResidentSelfTerminalReceipt::TYPE @@ -822,9 +792,6 @@ fn state_cache(path: &Path) -> Result { ResidentSelfState::TYPE => { cache.load_envelope::(envelope)?; } - ResidentSelfRuntimeReceipt::TYPE => { - cache.load_envelope::(envelope)?; - } ResidentSelfPressure::TYPE => { cache.load_envelope::(envelope)?; } @@ -2742,6 +2709,22 @@ mod pressure_replay_tests { } } + #[test] + fn obsolete_state_epoch_refuses_without_mutation() -> Result<()> { + let temp = tempfile::tempdir()?; + let store = temp.path().join("resident.cc"); + let cache = state_cache(&store)?; + let mut state = ResidentSelfState::default(); + state.schema_version = "epiphany.resident_self.state.v1".into(); + SingleFileMessagePackBackingStore::new(&store) + .push(&cache.prepare_entry(RESIDENT_SELF_STATE_KEY, &state)?.0)?; + let before = std::fs::read(&store)?; + let error = load_resident_self_state(&store).unwrap_err(); + assert!(error.to_string().contains("obsolete writable state epoch")); + assert_eq!(std::fs::read(&store)?, before); + Ok(()) + } + #[test] fn configured_operator_pressure_replay_preserves_the_first_document() -> Result<()> { let temp = tempfile::tempdir()?; diff --git a/epiphany-core/src/surfaces/coordinator_contract.rs b/epiphany-core/src/surfaces/coordinator_contract.rs index 479e432b..609a8b8c 100644 --- a/epiphany-core/src/surfaces/coordinator_contract.rs +++ b/epiphany-core/src/surfaces/coordinator_contract.rs @@ -12,20 +12,6 @@ pub enum EpiphanyCoordinatorRoleStatus { Blocked, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub enum EpiphanyCoordinatorRoleResultStatus { - MissingState, - MissingBinding, - BackendUnavailable, - BackendMissing, - Pending, - Running, - Completed, - Failed, - Cancelled, -} - #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub enum EpiphanyCoordinatorAction { From b987976b744be701730277ae051dc00c0e700d12 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 04:52:21 +0200 Subject: [PATCH 026/340] docs: Record dead Resident Self contract cut --- notes/epiphany-current-algorithmic-map.md | 12 ++++++++++-- notes/epiphany-fork-implementation-plan.md | 4 ++++ notes/fresh-workspace-handoff.md | 17 +++++++++++++---- state/ledgers.msgpack | Bin 700977 -> 701424 bytes state/map.yaml | 3 ++- 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 268d299c..20168df5 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `be611f24` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for dead Imagination contract deletion; +Latest committed implementation cut: `3140d305` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for dead Resident Self contract deletion; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -317,6 +317,14 @@ typed proposal-only outcome; a real adopted Modeling proposal follows the separate proposal lifecycle rather than this unread document. Runtime epoch v22 refuses v21 stores instead of silently carrying the retired type forward. +Resident Self no longer admits a receipt family that no process could produce +or consume. Exact `3140d305` removes `ResidentSelfRuntimeReceipt`, its schema +constant, and its registration/decoding branches. Resident Self state v2 +refuses v1 stores without mutation. The unrelated definition-only coordinator +result-status enum is also gone; current role-board status remains the one live +display projection. Session and worker retention continue through their actual +runtime-spine owners. + Bifrost owns its private feedback-signing identity. Exact `94098223` deletes Epiphany's host-identity executable and the private signer, persisted identity, enrollment, platform protection, and anchor-export implementation behind it. diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 487d20f1..e59bddf0 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -318,6 +318,10 @@ Cut in this order: writer and durable contract together. Candidates remain proposal-only outcomes; actual adopted proposal Modeling stays in its existing lifecycle. Runtime writable epoch is v22. + Exact `3140d305` removes the producerless Resident Self runtime-receipt + document and the definition-only coordinator role-result enum. Resident Self + state v2 refuses v1 stores; actual terminal receipts and runtime retention + remain with their live owners. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index e4ee6d83..f54e3338 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `be611f24` -Current worktree: documentation/evidence for dead Imagination contract deletion; +Latest committed implementation cut: `3140d305` +Current worktree: documentation/evidence for dead Resident Self contract deletion; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `be611f24` is the current +production symlink body and is inactive. Exact `3140d305` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,15 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `3140d305` deletes `ResidentSelfRuntimeReceipt`, a durable type that was +registered, accepted, and decoded but had no producer or reader. Its schema +constant and every state-cache branch are gone. The definition-plus-export-only +`EpiphanyCoordinatorRoleResultStatus` is also gone; the live role board retains +its distinct coordinator role status. Resident Self writable state advances to +v2, with one consequential proof that a v1 store refuses byte-identically. +Resident Self 7/7 and swarm physiology 4/4 pass. The cut is net 32 maintained +lines removed and does not touch Atlas. + Exact `be611f24` deletes the producerless Imagination consideration-review request as one authority cut: writer, durable document, schema constant, public export, and runtime registration are all gone. It had no caller, reader, @@ -130,7 +139,7 @@ the live resident fields. Runtime writable state advances to v20. JSON schemas parse; core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass. The cut removes 59 maintained lines and leaves `runtime_spine.rs` at 9,807 lines. -Continue the public-API/test-liability audit after exact `be611f24`. Model Atlas remains protected +Continue the registered-type and test-liability audit after exact `3140d305`. Model Atlas remains protected for its first live inter-swarm collaboration trial. Exact `3ed1d564` deletes the public diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 6e565a8061df76d0668b1fd6e8955fa99669c3a1..2c60abc2cb47d429b24c4af7f1c07463318ee9e6 100644 GIT binary patch delta 401 zcmY+Ay-EW?6ouXVX;x4RQ85S??1F1d+z^QfDp=T9B%R%`a}x(PGjZo`Vk!#@ORKO5 zc0Pbn3!gwc3*SMo^%1-=SXg|_z&&%$x%2p0{QfGAR-D;trC#<=-=^HB_vdxz+;NVt zhNo#jE6Kunc5VLV=t2Yp+hu=CZf{kS z58qw7Y@k&VH8nA8HDXPwgAEK&bqTs*Y(bF)8=PTBKwz{bp$UYRz&AoK5Ilki+saZT zNEuy{7#OK^d*fFoF+@TO5?e~EvA`SKdU(+_5qT!9!$IQg2*lxmK zH5hlB1cHz~p#wJTm4OWOD!V}3Kw}?tvj3V}PW8%(dz&x#|6kWiwMp&1h&texeCP_x e87D|=pduQ0)HliA$So`!P$(?$UznJ;lbb(m$cfVc delta 73 zcmezHTx;VKtql^4+$LsL#^zDS7`Qg_ZB}M1WMuScp32ldm5C9EK{PWEvj8zG5VHX> RI}mdKG3WNFOk8u;0|0o;7Zv~j diff --git a/state/map.yaml b/state/map.yaml index 28d611f2..fba84674 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -68,6 +68,7 @@ current_status: unowned_projection_and_grant_cut: Exact 6ccaf937 deletes three public surfaces with no live consumer. The repository Body helper merely unwrapped assemble_mind_view and its proof now reads the typed Mind view directly. The Persona blocked-pressure helper reconstructed a sorted list already owned by keyed quarantine documents. The generic repo-work planning grant could mint read/snapshot Hands authority but no admission or actuator consumed it; exact coordinator and worker grant constructors remain. Core checks, the read-only Body-basis proof, the fixed governed-tool operation proof, and coordinator 5/5 pass. The cut removes 41 net maintained lines without changing a schema, target, or Atlas path. Live inter-swarm collaboration remains unproven. unconsumed_read_helper_cut: Exact f6a2ad7f deletes two exported readers with no workspace consumer. Packaged-release publication retains its atomically written current-head document and authentication retains exact release-by-ID reads; only the unused standalone head reader is gone. Idunn provider-health admission retains typed supplied trust-anchor validation plus continuity and substitution proofs; only the unused trust-anchor file reader is gone. Core checks and Idunn provider-health 6/6 pass. The cut removes 25 net maintained lines without changing a schema, target, or Atlas path. imagination_review_contract_cut: Exact be611f24 deletes the producerless Imagination consideration-review request as one authority cut: its writer, durable document, schema constant, public export, and runtime registration are all gone. It had no caller, reader, test, or Modeling admission path. Imagination requests and candidates retain quoted-evidence, substitution, chronology, disposition, and route validation; adopted proposal Modeling remains owned by its actual lifecycle. Runtime writable epoch advances to v22 so v21 stores cannot carry the retired contract into current authority. Core checks, Imagination 8/8, old-epoch refusal, and coordinator 5/5 pass. The cut removes 71 net maintained lines without touching Atlas. + resident_self_runtime_receipt_cut: Exact 3140d305 deletes ResidentSelfRuntimeReceipt, a durable type that was registered, accepted, and decoded but had no producer or reader. Its schema constant and every state-cache branch are gone. The definition-plus-export-only EpiphanyCoordinatorRoleResultStatus is also gone; the live role board retains EpiphanyCoordinatorRoleStatus. Resident Self writable state advances to v2, and a consequential negative proof confirms a v1 store refuses byte-identically. Resident Self 7/7 and swarm physiology 4/4 pass. The cut is net 32 maintained lines removed without touching Atlas. supervisor_subtraction: Exact 856648de completes the supervisor deletion. Epiphany owns no local generic daemon supervisor, semantic projector service, workspace-coverage projector, Windows Task Scheduler integration, or service-policy/lifecycle/heartbeat/recovery mirror. Idunn on Yggdrasil owns source-triggered compilation, testing, packaging, deployment, signed health, and daemon survival. The canonical Epiphany brake gates Epiphany cognition and consequence authority, not Idunn startup or unrelated lifecycle. launch_dependency_cut: Exact 2aeab7a9 deletes the generic organ dependency matrix, generic receipt catalogue/proof profiles, persisted worker-launch cargo, Persona prompt injection, evaluator, and three self-certifying tests: 700 net lines. Family admission owners derive exact dependencies from typed state. Worker-launch schema v2 and Persona projector prompt v1 refuse the old writable shape. Core 378/378, OpenRouter runtime 27/27, packaged runtime 13/13, and Persona re-entry 1/1 pass. operator_surface_subtraction: Exact ef92e853 deletes the callerless view-lens registry, legacy acceptance-bundle builders, test-only raw-JSON result interpreters, and six tests: 797 net lines. Exact a292979d and 77e817c1 delete the duplicate CRRC recommendation algorithm, its unused input model, and four tests: 206 lines. Exact 3b94bf6e and 59c5e3a6 delete the nested duplicate status view, false auxiliary mode, and ignored status arguments. Exact 7c9b0cf3 deletes the fixed synthetic job table, role-board job cargo/mappers, and its test: 338 net lines. Exact 2ce91461 deletes the scene/planning Mind reconstructions, duplicate self-policy crate, unused prompt templates, four counterfeit schemas, and ten producer/source-text tests: 1,723 net lines. Exact 78836f3b deletes eight unconsumed status tableaux, the pressure calculator production only called without telemetry, its unreachable compaction action, one counterfeit schema, and six tests: 518 net lines. Exact f10f7fb3 deletes the final twelve epiphany.surface.* schemas and ten catalog entries after every one proved producerless and consumerless: 692 pure deletions. Exact ab3cacfb deletes thirty-one more producerless contracts, the false runtime-session mutation mouth, every Epiphany-owned Rider/Unity command schema, a callerless prompt-context module, its test-only specialist prompt system, and four self-affirming tests: 3,514 net lines. Exact 16d85b1b deletes six duplicate JSON-schema builder tests and two OpenAI-runtime self-source searches: 209 pure test-line deletions. Exact 06f93f70 deletes the test-only inverse OpenAI-to-native request mapper and makes two retained tests follow canonical native-to-provider derivation: sixty net lines. The local catalog now has twenty-three live or portable contracts. Brokkr owns Unity capabilities through CultMesh/Eve; a future Rider daemon owns Rider. Status retains Mind identity, exact current work, one action/reason decision, readable role lanes, and operator thought sealing. Core checks cleanly; retained provider and focused request-flow tests pass. @@ -130,7 +131,7 @@ current_status: yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,730 lines, 53 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, and coordinator artifact/status cargo are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the public API and test-liability audit after exact be611f24. Trace each remaining public surface and test to a live consumer and consequential invariant; delete only complete dead authority slices, not isolated writers whose durable types remain registered. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + next_action: Resume the registered-type and test-liability audit after exact 3140d305. Trace each remaining registered document and verifier to a producer, reader, and consequential invariant; delete complete dead authority slices and self-affirming tests, not isolated writers whose durable types remain registered. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Session/job documents carry only lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. The sole standalone diagnostic session creator refuses identity collisions; there is no lenient ensure/rebase mouth. It exposes no aggregate status head, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, public typed-fulfillment machinery, or producerless Imagination review contract. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v22, runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,729 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. From 0091e0e12270faaee652b72ec9d6fe28ba6906f5 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 05:03:45 +0200 Subject: [PATCH 027/340] Delete unread model adapter status families --- epiphany-core/src/runtime_spine.rs | 6 +- epiphany-model-adapter/src/lib.rs | 22 ----- epiphany-openai-adapter/src/lib.rs | 34 ------- epiphany-openai-codex-spine/src/lib.rs | 88 ------------------- epiphany-openai-runtime/src/lib.rs | 67 ++------------ .../epiphany.model-adapter-status.schema.json | 16 ---- ...epiphany.openai-adapter-status.schema.json | 18 ---- schemas/cultnet/index.json | 22 ----- 8 files changed, 6 insertions(+), 267 deletions(-) delete mode 100644 schemas/cultnet/epiphany.model-adapter-status.schema.json delete mode 100644 schemas/cultnet/epiphany.openai-adapter-status.schema.json diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index bff693be..f5d31239 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -47,12 +47,10 @@ use cultcache_rs::CacheBackingStore; use cultcache_rs::CultCache; use cultcache_rs::CultCacheEnvelope; use cultcache_rs::DatabaseEntry; -use epiphany_model_adapter::EpiphanyModelAdapterStatus; use epiphany_model_adapter::EpiphanyModelReceipt; use epiphany_model_adapter::EpiphanyModelRequest; use epiphany_model_adapter::EpiphanyModelStreamEvent; use epiphany_model_adapter::EpiphanyModelStreamPayload; -use epiphany_openai_adapter::EpiphanyOpenAiAdapterStatus; use epiphany_openai_adapter::EpiphanyOpenAiModelReceipt; use epiphany_openai_adapter::EpiphanyOpenAiModelRequest; use epiphany_openai_adapter::EpiphanyOpenAiStreamEvent; @@ -88,7 +86,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v22"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v23"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; pub const RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.model_execution_binding.v0"; @@ -863,11 +861,9 @@ fn runtime_spine_schema_cache() -> Result { cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; - cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; - cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; diff --git a/epiphany-model-adapter/src/lib.rs b/epiphany-model-adapter/src/lib.rs index 2cb5e668..f91e8d05 100644 --- a/epiphany-model-adapter/src/lib.rs +++ b/epiphany-model-adapter/src/lib.rs @@ -5,28 +5,6 @@ use serde::Serialize; pub const MODEL_ADAPTER_REQUEST_SCHEMA_ID: &str = "epiphany.model_request.v0"; pub const MODEL_ADAPTER_EVENT_SCHEMA_ID: &str = "epiphany.model_stream_event.v0"; pub const MODEL_ADAPTER_RECEIPT_SCHEMA_ID: &str = "epiphany.model_receipt.v0"; -pub const MODEL_ADAPTER_STATUS_SCHEMA_ID: &str = "epiphany.model_adapter_status.v0"; - -#[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] -#[cultcache( - type = "epiphany.model_adapter_status.v0", - schema = "EpiphanyModelAdapterStatus" -)] -pub struct EpiphanyModelAdapterStatus { - #[cultcache(key = 0)] - pub schema_id: String, - #[cultcache(key = 1)] - pub adapter_id: String, - #[cultcache(key = 2)] - pub provider: String, - #[cultcache(key = 3, default)] - pub default_model: Option, - #[cultcache(key = 4)] - pub streaming_supported: bool, - #[cultcache(key = 5)] - pub provider_transport_attached: bool, -} - #[derive(Debug, Clone, PartialEq, DatabaseEntry)] #[cultcache(type = "epiphany.model_request.v0", schema = "EpiphanyModelRequest")] pub struct EpiphanyModelRequest { diff --git a/epiphany-openai-adapter/src/lib.rs b/epiphany-openai-adapter/src/lib.rs index 9b02de1d..52b7bcd3 100644 --- a/epiphany-openai-adapter/src/lib.rs +++ b/epiphany-openai-adapter/src/lib.rs @@ -6,46 +6,12 @@ use serde::Serialize; pub const OPENAI_ADAPTER_REQUEST_SCHEMA_ID: &str = "epiphany.openai_model_request.v1"; pub const OPENAI_ADAPTER_EVENT_SCHEMA_ID: &str = "epiphany.openai_model_stream_event.v0"; pub const OPENAI_ADAPTER_RECEIPT_SCHEMA_ID: &str = "epiphany.openai_model_receipt.v0"; -pub const OPENAI_ADAPTER_STATUS_SCHEMA_ID: &str = "epiphany.openai_adapter_status.v0"; - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub enum EpiphanyOpenAiAuthMode { - ChatGptSubscription, - ApiKey, - ExternalBearer, - Unknown, -} - #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] pub enum EpiphanyOpenAiWireDialect { Responses, ChatCompletionsTerminalTool, } -#[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] -#[cultcache( - type = "epiphany.openai_adapter_status.v0", - schema = "EpiphanyOpenAiAdapterStatus" -)] -pub struct EpiphanyOpenAiAdapterStatus { - #[cultcache(key = 0)] - pub schema_id: String, - #[cultcache(key = 1)] - pub adapter_id: String, - #[cultcache(key = 2)] - pub auth_mode: EpiphanyOpenAiAuthMode, - #[cultcache(key = 3, default)] - pub account_id: Option, - #[cultcache(key = 4, default)] - pub plan_type: Option, - #[cultcache(key = 5, default)] - pub default_model: Option, - #[cultcache(key = 6)] - pub supports_websockets: bool, - #[cultcache(key = 7)] - pub codex_transport_attached: bool, -} - #[derive(Debug, Clone, PartialEq, DatabaseEntry)] #[cultcache( type = "epiphany.openai_model_request.v1", diff --git a/epiphany-openai-codex-spine/src/lib.rs b/epiphany-openai-codex-spine/src/lib.rs index 435be7ba..49c80175 100644 --- a/epiphany-openai-codex-spine/src/lib.rs +++ b/epiphany-openai-codex-spine/src/lib.rs @@ -9,18 +9,14 @@ use codex_client::Request; use codex_client::ReqwestTransport; use codex_client::TransportError; use codex_client::sse_stream; -use epiphany_openai_adapter::EpiphanyOpenAiAdapterStatus; -use epiphany_openai_adapter::EpiphanyOpenAiAuthMode; use epiphany_openai_adapter::EpiphanyOpenAiInputItem; use epiphany_openai_adapter::EpiphanyOpenAiModelReceipt; use epiphany_openai_adapter::EpiphanyOpenAiModelRequest; use epiphany_openai_adapter::EpiphanyOpenAiStreamEvent; use epiphany_openai_adapter::EpiphanyOpenAiStreamPayload; use epiphany_openai_adapter::EpiphanyOpenAiWireDialect; -use epiphany_openai_adapter::OPENAI_ADAPTER_STATUS_SCHEMA_ID; use codex_login::AuthCredentialsStoreMode; use codex_login::AuthManager; -use codex_login::AuthMode; use codex_login::CodexAuth; use codex_login::default_client::build_reqwest_client; use serde::Deserialize; @@ -37,8 +33,6 @@ const OPENROUTER_API_BASE_URL: &str = "https://openrouter.ai/api/v1"; const RESPONSES_STREAM_IDLE_TIMEOUT: Duration = Duration::from_secs(45); const RESPONSES_CALL_ID_MAX_BYTES: usize = 64; -pub const CODEX_SPINE_ADAPTER_ID: &str = "codex-openai-subscription-spine"; -pub const OPENROUTER_SPINE_ADAPTER_ID: &str = "openrouter-chat-completions-spine"; pub const OPENROUTER_TERMINAL_TOOL_NAME: &str = "epiphany_submit_typed_result"; pub fn default_codex_home() -> Result { @@ -60,47 +54,6 @@ pub fn auth_manager(codex_home: std::path::PathBuf) -> Arc { ) } -pub async fn status_from_auth_manager( - auth_manager: &AuthManager, - default_model: Option, - supports_websockets: bool, -) -> EpiphanyOpenAiAdapterStatus { - let auth = auth_manager.auth().await; - let auth_mode = auth_mode_from_manager(auth_manager, auth.as_ref()); - let account_id = auth.as_ref().and_then(CodexAuth::get_account_id); - let plan_type = auth - .as_ref() - .and_then(CodexAuth::account_plan_type) - .map(|plan| format!("{plan:?}")); - - EpiphanyOpenAiAdapterStatus { - schema_id: OPENAI_ADAPTER_STATUS_SCHEMA_ID.to_string(), - adapter_id: CODEX_SPINE_ADAPTER_ID.to_string(), - auth_mode, - account_id, - plan_type, - default_model, - supports_websockets, - codex_transport_attached: true, - } -} - -pub fn status_from_static_api_key( - adapter_id: &str, - default_model: Option, -) -> EpiphanyOpenAiAdapterStatus { - EpiphanyOpenAiAdapterStatus { - schema_id: OPENAI_ADAPTER_STATUS_SCHEMA_ID.to_string(), - adapter_id: adapter_id.to_string(), - auth_mode: EpiphanyOpenAiAuthMode::ApiKey, - account_id: None, - plan_type: None, - default_model, - supports_websockets: false, - codex_transport_attached: false, - } -} - pub struct EpiphanyCodexOpenAiTransport { auth_manager: Arc, base_url: Option, @@ -1457,33 +1410,6 @@ fn transport_error_to_anyhow(err: TransportError) -> anyhow::Error { anyhow::anyhow!("failed to open provider transport: {err}") } -fn auth_mode_from_manager( - auth_manager: &AuthManager, - auth: Option<&CodexAuth>, -) -> EpiphanyOpenAiAuthMode { - match auth_manager.auth_mode() { - Some(AuthMode::ApiKey) => EpiphanyOpenAiAuthMode::ApiKey, - Some(AuthMode::Chatgpt) | Some(AuthMode::ChatgptAuthTokens) => { - EpiphanyOpenAiAuthMode::ChatGptSubscription - } - Some(AuthMode::AgentIdentity) => EpiphanyOpenAiAuthMode::ExternalBearer, - None => auth_mode_from_codex_auth(auth), - } -} - -fn auth_mode_from_codex_auth(auth: Option<&CodexAuth>) -> EpiphanyOpenAiAuthMode { - let Some(auth) = auth else { - return EpiphanyOpenAiAuthMode::Unknown; - }; - if auth.is_api_key_auth() { - EpiphanyOpenAiAuthMode::ApiKey - } else if auth.is_chatgpt_auth() { - EpiphanyOpenAiAuthMode::ChatGptSubscription - } else { - EpiphanyOpenAiAuthMode::ExternalBearer - } -} - #[cfg(test)] mod tests { use super::*; @@ -1504,20 +1430,6 @@ mod tests { request } - #[test] - fn static_openrouter_status_does_not_claim_codex_transport() { - let status = status_from_static_api_key( - OPENROUTER_SPINE_ADAPTER_ID, - Some("stealth/ox-alpha".to_string()), - ); - - assert_eq!(status.adapter_id, OPENROUTER_SPINE_ADAPTER_ID); - assert_eq!(status.auth_mode, EpiphanyOpenAiAuthMode::ApiKey); - assert_eq!(status.default_model.as_deref(), Some("stealth/ox-alpha")); - assert!(!status.supports_websockets); - assert!(!status.codex_transport_attached); - } - #[test] fn openrouter_whole_request_timeout_is_explicit() -> Result<()> { let bounded = EpiphanyOpenRouterTransport::new("test-key", Some(Duration::from_secs(90)))?; diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index 3fb908bc..40ec2e4a 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -31,17 +31,13 @@ use epiphany_model_adapter::EpiphanyModelRequest; use epiphany_model_adapter::EpiphanyModelStreamEvent; use epiphany_model_adapter::EpiphanyModelStreamPayload; use epiphany_model_adapter::EpiphanyModelToolDefinition; -use epiphany_openai_adapter::EpiphanyOpenAiAdapterStatus; use epiphany_openai_adapter::EpiphanyOpenAiModelRequest; use epiphany_openai_adapter::EpiphanyOpenAiStreamEvent; use epiphany_openai_adapter::EpiphanyOpenAiStreamPayload; use epiphany_openai_codex_spine::EpiphanyCodexOpenAiTransport; use epiphany_openai_codex_spine::EpiphanyOpenRouterTransport; -use epiphany_openai_codex_spine::OPENROUTER_SPINE_ADAPTER_ID; use epiphany_openai_codex_spine::auth_manager; pub use epiphany_openai_codex_spine::default_codex_home; -use epiphany_openai_codex_spine::status_from_auth_manager; -use epiphany_openai_codex_spine::status_from_static_api_key; use epiphany_tool_adapter::EPIPHANY_TOOL_RUNTIME_ADAPTER_ID; use epiphany_tool_adapter::EpiphanyToolInvocationIntent; use epiphany_tool_adapter::EpiphanyToolInvocationReceipt; @@ -78,10 +74,6 @@ impl EpiphanyProviderProfile { )), } } - - fn streaming_supported(self) -> bool { - matches!(self, Self::OpenAiCodex) - } } pub fn worker_model_session_id(worker_job_id: &str) -> String { @@ -171,41 +163,23 @@ async fn run_openai_model_turn_bound( &model_request, &now(), )?; - let (status, events) = match profile { + let events = match profile { EpiphanyProviderProfile::OpenAiCodex => { let auth_manager = auth_manager(options.codex_home.clone()); - let status = - status_from_auth_manager(&auth_manager, options.default_model.clone(), true).await; let transport = EpiphanyCodexOpenAiTransport::openai(auth_manager); - let events = - collect_transport_events(transport.collect_model_events(request.clone()), &request) - .await; - (status, events) + collect_transport_events(transport.collect_model_events(request.clone()), &request) + .await } EpiphanyProviderProfile::OpenRouter => { let credential = read_static_provider_credential( options.provider_credential_path.as_deref(), OPENROUTER_MODEL_PROVIDER, )?; - let status = status_from_static_api_key( - OPENROUTER_SPINE_ADAPTER_ID, - options.default_model.clone(), - ); let transport = EpiphanyOpenRouterTransport::new(credential, options.request_timeout)?; - let events = - collect_transport_events(transport.collect_model_events(request.clone()), &request) - .await; - (status, events) + collect_transport_events(transport.collect_model_events(request.clone()), &request) + .await } }; - store_openai_status(&options.store_path, &status)?; - store_model_status( - &options.store_path, - &status, - &provider, - profile.streaming_supported(), - true, - )?; record_openai_events(&options.store_path, &options, &request, &provider, &events) } @@ -884,37 +858,6 @@ pub fn ensure_openai_runtime_ready(options: &EpiphanyOpenAiRuntimeOptions) -> Re Ok(()) } -pub fn store_openai_status( - store_path: impl AsRef, - status: &EpiphanyOpenAiAdapterStatus, -) -> Result<()> { - let mut cache = runtime_spine_cache(store_path)?; - cache.pull_all_backing_stores()?; - cache.put(status.adapter_id.clone(), status)?; - Ok(()) -} - -pub fn store_model_status( - store_path: impl AsRef, - status: &EpiphanyOpenAiAdapterStatus, - provider: &str, - streaming_supported: bool, - provider_transport_attached: bool, -) -> Result<()> { - let mut cache = runtime_spine_cache(store_path)?; - cache.pull_all_backing_stores()?; - let status = epiphany_model_adapter::EpiphanyModelAdapterStatus { - schema_id: epiphany_model_adapter::MODEL_ADAPTER_STATUS_SCHEMA_ID.to_string(), - adapter_id: status.adapter_id.clone(), - provider: provider.to_string(), - default_model: status.default_model.clone(), - streaming_supported, - provider_transport_attached, - }; - cache.put(status.adapter_id.clone(), &status)?; - Ok(()) -} - pub fn store_model_request( store_path: impl AsRef, request: &EpiphanyModelRequest, diff --git a/schemas/cultnet/epiphany.model-adapter-status.schema.json b/schemas/cultnet/epiphany.model-adapter-status.schema.json deleted file mode 100644 index 7c8a9dbc..00000000 --- a/schemas/cultnet/epiphany.model-adapter-status.schema.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.model-adapter-status.schema.json", - "title": "Epiphany Model Adapter Status", - "type": "object", - "required": ["schema_id", "adapter_id", "provider", "streaming_supported", "provider_transport_attached"], - "properties": { - "schema_id": { "const": "epiphany.model_adapter_status.v0" }, - "adapter_id": { "type": "string" }, - "provider": { "type": "string" }, - "default_model": { "type": ["string", "null"] }, - "streaming_supported": { "type": "boolean" }, - "provider_transport_attached": { "type": "boolean" } - }, - "additionalProperties": false -} diff --git a/schemas/cultnet/epiphany.openai-adapter-status.schema.json b/schemas/cultnet/epiphany.openai-adapter-status.schema.json deleted file mode 100644 index d3d80985..00000000 --- a/schemas/cultnet/epiphany.openai-adapter-status.schema.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.openai-adapter-status.schema.json", - "title": "Epiphany OpenAI Adapter Status", - "type": "object", - "required": ["schema_id", "adapter_id", "auth_mode", "supports_websockets", "codex_transport_attached"], - "properties": { - "schema_id": { "const": "epiphany.openai_adapter_status.v0" }, - "adapter_id": { "type": "string" }, - "auth_mode": { "enum": ["ChatGptSubscription", "ApiKey", "ExternalBearer", "Unknown"] }, - "account_id": { "type": ["string", "null"] }, - "plan_type": { "type": ["string", "null"] }, - "default_model": { "type": ["string", "null"] }, - "supports_websockets": { "type": "boolean" }, - "codex_transport_attached": { "type": "boolean" } - }, - "additionalProperties": false -} diff --git a/schemas/cultnet/index.json b/schemas/cultnet/index.json index af94f78b..32eae154 100644 --- a/schemas/cultnet/index.json +++ b/schemas/cultnet/index.json @@ -100,17 +100,6 @@ "title": "Epiphany Coordinator Run Receipt", "path": "epiphany.coordinator-run-receipt.schema.json" }, - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.model-adapter-status.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.model_adapter_status.v0", - "documentType": "epiphany.model_adapter_status.v0", - "title": "Epiphany Model Adapter Status", - "path": "epiphany.model-adapter-status.schema.json" - }, { "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.model-request.schema.json", "kind": "document_payload", @@ -166,17 +155,6 @@ "title": "Epiphany Tool Invocation Receipt", "path": "epiphany.tool-invocation-receipt.schema.json" }, - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.openai-adapter-status.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.openai_adapter_status.v0", - "documentType": "epiphany.openai_adapter_status.v0", - "title": "Epiphany OpenAI Adapter Status", - "path": "epiphany.openai-adapter-status.schema.json" - }, { "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.openai-model-request.schema.json", "kind": "document_payload", From 16c7b4d7604efd5bd1f011ae30277337be17c638 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 05:06:02 +0200 Subject: [PATCH 028/340] docs: Record adapter status authority cut --- notes/codex-auth-spine-inventory.md | 15 ++++++++------- notes/epiphany-current-algorithmic-map.md | 13 +++++++++++-- notes/epiphany-fork-implementation-plan.md | 4 ++++ notes/fresh-workspace-handoff.md | 19 +++++++++++++++---- state/ledgers.msgpack | Bin 701424 -> 701997 bytes state/map.yaml | 9 +++++---- 6 files changed, 43 insertions(+), 17 deletions(-) diff --git a/notes/codex-auth-spine-inventory.md b/notes/codex-auth-spine-inventory.md index 3d6837f2..32565b8a 100644 --- a/notes/codex-auth-spine-inventory.md +++ b/notes/codex-auth-spine-inventory.md @@ -137,10 +137,11 @@ skew. Do not paper over that with random version pins. The first workspace-verified wrapper now exists as `epiphany-openai-codex-spine`. It depends on the pure typed adapter plus the -keeper Codex auth types and projects `AuthManager` / `CodexAuth` into a typed -`EpiphanyOpenAiAdapterStatus`. `epiphany-codex-bridge` re-exports this spine so -the current app-server compatibility shell can compile it without making the -pure document crate depend on Codex. +keeper Codex auth types. It uses `AuthManager` / `CodexAuth` only at provider +transport construction and request authentication; no unread adapter-status +document mirrors that live boundary. `epiphany-codex-bridge` re-exports this +spine so the current app-server compatibility shell can compile it without +making the pure document crate depend on Codex. The transport wrapper is now also in that spine. It maps typed `EpiphanyOpenAiModelRequest` documents into a local serializable Responses @@ -153,8 +154,8 @@ longer imports Codex `ResponsesApiRequest`, `ResponsesClient`, workflow. Its narrow direct imports preserve Codex-compatible auth identity without letting Codex own Epiphany request/state shape. -`schemas/cultnet/` contains publication schemas for OpenAI adapter status, -model request, stream event, and terminal receipt. Live providers own their +`schemas/cultnet/` contains publication schemas for OpenAI model request, +stream event, and terminal receipt. Live providers own their CultMesh/CultNet catalogs. The native runtime accepts the document types registered by the actual CultCache runtime schema; there is no standalone hello/catalog CLI or hand-maintained mutation-contract mirror. @@ -162,7 +163,7 @@ hello/catalog CLI or hand-maintained mutation-contract mirror. The native runtime route is the operator and daemon edge. `epiphany-openai-adapter` documents derive CultCache `DatabaseEntry`, `epiphany-core::runtime_spine_cache` -registers OpenAI adapter status/request/stream-event/receipt documents, and the +registers OpenAI request/stream-event/receipt documents, and the outside-vendor `epiphany-openai-runtime` crate records typed OpenAI model-turn requests, stream events, terminal receipts, runtime sessions, jobs, and job results into the native runtime spine. Its `model-turn` command opens the diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 20168df5..1098b0ff 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `3140d305` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for dead Resident Self contract deletion; +Latest committed implementation cut: `0091e0e1` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for unread adapter-status deletion; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -325,6 +325,15 @@ result-status enum is also gone; current role-board status remains the one live display projection. Session and worker retention continue through their actual runtime-spine owners. +Model inference no longer writes mutable adapter-status shadows. Exact +`0091e0e1` removes both generic and OpenAI-specific status documents, their +constructors/writers, runtime registrations, published schemas, and the test +that only restated the synthetic OpenRouter status fields. Provider/model +identity remains in the exact native and provider requests; credential and +transport attachment is proved where the transport is constructed and used. +Runtime epoch v23 refuses v22 stores. The local published catalog now contains +twenty live or portable contracts. + Bifrost owns its private feedback-signing identity. Exact `94098223` deletes Epiphany's host-identity executable and the private signer, persisted identity, enrollment, platform protection, and anchor-export implementation behind it. diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index e59bddf0..cf2bbda2 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -322,6 +322,10 @@ Cut in this order: document and the definition-only coordinator role-result enum. Resident Self state v2 refuses v1 stores; actual terminal receipts and runtime retention remain with their live owners. + Exact `0091e0e1` removes the unread generic/OpenAI adapter-status documents, + their per-pass writers and construction helpers, one self-affirming test, + two schemas, and both runtime registrations. Exact request/provider context + and live transport construction remain. Runtime writable epoch is v23. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index f54e3338..c1fe72a9 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `3140d305` -Current worktree: documentation/evidence for dead Resident Self contract deletion; +Latest committed implementation cut: `0091e0e1` +Current worktree: documentation/evidence for unread adapter-status deletion; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `3140d305` is the current +production symlink body and is inactive. Exact `0091e0e1` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,17 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `0091e0e1` deletes the generic model-adapter and OpenAI-adapter status +families. Every model pass wrote both mutable documents, but no query, router, +admission owner, audit path, or display consumed either one. Their types, +writers, status/auth-mode constructors, adapter-ID constants, one +self-affirming OpenRouter status test, runtime registrations, two published +schemas, and catalog entries are gone. Native and provider requests still own +provider/model choice; transport construction still proves attached Codex auth +or OpenRouter credentials. Runtime writable epoch advances to v23. Adapter +libraries compile; provider spine 14/14, old-epoch refusal, and model runtime +23/23 pass. The cut removes 267 net maintained lines and does not touch Atlas. + Exact `3140d305` deletes `ResidentSelfRuntimeReceipt`, a durable type that was registered, accepted, and decoded but had no producer or reader. Its schema constant and every state-cache branch are gone. The definition-plus-export-only @@ -139,7 +150,7 @@ the live resident fields. Runtime writable state advances to v20. JSON schemas parse; core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass. The cut removes 59 maintained lines and leaves `runtime_spine.rs` at 9,807 lines. -Continue the registered-type and test-liability audit after exact `3140d305`. Model Atlas remains protected +Continue the registered-type and test-liability audit after exact `0091e0e1`. Model Atlas remains protected for its first live inter-swarm collaboration trial. Exact `3ed1d564` deletes the public diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 2c60abc2cb47d429b24c4af7f1c07463318ee9e6..cd646cc28a7eb2166d12167405dcccc68ebc459e 100644 GIT binary patch delta 568 zcmYL_zit#U5XRXf{K-l|sUm@p7>O=oZ|@&Mq>F$eG?5}ID3Gz|ZY{jFV~;m?)fE&x z!D$}=i4Fvc5Oo@!gN}xRM_@LWK=ElL&-k0~H-CQZe)_%pWhdJj?+qUAO&-1caV7tj zpWe@ov+Vi1Rqy?(m$ABfm9@dT#=6eB!Me%X{J!etufDc-KIFGHI-B+kv%AaQ*0Z^g z1cSljAr5c|3JnrQNH(BQFhh$$%kt2p-9G@KgeMF|Bta>Hax&Fu325OlJ^;@xFJgp~ zpm~g6E(V2FAQDwY?G%D^Hd08E+@zbiGQHMtyENix)NX&= z+*x)X*_BQl`1Ho;SfPR_E38E!Sf@ zlW#fpzxB~;1|3ey;e?ruD%K_erzr}v=Iah-AY5!2jmyy(x)a~-!wW{Ql2xGt*K=AF R5gWAa>(BYU_UCE7{THr_$DaTI delta 75 zcmZ4cM(e|Ktqo#~yhc{0MplLO?Ngb!qBjBn!w(n$ diff --git a/state/map.yaml b/state/map.yaml index fba84674..1d0c0da3 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -52,7 +52,7 @@ current_status: summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Runtime status aggregates, global revisions, generic role/event authority, duplicate prompt-state cargo, duplicate family launch bindings, and Epiphany-owned Rider/Unity organs are absent. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. Completed model-session tombstones retain only resurrection fences and an exact deletion digest. Archived worker attempts retain the exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records needed for audit. Runtime sessions and jobs own lifecycle identity/status only; terminal job results own summaries and artifacts. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v22; runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, and coordinator-run-receipt schema/type is v1. Old writable stores refuse with no migrator or dual reader. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Runtime status aggregates, mutable adapter-status shadows, global revisions, generic role/event authority, duplicate prompt-state cargo, duplicate family launch bindings, and Epiphany-owned Rider/Unity organs are absent. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. Completed model-session tombstones retain only resurrection fences and an exact deletion digest. Archived worker attempts retain the exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records needed for audit. Runtime sessions and jobs own lifecycle identity/status only; terminal job results own summaries and artifacts. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v23; runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, and coordinator-run-receipt schema/type is v1. Old writable stores refuse with no migrator or dual reader. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. atlas_authoring_cut: Exact ce306e23 preserves the complete inter-swarm Atlas vertical slice while deleting its duplicate local offer/claim authoring authority. Ordinary Modeling through RepoModel operations is the sole owner of provider offers and consumer claims; Atlas retains signed publication, trust, transport, deterministic projection, Soul verification, Self impact admission, Resident Self wake, brakes, and Eve lowering. Two direct write-intent types, their runtime commit APIs and registry entries, 518 planner lines, and two tests that animated only that duplicate path are gone. The runtime proof now creates offers/claims through RepoModel before proving exact verification admission and Body-drift refusal. The cut removes 593 net source lines; the three-repository direct/transitive Modeling proof passes. These are component proofs only: no live inter-swarm collaboration has yet run, so the Atlas vertical slice remains protected until Gate 1 exercises it end to end. Runtime writable epoch is v14. autonomous_proposal_binding_cut: Exact 5d507bfd reduces Self's autonomous Imagination-to-Modeling origin binding from a 22-field duplicate archive to six causal join fields: schema, exact direction-result identity, selected option ordinal, worker job identity, and exact worker-result/launch digests. Proposal identity and payload, direction request, runtime/thread, typed model projection, Body/domain binding, selected option content, and canonical Modeling-request identity are checked directly from their owning immutable documents. The atomic proposal plus binding plus Modeling-request commit and its broad keyed-lifecycle proof remain; 60 net source lines are gone. Runtime writable epoch is v15. hands_verification_derivation_cut: Exact 6ccc7dd2 deletes the 20-field transient Hands receipt-chain summary. The Hands commit owner now derives the exact Verification request directly from the persisted patch, command, and commit receipts plus the frontier authority; no copied schema, job, grant, command-output, Git, path, summary, or timestamp fields mediate that handoff. Atomic Hands-to-Verification admission and the concurrent Persona/Hands lifecycle proof remain. The cut removes 43 net source lines without adding state, schema, or tests. @@ -69,9 +69,10 @@ current_status: unconsumed_read_helper_cut: Exact f6a2ad7f deletes two exported readers with no workspace consumer. Packaged-release publication retains its atomically written current-head document and authentication retains exact release-by-ID reads; only the unused standalone head reader is gone. Idunn provider-health admission retains typed supplied trust-anchor validation plus continuity and substitution proofs; only the unused trust-anchor file reader is gone. Core checks and Idunn provider-health 6/6 pass. The cut removes 25 net maintained lines without changing a schema, target, or Atlas path. imagination_review_contract_cut: Exact be611f24 deletes the producerless Imagination consideration-review request as one authority cut: its writer, durable document, schema constant, public export, and runtime registration are all gone. It had no caller, reader, test, or Modeling admission path. Imagination requests and candidates retain quoted-evidence, substitution, chronology, disposition, and route validation; adopted proposal Modeling remains owned by its actual lifecycle. Runtime writable epoch advances to v22 so v21 stores cannot carry the retired contract into current authority. Core checks, Imagination 8/8, old-epoch refusal, and coordinator 5/5 pass. The cut removes 71 net maintained lines without touching Atlas. resident_self_runtime_receipt_cut: Exact 3140d305 deletes ResidentSelfRuntimeReceipt, a durable type that was registered, accepted, and decoded but had no producer or reader. Its schema constant and every state-cache branch are gone. The definition-plus-export-only EpiphanyCoordinatorRoleResultStatus is also gone; the live role board retains EpiphanyCoordinatorRoleStatus. Resident Self writable state advances to v2, and a consequential negative proof confirms a v1 store refuses byte-identically. Resident Self 7/7 and swarm physiology 4/4 pass. The cut is net 32 maintained lines removed without touching Atlas. + adapter_status_authority_cut: Exact 0091e0e1 deletes the generic model-adapter and OpenAI-adapter status families. Every model pass wrote both mutable documents, but no query, router, admission owner, audit path, or display consumed either. Their types, per-pass writers, status/auth-mode constructors, adapter-ID constants, one self-affirming OpenRouter status test, runtime registrations, two published schemas, and catalog entries are gone. Native/provider requests retain provider and model identity; live transport construction retains credential and attachment proof. Runtime writable epoch advances to v23. Adapter libraries compile; provider spine 14/14, old-epoch refusal, and model runtime 23/23 pass. The cut removes 267 net maintained lines without touching Atlas. The local published catalog contains twenty live or portable contracts. supervisor_subtraction: Exact 856648de completes the supervisor deletion. Epiphany owns no local generic daemon supervisor, semantic projector service, workspace-coverage projector, Windows Task Scheduler integration, or service-policy/lifecycle/heartbeat/recovery mirror. Idunn on Yggdrasil owns source-triggered compilation, testing, packaging, deployment, signed health, and daemon survival. The canonical Epiphany brake gates Epiphany cognition and consequence authority, not Idunn startup or unrelated lifecycle. launch_dependency_cut: Exact 2aeab7a9 deletes the generic organ dependency matrix, generic receipt catalogue/proof profiles, persisted worker-launch cargo, Persona prompt injection, evaluator, and three self-certifying tests: 700 net lines. Family admission owners derive exact dependencies from typed state. Worker-launch schema v2 and Persona projector prompt v1 refuse the old writable shape. Core 378/378, OpenRouter runtime 27/27, packaged runtime 13/13, and Persona re-entry 1/1 pass. - operator_surface_subtraction: Exact ef92e853 deletes the callerless view-lens registry, legacy acceptance-bundle builders, test-only raw-JSON result interpreters, and six tests: 797 net lines. Exact a292979d and 77e817c1 delete the duplicate CRRC recommendation algorithm, its unused input model, and four tests: 206 lines. Exact 3b94bf6e and 59c5e3a6 delete the nested duplicate status view, false auxiliary mode, and ignored status arguments. Exact 7c9b0cf3 deletes the fixed synthetic job table, role-board job cargo/mappers, and its test: 338 net lines. Exact 2ce91461 deletes the scene/planning Mind reconstructions, duplicate self-policy crate, unused prompt templates, four counterfeit schemas, and ten producer/source-text tests: 1,723 net lines. Exact 78836f3b deletes eight unconsumed status tableaux, the pressure calculator production only called without telemetry, its unreachable compaction action, one counterfeit schema, and six tests: 518 net lines. Exact f10f7fb3 deletes the final twelve epiphany.surface.* schemas and ten catalog entries after every one proved producerless and consumerless: 692 pure deletions. Exact ab3cacfb deletes thirty-one more producerless contracts, the false runtime-session mutation mouth, every Epiphany-owned Rider/Unity command schema, a callerless prompt-context module, its test-only specialist prompt system, and four self-affirming tests: 3,514 net lines. Exact 16d85b1b deletes six duplicate JSON-schema builder tests and two OpenAI-runtime self-source searches: 209 pure test-line deletions. Exact 06f93f70 deletes the test-only inverse OpenAI-to-native request mapper and makes two retained tests follow canonical native-to-provider derivation: sixty net lines. The local catalog now has twenty-three live or portable contracts. Brokkr owns Unity capabilities through CultMesh/Eve; a future Rider daemon owns Rider. Status retains Mind identity, exact current work, one action/reason decision, readable role lanes, and operator thought sealing. Core checks cleanly; retained provider and focused request-flow tests pass. + operator_surface_subtraction: Exact ef92e853 deletes the callerless view-lens registry, legacy acceptance-bundle builders, test-only raw-JSON result interpreters, and six tests: 797 net lines. Exact a292979d and 77e817c1 delete the duplicate CRRC recommendation algorithm, its unused input model, and four tests: 206 lines. Exact 3b94bf6e and 59c5e3a6 delete the nested duplicate status view, false auxiliary mode, and ignored status arguments. Exact 7c9b0cf3 deletes the fixed synthetic job table, role-board job cargo/mappers, and its test: 338 net lines. Exact 2ce91461 deletes the scene/planning Mind reconstructions, duplicate self-policy crate, unused prompt templates, four counterfeit schemas, and ten producer/source-text tests: 1,723 net lines. Exact 78836f3b deletes eight unconsumed status tableaux, the pressure calculator production only called without telemetry, its unreachable compaction action, one counterfeit schema, and six tests: 518 net lines. Exact f10f7fb3 deletes the final twelve epiphany.surface.* schemas and ten catalog entries after every one proved producerless and consumerless: 692 pure deletions. Exact ab3cacfb deletes thirty-one more producerless contracts, the false runtime-session mutation mouth, every Epiphany-owned Rider/Unity command schema, a callerless prompt-context module, its test-only specialist prompt system, and four self-affirming tests: 3,514 net lines. Exact 16d85b1b deletes six duplicate JSON-schema builder tests and two OpenAI-runtime self-source searches: 209 pure test-line deletions. Exact 06f93f70 deletes the test-only inverse OpenAI-to-native request mapper and makes two retained tests follow canonical native-to-provider derivation: sixty net lines. Exact 0091e0e1 later removes two unread adapter-status schemas and catalog entries; the local catalog now has twenty live or portable contracts. Brokkr owns Unity capabilities through CultMesh/Eve; a future Rider daemon owns Rider. Status retains Mind identity, exact current work, one action/reason decision, readable role lanes, and operator thought sealing. Core checks cleanly; retained provider and focused request-flow tests pass. immutable_runtime_identity_cut: Exact bf997ce0 removes empty legacy frontier-decision echoes and requires exact worker-result provenance. Exact e00ea70f deletes the lossy PID-only process compatibility API. Exact 87983ffc makes runtime identity immutable bootstrap state: no update time, duplicated capability catalog, temporary metadata, or launch-time reconstruction survives. Current-work launch replays the original identity and existing root-session envelopes byte-for-byte as strong reads, preventing hidden singleton timestamp conflicts while retaining substitution refusal. Exact ffcf036f advances runtime spine to v7 and derives the constant native runtime kind at CultNet publication. The current-work capstone, epoch refusal, and OpenAI-runtime all-target checks pass. build_target_ownership_cut: Exact a319146b deletes the public non-atomic worker-launch path used only by test fixtures; exact 76fd259b deletes two source-layout tests while retaining real CLI refusal behavior. Exact b95a3266 deletes the superseded unpackaged OpenAI debug executable and the tests/helper that animated it. Exact 6f93134d makes epiphany-release-bundle the sole package owner for production entrypoints, disables automatic leaf binaries, reduces Cargo executable targets from 26 to 22, and deletes a hardcoded release target map plus two self-affirming tests that did not drive the build. Exact c04c3aff deletes the five-reexport auth wrapper crate; the transport imports its narrow Codex auth surface directly. Exact ad2292ee deletes two callerless Persona identity setup executables, their forced release roles, and 96 lines of enrollment/anchor-export wrappers. Exact 3dda58a5 deletes the duplicate Persona feedback ingress executable and release role after Resident Self proved to be the live authenticated Bifrost import owner. Exact 56267201 deletes three unadmitted Model Atlas daemon shells and release roles while preserving the typed library owners; authority separation alone does not justify production processes. Exact 900c5232 deletes the callerless frontier-proposal executable and release role; typed Self/runtime proposal intake and selection remain. Exact 94098223 deletes the host-identity executable/release role and 555 net lines of unowned private identity custody; Bifrost owns its signer while Epiphany retains only public-anchor verification. Exact b78ffb25 deletes the callerless Hands consequence recorder, release role, unconsumed command-description handshake, and main-only tests after proving that it executed no patch, command, or commit. The coordinator now reports awaitingHandsExecutor; exact typed receipt-chain admission remains. Exact a78c1802 deletes the 366-line standalone pre-compaction checker and its Cargo target. It merely re-rendered the existing state status, Git status/log, and phrase checks over canonical documents; agents now inspect those owners directly. Exact d2aee1ce deletes the 97-line callerless epiphany-package CLI because epiphany-release already owns its package/inspect operations plus publish. Cargo metadata reports 9 executable targets and no binary source with multiple package owners; focused state-binary, core-library, release-construction-library, and release-binary checks pass. runtime_registry_authority_cut: Exact 03140a47 deletes the 649-line epiphany-runtime-spine operator/debug CLI, its packaged release role, its callerless Hello/schema-catalog service facsimile, the 600-line hand-maintained mutation-contract mirror, and the source-shape test that guarded that mirror. CultCache exact fdbf3bf exposes its registered type identities, so runtime status and model preflight derive accepted documents from the same registration used to open the Mind store. Executable targets fall from 22 to 21 with zero duplicate source owners. Core checks without warnings and release construction passes 17/17. Editor actuation remains entirely provider-owned: Brokkr owns Unity through CultMesh/Eve and a future Rider daemon owns Rider. @@ -131,9 +132,9 @@ current_status: yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,730 lines, 53 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, and coordinator artifact/status cargo are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the registered-type and test-liability audit after exact 3140d305. Trace each remaining registered document and verifier to a producer, reader, and consequential invariant; delete complete dead authority slices and self-affirming tests, not isolated writers whose durable types remain registered. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + next_action: Resume the registered-type and test-liability audit after exact 0091e0e1. Trace each remaining registered document and verifier to a producer, reader, and consequential invariant; delete complete dead authority slices, unread status mirrors, and self-affirming tests. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, exact provider requests/receipts, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Session/job documents carry only lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. The sole standalone diagnostic session creator refuses identity collisions; there is no lenient ensure/rebase mouth. It exposes no aggregate status head, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, public typed-fulfillment machinery, or producerless Imagination review contract. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v22, runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,729 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Session/job documents carry only lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. The sole standalone diagnostic session creator refuses identity collisions; there is no lenient ensure/rebase mouth. It exposes no aggregate status head, mutable adapter-status shadow, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, public typed-fulfillment machinery, or producerless Imagination review contract. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v23, runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,725 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. From 2e3489c4f5c16157acf1ed071f8f7a889ef4b2b3 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 05:12:50 +0200 Subject: [PATCH 029/340] Delete the empty generic planning mirror --- epiphany-core/src/mind_documents.rs | 92 +-------- epiphany-core/src/reasoning_context.rs | 3 - epiphany-core/src/runtime_spine.rs | 2 +- epiphany-openai-runtime/src/lib.rs | 1 - epiphany-state-model/src/lib.rs | 256 ------------------------- 5 files changed, 4 insertions(+), 350 deletions(-) diff --git a/epiphany-core/src/mind_documents.rs b/epiphany-core/src/mind_documents.rs index c3d35de7..e03a8974 100644 --- a/epiphany-core/src/mind_documents.rs +++ b/epiphany-core/src/mind_documents.rs @@ -3,17 +3,15 @@ use std::path::Path; use anyhow::{Result, anyhow}; use cultcache_rs::{CultCache, CultCacheEnvelope, DatabaseEntry}; use epiphany_state_model::{ - EpiphanyBacklogItem, EpiphanyEvidenceRecord, EpiphanyInvariant, - EpiphanyInvestigationCheckpoint, EpiphanyModeState, EpiphanyObjectiveDraft, - EpiphanyObservation, EpiphanyPlanningCapture, EpiphanyPlanningState, EpiphanyRoadmapStream, - EpiphanySubgoal, + EpiphanyEvidenceRecord, EpiphanyInvariant, EpiphanyInvestigationCheckpoint, + EpiphanyModeState, EpiphanyObservation, EpiphanySubgoal, }; use serde::{Deserialize, Serialize}; use sha2::{Digest, Sha256}; use crate::{EpiphanyMindDocumentVersion, runtime_spine_cache}; -pub const MIND_SCHEMA_EPOCH: &str = "epiphany.mind.epoch.v8"; +pub const MIND_SCHEMA_EPOCH: &str = "epiphany.mind.epoch.v9"; pub const MIND_OBJECTIVE_KEY: &str = "objective"; pub const MIND_FOCUS_KEY: &str = "focus"; pub const MIND_MODE_KEY: &str = "mode"; @@ -297,46 +295,6 @@ pub struct EpiphanyMindInvestigationCheckpointDocument { pub value: EpiphanyInvestigationCheckpoint, } -#[derive(Clone, Debug, PartialEq, DatabaseEntry)] -#[cultcache( - type = "epiphany.mind.planning_capture.v1", - schema = "EpiphanyMindPlanningCaptureDocument" -)] -pub struct EpiphanyMindPlanningCaptureDocument { - #[cultcache(key = 0)] - pub value: EpiphanyPlanningCapture, -} - -#[derive(Clone, Debug, PartialEq, DatabaseEntry)] -#[cultcache( - type = "epiphany.mind.backlog_item.v1", - schema = "EpiphanyMindBacklogItemDocument" -)] -pub struct EpiphanyMindBacklogItemDocument { - #[cultcache(key = 0)] - pub value: EpiphanyBacklogItem, -} - -#[derive(Clone, Debug, PartialEq, DatabaseEntry)] -#[cultcache( - type = "epiphany.mind.roadmap_stream.v1", - schema = "EpiphanyMindRoadmapStreamDocument" -)] -pub struct EpiphanyMindRoadmapStreamDocument { - #[cultcache(key = 0)] - pub value: EpiphanyRoadmapStream, -} - -#[derive(Clone, Debug, PartialEq, DatabaseEntry)] -#[cultcache( - type = "epiphany.mind.objective_draft.v1", - schema = "EpiphanyMindObjectiveDraftDocument" -)] -pub struct EpiphanyMindObjectiveDraftDocument { - #[cultcache(key = 0)] - pub value: EpiphanyObjectiveDraft, -} - #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct EpiphanyMindView { pub schema_epoch: String, @@ -356,7 +314,6 @@ pub struct EpiphanyMindView { pub agent_pass_admission_refusals: Vec, pub investigation_checkpoint: Option, pub mode: Option, - pub planning: EpiphanyPlanningState, pub repository_body_observation: Option, pub repo_model: Option, } @@ -376,10 +333,6 @@ pub(crate) fn register_mind_document_types(cache: &mut CultCache) -> Result<()> cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; - cache.register_entry_type::()?; - cache.register_entry_type::()?; - cache.register_entry_type::()?; - cache.register_entry_type::()?; cache.register_entry_type::()?; crate::repo_model_documents::register_repo_model_document_types(cache)?; cache.register_entry_type::()?; @@ -524,22 +477,6 @@ pub(crate) fn validate_mind_write_envelope(envelope: &CultCacheEnvelope) -> Resu rmp_serde::from_slice::(&envelope.payload)? .value .checkpoint_id - } else if envelope.r#type == EpiphanyMindPlanningCaptureDocument::TYPE { - rmp_serde::from_slice::(&envelope.payload)? - .value - .id - } else if envelope.r#type == EpiphanyMindBacklogItemDocument::TYPE { - rmp_serde::from_slice::(&envelope.payload)? - .value - .id - } else if envelope.r#type == EpiphanyMindRoadmapStreamDocument::TYPE { - rmp_serde::from_slice::(&envelope.payload)? - .value - .id - } else if envelope.r#type == EpiphanyMindObjectiveDraftDocument::TYPE { - rmp_serde::from_slice::(&envelope.payload)? - .value - .id } else if envelope.r#type == EpiphanyMindRepositoryBodyObservationDocument::TYPE { let value: EpiphanyMindRepositoryBodyObservationDocument = rmp_serde::from_slice(&envelope.payload)?; @@ -599,14 +536,6 @@ pub fn assemble_mind_view(store_path: impl AsRef) -> Result(&cache, |value| value.value)?; - let mut captures = - values::(&cache, |value| value.value)?; - let mut backlog_items = - values::(&cache, |value| value.value)?; - let mut roadmap_streams = - values::(&cache, |value| value.value)?; - let mut objective_drafts = - values::(&cache, |value| value.value)?; let mut body_observations = cache.get_all::()?; for observation in &body_observations { observation.validate()?; @@ -642,10 +571,6 @@ pub fn assemble_mind_view(store_path: impl AsRef) -> Result) -> Result, pub investigation_checkpoint: Option, pub mode: Option, - pub planning: epiphany_state_model::EpiphanyPlanningState, pub repository_body_observation: Option, pub repo_model: Option, } @@ -141,7 +140,6 @@ impl From for EpiphanyMindPromptProjection { agent_pass_admission_refusals: value.agent_pass_admission_refusals, investigation_checkpoint: value.investigation_checkpoint, mode: value.mode, - planning: value.planning, repository_body_observation: value.repository_body_observation, repo_model: value.repo_model.map(Into::into), } @@ -2005,7 +2003,6 @@ mod tests { agent_pass_admission_refusals: Vec::new(), investigation_checkpoint: None, mode: None, - planning: Default::default(), repository_body_observation: None, repo_model: None, }, diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index f5d31239..77da712f 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -86,7 +86,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v23"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v24"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; pub const RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.model_execution_binding.v0"; diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index 40ec2e4a..e878e09e 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -2472,7 +2472,6 @@ mod tests { agent_pass_admission_refusals: Vec::new(), investigation_checkpoint: None, mode: None, - planning: Default::default(), repository_body_observation: None, repo_model: None, }; diff --git a/epiphany-state-model/src/lib.rs b/epiphany-state-model/src/lib.rs index d83a282d..5ad4f8af 100644 --- a/epiphany-state-model/src/lib.rs +++ b/epiphany-state-model/src/lib.rs @@ -389,262 +389,6 @@ pub enum EpiphanyModeKind { Default, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyPlanningState { - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub workspace_root: Option, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub captures: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub backlog_items: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub roadmap_streams: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub objective_drafts: Vec, -} - -impl EpiphanyPlanningState { - pub fn is_empty(&self) -> bool { - self.workspace_root.is_none() - && self.captures.is_empty() - && self.backlog_items.is_empty() - && self.roadmap_streams.is_empty() - && self.objective_drafts.is_empty() - } -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyPlanningCapture { - pub id: String, - pub title: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub body: Option, - pub confidence: String, - pub status: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub speaker: Option, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub tags: Vec, - pub source: EpiphanyPlanningSourceRef, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub created_at: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub updated_at: Option, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyPlanningSourceRef { - pub kind: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub provider: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub uri: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub external_id: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub repo: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "number | null")] - pub issue_number: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub node_id: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "bigint | null")] - pub database_id: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub url: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub state: Option, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub labels: Vec, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub milestone: Option, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub assignees: Vec, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub author: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub created_at: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub updated_at: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub closed_at: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "boolean | null")] - pub is_pull_request: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub imported_at: Option, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyBacklogItem { - pub id: String, - pub title: String, - pub kind: String, - pub summary: String, - pub status: String, - pub horizon: String, - pub priority: EpiphanyPlanningPriority, - pub confidence: String, - pub product_area: String, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub lane_hints: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub dependencies: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub blockers: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub acceptance_sketch: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub evidence_refs: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub source_refs: Vec, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub duplicate_of: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub updated_at: Option, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyPlanningPriority { - pub value: String, - pub rationale: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub impact: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub urgency: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub confidence: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub effort: Option, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub unblocks: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub blocks: Vec, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub reason: Option, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyRoadmapStream { - pub id: String, - pub title: String, - pub purpose: String, - pub status: String, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub item_ids: Vec, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub near_term_focus: Option, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub blocked_by: Vec, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub review_cadence: Option, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyObjectiveDraft { - pub id: String, - pub title: String, - pub summary: String, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub source_item_ids: Vec, - pub scope: EpiphanyObjectiveDraftScope, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub acceptance_criteria: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub evidence_required: Vec, - pub lane_plan: EpiphanyObjectiveDraftLanePlan, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub dependencies: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub risks: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub review_gates: Vec, - pub status: String, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyObjectiveDraftScope { - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub includes: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub excludes: Vec, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyObjectiveDraftLanePlan { - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub imagination: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub eyes: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub body: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub hands: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub soul: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub life: Option, -} - #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] pub struct EpiphanyMemoryGraphSnapshot { pub graph_id: String, From 24e2949e46cd121c674b2b625ffc4a7635bb7518 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 05:14:04 +0200 Subject: [PATCH 030/340] docs: Record generic planning mirror cut --- notes/epiphany-current-algorithmic-map.md | 13 +++++++++++-- notes/epiphany-fork-implementation-plan.md | 4 ++++ notes/fresh-workspace-handoff.md | 20 ++++++++++++++++---- state/ledgers.msgpack | Bin 701997 -> 702568 bytes state/map.yaml | 7 ++++--- 5 files changed, 35 insertions(+), 9 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 1098b0ff..1369c1a8 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `0091e0e1` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for unread adapter-status deletion; +Latest committed implementation cut: `2e3489c4` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for generic planning-mirror deletion; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -334,6 +334,15 @@ transport attachment is proved where the transport is constructed and used. Runtime epoch v23 refuses v22 stores. The local published catalog now contains twenty live or portable contracts. +Mind no longer contains a second, uninhabited planning ontology. Exact +`2e3489c4` removes planning-capture, backlog-item, roadmap-stream, and +objective-draft document families plus their 256-line generic state-model +vocabulary. No live path could construct or admit one, so every reasoning +projection received the same empty structure. Frontier planning requests, +candidates, Mind review, adopted decisions, checkpoints, and consequence +receipts remain the sole planning lifecycle. Mind/runtime epochs v9/v24 refuse +the retired writable shape. + Bifrost owns its private feedback-signing identity. Exact `94098223` deletes Epiphany's host-identity executable and the private signer, persisted identity, enrollment, platform protection, and anchor-export implementation behind it. diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index cf2bbda2..5da0104d 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -326,6 +326,10 @@ Cut in this order: their per-pass writers and construction helpers, one self-affirming test, two schemas, and both runtime registrations. Exact request/provider context and live transport construction remain. Runtime writable epoch is v23. + Exact `2e3489c4` removes four uninhabited generic planning document families, + their empty reasoning-projection field, and the 256-line issue-tracker DTO + vocabulary beneath them. Actual frontier planning and adoption remain. + Mind/runtime writable epochs are v9/v24. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index c1fe72a9..9c015a46 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `0091e0e1` -Current worktree: documentation/evidence for unread adapter-status deletion; +Latest committed implementation cut: `2e3489c4` +Current worktree: documentation/evidence for generic planning-mirror deletion; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `0091e0e1` is the current +production symlink body and is inactive. Exact `2e3489c4` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,18 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `2e3489c4` deletes the empty generic planning mirror. Four registered Mind +document families—planning captures, backlog items, roadmap streams, and +objective drafts—had no constructor, writer, admission owner, or consumer, yet +were read and injected empty into every reasoning projection. Their document +types, registry/validation/projection branches, reasoning field, and 256-line +issue-tracker-shaped state-model vocabulary are gone. Real planning remains in +frontier planning requests, candidates, Mind review, adopted decisions, +checkpoints, Hands receipts, and their exact admission paths. Mind/runtime +writable epochs advance to v9/v24. State model and core compile; sealed +reasoning 8/8, old-epoch refusal, model runtime 23/23, and coordinator 5/5 pass. +The cut removes 350 net maintained lines without touching Atlas. + Exact `0091e0e1` deletes the generic model-adapter and OpenAI-adapter status families. Every model pass wrote both mutable documents, but no query, router, admission owner, audit path, or display consumed either one. Their types, @@ -150,7 +162,7 @@ the live resident fields. Runtime writable state advances to v20. JSON schemas parse; core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass. The cut removes 59 maintained lines and leaves `runtime_spine.rs` at 9,807 lines. -Continue the registered-type and test-liability audit after exact `0091e0e1`. Model Atlas remains protected +Continue the registered-type and test-liability audit after exact `2e3489c4`. Model Atlas remains protected for its first live inter-swarm collaboration trial. Exact `3ed1d564` deletes the public diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index cd646cc28a7eb2166d12167405dcccc68ebc459e..29eb662eab970c52e60c5890b9f3f3fa21231894 100644 GIT binary patch delta 534 zcmYjOy>1jS5N4O(Y#JmA5JY4ox@ePCb}wjyXd;mcMHHl>L5@9pJH%^mZ12KVS5WW- zr={fqh>)(x8}JAeRFoi5V|ll_OB7F`$Rab`Cm2rWQvOP{9}tI+D<8Vfc6q2V@i|E4v0wfJ!u^34IEoMsnbA zOg^|t)(cHa1hOV;oqdCHQNocEM%L56_W_$WOqe6Qz0j@*wMs#-L%#DEG#QR$DgpxRkmFWq)^@^&tW*TtWh4fmQ3J{ zFvG8JD-Wj^w9Iv^)*#b*j*QTkS)UgWEcClvjke%r5CNgF{B)VL4wq^yDvNJBPJHgt{}zu~bD>m<+E^ll9>T|KlGJ C0lUor delta 73 zcmaFyL2K RI}mdKG3WNFOk6WI0|0q?7a0Hm diff --git a/state/map.yaml b/state/map.yaml index 1d0c0da3..b6d93154 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -52,7 +52,7 @@ current_status: summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Runtime status aggregates, mutable adapter-status shadows, global revisions, generic role/event authority, duplicate prompt-state cargo, duplicate family launch bindings, and Epiphany-owned Rider/Unity organs are absent. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. Completed model-session tombstones retain only resurrection fences and an exact deletion digest. Archived worker attempts retain the exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records needed for audit. Runtime sessions and jobs own lifecycle identity/status only; terminal job results own summaries and artifacts. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v23; runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, and coordinator-run-receipt schema/type is v1. Old writable stores refuse with no migrator or dual reader. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Runtime status aggregates, mutable adapter-status shadows, uninhabited generic planning mirrors, global revisions, generic role/event authority, duplicate prompt-state cargo, duplicate family launch bindings, and Epiphany-owned Rider/Unity organs are absent. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. Completed model-session tombstones retain only resurrection fences and an exact deletion digest. Archived worker attempts retain the exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records needed for audit. Runtime sessions and jobs own lifecycle identity/status only; terminal job results own summaries and artifacts. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v9/v24; runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, and coordinator-run-receipt schema/type is v1. Old writable stores refuse with no migrator or dual reader. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. atlas_authoring_cut: Exact ce306e23 preserves the complete inter-swarm Atlas vertical slice while deleting its duplicate local offer/claim authoring authority. Ordinary Modeling through RepoModel operations is the sole owner of provider offers and consumer claims; Atlas retains signed publication, trust, transport, deterministic projection, Soul verification, Self impact admission, Resident Self wake, brakes, and Eve lowering. Two direct write-intent types, their runtime commit APIs and registry entries, 518 planner lines, and two tests that animated only that duplicate path are gone. The runtime proof now creates offers/claims through RepoModel before proving exact verification admission and Body-drift refusal. The cut removes 593 net source lines; the three-repository direct/transitive Modeling proof passes. These are component proofs only: no live inter-swarm collaboration has yet run, so the Atlas vertical slice remains protected until Gate 1 exercises it end to end. Runtime writable epoch is v14. autonomous_proposal_binding_cut: Exact 5d507bfd reduces Self's autonomous Imagination-to-Modeling origin binding from a 22-field duplicate archive to six causal join fields: schema, exact direction-result identity, selected option ordinal, worker job identity, and exact worker-result/launch digests. Proposal identity and payload, direction request, runtime/thread, typed model projection, Body/domain binding, selected option content, and canonical Modeling-request identity are checked directly from their owning immutable documents. The atomic proposal plus binding plus Modeling-request commit and its broad keyed-lifecycle proof remain; 60 net source lines are gone. Runtime writable epoch is v15. hands_verification_derivation_cut: Exact 6ccc7dd2 deletes the 20-field transient Hands receipt-chain summary. The Hands commit owner now derives the exact Verification request directly from the persisted patch, command, and commit receipts plus the frontier authority; no copied schema, job, grant, command-output, Git, path, summary, or timestamp fields mediate that handoff. Atomic Hands-to-Verification admission and the concurrent Persona/Hands lifecycle proof remain. The cut removes 43 net source lines without adding state, schema, or tests. @@ -70,6 +70,7 @@ current_status: imagination_review_contract_cut: Exact be611f24 deletes the producerless Imagination consideration-review request as one authority cut: its writer, durable document, schema constant, public export, and runtime registration are all gone. It had no caller, reader, test, or Modeling admission path. Imagination requests and candidates retain quoted-evidence, substitution, chronology, disposition, and route validation; adopted proposal Modeling remains owned by its actual lifecycle. Runtime writable epoch advances to v22 so v21 stores cannot carry the retired contract into current authority. Core checks, Imagination 8/8, old-epoch refusal, and coordinator 5/5 pass. The cut removes 71 net maintained lines without touching Atlas. resident_self_runtime_receipt_cut: Exact 3140d305 deletes ResidentSelfRuntimeReceipt, a durable type that was registered, accepted, and decoded but had no producer or reader. Its schema constant and every state-cache branch are gone. The definition-plus-export-only EpiphanyCoordinatorRoleResultStatus is also gone; the live role board retains EpiphanyCoordinatorRoleStatus. Resident Self writable state advances to v2, and a consequential negative proof confirms a v1 store refuses byte-identically. Resident Self 7/7 and swarm physiology 4/4 pass. The cut is net 32 maintained lines removed without touching Atlas. adapter_status_authority_cut: Exact 0091e0e1 deletes the generic model-adapter and OpenAI-adapter status families. Every model pass wrote both mutable documents, but no query, router, admission owner, audit path, or display consumed either. Their types, per-pass writers, status/auth-mode constructors, adapter-ID constants, one self-affirming OpenRouter status test, runtime registrations, two published schemas, and catalog entries are gone. Native/provider requests retain provider and model identity; live transport construction retains credential and attachment proof. Runtime writable epoch advances to v23. Adapter libraries compile; provider spine 14/14, old-epoch refusal, and model runtime 23/23 pass. The cut removes 267 net maintained lines without touching Atlas. The local published catalog contains twenty live or portable contracts. + generic_planning_mirror_cut: Exact 2e3489c4 deletes the empty generic planning mirror. Four registered Mind document families—planning captures, backlog items, roadmap streams, and objective drafts—had no constructor, writer, admission owner, or consumer, yet were read and injected empty into every reasoning projection. Their document types, registry/validation/projection branches, reasoning field, and 256-line issue-tracker-shaped state-model vocabulary are gone. Real planning remains in frontier planning requests, candidates, Mind review, adopted decisions, checkpoints, Hands receipts, and exact admission paths. Mind/runtime writable epochs advance to v9/v24. State model and core compile; sealed reasoning 8/8, old-epoch refusal, model runtime 23/23, and coordinator 5/5 pass. The cut removes 350 net maintained lines without touching Atlas. supervisor_subtraction: Exact 856648de completes the supervisor deletion. Epiphany owns no local generic daemon supervisor, semantic projector service, workspace-coverage projector, Windows Task Scheduler integration, or service-policy/lifecycle/heartbeat/recovery mirror. Idunn on Yggdrasil owns source-triggered compilation, testing, packaging, deployment, signed health, and daemon survival. The canonical Epiphany brake gates Epiphany cognition and consequence authority, not Idunn startup or unrelated lifecycle. launch_dependency_cut: Exact 2aeab7a9 deletes the generic organ dependency matrix, generic receipt catalogue/proof profiles, persisted worker-launch cargo, Persona prompt injection, evaluator, and three self-certifying tests: 700 net lines. Family admission owners derive exact dependencies from typed state. Worker-launch schema v2 and Persona projector prompt v1 refuse the old writable shape. Core 378/378, OpenRouter runtime 27/27, packaged runtime 13/13, and Persona re-entry 1/1 pass. operator_surface_subtraction: Exact ef92e853 deletes the callerless view-lens registry, legacy acceptance-bundle builders, test-only raw-JSON result interpreters, and six tests: 797 net lines. Exact a292979d and 77e817c1 delete the duplicate CRRC recommendation algorithm, its unused input model, and four tests: 206 lines. Exact 3b94bf6e and 59c5e3a6 delete the nested duplicate status view, false auxiliary mode, and ignored status arguments. Exact 7c9b0cf3 deletes the fixed synthetic job table, role-board job cargo/mappers, and its test: 338 net lines. Exact 2ce91461 deletes the scene/planning Mind reconstructions, duplicate self-policy crate, unused prompt templates, four counterfeit schemas, and ten producer/source-text tests: 1,723 net lines. Exact 78836f3b deletes eight unconsumed status tableaux, the pressure calculator production only called without telemetry, its unreachable compaction action, one counterfeit schema, and six tests: 518 net lines. Exact f10f7fb3 deletes the final twelve epiphany.surface.* schemas and ten catalog entries after every one proved producerless and consumerless: 692 pure deletions. Exact ab3cacfb deletes thirty-one more producerless contracts, the false runtime-session mutation mouth, every Epiphany-owned Rider/Unity command schema, a callerless prompt-context module, its test-only specialist prompt system, and four self-affirming tests: 3,514 net lines. Exact 16d85b1b deletes six duplicate JSON-schema builder tests and two OpenAI-runtime self-source searches: 209 pure test-line deletions. Exact 06f93f70 deletes the test-only inverse OpenAI-to-native request mapper and makes two retained tests follow canonical native-to-provider derivation: sixty net lines. Exact 0091e0e1 later removes two unread adapter-status schemas and catalog entries; the local catalog now has twenty live or portable contracts. Brokkr owns Unity capabilities through CultMesh/Eve; a future Rider daemon owns Rider. Status retains Mind identity, exact current work, one action/reason decision, readable role lanes, and operator thought sealing. Core checks cleanly; retained provider and focused request-flow tests pass. @@ -132,9 +133,9 @@ current_status: yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,730 lines, 53 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, and coordinator artifact/status cargo are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the registered-type and test-liability audit after exact 0091e0e1. Trace each remaining registered document and verifier to a producer, reader, and consequential invariant; delete complete dead authority slices, unread status mirrors, and self-affirming tests. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, exact provider requests/receipts, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + next_action: Resume the registered-type and test-liability audit after exact 2e3489c4. Trace each remaining registered document and verifier to a producer, reader, and consequential invariant; delete complete dead authority slices, unread projections, and self-affirming tests. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, exact provider requests/receipts, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Session/job documents carry only lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. The sole standalone diagnostic session creator refuses identity collisions; there is no lenient ensure/rebase mouth. It exposes no aggregate status head, mutable adapter-status shadow, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, public typed-fulfillment machinery, or producerless Imagination review contract. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v8/v23, runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,725 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Session/job documents carry only lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. The sole standalone diagnostic session creator refuses identity collisions; there is no lenient ensure/rebase mouth. It exposes no aggregate status head, mutable adapter-status shadow, uninhabited generic planning mirror, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, public typed-fulfillment machinery, or producerless Imagination review contract. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v9/v24, runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,725 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. From a6f73fc4cc97542d8bd48febec4a98c5d1324d78 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 05:16:52 +0200 Subject: [PATCH 031/340] Delete write-only Persona quarantine mirror --- epiphany-core/src/persona_social_state.rs | 63 ----------------------- 1 file changed, 63 deletions(-) diff --git a/epiphany-core/src/persona_social_state.rs b/epiphany-core/src/persona_social_state.rs index 23fafeae..07fc9b87 100644 --- a/epiphany-core/src/persona_social_state.rs +++ b/epiphany-core/src/persona_social_state.rs @@ -146,30 +146,9 @@ pub struct PersonaTurnBlockedEvidence { pub bridge_receipt_sha256: Option, } -#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct PersonaBlockedConversationPressure { - pub schema_version: String, - pub quarantine_id: String, - pub request_id: String, - pub terminal_receipt_id: String, - pub crossing_status: String, - pub evidence_source: String, - pub reason: String, - pub mentions: Vec, - pub mention_cargo_sha256: String, - #[serde(default)] - pub crossing_receipt_id: Option, - #[serde(default)] - pub bridge_receipt_sha256: Option, - pub quarantined_at: String, - pub private_state_exposed: bool, -} - pub const PERSONA_SOCIAL_MENTION_TYPE: &str = "epiphany.persona.social_mention.v1"; pub const PERSONA_SOCIAL_TURN_REQUEST_TYPE: &str = "epiphany.persona.turn_request.v1"; pub const PERSONA_SOCIAL_TURN_TERMINAL_TYPE: &str = "epiphany.persona.turn_terminal.v1"; -pub const PERSONA_SOCIAL_QUARANTINE_TYPE: &str = "epiphany.persona.quarantine.v1"; pub const PERSONA_SOCIAL_RETENTION_HEAD_TYPE: &str = "epiphany.persona.retention_head.v1"; pub const PERSONA_SOCIAL_RETENTION_PLAN_TYPE: &str = "epiphany.persona.retention_plan.v1"; pub const PERSONA_SOCIAL_RETENTION_HEAD_KEY: &str = "persona"; @@ -228,16 +207,6 @@ pub struct PersonaSocialTurnTerminalDocument { pub receipt: PersonaTurnTerminalReceipt, } -#[derive(Clone, Debug, PartialEq, DatabaseEntry)] -#[cultcache( - type = "epiphany.persona.quarantine.v1", - schema = "PersonaSocialQuarantineDocument" -)] -pub struct PersonaSocialQuarantineDocument { - #[cultcache(key = 0)] - pub pressure: PersonaBlockedConversationPressure, -} - #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache( type = "epiphany.persona.retention_head.v1", @@ -644,33 +613,6 @@ pub fn complete_persona_social_turn( document.terminal_receipt_id = Some(receipt.receipt_id.clone()); writes.push(cache.prepare_entry(&mention.id, &document)?.0); } - if mention_disposition == "quarantined" { - let evidence = blocked_evidence.expect("validated blocked evidence"); - let pressure = PersonaBlockedConversationPressure { - schema_version: "epiphany.persona_blocked_conversation_pressure.v1".into(), - quarantine_id: format!("{}:quarantine", request.request_id), - request_id: request.request_id.clone(), - terminal_receipt_id: receipt.receipt_id.clone(), - crossing_status: evidence.crossing_status.clone(), - evidence_source: evidence.evidence_source.clone(), - reason: evidence.reason.clone(), - mentions: request.mentions.clone(), - mention_cargo_sha256: receipt.mention_cargo_sha256.clone(), - crossing_receipt_id: evidence.crossing_receipt_id.clone(), - bridge_receipt_sha256: evidence.bridge_receipt_sha256.clone(), - quarantined_at: receipt.completed_at.clone(), - private_state_exposed: false, - }; - let quarantine_id = pressure.quarantine_id.clone(); - writes.push( - cache - .prepare_entry( - &quarantine_id, - &PersonaSocialQuarantineDocument { pressure }, - )? - .0, - ); - } if !persona_social_backing(store_path).compare_and_swap_batch(&expected, writes)? { return Err(anyhow!( "Persona terminal decision lost exact document compare-and-swap" @@ -877,7 +819,6 @@ fn register_persona_social_types(cache: &mut CultCache) -> Result<()> { cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; - cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; Ok(()) @@ -888,7 +829,6 @@ fn is_persona_social_type(document_type: &str) -> bool { PERSONA_SOCIAL_MENTION_TYPE, PERSONA_SOCIAL_TURN_REQUEST_TYPE, PERSONA_SOCIAL_TURN_TERMINAL_TYPE, - PERSONA_SOCIAL_QUARANTINE_TYPE, PERSONA_SOCIAL_RETENTION_HEAD_TYPE, PERSONA_SOCIAL_RETENTION_PLAN_TYPE, ] @@ -906,9 +846,6 @@ fn load_persona_social_envelope(cache: &mut CultCache, envelope: CultCacheEnvelo PERSONA_SOCIAL_TURN_TERMINAL_TYPE => { cache.load_envelope::(envelope)?; } - PERSONA_SOCIAL_QUARANTINE_TYPE => { - cache.load_envelope::(envelope)?; - } PERSONA_SOCIAL_RETENTION_HEAD_TYPE => { cache.load_envelope::(envelope)?; } From a2bf15359ece250554e96997adf66e15add07ca8 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 05:17:36 +0200 Subject: [PATCH 032/340] docs: Record Persona quarantine mirror cut --- notes/epiphany-current-algorithmic-map.md | 11 +++++++++-- notes/epiphany-fork-implementation-plan.md | 3 +++ notes/fresh-workspace-handoff.md | 18 ++++++++++++++---- state/ledgers.msgpack | Bin 702568 -> 703048 bytes state/map.yaml | 3 ++- 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 1369c1a8..133db517 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `2e3489c4` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for generic planning-mirror deletion; +Latest committed implementation cut: `a6f73fc4` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for Persona quarantine-mirror deletion; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -343,6 +343,13 @@ candidates, Mind review, adopted decisions, checkpoints, and consequence receipts remain the sole planning lifecycle. Mind/runtime epochs v9/v24 refuse the retired writable shape. +Blocked Persona turns have one durable consequence record. Exact `a6f73fc4` +deletes the duplicate quarantine-pressure document that was written beside the +terminal receipt but never read. The terminal receipt retains exact blocked +crossing evidence and mention digest; keyed mentions retain `quarantined` +status plus terminal-receipt identity. No second queue or pressure projection +reconstructs the same decision. + Bifrost owns its private feedback-signing identity. Exact `94098223` deletes Epiphany's host-identity executable and the private signer, persisted identity, enrollment, platform protection, and anchor-export implementation behind it. diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 5da0104d..dacd3116 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -330,6 +330,9 @@ Cut in this order: their empty reasoning-projection field, and the 256-line issue-tracker DTO vocabulary beneath them. Actual frontier planning and adoption remain. Mind/runtime writable epochs are v9/v24. + Exact `a6f73fc4` removes the write-only Persona quarantine-pressure document. + The terminal turn receipt and receipt-bound quarantined mentions remain the + single blocked-consequence authority. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 9c015a46..55191694 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `2e3489c4` -Current worktree: documentation/evidence for generic planning-mirror deletion; +Latest committed implementation cut: `a6f73fc4` +Current worktree: documentation/evidence for Persona quarantine-mirror deletion; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `2e3489c4` is the current +production symlink body and is inactive. Exact `a6f73fc4` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,16 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `a6f73fc4` deletes the write-only Persona quarantine mirror. A blocked +turn already atomically writes one terminal receipt containing exact crossing +status/reason and mention digest, then marks each mention `quarantined` and +binds it to that receipt. The duplicate blocked-pressure payload, wrapper +document, construction branch, type constant, registry entry, and decoder are +gone; nothing read them after the earlier duplicate projection was deleted. +Core compiles, Persona consequence/retention 5/5 pass, and the feature-gated +Persona service compiles. The cut is 63 pure deletions and does not touch +Atlas. + Exact `2e3489c4` deletes the empty generic planning mirror. Four registered Mind document families—planning captures, backlog items, roadmap streams, and objective drafts—had no constructor, writer, admission owner, or consumer, yet @@ -162,7 +172,7 @@ the live resident fields. Runtime writable state advances to v20. JSON schemas parse; core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass. The cut removes 59 maintained lines and leaves `runtime_spine.rs` at 9,807 lines. -Continue the registered-type and test-liability audit after exact `2e3489c4`. Model Atlas remains protected +Continue the registered-type and test-liability audit after exact `a6f73fc4`. Model Atlas remains protected for its first live inter-swarm collaboration trial. Exact `3ed1d564` deletes the public diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 29eb662eab970c52e60c5890b9f3f3fa21231894..464461a3a8cf73ddaa890ae7c1bba4eadcae3dd6 100644 GIT binary patch delta 521 zcmZ8eyGlbr5cS4)Dq9;F5F5!u@e$BU#m+*ovs-s3$&%~t&CaYQRSFBgAmld!LBt;r zdw;>gGKC-D+$2P>IP7C~&SUm_y!-L9JKRi)wUdLr+xLay+sC| zT@)+{mIW()s zmc2{6aE*byQ*f7h-9l5&0usf5)pk@tIkpbLcpdN2aS60{#35?7-oc&Jb#rzpPfHN6 zVWqC5+;b&R&WNn`215nTrvktj?yXa)Jl1G4CfTsE4shaE2Tx>O1Bewzss>czZ$gz@ z$aRfvAn_^8&U1o4#|Ef3X@@M068WDbSd&w6w*nVFAm}FQR%t$pJS4UwI*lUFGu5N& z(KJy$z&eV#faQi_H1kHn@L=_n@2~}#BC5cR?Qplu&437*^h`fOa?mN9ajFQSV;{wX Gsr&+ZYrj?i delta 72 zcmX@{MeD@}tqqclT*g+W7E#9-xVF1)R%R?@Wb|&H%G5rUi4llFG&2yh05K~NvjH(X Q5OV-A=k}>gT$i^30Doy0hX4Qo diff --git a/state/map.yaml b/state/map.yaml index b6d93154..cd68067e 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -71,6 +71,7 @@ current_status: resident_self_runtime_receipt_cut: Exact 3140d305 deletes ResidentSelfRuntimeReceipt, a durable type that was registered, accepted, and decoded but had no producer or reader. Its schema constant and every state-cache branch are gone. The definition-plus-export-only EpiphanyCoordinatorRoleResultStatus is also gone; the live role board retains EpiphanyCoordinatorRoleStatus. Resident Self writable state advances to v2, and a consequential negative proof confirms a v1 store refuses byte-identically. Resident Self 7/7 and swarm physiology 4/4 pass. The cut is net 32 maintained lines removed without touching Atlas. adapter_status_authority_cut: Exact 0091e0e1 deletes the generic model-adapter and OpenAI-adapter status families. Every model pass wrote both mutable documents, but no query, router, admission owner, audit path, or display consumed either. Their types, per-pass writers, status/auth-mode constructors, adapter-ID constants, one self-affirming OpenRouter status test, runtime registrations, two published schemas, and catalog entries are gone. Native/provider requests retain provider and model identity; live transport construction retains credential and attachment proof. Runtime writable epoch advances to v23. Adapter libraries compile; provider spine 14/14, old-epoch refusal, and model runtime 23/23 pass. The cut removes 267 net maintained lines without touching Atlas. The local published catalog contains twenty live or portable contracts. generic_planning_mirror_cut: Exact 2e3489c4 deletes the empty generic planning mirror. Four registered Mind document families—planning captures, backlog items, roadmap streams, and objective drafts—had no constructor, writer, admission owner, or consumer, yet were read and injected empty into every reasoning projection. Their document types, registry/validation/projection branches, reasoning field, and 256-line issue-tracker-shaped state-model vocabulary are gone. Real planning remains in frontier planning requests, candidates, Mind review, adopted decisions, checkpoints, Hands receipts, and exact admission paths. Mind/runtime writable epochs advance to v9/v24. State model and core compile; sealed reasoning 8/8, old-epoch refusal, model runtime 23/23, and coordinator 5/5 pass. The cut removes 350 net maintained lines without touching Atlas. + persona_quarantine_mirror_cut: Exact a6f73fc4 deletes the write-only Persona quarantine mirror. A blocked turn already atomically writes one terminal receipt containing exact crossing status/reason and mention digest, then marks each mention quarantined and binds it to that receipt. The duplicate blocked-pressure payload, wrapper document, construction branch, type constant, registry entry, and decoder are gone; nothing read them after the earlier duplicate projection was deleted. Core compiles, Persona consequence/retention 5/5 pass, and the feature-gated Persona service compiles. The cut is 63 pure deletions without touching Atlas. supervisor_subtraction: Exact 856648de completes the supervisor deletion. Epiphany owns no local generic daemon supervisor, semantic projector service, workspace-coverage projector, Windows Task Scheduler integration, or service-policy/lifecycle/heartbeat/recovery mirror. Idunn on Yggdrasil owns source-triggered compilation, testing, packaging, deployment, signed health, and daemon survival. The canonical Epiphany brake gates Epiphany cognition and consequence authority, not Idunn startup or unrelated lifecycle. launch_dependency_cut: Exact 2aeab7a9 deletes the generic organ dependency matrix, generic receipt catalogue/proof profiles, persisted worker-launch cargo, Persona prompt injection, evaluator, and three self-certifying tests: 700 net lines. Family admission owners derive exact dependencies from typed state. Worker-launch schema v2 and Persona projector prompt v1 refuse the old writable shape. Core 378/378, OpenRouter runtime 27/27, packaged runtime 13/13, and Persona re-entry 1/1 pass. operator_surface_subtraction: Exact ef92e853 deletes the callerless view-lens registry, legacy acceptance-bundle builders, test-only raw-JSON result interpreters, and six tests: 797 net lines. Exact a292979d and 77e817c1 delete the duplicate CRRC recommendation algorithm, its unused input model, and four tests: 206 lines. Exact 3b94bf6e and 59c5e3a6 delete the nested duplicate status view, false auxiliary mode, and ignored status arguments. Exact 7c9b0cf3 deletes the fixed synthetic job table, role-board job cargo/mappers, and its test: 338 net lines. Exact 2ce91461 deletes the scene/planning Mind reconstructions, duplicate self-policy crate, unused prompt templates, four counterfeit schemas, and ten producer/source-text tests: 1,723 net lines. Exact 78836f3b deletes eight unconsumed status tableaux, the pressure calculator production only called without telemetry, its unreachable compaction action, one counterfeit schema, and six tests: 518 net lines. Exact f10f7fb3 deletes the final twelve epiphany.surface.* schemas and ten catalog entries after every one proved producerless and consumerless: 692 pure deletions. Exact ab3cacfb deletes thirty-one more producerless contracts, the false runtime-session mutation mouth, every Epiphany-owned Rider/Unity command schema, a callerless prompt-context module, its test-only specialist prompt system, and four self-affirming tests: 3,514 net lines. Exact 16d85b1b deletes six duplicate JSON-schema builder tests and two OpenAI-runtime self-source searches: 209 pure test-line deletions. Exact 06f93f70 deletes the test-only inverse OpenAI-to-native request mapper and makes two retained tests follow canonical native-to-provider derivation: sixty net lines. Exact 0091e0e1 later removes two unread adapter-status schemas and catalog entries; the local catalog now has twenty live or portable contracts. Brokkr owns Unity capabilities through CultMesh/Eve; a future Rider daemon owns Rider. Status retains Mind identity, exact current work, one action/reason decision, readable role lanes, and operator thought sealing. Core checks cleanly; retained provider and focused request-flow tests pass. @@ -133,7 +134,7 @@ current_status: yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,730 lines, 53 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, and coordinator artifact/status cargo are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the registered-type and test-liability audit after exact 2e3489c4. Trace each remaining registered document and verifier to a producer, reader, and consequential invariant; delete complete dead authority slices, unread projections, and self-affirming tests. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, exact provider requests/receipts, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + next_action: Resume the registered-type and test-liability audit after exact a6f73fc4. Trace each remaining registered document and verifier to a producer, reader, and consequential invariant; delete complete dead authority slices, write-only mirrors, unread projections, and self-affirming tests. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, exact Persona terminal consequences, exact provider requests/receipts, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Session/job documents carry only lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. The sole standalone diagnostic session creator refuses identity collisions; there is no lenient ensure/rebase mouth. It exposes no aggregate status head, mutable adapter-status shadow, uninhabited generic planning mirror, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, public typed-fulfillment machinery, or producerless Imagination review contract. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v9/v24, runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,725 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. From fed4b857804e104bed8790107c525dbe98e9cb49 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 05:20:45 +0200 Subject: [PATCH 033/340] Delete duplicate continuity recovery receipts --- epiphany-core/src/continuity_gateway.rs | 63 ------------------------- epiphany-core/src/lib.rs | 2 - epiphany-core/src/reorientation_work.rs | 14 +----- epiphany-core/src/runtime_spine.rs | 4 +- 4 files changed, 3 insertions(+), 80 deletions(-) delete mode 100644 epiphany-core/src/continuity_gateway.rs diff --git a/epiphany-core/src/continuity_gateway.rs b/epiphany-core/src/continuity_gateway.rs deleted file mode 100644 index 871bc55e..00000000 --- a/epiphany-core/src/continuity_gateway.rs +++ /dev/null @@ -1,63 +0,0 @@ -use crate::EpiphanyReorientFindingInterpretation; -use cultcache_rs::DatabaseEntry; - -pub const CONTINUITY_RECOVERY_RECEIPT_TYPE: &str = "epiphany.continuity.recovery_receipt"; -pub const CONTINUITY_RECOVERY_RECEIPT_SCHEMA_VERSION: &str = - "epiphany.continuity.recovery_receipt.v0"; - -#[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] -#[cultcache( - type = "epiphany.continuity.recovery_receipt", - schema = "ContinuityRecoveryReceipt" -)] -pub struct ContinuityRecoveryReceipt { - #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] - pub receipt_id: String, - #[cultcache(key = 2)] - pub source_result_id: String, - #[cultcache(key = 3)] - pub source_job_id: String, - #[cultcache(key = 4)] - pub binding_id: String, - #[cultcache(key = 5)] - pub mode: String, - #[cultcache(key = 6)] - pub checkpoint_still_valid: String, - #[cultcache(key = 7)] - pub summary: String, - #[cultcache(key = 8)] - pub next_safe_move: String, - #[cultcache(key = 9)] - pub files_inspected: Vec, - #[cultcache(key = 10)] - pub emitted_at: String, - #[cultcache(key = 11)] - pub contract: String, -} - -pub fn continuity_recovery_receipt_from_reorient_finding( - receipt_id: String, - binding_id: String, - finding: &EpiphanyReorientFindingInterpretation, - emitted_at: String, -) -> ContinuityRecoveryReceipt { - ContinuityRecoveryReceipt { - schema_version: CONTINUITY_RECOVERY_RECEIPT_SCHEMA_VERSION.to_string(), - receipt_id, - source_result_id: finding.runtime_result_id.clone().unwrap_or_default(), - source_job_id: finding.runtime_job_id.clone().unwrap_or_default(), - binding_id, - mode: finding.mode.clone().unwrap_or_else(|| "unknown".to_string()), - checkpoint_still_valid: finding - .checkpoint_still_valid - .map(|value| value.to_string()) - .unwrap_or_else(|| "unknown".to_string()), - summary: finding.summary.clone().unwrap_or_default(), - next_safe_move: finding.next_safe_move.clone().unwrap_or_default(), - files_inspected: finding.files_inspected.clone(), - emitted_at, - contract: "Continuity recovery emitted from a reviewed reorientation finding; it proves what survived rupture before Mind admits recovery state.".to_string(), - } -} diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index f8888625..7da0e1d7 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -1,7 +1,6 @@ mod agent_launch; pub mod atlas; mod causal_work_identity; -mod continuity_gateway; mod coordinator_objective_intake; mod coordinator_results; pub mod coordinator_status; @@ -75,7 +74,6 @@ pub use agent_launch::epiphany_role_label; pub use agent_launch::epiphany_role_launch_output_schema; pub use atlas::*; pub use causal_work_identity::*; -pub use continuity_gateway::*; pub use coordinator_objective_intake::USER_OBJECTIVE_INTAKE_CONTRACT; pub use coordinator_objective_intake::USER_OBJECTIVE_INTAKE_SCHEMA_VERSION; pub use coordinator_objective_intake::USER_OBJECTIVE_INTAKE_TYPE; diff --git a/epiphany-core/src/reorientation_work.rs b/epiphany-core/src/reorientation_work.rs index 0f9e020f..ca9886cc 100644 --- a/epiphany-core/src/reorientation_work.rs +++ b/epiphany-core/src/reorientation_work.rs @@ -418,13 +418,12 @@ pub fn record_reorientation_pass_failure( } let write = crate::mind_documents::prepare_mind_document(&cache, &failure.failure_id, &failure)?; - match crate::reasoning_context::commit_mind_mutation_with_derived_companions( + match crate::reasoning_context::commit_mind_mutation( store_path, decision_context_id, "Continuity.reorientation_failure", strong_reads, vec![write], - Vec::new(), &terminal.completed_at, )? { crate::EpiphanyMindCommitOutcome::Committed(receipt) => Ok(receipt), @@ -621,13 +620,6 @@ pub fn accept_reorientation_result( next_safe_move: result.next_safe_move.clone(), decided_at: accepted_at.into(), }; - let finding = crate::interpret_runtime_reorient_worker_result(&result); - let recovery = crate::continuity_recovery_receipt_from_reorient_finding( - format!("continuity-recovery-{}", request.request_id), - crate::EPIPHANY_REORIENT_LAUNCH_BINDING_ID.into(), - &finding, - accepted_at.into(), - ); let mut strong_reads = exact_source_envelopes(&cache, &request.source_documents)?; for (document_type, document_key) in [ ( @@ -652,14 +644,12 @@ pub fn accept_reorientation_result( } let write = crate::mind_documents::prepare_mind_document(&cache, &decision.decision_id, &decision)?; - let companion = cache.prepare_entry(&recovery.receipt_id, &recovery)?.0; - match crate::reasoning_context::commit_mind_mutation_with_derived_companions( + match crate::reasoning_context::commit_mind_mutation( store_path, &result.decision_context_id, "Continuity.reorientation", strong_reads, vec![write], - vec![companion], accepted_at, )? { crate::EpiphanyMindCommitOutcome::Committed(receipt) => Ok(receipt), diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index 77da712f..1048320b 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -5,7 +5,6 @@ use crate::agent_launch::{ EPIPHANY_MIND_OWNER_ROLE, EPIPHANY_MIND_ROLE_BINDING_ID, EPIPHANY_MODELING_OWNER_ROLE, EPIPHANY_MODELING_ROLE_BINDING_ID, }; -use crate::continuity_gateway::ContinuityRecoveryReceipt; use crate::eyes_gateway::EyesEvidencePacket; use crate::eyes_gateway::EyesSourceLookupReceipt; use crate::hands_gateway::*; @@ -86,7 +85,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v24"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v25"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; pub const RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.model_execution_binding.v0"; @@ -860,7 +859,6 @@ fn runtime_spine_schema_cache() -> Result { cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; - cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; From 115f8751679d48bd08448b2644488142c16273b6 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 05:22:10 +0200 Subject: [PATCH 034/340] docs: Record continuity recovery mirror cut --- notes/epiphany-current-algorithmic-map.md | 22 +++++++++++++------ notes/epiphany-fork-implementation-plan.md | 4 ++++ notes/fresh-workspace-handoff.md | 24 +++++++++++++++------ state/ledgers.msgpack | Bin 703048 -> 703585 bytes state/map.yaml | 9 ++++---- 5 files changed, 42 insertions(+), 17 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 133db517..9406f8d8 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `a6f73fc4` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for Persona quarantine-mirror deletion; +Latest committed implementation cut: `fed4b857` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for duplicate continuity-receipt deletion; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -350,6 +350,13 @@ crossing evidence and mention digest; keyed mentions retain `quarantined` status plus terminal-receipt identity. No second queue or pressure projection reconstructs the same decision. +Reorientation likewise has one decision record. Exact `fed4b857` deletes the +entire continuity-gateway module and its unread recovery receipt, which copied +the persisted runtime result into a companion beside the typed Mind decision. +The sealed basis/context, exact result, strong reads, Mind decision or failure, +and commit receipt own replay and audit. Reorientation now uses the ordinary +Mind commit primitive. Runtime epoch v25 refuses v24 stores. + Bifrost owns its private feedback-signing identity. Exact `94098223` deletes Epiphany's host-identity executable and the private signer, persisted identity, enrollment, platform protection, and anchor-export implementation behind it. @@ -417,11 +424,12 @@ producer or consumer. Exact tool definitions sealed into model requests plus runtime execution bindings and governed invocation receipts own the actual path. The catalog retains tool intent/receipt and drops to 42 schemas. -Continuity publishes only the document it owns. Exact `ca2d2cf2` removes packet, -compaction-checkpoint, stale-turn-repair, and refusal contract rows that had no -typed documents or runtime path. Reorientation still emits the exact persisted -`ContinuityRecoveryReceipt`; compaction and handoff remain native state -physiology rather than advertised CultNet fiction. +Continuity owns no second reorientation archive. Exact `ca2d2cf2` removes +packet, compaction-checkpoint, stale-turn-repair, and refusal contract rows that +had no typed documents or runtime path. Exact `fed4b857` later removes the +unread recovery-receipt copy. The typed reorientation Mind decision/failure, +sealed context, exact result, and commit receipt own the live path; compaction +and handoff remain native state physiology. Soul likewise publishes only its real result. Exact `f8974d52` removes generic verification-request, invariant-check, regression, review, and refusal contract diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index dacd3116..e547478a 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -333,6 +333,10 @@ Cut in this order: Exact `a6f73fc4` removes the write-only Persona quarantine-pressure document. The terminal turn receipt and receipt-bound quarantined mentions remain the single blocked-consequence authority. + Exact `fed4b857` removes the unread Continuity recovery-receipt companion and + its entire module. Exact reorientation result, typed Mind decision/failure, + sealed context, and commit receipt remain the sole recovery audit path. + Runtime writable epoch is v25. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 55191694..d4f6a6f5 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `a6f73fc4` -Current worktree: documentation/evidence for Persona quarantine-mirror deletion; +Latest committed implementation cut: `fed4b857` +Current worktree: documentation/evidence for duplicate continuity-receipt deletion; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `a6f73fc4` is the current +production symlink body and is inactive. Exact `fed4b857` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,17 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `fed4b857` deletes the final duplicate Continuity recovery record. An +accepted reorientation already persists its exact runtime result, sealed +reasoning basis/context, typed Mind decision, strong-read admission, and Mind +commit receipt. `ContinuityRecoveryReceipt` copied the same job/result, mode, +checkpoint validity, summary, next move, files, and timestamp, and no reader +consumed it. The entire continuity-gateway module, runtime registration, and +derived-companion write are gone; success and failure use the ordinary exact +Mind commit primitive. Runtime writable epoch advances to v25. Core compiles; +decision-auditable reorientation 1/1, old-epoch refusal, and coordinator 5/5 +pass. The cut removes 80 net maintained lines without touching Atlas. + Exact `a6f73fc4` deletes the write-only Persona quarantine mirror. A blocked turn already atomically writes one terminal receipt containing exact crossing status/reason and mention digest, then marks each mention `quarantined` and @@ -172,7 +183,7 @@ the live resident fields. Runtime writable state advances to v20. JSON schemas parse; core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass. The cut removes 59 maintained lines and leaves `runtime_spine.rs` at 9,807 lines. -Continue the registered-type and test-liability audit after exact `a6f73fc4`. Model Atlas remains protected +Continue the registered-type and test-liability audit after exact `fed4b857`. Model Atlas remains protected for its first live inter-swarm collaboration trial. Exact `3ed1d564` deletes the public @@ -1197,8 +1208,9 @@ tool intent/receipt. Four affected packages compile; the tool runtime passes Exact `ca2d2cf2` deletes four prose-only Continuity contract families: packet, compaction checkpoint, stale-turn repair, and refusal. They had constants and runtime mutation-table rows but no typed documents, schemas, stores, writers, -readers, or tests. `ContinuityRecoveryReceipt` remains real: accepted -reorientation constructs, persists, and exposes it. Core/release checks pass +readers, or tests. At that cut, accepted reorientation still wrote a separate +`ContinuityRecoveryReceipt`; exact `fed4b857` later removes that unread copy in +favor of the typed Mind decision and commit receipt. Core/release checks pass and the decision-auditable reorientation test passes 1/1. Exact `f8974d52` deletes five prose-only Soul families: generic verification diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 464461a3a8cf73ddaa890ae7c1bba4eadcae3dd6..033141df374c3b527173df66961970f8f0db3c23 100644 GIT binary patch delta 392 zcmXAlJ4*vW6ouXR%xEEqk0|N|v61z`8u0}-lFs}AEo9ueNd|Xk;_PfRg@su73&M2T zSq33W3VX55KhR3-EG#U&(ce@TxXL_kNF^N0;sGs2(cDvgs$_*Ch|UTCCFlA4aIV(<0@BDD>ygO;tKpno0N<( zg25z>tnc)Fc5;0+)XL(8^}*JwD4;0+f)f3?JAlp6FQu|}&hS-D8u)onJnO>@kp z+9lOSQYUV^8`Fe3+X{je3BY-T(URzoe=Sb=>_$AlFOPknc^ l#TG|=(2-cistzmQ?k-u*9W)smD9Ccf*4=TF&AT`H+%H0UiY@>E delta 73 zcmaF(L+ivBtql^4+=k{>#s*Qx7`S$-ZdPV2WMuSdp32ldm5C9EK{PWEvj8zG5VHX> RI}mdKG3WNFOkA6{0|1FE7kB^w diff --git a/state/map.yaml b/state/map.yaml index cd68067e..44a3a199 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -52,7 +52,7 @@ current_status: summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Runtime status aggregates, mutable adapter-status shadows, uninhabited generic planning mirrors, global revisions, generic role/event authority, duplicate prompt-state cargo, duplicate family launch bindings, and Epiphany-owned Rider/Unity organs are absent. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. Completed model-session tombstones retain only resurrection fences and an exact deletion digest. Archived worker attempts retain the exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records needed for audit. Runtime sessions and jobs own lifecycle identity/status only; terminal job results own summaries and artifacts. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v9/v24; runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, and coordinator-run-receipt schema/type is v1. Old writable stores refuse with no migrator or dual reader. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Runtime status aggregates, mutable adapter-status shadows, uninhabited generic planning mirrors, duplicate Continuity recovery copies, global revisions, generic role/event authority, duplicate prompt-state cargo, duplicate family launch bindings, and Epiphany-owned Rider/Unity organs are absent. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. Completed model-session tombstones retain only resurrection fences and an exact deletion digest. Archived worker attempts retain the exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records needed for audit. Runtime sessions and jobs own lifecycle identity/status only; terminal job results own summaries and artifacts. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v9/v25; runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, and coordinator-run-receipt schema/type is v1. Old writable stores refuse with no migrator or dual reader. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. atlas_authoring_cut: Exact ce306e23 preserves the complete inter-swarm Atlas vertical slice while deleting its duplicate local offer/claim authoring authority. Ordinary Modeling through RepoModel operations is the sole owner of provider offers and consumer claims; Atlas retains signed publication, trust, transport, deterministic projection, Soul verification, Self impact admission, Resident Self wake, brakes, and Eve lowering. Two direct write-intent types, their runtime commit APIs and registry entries, 518 planner lines, and two tests that animated only that duplicate path are gone. The runtime proof now creates offers/claims through RepoModel before proving exact verification admission and Body-drift refusal. The cut removes 593 net source lines; the three-repository direct/transitive Modeling proof passes. These are component proofs only: no live inter-swarm collaboration has yet run, so the Atlas vertical slice remains protected until Gate 1 exercises it end to end. Runtime writable epoch is v14. autonomous_proposal_binding_cut: Exact 5d507bfd reduces Self's autonomous Imagination-to-Modeling origin binding from a 22-field duplicate archive to six causal join fields: schema, exact direction-result identity, selected option ordinal, worker job identity, and exact worker-result/launch digests. Proposal identity and payload, direction request, runtime/thread, typed model projection, Body/domain binding, selected option content, and canonical Modeling-request identity are checked directly from their owning immutable documents. The atomic proposal plus binding plus Modeling-request commit and its broad keyed-lifecycle proof remain; 60 net source lines are gone. Runtime writable epoch is v15. hands_verification_derivation_cut: Exact 6ccc7dd2 deletes the 20-field transient Hands receipt-chain summary. The Hands commit owner now derives the exact Verification request directly from the persisted patch, command, and commit receipts plus the frontier authority; no copied schema, job, grant, command-output, Git, path, summary, or timestamp fields mediate that handoff. Atomic Hands-to-Verification admission and the concurrent Persona/Hands lifecycle proof remain. The cut removes 43 net source lines without adding state, schema, or tests. @@ -72,6 +72,7 @@ current_status: adapter_status_authority_cut: Exact 0091e0e1 deletes the generic model-adapter and OpenAI-adapter status families. Every model pass wrote both mutable documents, but no query, router, admission owner, audit path, or display consumed either. Their types, per-pass writers, status/auth-mode constructors, adapter-ID constants, one self-affirming OpenRouter status test, runtime registrations, two published schemas, and catalog entries are gone. Native/provider requests retain provider and model identity; live transport construction retains credential and attachment proof. Runtime writable epoch advances to v23. Adapter libraries compile; provider spine 14/14, old-epoch refusal, and model runtime 23/23 pass. The cut removes 267 net maintained lines without touching Atlas. The local published catalog contains twenty live or portable contracts. generic_planning_mirror_cut: Exact 2e3489c4 deletes the empty generic planning mirror. Four registered Mind document families—planning captures, backlog items, roadmap streams, and objective drafts—had no constructor, writer, admission owner, or consumer, yet were read and injected empty into every reasoning projection. Their document types, registry/validation/projection branches, reasoning field, and 256-line issue-tracker-shaped state-model vocabulary are gone. Real planning remains in frontier planning requests, candidates, Mind review, adopted decisions, checkpoints, Hands receipts, and exact admission paths. Mind/runtime writable epochs advance to v9/v24. State model and core compile; sealed reasoning 8/8, old-epoch refusal, model runtime 23/23, and coordinator 5/5 pass. The cut removes 350 net maintained lines without touching Atlas. persona_quarantine_mirror_cut: Exact a6f73fc4 deletes the write-only Persona quarantine mirror. A blocked turn already atomically writes one terminal receipt containing exact crossing status/reason and mention digest, then marks each mention quarantined and binds it to that receipt. The duplicate blocked-pressure payload, wrapper document, construction branch, type constant, registry entry, and decoder are gone; nothing read them after the earlier duplicate projection was deleted. Core compiles, Persona consequence/retention 5/5 pass, and the feature-gated Persona service compiles. The cut is 63 pure deletions without touching Atlas. + continuity_recovery_mirror_cut: Exact fed4b857 deletes the final duplicate Continuity recovery record. Accepted reorientation already persists its exact runtime result, sealed reasoning basis/context, typed Mind decision, strong-read admission, and Mind commit receipt. ContinuityRecoveryReceipt copied the same job/result, mode, checkpoint validity, summary, next move, files, and timestamp, and no reader consumed it. The entire continuity-gateway module, runtime registration, and derived-companion write are gone; success and failure use the ordinary exact Mind commit primitive. Runtime writable epoch advances to v25. Core compiles; decision-auditable reorientation 1/1, old-epoch refusal, and coordinator 5/5 pass. The cut removes 80 net maintained lines without touching Atlas. supervisor_subtraction: Exact 856648de completes the supervisor deletion. Epiphany owns no local generic daemon supervisor, semantic projector service, workspace-coverage projector, Windows Task Scheduler integration, or service-policy/lifecycle/heartbeat/recovery mirror. Idunn on Yggdrasil owns source-triggered compilation, testing, packaging, deployment, signed health, and daemon survival. The canonical Epiphany brake gates Epiphany cognition and consequence authority, not Idunn startup or unrelated lifecycle. launch_dependency_cut: Exact 2aeab7a9 deletes the generic organ dependency matrix, generic receipt catalogue/proof profiles, persisted worker-launch cargo, Persona prompt injection, evaluator, and three self-certifying tests: 700 net lines. Family admission owners derive exact dependencies from typed state. Worker-launch schema v2 and Persona projector prompt v1 refuse the old writable shape. Core 378/378, OpenRouter runtime 27/27, packaged runtime 13/13, and Persona re-entry 1/1 pass. operator_surface_subtraction: Exact ef92e853 deletes the callerless view-lens registry, legacy acceptance-bundle builders, test-only raw-JSON result interpreters, and six tests: 797 net lines. Exact a292979d and 77e817c1 delete the duplicate CRRC recommendation algorithm, its unused input model, and four tests: 206 lines. Exact 3b94bf6e and 59c5e3a6 delete the nested duplicate status view, false auxiliary mode, and ignored status arguments. Exact 7c9b0cf3 deletes the fixed synthetic job table, role-board job cargo/mappers, and its test: 338 net lines. Exact 2ce91461 deletes the scene/planning Mind reconstructions, duplicate self-policy crate, unused prompt templates, four counterfeit schemas, and ten producer/source-text tests: 1,723 net lines. Exact 78836f3b deletes eight unconsumed status tableaux, the pressure calculator production only called without telemetry, its unreachable compaction action, one counterfeit schema, and six tests: 518 net lines. Exact f10f7fb3 deletes the final twelve epiphany.surface.* schemas and ten catalog entries after every one proved producerless and consumerless: 692 pure deletions. Exact ab3cacfb deletes thirty-one more producerless contracts, the false runtime-session mutation mouth, every Epiphany-owned Rider/Unity command schema, a callerless prompt-context module, its test-only specialist prompt system, and four self-affirming tests: 3,514 net lines. Exact 16d85b1b deletes six duplicate JSON-schema builder tests and two OpenAI-runtime self-source searches: 209 pure test-line deletions. Exact 06f93f70 deletes the test-only inverse OpenAI-to-native request mapper and makes two retained tests follow canonical native-to-provider derivation: sixty net lines. Exact 0091e0e1 later removes two unread adapter-status schemas and catalog entries; the local catalog now has twenty live or portable contracts. Brokkr owns Unity capabilities through CultMesh/Eve; a future Rider daemon owns Rider. Status retains Mind identity, exact current work, one action/reason decision, readable role lanes, and operator thought sealing. Core checks cleanly; retained provider and focused request-flow tests pass. @@ -88,7 +89,7 @@ current_status: hands_pr_authority_cut: Exact 11d99de1 deletes the producerless HandsPrReceipt type, registration, dead test-only writer, read path, exports, relinquishment branch, and two contract advertisements. Hands owns local patch, command, and commit consequences; exact remote publication evidence belongs to the provider/Bifrost crossing. Core and release-bundle checks pass, and the rebuilt 43-entry schema catalog contains no deleted PR family. local_verse_contract_cut: Exact a4af4734 deletes six organ-specific contract DTO/factories, the callerless LocalVerseContext query/seed bundle, fixed Verse/room policy prose, the mind-contract self-test, and persisted cluster topology. The topology writer had no caller; supervision accepted any nonempty fixed-key subset without authenticating Body domain, completeness, or runtime binding. That false bootstrap gate, loader, exports, and its diagnostic test are gone. Exact 03140a47 later deletes the remaining standalone runtime contract mirror; live providers own their CultMesh/CultNet catalogs. Exact runtime/store identity, packaged release, brake, service policy, process identity, and signed health remain supervisor prerequisites. The cut removes 1,005 net source lines; core/release checks, CultMesh 12/12, and supervisor 4/4 pass. tool_capability_cut: Exact beb9fd32 deletes the producerless EpiphanyToolCapability DTO/constructor, runtime registration and mutation-contract row, standalone schema/index entry, and MCP smoke-banner claim. No writer, reader, constructor call, admission path, or test existed. Exact model-request tool definitions, RuntimeToolExecutionBinding, invocation intents, and governed receipts remain owners. The canonical catalog drops from 43 to 42 schemas; four affected packages compile and the tool runtime passes 14/14 active tests with one live-source test ignored. - continuity_contract_cut: Exact ca2d2cf2 deletes four prose-only Continuity mutation contracts and their constants: packet, compaction checkpoint, stale-turn repair, and refusal. None had a typed document, schema, store, writer, reader, or test. ContinuityRecoveryReceipt remains constructed and persisted by accepted reorientation. Core/release checks and decision-auditable reorientation 1/1 pass. + continuity_contract_cut: Exact ca2d2cf2 deletes four prose-only Continuity mutation contracts and their constants: packet, compaction checkpoint, stale-turn repair, and refusal. None had a typed document, schema, store, writer, reader, or test. Exact fed4b857 later deletes the final unread ContinuityRecoveryReceipt copy; typed reorientation Mind decisions/failures and commit receipts own recovery audit. Core/release checks and decision-auditable reorientation 1/1 pass. soul_contract_cut: Exact f8974d52 deletes five prose-only Soul mutation contracts/constants: generic verification request, invariant check, regression receipt, review receipt, and verification refusal. None had a typed document, schema, store, writer, reader, or test. The keyed RepoFrontierVerificationRequest and persisted SoulVerdictReceipt remain the actual request/result path. Core/release checks and focused verification 3/3 pass. eyes_contract_cut: Exact 201fa192 deletes three prose-only Eyes mutation contracts/constants/exports: generic evidence request, evidence review, and evidence refusal. None had a typed document, schema, store, writer, reader, or test. Authenticated EyesSourceLookupReceipt rows and the exact research decision's persisted EyesEvidencePacket remain real. Core/release checks and focused Research 2/2 pass. persona_social_cut: Pending mentions, immutable requests, terminal receipts, quarantine records, retention heads, and retention plans are separate keyed CultCache documents. Persona derives its own deterministic work identity, reserves and terminalizes through exact batch CAS, cites the exact request envelope as pass-input provenance, and retries failed mentions without a timestamp or global revision. No scheduler can launch, block, retain, or provide pass provenance for Persona work. Exact 3dda58a5 makes Resident Self the sole authenticated Bifrost-feedback polling/import owner and deletes the standalone ingress CLI, its static projections, its old Starfire snapshot replacement seam, and two command-only tests: 426 net deletions. Seven retained tests prove signed admission, target/provider substitution refusal, disclosure gating, recovery, and read-only provider-store import. @@ -134,9 +135,9 @@ current_status: yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,730 lines, 53 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, and coordinator artifact/status cargo are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the registered-type and test-liability audit after exact a6f73fc4. Trace each remaining registered document and verifier to a producer, reader, and consequential invariant; delete complete dead authority slices, write-only mirrors, unread projections, and self-affirming tests. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, exact Persona terminal consequences, exact provider requests/receipts, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + next_action: Resume the registered-type and test-liability audit after exact fed4b857. Trace each remaining registered document and verifier to a producer, reader, and consequential invariant; delete complete dead authority slices, duplicate decision companions, write-only mirrors, unread projections, and self-affirming tests. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, exact Persona terminal consequences, exact provider requests/receipts, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Session/job documents carry only lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. The sole standalone diagnostic session creator refuses identity collisions; there is no lenient ensure/rebase mouth. It exposes no aggregate status head, mutable adapter-status shadow, uninhabited generic planning mirror, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, public typed-fulfillment machinery, or producerless Imagination review contract. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v9/v24, runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,725 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Session/job documents carry only lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. The sole standalone diagnostic session creator refuses identity collisions; there is no lenient ensure/rebase mouth. It exposes no aggregate status head, mutable adapter-status shadow, uninhabited generic planning mirror, duplicate Continuity recovery copy, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, public typed-fulfillment machinery, or producerless Imagination review contract. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v9/v25, runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,723 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. From a602fbdc2e2eb988849b3a229f46cc25dd02e983 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 05:36:11 +0200 Subject: [PATCH 035/340] Delete dormant aggregate state vocabulary --- epiphany-core/src/hands_gateway.rs | 2 - epiphany-core/src/reasoning_context.rs | 4 - epiphany-core/src/soul_gateway.rs | 3 - epiphany-openai-runtime/src/lib.rs | 16 -- epiphany-state-model/src/lib.rs | 266 ------------------------- 5 files changed, 291 deletions(-) diff --git a/epiphany-core/src/hands_gateway.rs b/epiphany-core/src/hands_gateway.rs index 0e0a6820..3e2866ea 100644 --- a/epiphany-core/src/hands_gateway.rs +++ b/epiphany-core/src/hands_gateway.rs @@ -1,7 +1,5 @@ use cultcache_rs::DatabaseEntry; -pub const HANDS_ACTION_INTENT_TYPE: &str = "epiphany.hands.action_intent"; -pub const HANDS_ACTION_REVIEW_TYPE: &str = "epiphany.hands.action_review"; pub const HANDS_COMMAND_RECEIPT_TYPE: &str = "epiphany.hands.command_receipt"; pub const HANDS_PATCH_RECEIPT_TYPE: &str = "epiphany.hands.patch_receipt"; pub const HANDS_COMMIT_RECEIPT_TYPE: &str = "epiphany.hands.commit_receipt"; diff --git a/epiphany-core/src/reasoning_context.rs b/epiphany-core/src/reasoning_context.rs index 7a638464..597001ba 100644 --- a/epiphany-core/src/reasoning_context.rs +++ b/epiphany-core/src/reasoning_context.rs @@ -21,10 +21,6 @@ pub const REASONING_BASIS_SCHEMA_VERSION: &str = "epiphany.reasoning_basis.v1"; pub const DECISION_CONTEXT_SCHEMA_VERSION: &str = "epiphany.decision_context.v2"; pub const MODEL_PASS_FAILURE_SCHEMA_VERSION: &str = "epiphany.model_pass_failure.v1"; pub const MIND_COMMIT_RECEIPT_SCHEMA_VERSION: &str = "epiphany.mind_commit_receipt.v1"; -pub const REASONING_BASIS_TYPE: &str = "epiphany.reasoning_basis.v1"; -pub const DECISION_CONTEXT_TYPE: &str = "epiphany.decision_context.v2"; -pub const MODEL_PASS_FAILURE_TYPE: &str = "epiphany.model_pass_failure.v1"; -pub const MIND_COMMIT_RECEIPT_TYPE: &str = "epiphany.mind_commit_receipt.v1"; pub const DECISION_AUDIT_PROJECTION_SCHEMA_VERSION: &str = "epiphany.decision_audit_projection.v1"; pub const DECISION_AUDIT_INDEX_SCHEMA_VERSION: &str = "epiphany.decision_audit_index.v1"; pub const WORKER_REASONING_PROJECTION_POLICY: &str = diff --git a/epiphany-core/src/soul_gateway.rs b/epiphany-core/src/soul_gateway.rs index b14fd0a2..0af3cce3 100644 --- a/epiphany-core/src/soul_gateway.rs +++ b/epiphany-core/src/soul_gateway.rs @@ -1,8 +1,5 @@ use cultcache_rs::DatabaseEntry; -pub const SOUL_VERDICT_RECEIPT_TYPE: &str = "epiphany.soul.verdict_receipt"; -pub const REPO_FRONTIER_VERIFICATION_REQUEST_TYPE: &str = - "epiphany.soul.repo_frontier_verification_request"; pub const REPO_FRONTIER_VERIFICATION_REQUEST_SCHEMA_VERSION: &str = "epiphany.soul.repo_frontier_verification_request.v2"; pub const REPO_FRONTIER_VERIFICATION_REQUEST_CONTRACT: &str = diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index e878e09e..8a22f6e4 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -254,12 +254,6 @@ pub async fn run_tool_followup_model_turn( run_model_turn(provider, options, request).await } -pub async fn run_worker_launch( - options: EpiphanyWorkerRuntimeOptions, -) -> Result { - run_worker_launch_observed(options, |_| {}).await -} - pub async fn run_worker_launch_observed( options: EpiphanyWorkerRuntimeOptions, on_model_request: F, @@ -858,16 +852,6 @@ pub fn ensure_openai_runtime_ready(options: &EpiphanyOpenAiRuntimeOptions) -> Re Ok(()) } -pub fn store_model_request( - store_path: impl AsRef, - request: &EpiphanyModelRequest, -) -> Result<()> { - let mut cache = runtime_spine_cache(store_path)?; - cache.pull_all_backing_stores()?; - cache.put(model_request_key(&request.request_id), request)?; - Ok(()) -} - pub fn assistant_text_from_openai_events( store_path: impl AsRef, request_id: &str, diff --git a/epiphany-state-model/src/lib.rs b/epiphany-state-model/src/lib.rs index 5ad4f8af..4f3be10c 100644 --- a/epiphany-state-model/src/lib.rs +++ b/epiphany-state-model/src/lib.rs @@ -5,44 +5,6 @@ use serde::Deserialize; use serde::Serialize; use ts_rs::TS; -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyAcceptanceReceipt { - pub id: String, - pub result_id: String, - pub job_id: String, - pub binding_id: String, - pub surface: String, - pub role_id: String, - pub status: String, - pub accepted_at: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub accepted_observation_id: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub accepted_evidence_id: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub summary: Option, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyRuntimeLink { - pub id: String, - pub binding_id: String, - pub surface: String, - pub role_id: String, - pub authority_scope: String, - pub runtime_job_id: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub runtime_result_id: Option, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub linked_subgoal_ids: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub linked_graph_node_ids: Vec, -} - #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] pub struct EpiphanySubgoal { pub id: String, @@ -63,86 +25,6 @@ pub struct EpiphanyInvariant { pub rationale: Option, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyGraphs { - #[serde(default, skip_serializing_if = "EpiphanyGraph::is_empty")] - pub architecture: EpiphanyGraph, - #[serde(default, skip_serializing_if = "EpiphanyGraph::is_empty")] - pub dataflow: EpiphanyGraph, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub links: Vec, -} - -impl EpiphanyGraphs { - pub fn is_empty(&self) -> bool { - self.architecture.is_empty() && self.dataflow.is_empty() && self.links.is_empty() - } -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyGraph { - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub nodes: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub edges: Vec, -} - -impl EpiphanyGraph { - pub fn is_empty(&self) -> bool { - self.nodes.is_empty() && self.edges.is_empty() - } -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyGraphNode { - pub id: String, - pub title: String, - pub purpose: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub mechanism: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub metaphor: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub status: Option, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub code_refs: Vec, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyGraphEdge { - pub source_id: String, - pub target_id: String, - pub kind: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub id: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub label: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub mechanism: Option, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub code_refs: Vec, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyGraphLink { - pub dataflow_node_id: String, - pub architecture_node_id: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub relationship: Option, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub code_refs: Vec, -} - #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] pub struct EpiphanyCodeRef { pub path: PathBuf, @@ -160,112 +42,6 @@ pub struct EpiphanyCodeRef { pub note: Option, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyGraphFrontier { - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub active_node_ids: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub active_edge_ids: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub open_question_ids: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub open_gap_ids: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub dirty_paths: Vec, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyGraphCheckpoint { - pub checkpoint_id: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub summary: Option, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub frontier_node_ids: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub open_question_ids: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub open_gap_ids: Vec, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyRetrievalState { - pub workspace_root: PathBuf, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub index_revision: Option, - #[serde(default)] - pub status: EpiphanyRetrievalStatus, - #[serde(default, skip_serializing_if = "std::ops::Not::not")] - #[ts(type = "boolean")] - pub semantic_available: bool, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "bigint | null")] - pub last_indexed_at_unix_seconds: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "number | null")] - pub indexed_file_count: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "number | null")] - pub indexed_chunk_count: Option, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub shards: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub dirty_paths: Vec, -} - -#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -#[serde(rename_all = "snake_case")] -#[ts(rename_all = "snake_case")] -pub enum EpiphanyRetrievalStatus { - #[default] - Unavailable, - Ready, - Stale, - Indexing, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyRetrievalShardSummary { - pub shard_id: String, - pub path_prefix: PathBuf, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "number | null")] - pub indexed_file_count: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "number | null")] - pub indexed_chunk_count: Option, - #[serde(default)] - pub status: EpiphanyRetrievalStatus, - #[serde(default, skip_serializing_if = "std::ops::Not::not")] - #[ts(type = "boolean")] - pub exact_available: bool, - #[serde(default, skip_serializing_if = "std::ops::Not::not")] - #[ts(type = "boolean")] - pub semantic_available: bool, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyScratchPad { - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub summary: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub hypothesis: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub next_probe: Option, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub notes: Vec, -} - #[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, JsonSchema, TS, Default)] #[serde(rename_all = "snake_case")] #[ts(rename_all = "snake_case")] @@ -301,36 +77,6 @@ pub struct EpiphanyInvestigationCheckpoint { pub evidence_ids: Vec, } -#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, JsonSchema, TS)] -#[serde(rename_all = "snake_case")] -#[ts(rename_all = "snake_case")] -pub enum EpiphanyJobKind { - Indexing, - Remap, - Verification, - Specialist, -} - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS)] -pub struct EpiphanyJobBinding { - pub id: String, - pub kind: EpiphanyJobKind, - pub scope: String, - pub owner_role: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub authority_scope: Option, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub linked_subgoal_ids: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] - pub linked_graph_node_ids: Vec, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub blocking_reason: Option, -} - #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] pub struct EpiphanyObservation { pub id: String, @@ -353,18 +99,6 @@ pub struct EpiphanyEvidenceRecord { pub code_refs: Vec, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] -pub struct EpiphanyChurnState { - pub understanding_status: String, - pub diff_pressure: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] - pub warning: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "number | null")] - pub unexplained_writes: Option, -} - #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] pub struct EpiphanyModeState { pub name: String, From 84b4012aa5a13b74bc2f1ea3ae099253dd6df5bb Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 05:38:37 +0200 Subject: [PATCH 036/340] docs: Record dormant state vocabulary cut --- notes/epiphany-current-algorithmic-map.md | 15 ++++++++++++-- notes/epiphany-fork-implementation-plan.md | 5 +++++ notes/fresh-workspace-handoff.md | 22 +++++++++++++++++---- state/ledgers.msgpack | Bin 703585 -> 704283 bytes state/map.yaml | 5 +++-- 5 files changed, 39 insertions(+), 8 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 9406f8d8..427986ec 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `fed4b857` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for duplicate continuity-receipt deletion; +Latest committed implementation cut: `a602fbdc` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for dormant state-vocabulary deletion; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -25,6 +25,17 @@ The fixed three-Verse trust policy and public-room directory are also direct local Verse projections; they are not written into CultCache as counterfeit mutable state. +The shared state-model vocabulary is inhabited, not aspirational. Exact +`a602fbdc` deletes fifteen DTO types with no external consumer: aggregate +acceptance/runtime links, a second graph/frontier/checkpoint model, global +retrieval and scratch state, generic job bindings, and churn telemetry. Keyed +Mind/runtime receipts own decisions and lifecycle identity; keyed RepoModel +documents own repository structure; scratch and retrieval inputs belong to +sealed reasoning passes. Two callerless OpenAI-runtime mouths and eight +definition-only type constants are also gone. The cut is 291 pure deletions; +the state-model crate is 398 lines. It does not touch the still-unrun Atlas +inter-swarm path. + CultMesh contains no JSON-derived operator snapshot, coordinator receipt, Hands gate, role-review event, unauthenticated Odin/Eve provider row, or daemon tool directory. Native runtime and keyed Mind receipts remain the owners; old diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index e547478a..ef6ed161 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -337,6 +337,11 @@ Cut in this order: its entire module. Exact reorientation result, typed Mind decision/failure, sealed context, and commit receipt remain the sole recovery audit path. Runtime writable epoch is v25. + Exact `a602fbdc` removes fifteen unconsumed state-model DTO types, two + callerless OpenAI-runtime mouths, and eight definition-only type constants. + Exact keyed Mind/runtime receipts, RepoModel documents, pass-local reasoning, + and the release-owned observed worker route remain. No schema epoch changes + because none of the deleted vocabulary was registered or persisted. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index d4f6a6f5..b85bd87f 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `fed4b857` -Current worktree: documentation/evidence for duplicate continuity-receipt deletion; +Latest committed implementation cut: `a602fbdc` +Current worktree: documentation/evidence for dormant state-vocabulary deletion; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `fed4b857` is the current +production symlink body and is inactive. Exact `a602fbdc` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,20 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `a602fbdc` deletes fifteen public state-model DTO types with no external +consumer, two callerless OpenAI-runtime mouths, and eight definition-only type +constants. Acceptance/runtime-link aggregates, duplicate graph and frontier +DTOs, global retrieval and scratch state, generic job bindings, and churn state +had no constructor, reader, writer, registry entry, test, or downstream +consumer. Their live concepts already belong to keyed Mind/runtime receipts, +keyed RepoModel documents, sealed reasoning passes, and exact runtime jobs. The +standalone worker wrapper and direct model-request writer likewise had no +caller; the release-owned observed worker path remains. State-model, core, +OpenAI-runtime, and the packaged model-runtime entrypoint compile through the +shared target. The cut removes 291 maintained lines, changes no writable +schema, and leaves Atlas untouched. Live inter-swarm collaboration remains +unproven. + Exact `fed4b857` deletes the final duplicate Continuity recovery record. An accepted reorientation already persists its exact runtime result, sealed reasoning basis/context, typed Mind decision, strong-read admission, and Mind @@ -183,7 +197,7 @@ the live resident fields. Runtime writable state advances to v20. JSON schemas parse; core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass. The cut removes 59 maintained lines and leaves `runtime_spine.rs` at 9,807 lines. -Continue the registered-type and test-liability audit after exact `fed4b857`. Model Atlas remains protected +Continue the registered-type and test-liability audit after exact `a602fbdc`. Model Atlas remains protected for its first live inter-swarm collaboration trial. Exact `3ed1d564` deletes the public diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 033141df374c3b527173df66961970f8f0db3c23..a3ea4307bba5201633be9dad40a94d213174d68f 100644 GIT binary patch delta 668 zcmZ9JziSjh6vy55M|9IDSXiWZV0YZ+Odlu(bKn!_}wCoMBRB=bVYPkbWOA-x-PnLx`>mX-`d|N$<26Y*nT*SHsgTRV0t-QR$!xsm@vs!+qhD&fB@R*UDvY@>SO@-74 zo_f&AS|p1hz(I{}^f;x)v8fO$-*6fFpj-}Uih0SBI5y6(@h>y}TtV=0v=%U{hUx5zEXn5r_$c)R4D?-<_^{zmIT0BtNU=JC>z7%xSOfpWPeu6X1 zm#=@RB~zoRSs}ANZ cX+_wXdkNfwB{PiJssN_#eNG1L>6hfzA4cc#NdN!< delta 73 zcmbRJPwU|itql^4+(t%L2F6jx7`S%ZZB}M1WMuShp32ldm5C9EK{PWEvj8zG5VHX> RI}mdKG3WNFOk8Jn0sw>27l;4= diff --git a/state/map.yaml b/state/map.yaml index 44a3a199..5a6bcd5a 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -73,6 +73,7 @@ current_status: generic_planning_mirror_cut: Exact 2e3489c4 deletes the empty generic planning mirror. Four registered Mind document families—planning captures, backlog items, roadmap streams, and objective drafts—had no constructor, writer, admission owner, or consumer, yet were read and injected empty into every reasoning projection. Their document types, registry/validation/projection branches, reasoning field, and 256-line issue-tracker-shaped state-model vocabulary are gone. Real planning remains in frontier planning requests, candidates, Mind review, adopted decisions, checkpoints, Hands receipts, and exact admission paths. Mind/runtime writable epochs advance to v9/v24. State model and core compile; sealed reasoning 8/8, old-epoch refusal, model runtime 23/23, and coordinator 5/5 pass. The cut removes 350 net maintained lines without touching Atlas. persona_quarantine_mirror_cut: Exact a6f73fc4 deletes the write-only Persona quarantine mirror. A blocked turn already atomically writes one terminal receipt containing exact crossing status/reason and mention digest, then marks each mention quarantined and binds it to that receipt. The duplicate blocked-pressure payload, wrapper document, construction branch, type constant, registry entry, and decoder are gone; nothing read them after the earlier duplicate projection was deleted. Core compiles, Persona consequence/retention 5/5 pass, and the feature-gated Persona service compiles. The cut is 63 pure deletions without touching Atlas. continuity_recovery_mirror_cut: Exact fed4b857 deletes the final duplicate Continuity recovery record. Accepted reorientation already persists its exact runtime result, sealed reasoning basis/context, typed Mind decision, strong-read admission, and Mind commit receipt. ContinuityRecoveryReceipt copied the same job/result, mode, checkpoint validity, summary, next move, files, and timestamp, and no reader consumed it. The entire continuity-gateway module, runtime registration, and derived-companion write are gone; success and failure use the ordinary exact Mind commit primitive. Runtime writable epoch advances to v25. Core compiles; decision-auditable reorientation 1/1, old-epoch refusal, and coordinator 5/5 pass. The cut removes 80 net maintained lines without touching Atlas. + dormant_state_vocabulary_cut: Exact a602fbdc deletes fifteen public state-model DTO types with no external consumer, two callerless OpenAI-runtime mouths, and eight definition-only type constants. Acceptance receipts and runtime links are derived from exact runtime/Mind receipts; RepoModel owns its keyed graph; retrieval and scratch belong to sealed passes; runtime jobs own their own typed identity. The old aggregate graph/frontier/checkpoint, retrieval, scratch, generic job-binding, and churn vocabulary has no remaining source reference. State-model is 398 lines. Focused state-model, core, OpenAI-runtime, and release-owned model-runtime checks pass. The cut removes 291 maintained lines, does not alter a writable schema, and leaves the complete unrun Atlas vertical slice untouched. supervisor_subtraction: Exact 856648de completes the supervisor deletion. Epiphany owns no local generic daemon supervisor, semantic projector service, workspace-coverage projector, Windows Task Scheduler integration, or service-policy/lifecycle/heartbeat/recovery mirror. Idunn on Yggdrasil owns source-triggered compilation, testing, packaging, deployment, signed health, and daemon survival. The canonical Epiphany brake gates Epiphany cognition and consequence authority, not Idunn startup or unrelated lifecycle. launch_dependency_cut: Exact 2aeab7a9 deletes the generic organ dependency matrix, generic receipt catalogue/proof profiles, persisted worker-launch cargo, Persona prompt injection, evaluator, and three self-certifying tests: 700 net lines. Family admission owners derive exact dependencies from typed state. Worker-launch schema v2 and Persona projector prompt v1 refuse the old writable shape. Core 378/378, OpenRouter runtime 27/27, packaged runtime 13/13, and Persona re-entry 1/1 pass. operator_surface_subtraction: Exact ef92e853 deletes the callerless view-lens registry, legacy acceptance-bundle builders, test-only raw-JSON result interpreters, and six tests: 797 net lines. Exact a292979d and 77e817c1 delete the duplicate CRRC recommendation algorithm, its unused input model, and four tests: 206 lines. Exact 3b94bf6e and 59c5e3a6 delete the nested duplicate status view, false auxiliary mode, and ignored status arguments. Exact 7c9b0cf3 deletes the fixed synthetic job table, role-board job cargo/mappers, and its test: 338 net lines. Exact 2ce91461 deletes the scene/planning Mind reconstructions, duplicate self-policy crate, unused prompt templates, four counterfeit schemas, and ten producer/source-text tests: 1,723 net lines. Exact 78836f3b deletes eight unconsumed status tableaux, the pressure calculator production only called without telemetry, its unreachable compaction action, one counterfeit schema, and six tests: 518 net lines. Exact f10f7fb3 deletes the final twelve epiphany.surface.* schemas and ten catalog entries after every one proved producerless and consumerless: 692 pure deletions. Exact ab3cacfb deletes thirty-one more producerless contracts, the false runtime-session mutation mouth, every Epiphany-owned Rider/Unity command schema, a callerless prompt-context module, its test-only specialist prompt system, and four self-affirming tests: 3,514 net lines. Exact 16d85b1b deletes six duplicate JSON-schema builder tests and two OpenAI-runtime self-source searches: 209 pure test-line deletions. Exact 06f93f70 deletes the test-only inverse OpenAI-to-native request mapper and makes two retained tests follow canonical native-to-provider derivation: sixty net lines. Exact 0091e0e1 later removes two unread adapter-status schemas and catalog entries; the local catalog now has twenty live or portable contracts. Brokkr owns Unity capabilities through CultMesh/Eve; a future Rider daemon owns Rider. Status retains Mind identity, exact current work, one action/reason decision, readable role lanes, and operator thought sealing. Core checks cleanly; retained provider and focused request-flow tests pass. @@ -134,8 +135,8 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,730 lines, 53 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, and coordinator artifact/status cargo are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the registered-type and test-liability audit after exact fed4b857. Trace each remaining registered document and verifier to a producer, reader, and consequential invariant; delete complete dead authority slices, duplicate decision companions, write-only mirrors, unread projections, and self-affirming tests. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, exact Persona terminal consequences, exact provider requests/receipts, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,723 lines, 53 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, coordinator artifact/status cargo, and uninhabited aggregate state-model DTO families are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Resume the registered-type and test-liability audit after exact a602fbdc. Trace each remaining registered document, public runtime surface, and verifier to a producer, reader, and consequential invariant; delete complete dead authority slices, duplicate decision companions, write-only mirrors, unread projections, re-export-only API, and self-affirming tests. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, exact Persona terminal consequences, exact provider requests/receipts, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Session/job documents carry only lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. The sole standalone diagnostic session creator refuses identity collisions; there is no lenient ensure/rebase mouth. It exposes no aggregate status head, mutable adapter-status shadow, uninhabited generic planning mirror, duplicate Continuity recovery copy, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, public typed-fulfillment machinery, or producerless Imagination review contract. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v9/v25, runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,723 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. From 9abadfe7875873abbd5b8969cc69131be26e0212 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 05:55:41 +0200 Subject: [PATCH 037/340] Delete unconsumed provider frame observer --- epiphany-core/src/idunn_runtime_health.rs | 17 +---- epiphany-openai-codex-spine/src/lib.rs | 82 ++--------------------- epiphany-openai-runtime/src/lib.rs | 23 ------- epiphany-state-model/src/lib.rs | 32 --------- epiphany-tool-mcp-runtime/src/lib.rs | 2 - 5 files changed, 8 insertions(+), 148 deletions(-) diff --git a/epiphany-core/src/idunn_runtime_health.rs b/epiphany-core/src/idunn_runtime_health.rs index e29ccf33..1cd61476 100644 --- a/epiphany-core/src/idunn_runtime_health.rs +++ b/epiphany-core/src/idunn_runtime_health.rs @@ -256,9 +256,8 @@ fn require_id(value: &str, label: &str) -> Result<()> { mod tests { use super::*; use cultnet_rs::{ - ServiceIdentityProfile, ServiceIdentitySignature, ServiceSignaturePurpose, - decode_cultnet_message_from_slice, enroll_service_identity_at, - verify_service_identity_signature, + ServiceIdentitySignature, ServiceSignaturePurpose, decode_cultnet_message_from_slice, + enroll_service_identity_at, verify_service_identity_signature, }; use std::thread; @@ -503,16 +502,4 @@ mod tests { assert_eq!(decoded, record); assert_eq!(rmp_serde::to_vec(&decoded).unwrap(), document.payload); } - - #[test] - fn identity_profile_is_not_host_identity() { - assert_eq!( - GameCultProviderHealthIdentity::TRUST_ANCHOR_SCHEMA, - "gamecult.provider_health_identity.trust_anchor.v1" - ); - assert_ne!( - GameCultProviderHealthIdentity::ID_DOMAIN, - b"epiphany.host-incarnation.identity.v0\0" - ); - } } diff --git a/epiphany-openai-codex-spine/src/lib.rs b/epiphany-openai-codex-spine/src/lib.rs index 49c80175..7dcfee54 100644 --- a/epiphany-openai-codex-spine/src/lib.rs +++ b/epiphany-openai-codex-spine/src/lib.rs @@ -59,14 +59,6 @@ pub struct EpiphanyCodexOpenAiTransport { base_url: Option, } -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct EpiphanyResponsesFrameObservation { - pub frame_sequence: u64, - pub kind: String, - pub recognized: bool, - pub delta_preview: Option, -} - impl EpiphanyCodexOpenAiTransport { pub fn new(auth_manager: Arc, base_url: Option) -> Self { Self { @@ -82,15 +74,6 @@ impl EpiphanyCodexOpenAiTransport { pub async fn collect_model_events( &self, request: EpiphanyOpenAiModelRequest, - ) -> Result> { - self.collect_model_events_with_frame_observer(request, |_| {}) - .await - } - - pub async fn collect_model_events_with_frame_observer( - &self, - request: EpiphanyOpenAiModelRequest, - mut observe_frame: impl FnMut(EpiphanyResponsesFrameObservation), ) -> Result> { let request_id = request.request_id.clone(); let model = request.model.clone(); @@ -106,10 +89,7 @@ impl EpiphanyCodexOpenAiTransport { let mut stream_state = EpiphanyResponsesStreamState::new(&request_id, &model); while let Some(frame) = rx.recv().await { match frame { - Ok(frame) => { - let observation = stream_state.push_sse_frame(&frame); - observe_frame(observation); - } + Ok(frame) => stream_state.push_sse_frame(&frame), Err(err) => stream_state.push_failed(err.to_string()), } if stream_state.completed { @@ -193,15 +173,6 @@ impl EpiphanyOpenRouterTransport { pub async fn collect_model_events( &self, request: EpiphanyOpenAiModelRequest, - ) -> Result> { - self.collect_model_events_with_frame_observer(request, |_| {}) - .await - } - - pub async fn collect_model_events_with_frame_observer( - &self, - request: EpiphanyOpenAiModelRequest, - mut observe_frame: impl FnMut(EpiphanyResponsesFrameObservation), ) -> Result> { let url = format!("{}/chat/completions", self.base_url.trim_end_matches('/')); let body = chat_completions_body_from_epiphany(&request)?; @@ -217,12 +188,6 @@ impl EpiphanyOpenRouterTransport { .execute(outbound) .await .map_err(transport_error_to_anyhow)?; - observe_frame(EpiphanyResponsesFrameObservation { - frame_sequence: 1, - kind: "chat.completion".to_string(), - recognized: true, - delta_preview: None, - }); let response: OpenRouterChatCompletionResponse = serde_json::from_slice(&response.body) .context("OpenRouter returned an invalid Chat Completions response")?; openrouter_events_from_chat_completion(&request, response) @@ -1078,7 +1043,6 @@ struct EpiphanyResponsesStreamState { request_id: String, requested_model: String, sequence: u64, - frame_sequence: u64, completed: bool, pending_tool_calls: HashMap, events: Vec, @@ -1097,44 +1061,31 @@ impl EpiphanyResponsesStreamState { request_id: request_id.to_string(), requested_model: requested_model.to_string(), sequence: 0, - frame_sequence: 0, completed: false, pending_tool_calls: HashMap::new(), events: Vec::new(), } } - fn push_sse_frame(&mut self, frame: &str) -> EpiphanyResponsesFrameObservation { - let frame_sequence = self.frame_sequence; - self.frame_sequence += 1; + fn push_sse_frame(&mut self, frame: &str) { let Ok(event) = serde_json::from_str::(frame) else { - return EpiphanyResponsesFrameObservation { - frame_sequence, - kind: "unparseable".to_string(), - recognized: false, - delta_preview: None, - }; + return; }; - let kind = event.kind.clone(); - let delta_preview = event.delta.as_deref().map(delta_preview); - let recognized = match event.kind.as_str() { + match event.kind.as_str() { "response.output_text.delta" => { if let Some(text) = event.delta { self.push_payload(EpiphanyOpenAiStreamPayload::TextDelta { text }); } - true } "response.reasoning_summary_text.delta" | "response.reasoning_text.delta" => { if let Some(text) = event.delta { self.push_payload(EpiphanyOpenAiStreamPayload::ReasoningDelta { text }); } - true } "response.output_item.added" => { if let Some(item) = event.item { self.seed_tool_call_from_item(&item); } - true } "response.function_call_arguments.delta" => { if let (Some(arguments), Some(item_id)) = @@ -1150,7 +1101,6 @@ impl EpiphanyResponsesStreamState { .arguments .push_str(&arguments); } - true } "response.custom_tool_call_input.delta" => { if let (Some(arguments), Some(item_id)) = @@ -1166,13 +1116,11 @@ impl EpiphanyResponsesStreamState { .arguments .push_str(&arguments); } - true } "response.output_item.done" => { if let Some(item) = event.item { self.push_tool_call_from_done_item(&item); } - true } "response.completed" => { if let Some(response) = event.response { @@ -1184,19 +1132,11 @@ impl EpiphanyResponsesStreamState { } } self.completed = true; - true } "response.failed" | "response.incomplete" => { self.push_failed(response_error_message(event.response.as_ref())); - true } - _ => false, - }; - EpiphanyResponsesFrameObservation { - frame_sequence, - kind, - recognized, - delta_preview, + _ => {} } } @@ -1280,15 +1220,6 @@ impl EpiphanyResponsesStreamState { } } -fn delta_preview(delta: &str) -> String { - const MAX_PREVIEW_CHARS: usize = 120; - let mut preview = delta.chars().take(MAX_PREVIEW_CHARS).collect::(); - if delta.chars().count() > MAX_PREVIEW_CHARS { - preview.push_str("..."); - } - preview.replace(['\r', '\n', '\t'], " ") -} - fn item_type(item: &Value) -> Option<&str> { item.get("type").and_then(Value::as_str) } @@ -1946,7 +1877,7 @@ mod tests { #[test] fn parses_function_call_output_item_done_as_complete_tool_call() { let mut state = EpiphanyResponsesStreamState::new("req-tools", "gpt-5.4"); - let observation = state.push_sse_frame( + state.push_sse_frame( &serde_json::json!({ "type": "response.output_item.done", "item": { @@ -1960,7 +1891,6 @@ mod tests { .to_string(), ); - assert!(observation.recognized); assert_eq!(state.events.len(), 1); assert_eq!( state.events[0].payload, diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index 8a22f6e4..e43ef6a0 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -852,28 +852,6 @@ pub fn ensure_openai_runtime_ready(options: &EpiphanyOpenAiRuntimeOptions) -> Re Ok(()) } -pub fn assistant_text_from_openai_events( - store_path: impl AsRef, - request_id: &str, -) -> Result { - let mut cache = runtime_spine_cache(store_path)?; - cache.pull_all_backing_stores()?; - let mut events = cache - .get_all::()? - .into_iter() - .filter(|event| event.request_id == request_id) - .collect::>(); - events.sort_by_key(|event| event.sequence); - - let mut text = String::new(); - for event in events { - if let EpiphanyOpenAiStreamPayload::TextDelta { text: delta } = event.payload { - text.push_str(&delta); - } - } - Ok(text) -} - pub fn assistant_text_from_model_events( store_path: impl AsRef, request_id: &str, @@ -3470,7 +3448,6 @@ mod tests { record_openai_events(&store, &options, &request, DEFAULT_MODEL_PROVIDER, &events)?; assert_eq!(summary.verdict, "pass"); - assert_eq!(assistant_text_from_openai_events(&store, "req-1")?, ""); assert_eq!(assistant_text_from_model_events(&store, "req-1")?, ""); let mut cache = runtime_spine_cache(&store)?; cache.pull_all_backing_stores()?; diff --git a/epiphany-state-model/src/lib.rs b/epiphany-state-model/src/lib.rs index 4f3be10c..4fb147a5 100644 --- a/epiphany-state-model/src/lib.rs +++ b/epiphany-state-model/src/lib.rs @@ -238,38 +238,6 @@ pub enum RepoFrontierStatus { Superseded, } -pub fn reorient_checkpoint_from_admitted_repo_model( - snapshot: &EpiphanyMemoryGraphSnapshot, - obligation_id: &str, -) -> EpiphanyInvestigationCheckpoint { - EpiphanyInvestigationCheckpoint { - checkpoint_id: obligation_id.to_string(), - kind: "admitted_repo_model".to_string(), - disposition: EpiphanyInvestigationDisposition::ResumeReady, - focus: "Current Mind-admitted RepoModel frontier".to_string(), - summary: Some( - "Derived from the authenticated current keyed RepoModel view.".to_string(), - ), - next_action: Some("Resume from the current Mind-admitted RepoModel frontier.".to_string()), - captured_at_turn_id: None, - open_questions: Vec::new(), - code_refs: snapshot - .frontier - .iter() - .filter(|item| item.status == RepoFrontierStatus::Active) - .flat_map(|item| item.repository_scope.iter()) - .map(|path| EpiphanyCodeRef { - path: path.into(), - start_line: None, - end_line: None, - symbol: None, - note: Some("Current admitted RepoModel frontier scope".to_string()), - }) - .collect(), - evidence_ids: Vec::new(), - } -} - #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] pub struct EpiphanyMemoryDomain { pub id: String, diff --git a/epiphany-tool-mcp-runtime/src/lib.rs b/epiphany-tool-mcp-runtime/src/lib.rs index 426b65d7..7f166566 100644 --- a/epiphany-tool-mcp-runtime/src/lib.rs +++ b/epiphany-tool-mcp-runtime/src/lib.rs @@ -31,8 +31,6 @@ use std::collections::HashMap; use std::process::Stdio; use std::time::{SystemTime, UNIX_EPOCH}; -pub const MCP_CLIENT_NAME: &str = "epiphany-tool-mcp-runtime"; - #[derive(Debug, Clone, PartialEq)] pub struct InvocationOutcome { pub receipt: EpiphanyToolInvocationReceipt, From 4e0f3d3cd221196958a766b84d738715ddb6564e Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 05:56:40 +0200 Subject: [PATCH 038/340] docs: Record provider observer cut --- notes/epiphany-current-algorithmic-map.md | 13 +++++++++++-- notes/epiphany-fork-implementation-plan.md | 4 ++++ notes/fresh-workspace-handoff.md | 20 ++++++++++++++++---- state/ledgers.msgpack | Bin 704283 -> 705044 bytes state/map.yaml | 3 ++- 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 427986ec..9ca8199e 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `a602fbdc` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for dormant state-vocabulary deletion; +Latest committed implementation cut: `9abadfe7` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for provider-frame observer deletion; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -36,6 +36,15 @@ definition-only type constants are also gone. The cut is 291 pure deletions; the state-model crate is 398 lines. It does not touch the still-unrun Atlas inter-swarm path. +Provider observability is typed consequence, not a no-op callback shelf. Exact +`9abadfe7` removes the frame-observation DTO, sequence/preview bookkeeping, and +observer methods from both provider transports because every live caller threw +the observation away. Codex SSE and OpenRouter responses still lower into the +same typed model events and receipts. A provider-specific transcript reader +used only by a test assertion is also absent; decision audit continues to use +sealed native/provider requests, structured terminal records, governed tool +receipts, and Mind commit receipts rather than stream text. + CultMesh contains no JSON-derived operator snapshot, coordinator receipt, Hands gate, role-review event, unauthenticated Odin/Eve provider row, or daemon tool directory. Native runtime and keyed Mind receipts remain the owners; old diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index ef6ed161..1a97b7b7 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -342,6 +342,10 @@ Cut in this order: Exact keyed Mind/runtime receipts, RepoModel documents, pass-local reasoning, and the release-owned observed worker route remain. No schema epoch changes because none of the deleted vocabulary was registered or persisted. + Exact `9abadfe7` removes the unconsumed provider-frame observation DTO and + callback APIs from both transports, plus the provider-specific transcript + reader used only by one test assertion. Typed stream events/receipts remain; + no audit or admission path depends on frame previews or transcript text. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index b85bd87f..ce27eef0 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `a602fbdc` -Current worktree: documentation/evidence for dormant state-vocabulary deletion; +Latest committed implementation cut: `9abadfe7` +Current worktree: documentation/evidence for provider-frame observer deletion; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `a602fbdc` is the current +production symlink body and is inactive. Exact `9abadfe7` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,18 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `9abadfe7` deletes the provider-frame observation DTO and callback APIs +from both Codex Responses and OpenRouter transports. No runtime, binary, test, +or operator surface consumed an observation; both live transport callers +supplied a no-op closure. The SSE parser and OpenRouter response path still emit +the same typed model stream events and receipts. A provider-specific transcript +reader used only by one empty-text assertion, a callerless checkpoint +constructor, a definition-only MCP label, and a historical constant-spelling +health test are also gone. Provider spine 14/14, OpenAI runtime 23/23, tool MCP +8/8, Idunn runtime health 5/5, state-model, and the packaged model-runtime +entrypoint pass. The cut removes 140 net maintained lines; state-model is 366 +lines. Atlas is untouched and live inter-swarm collaboration remains unproven. + Exact `a602fbdc` deletes fifteen public state-model DTO types with no external consumer, two callerless OpenAI-runtime mouths, and eight definition-only type constants. Acceptance/runtime-link aggregates, duplicate graph and frontier @@ -197,7 +209,7 @@ the live resident fields. Runtime writable state advances to v20. JSON schemas parse; core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass. The cut removes 59 maintained lines and leaves `runtime_spine.rs` at 9,807 lines. -Continue the registered-type and test-liability audit after exact `a602fbdc`. Model Atlas remains protected +Continue the registered-type and test-liability audit after exact `9abadfe7`. Model Atlas remains protected for its first live inter-swarm collaboration trial. Exact `3ed1d564` deletes the public diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index a3ea4307bba5201633be9dad40a94d213174d68f..427e92a9d09dd709e75b3d15dac6ce30dda74aed 100644 GIT binary patch delta 652 zcmX|8KWh|06!%V}xmB<+ViR~^r?;1=w^0b)-9CK zKLDy7{|E9Y3cv~t&B&XpAG#}t*68}oB(%2iphP2)W%fCWED3}T7CaWVYHgi$$HAdg zVkN$152hgSdNH=qdF#>FjL_8ZTLR(w9X6k8bbh?qkQSCGBoo*zLaEr z+m+#18P(3jGp|p!_jq$DYA*7I1mr4kt75kKs4&zz(^{DqkfYGNTRsd8V6S=qC0c1l z$GvNh`asrdXxTQ`Hv8~6D~$nP8d7|w#aObI^m%cDFfRByEYRAV3-g_uzemw(^X?>C diokKS0o)m`H_tyt*RKeVi;ZQ2=GRH|^gl|R>MH;M delta 73 zcmbQzqCNYc)&>biZeuem6U(S$3|xDEY*uD0WMuSfp32ldm5C9EK{PWEvj8zG5VHX> QI}mdKG3WNFOk8by0C-;)Q2+n{ diff --git a/state/map.yaml b/state/map.yaml index 5a6bcd5a..fc6c47d6 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -74,6 +74,7 @@ current_status: persona_quarantine_mirror_cut: Exact a6f73fc4 deletes the write-only Persona quarantine mirror. A blocked turn already atomically writes one terminal receipt containing exact crossing status/reason and mention digest, then marks each mention quarantined and binds it to that receipt. The duplicate blocked-pressure payload, wrapper document, construction branch, type constant, registry entry, and decoder are gone; nothing read them after the earlier duplicate projection was deleted. Core compiles, Persona consequence/retention 5/5 pass, and the feature-gated Persona service compiles. The cut is 63 pure deletions without touching Atlas. continuity_recovery_mirror_cut: Exact fed4b857 deletes the final duplicate Continuity recovery record. Accepted reorientation already persists its exact runtime result, sealed reasoning basis/context, typed Mind decision, strong-read admission, and Mind commit receipt. ContinuityRecoveryReceipt copied the same job/result, mode, checkpoint validity, summary, next move, files, and timestamp, and no reader consumed it. The entire continuity-gateway module, runtime registration, and derived-companion write are gone; success and failure use the ordinary exact Mind commit primitive. Runtime writable epoch advances to v25. Core compiles; decision-auditable reorientation 1/1, old-epoch refusal, and coordinator 5/5 pass. The cut removes 80 net maintained lines without touching Atlas. dormant_state_vocabulary_cut: Exact a602fbdc deletes fifteen public state-model DTO types with no external consumer, two callerless OpenAI-runtime mouths, and eight definition-only type constants. Acceptance receipts and runtime links are derived from exact runtime/Mind receipts; RepoModel owns its keyed graph; retrieval and scratch belong to sealed passes; runtime jobs own their own typed identity. The old aggregate graph/frontier/checkpoint, retrieval, scratch, generic job-binding, and churn vocabulary has no remaining source reference. State-model is 398 lines. Focused state-model, core, OpenAI-runtime, and release-owned model-runtime checks pass. The cut removes 291 maintained lines, does not alter a writable schema, and leaves the complete unrun Atlas vertical slice untouched. + provider_frame_observer_cut: Exact 9abadfe7 deletes the provider-frame observation DTO and callback APIs from both Codex Responses and OpenRouter transports. Every live caller supplied a no-op observer; typed model stream events and receipts remain the sole provider consequences. The same cut removes a provider-specific transcript reader used only by one empty-text assertion, a callerless RepoModel-to-reorientation checkpoint constructor, a definition-only MCP client label, and a historical health-identity constant-spelling test. Provider spine 14/14, OpenAI runtime 23/23, tool MCP 8/8, Idunn runtime health 5/5, state-model, and the release-owned model-runtime check pass. The cut removes 140 net maintained lines; state-model is 366 lines. Atlas remains untouched and live inter-swarm collaboration remains unproven. supervisor_subtraction: Exact 856648de completes the supervisor deletion. Epiphany owns no local generic daemon supervisor, semantic projector service, workspace-coverage projector, Windows Task Scheduler integration, or service-policy/lifecycle/heartbeat/recovery mirror. Idunn on Yggdrasil owns source-triggered compilation, testing, packaging, deployment, signed health, and daemon survival. The canonical Epiphany brake gates Epiphany cognition and consequence authority, not Idunn startup or unrelated lifecycle. launch_dependency_cut: Exact 2aeab7a9 deletes the generic organ dependency matrix, generic receipt catalogue/proof profiles, persisted worker-launch cargo, Persona prompt injection, evaluator, and three self-certifying tests: 700 net lines. Family admission owners derive exact dependencies from typed state. Worker-launch schema v2 and Persona projector prompt v1 refuse the old writable shape. Core 378/378, OpenRouter runtime 27/27, packaged runtime 13/13, and Persona re-entry 1/1 pass. operator_surface_subtraction: Exact ef92e853 deletes the callerless view-lens registry, legacy acceptance-bundle builders, test-only raw-JSON result interpreters, and six tests: 797 net lines. Exact a292979d and 77e817c1 delete the duplicate CRRC recommendation algorithm, its unused input model, and four tests: 206 lines. Exact 3b94bf6e and 59c5e3a6 delete the nested duplicate status view, false auxiliary mode, and ignored status arguments. Exact 7c9b0cf3 deletes the fixed synthetic job table, role-board job cargo/mappers, and its test: 338 net lines. Exact 2ce91461 deletes the scene/planning Mind reconstructions, duplicate self-policy crate, unused prompt templates, four counterfeit schemas, and ten producer/source-text tests: 1,723 net lines. Exact 78836f3b deletes eight unconsumed status tableaux, the pressure calculator production only called without telemetry, its unreachable compaction action, one counterfeit schema, and six tests: 518 net lines. Exact f10f7fb3 deletes the final twelve epiphany.surface.* schemas and ten catalog entries after every one proved producerless and consumerless: 692 pure deletions. Exact ab3cacfb deletes thirty-one more producerless contracts, the false runtime-session mutation mouth, every Epiphany-owned Rider/Unity command schema, a callerless prompt-context module, its test-only specialist prompt system, and four self-affirming tests: 3,514 net lines. Exact 16d85b1b deletes six duplicate JSON-schema builder tests and two OpenAI-runtime self-source searches: 209 pure test-line deletions. Exact 06f93f70 deletes the test-only inverse OpenAI-to-native request mapper and makes two retained tests follow canonical native-to-provider derivation: sixty net lines. Exact 0091e0e1 later removes two unread adapter-status schemas and catalog entries; the local catalog now has twenty live or portable contracts. Brokkr owns Unity capabilities through CultMesh/Eve; a future Rider daemon owns Rider. Status retains Mind identity, exact current work, one action/reason decision, readable role lanes, and operator thought sealing. Core checks cleanly; retained provider and focused request-flow tests pass. @@ -136,7 +137,7 @@ current_status: yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,723 lines, 53 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, coordinator artifact/status cargo, and uninhabited aggregate state-model DTO families are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the registered-type and test-liability audit after exact a602fbdc. Trace each remaining registered document, public runtime surface, and verifier to a producer, reader, and consequential invariant; delete complete dead authority slices, duplicate decision companions, write-only mirrors, unread projections, re-export-only API, and self-affirming tests. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, exact Persona terminal consequences, exact provider requests/receipts, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + next_action: Resume the registered-type and test-liability audit after exact 9abadfe7. Trace each remaining registered document, public runtime surface, observer, and verifier to a producer, reader, and consequential invariant; delete complete dead authority slices, duplicate decision companions, write-only mirrors, unread projections, re-export-only API, no-op callback lanes, and self-affirming tests. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, exact Persona terminal consequences, exact provider requests/receipts, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Session/job documents carry only lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. The sole standalone diagnostic session creator refuses identity collisions; there is no lenient ensure/rebase mouth. It exposes no aggregate status head, mutable adapter-status shadow, uninhabited generic planning mirror, duplicate Continuity recovery copy, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, public typed-fulfillment machinery, or producerless Imagination review contract. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v9/v25, runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,723 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. From 2a435eb5ab561c657568fedff4c43e6c1633ed40 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 06:03:28 +0200 Subject: [PATCH 039/340] Delete duplicate Persona and tool receipt cargo --- epiphany-core/src/mind_documents.rs | 10 +++------- epiphany-core/src/persona_conversation.rs | 2 -- epiphany-core/src/runtime_spine.rs | 2 +- epiphany-tool-adapter/src/lib.rs | 7 ++----- .../epiphany.tool-invocation-receipt.schema.json | 5 ++--- schemas/cultnet/index.json | 4 ++-- 6 files changed, 10 insertions(+), 20 deletions(-) diff --git a/epiphany-core/src/mind_documents.rs b/epiphany-core/src/mind_documents.rs index e03a8974..3167cbe1 100644 --- a/epiphany-core/src/mind_documents.rs +++ b/epiphany-core/src/mind_documents.rs @@ -11,7 +11,7 @@ use sha2::{Digest, Sha256}; use crate::{EpiphanyMindDocumentVersion, runtime_spine_cache}; -pub const MIND_SCHEMA_EPOCH: &str = "epiphany.mind.epoch.v9"; +pub const MIND_SCHEMA_EPOCH: &str = "epiphany.mind.epoch.v10"; pub const MIND_OBJECTIVE_KEY: &str = "objective"; pub const MIND_FOCUS_KEY: &str = "focus"; pub const MIND_MODE_KEY: &str = "mode"; @@ -138,7 +138,7 @@ pub struct EpiphanyMindEvidenceDocument { #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache( - type = "epiphany.mind.persona_memory.v1", + type = "epiphany.mind.persona_memory.v2", schema = "EpiphanyMindPersonaMemoryDocument" )] pub struct EpiphanyMindPersonaMemoryDocument { @@ -155,12 +155,8 @@ pub struct EpiphanyMindPersonaMemoryDocument { #[cultcache(key = 5)] pub confidence: f64, #[cultcache(key = 6)] - pub linked_event_ids: Vec, - #[cultcache(key = 7)] - pub linked_relationship_id: Option, - #[cultcache(key = 8)] pub effect_document_id: String, - #[cultcache(key = 9)] + #[cultcache(key = 7)] pub decision_context_id: String, } diff --git a/epiphany-core/src/persona_conversation.rs b/epiphany-core/src/persona_conversation.rs index dc317ace..08a93780 100644 --- a/epiphany-core/src/persona_conversation.rs +++ b/epiphany-core/src/persona_conversation.rs @@ -1110,8 +1110,6 @@ pub(crate) fn admit_persona_state_notes( summary: summary.clone(), salience: 0.7, confidence: confidence.unwrap_or(0.7), - linked_event_ids: vec![document.document_id.clone()], - linked_relationship_id: None, effect_document_id: document.document_id.clone(), decision_context_id: document.decision_context_id.clone(), }; diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index 1048320b..bf12654d 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -85,7 +85,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v25"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v26"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; pub const RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.model_execution_binding.v0"; diff --git a/epiphany-tool-adapter/src/lib.rs b/epiphany-tool-adapter/src/lib.rs index 7dcdbf4d..bf3dcf7b 100644 --- a/epiphany-tool-adapter/src/lib.rs +++ b/epiphany-tool-adapter/src/lib.rs @@ -1,7 +1,7 @@ use cultcache_rs::DatabaseEntry; pub const TOOL_ADAPTER_INVOCATION_INTENT_SCHEMA_ID: &str = "epiphany.tool_invocation_intent.v0"; -pub const TOOL_ADAPTER_INVOCATION_RECEIPT_SCHEMA_ID: &str = "epiphany.tool_invocation_receipt.v0"; +pub const TOOL_ADAPTER_INVOCATION_RECEIPT_SCHEMA_ID: &str = "epiphany.tool_invocation_receipt.v1"; pub const EPIPHANY_TOOL_RUNTIME_ADAPTER_ID: &str = "epiphany-tools"; pub fn tool_invocation_intent_key(intent_id: &str) -> String { @@ -102,7 +102,7 @@ impl EpiphanyToolInvocationIntent { #[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] #[cultcache( - type = "epiphany.tool_invocation_receipt.v0", + type = "epiphany.tool_invocation_receipt.v1", schema = "EpiphanyToolInvocationReceipt" )] pub struct EpiphanyToolInvocationReceipt { @@ -126,8 +126,6 @@ pub struct EpiphanyToolInvocationReceipt { pub result_json: Option, #[cultcache(key = 9, default)] pub error: Option, - #[cultcache(key = 10, default)] - pub sealed_raw_result_ref: Option, } impl EpiphanyToolInvocationReceipt { @@ -151,7 +149,6 @@ impl EpiphanyToolInvocationReceipt { completed_at: completed_at.into(), result_json: None, error: None, - sealed_raw_result_ref: None, } } } diff --git a/schemas/cultnet/epiphany.tool-invocation-receipt.schema.json b/schemas/cultnet/epiphany.tool-invocation-receipt.schema.json index d079959b..0470eb72 100644 --- a/schemas/cultnet/epiphany.tool-invocation-receipt.schema.json +++ b/schemas/cultnet/epiphany.tool-invocation-receipt.schema.json @@ -15,7 +15,7 @@ "completed_at" ], "properties": { - "schema_id": { "const": "epiphany.tool_invocation_receipt.v0" }, + "schema_id": { "const": "epiphany.tool_invocation_receipt.v1" }, "receipt_id": { "type": "string" }, "intent_id": { "type": "string" }, "adapter": { "type": "string" }, @@ -24,8 +24,7 @@ "status": { "type": "string" }, "completed_at": { "type": "string", "format": "date-time" }, "result_json": { "type": ["string", "null"] }, - "error": { "type": ["string", "null"] }, - "sealed_raw_result_ref": { "type": ["string", "null"] } + "error": { "type": ["string", "null"] } }, "additionalProperties": false } diff --git a/schemas/cultnet/index.json b/schemas/cultnet/index.json index 32eae154..c8e70ac9 100644 --- a/schemas/cultnet/index.json +++ b/schemas/cultnet/index.json @@ -150,8 +150,8 @@ "wireContracts": [ "cultnet.schema.v0" ], - "schemaVersion": "epiphany.tool_invocation_receipt.v0", - "documentType": "epiphany.tool_invocation_receipt.v0", + "schemaVersion": "epiphany.tool_invocation_receipt.v1", + "documentType": "epiphany.tool_invocation_receipt.v1", "title": "Epiphany Tool Invocation Receipt", "path": "epiphany.tool-invocation-receipt.schema.json" }, From 61238cfdb24ad9cd5227fa8cdf8fdc872675fa5f Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 06:04:57 +0200 Subject: [PATCH 040/340] docs: Record singular provenance cut --- notes/epiphany-current-algorithmic-map.md | 12 ++++++++++-- notes/epiphany-fork-implementation-plan.md | 4 ++++ notes/fresh-workspace-handoff.md | 19 +++++++++++++++---- state/ledgers.msgpack | Bin 705044 -> 705804 bytes state/map.yaml | 7 ++++--- 5 files changed, 33 insertions(+), 9 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 9ca8199e..776611d9 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `9abadfe7` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for provider-frame observer deletion; +Latest committed implementation cut: `2a435eb5` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for singular Persona/tool provenance; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -45,6 +45,14 @@ used only by a test assertion is also absent; decision audit continues to use sealed native/provider requests, structured terminal records, governed tool receipts, and Mind commit receipts rather than stream text. +Durable provenance is singular. Exact `2a435eb5` advances Persona memory to v2 +and removes a linked-event vector that repeated `effect_document_id` plus a +relationship slot every producer left empty. The memory keeps the exact +Interpreter effect document and decision context. Tool receipts advance to v1 +and remove an always-empty raw-result reference; exact result JSON or error is +the receipt consequence. Mind/runtime writable epochs are v10/v26, and old +stores refuse rather than inheriting the retired shapes. + CultMesh contains no JSON-derived operator snapshot, coordinator receipt, Hands gate, role-review event, unauthenticated Odin/Eve provider row, or daemon tool directory. Native runtime and keyed Mind receipts remain the owners; old diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 1a97b7b7..73f14948 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -346,6 +346,10 @@ Cut in this order: callback APIs from both transports, plus the provider-specific transcript reader used only by one test assertion. Typed stream events/receipts remain; no audit or admission path depends on frame previews or transcript text. + Exact `2a435eb5` advances Persona memory to v2 and tool receipts to v1 while + deleting duplicate effect-event provenance, an always-empty relationship, + and an always-empty raw-result reference. Mind/runtime epochs are v10/v26; + old writable stores refuse without migration. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index ce27eef0..f4141a31 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `9abadfe7` -Current worktree: documentation/evidence for provider-frame observer deletion; +Latest committed implementation cut: `2a435eb5` +Current worktree: documentation/evidence for singular Persona/tool provenance; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `9abadfe7` is the current +production symlink body and is inactive. Exact `2a435eb5` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,17 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `2a435eb5` makes Persona-memory and tool-receipt provenance singular. +Persona-memory v2 retains the exact Interpreter effect-document and decision- +context IDs; its linked-event vector repeated that same effect ID and its +relationship field was always `None`. Tool-receipt v1 retains exact result JSON +or error; its sealed-raw-result reference was always `None` and had no producer +or reader. Mind/runtime writable epochs advance to v10/v26 with no migrator or +compatibility reader. Tool adapter compiles; tool MCP 8/8, Persona conversation +and retention 5/5, old-epoch refusal 1/1, OpenAI runtime 23/23, and the packaged +model-runtime entrypoint pass. The cut removes 10 net maintained lines. Atlas +is untouched and live inter-swarm collaboration remains unproven. + Exact `9abadfe7` deletes the provider-frame observation DTO and callback APIs from both Codex Responses and OpenRouter transports. No runtime, binary, test, or operator surface consumed an observation; both live transport callers @@ -209,7 +220,7 @@ the live resident fields. Runtime writable state advances to v20. JSON schemas parse; core check, old-epoch refusal, coordinator 5/5, and swarm 4/4 pass. The cut removes 59 maintained lines and leaves `runtime_spine.rs` at 9,807 lines. -Continue the registered-type and test-liability audit after exact `9abadfe7`. Model Atlas remains protected +Continue the registered-type, field-cargo, and test-liability audit after exact `2a435eb5`. Model Atlas remains protected for its first live inter-swarm collaboration trial. Exact `3ed1d564` deletes the public diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 427e92a9d09dd709e75b3d15dac6ce30dda74aed..d82407d28d0a0542f73c5f788d6526c9faee6cb2 100644 GIT binary patch delta 636 zcmY+B&1w`u6os9MiRlJGi5MaZS9F(j<|i{DB&+zdh@cLbg}AG9-N_VIS9PkYdort0 z3<%=Vp`O5n$%xU>NQgM&XCTNW=V6T3#55c^m$T`$0z>BVHD4|JG;%W%Ac*r z*T?nm_YYa>pv^jKUEJ$J#-5{v9vZ6^OES!~839uqoYpcin4-uXQ2T{s zX7#TL{+P-(7<5c13vPgbRnCrbXma|G2C(11gp|#7T4bnPi19CvqlIyp=S40>${d1L zn4rXJ1S!@fJNKX@r#2NClS4ML31+z)QKV!}Xk`Z?hrU3`ffp{C^P^nM4kT4XKaHVz7?}LmR?Qqx_8z(V~CxKAwGQ zf$_4c%4sND%|_W?hoNu-P#RL5<;1%uq^RH-M{2U-WSr%prZ6HTS|SPf5AXJ1qp`69 z{^qsl%I!wzQiY45+vu)L52r~m)} delta 75 zcmeC_(w@?yy+MqT*VxL`)XLN(>KFspfsdP&84DR1{hOyUwNGVY1Y!`)48$xz%nHP8 SK+F!r96-#ueJT@I{eA#;2NyB` diff --git a/state/map.yaml b/state/map.yaml index fc6c47d6..706c70f9 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -52,7 +52,7 @@ current_status: summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Runtime status aggregates, mutable adapter-status shadows, uninhabited generic planning mirrors, duplicate Continuity recovery copies, global revisions, generic role/event authority, duplicate prompt-state cargo, duplicate family launch bindings, and Epiphany-owned Rider/Unity organs are absent. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. Completed model-session tombstones retain only resurrection fences and an exact deletion digest. Archived worker attempts retain the exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records needed for audit. Runtime sessions and jobs own lifecycle identity/status only; terminal job results own summaries and artifacts. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v9/v25; runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, and coordinator-run-receipt schema/type is v1. Old writable stores refuse with no migrator or dual reader. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Runtime status aggregates, mutable adapter-status shadows, uninhabited generic planning mirrors, duplicate Continuity recovery copies, global revisions, generic role/event authority, duplicate prompt-state cargo, duplicate family launch bindings, and Epiphany-owned Rider/Unity organs are absent. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. Completed model-session tombstones retain only resurrection fences and an exact deletion digest. Archived worker attempts retain the exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records needed for audit. Runtime sessions and jobs own lifecycle identity/status only; terminal job results own summaries and artifacts. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Persona-memory v2 owns exact Interpreter effect/context provenance; tool-receipt v1 owns exact result JSON or error. Mind/runtime writable epochs are v10/v26; runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, and coordinator-run-receipt schema/type is v1. Old writable stores refuse with no migrator or dual reader. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. atlas_authoring_cut: Exact ce306e23 preserves the complete inter-swarm Atlas vertical slice while deleting its duplicate local offer/claim authoring authority. Ordinary Modeling through RepoModel operations is the sole owner of provider offers and consumer claims; Atlas retains signed publication, trust, transport, deterministic projection, Soul verification, Self impact admission, Resident Self wake, brakes, and Eve lowering. Two direct write-intent types, their runtime commit APIs and registry entries, 518 planner lines, and two tests that animated only that duplicate path are gone. The runtime proof now creates offers/claims through RepoModel before proving exact verification admission and Body-drift refusal. The cut removes 593 net source lines; the three-repository direct/transitive Modeling proof passes. These are component proofs only: no live inter-swarm collaboration has yet run, so the Atlas vertical slice remains protected until Gate 1 exercises it end to end. Runtime writable epoch is v14. autonomous_proposal_binding_cut: Exact 5d507bfd reduces Self's autonomous Imagination-to-Modeling origin binding from a 22-field duplicate archive to six causal join fields: schema, exact direction-result identity, selected option ordinal, worker job identity, and exact worker-result/launch digests. Proposal identity and payload, direction request, runtime/thread, typed model projection, Body/domain binding, selected option content, and canonical Modeling-request identity are checked directly from their owning immutable documents. The atomic proposal plus binding plus Modeling-request commit and its broad keyed-lifecycle proof remain; 60 net source lines are gone. Runtime writable epoch is v15. hands_verification_derivation_cut: Exact 6ccc7dd2 deletes the 20-field transient Hands receipt-chain summary. The Hands commit owner now derives the exact Verification request directly from the persisted patch, command, and commit receipts plus the frontier authority; no copied schema, job, grant, command-output, Git, path, summary, or timestamp fields mediate that handoff. Atomic Hands-to-Verification admission and the concurrent Persona/Hands lifecycle proof remain. The cut removes 43 net source lines without adding state, schema, or tests. @@ -75,6 +75,7 @@ current_status: continuity_recovery_mirror_cut: Exact fed4b857 deletes the final duplicate Continuity recovery record. Accepted reorientation already persists its exact runtime result, sealed reasoning basis/context, typed Mind decision, strong-read admission, and Mind commit receipt. ContinuityRecoveryReceipt copied the same job/result, mode, checkpoint validity, summary, next move, files, and timestamp, and no reader consumed it. The entire continuity-gateway module, runtime registration, and derived-companion write are gone; success and failure use the ordinary exact Mind commit primitive. Runtime writable epoch advances to v25. Core compiles; decision-auditable reorientation 1/1, old-epoch refusal, and coordinator 5/5 pass. The cut removes 80 net maintained lines without touching Atlas. dormant_state_vocabulary_cut: Exact a602fbdc deletes fifteen public state-model DTO types with no external consumer, two callerless OpenAI-runtime mouths, and eight definition-only type constants. Acceptance receipts and runtime links are derived from exact runtime/Mind receipts; RepoModel owns its keyed graph; retrieval and scratch belong to sealed passes; runtime jobs own their own typed identity. The old aggregate graph/frontier/checkpoint, retrieval, scratch, generic job-binding, and churn vocabulary has no remaining source reference. State-model is 398 lines. Focused state-model, core, OpenAI-runtime, and release-owned model-runtime checks pass. The cut removes 291 maintained lines, does not alter a writable schema, and leaves the complete unrun Atlas vertical slice untouched. provider_frame_observer_cut: Exact 9abadfe7 deletes the provider-frame observation DTO and callback APIs from both Codex Responses and OpenRouter transports. Every live caller supplied a no-op observer; typed model stream events and receipts remain the sole provider consequences. The same cut removes a provider-specific transcript reader used only by one empty-text assertion, a callerless RepoModel-to-reorientation checkpoint constructor, a definition-only MCP client label, and a historical health-identity constant-spelling test. Provider spine 14/14, OpenAI runtime 23/23, tool MCP 8/8, Idunn runtime health 5/5, state-model, and the release-owned model-runtime check pass. The cut removes 140 net maintained lines; state-model is 366 lines. Atlas remains untouched and live inter-swarm collaboration remains unproven. + singular_persona_tool_provenance_cut: Exact 2a435eb5 deletes duplicate or uninhabited provenance cargo from two durable contracts. Persona-memory v2 retains exact Interpreter effect-document and decision-context IDs; the one-element linked-event vector repeated the same effect ID and the relationship field was always None. Tool-receipt v1 retains exact result JSON or error; the sealed-raw-result reference was always None and had no producer or reader. Mind/runtime writable epochs advance to v10/v26 with no migrator or compatibility reader. Tool adapter compiles; tool MCP 8/8, Persona conversation/retention 5/5, old-epoch refusal 1/1, OpenAI runtime 23/23, and the release-owned model-runtime check pass. The cut removes 10 net maintained lines without touching Atlas. supervisor_subtraction: Exact 856648de completes the supervisor deletion. Epiphany owns no local generic daemon supervisor, semantic projector service, workspace-coverage projector, Windows Task Scheduler integration, or service-policy/lifecycle/heartbeat/recovery mirror. Idunn on Yggdrasil owns source-triggered compilation, testing, packaging, deployment, signed health, and daemon survival. The canonical Epiphany brake gates Epiphany cognition and consequence authority, not Idunn startup or unrelated lifecycle. launch_dependency_cut: Exact 2aeab7a9 deletes the generic organ dependency matrix, generic receipt catalogue/proof profiles, persisted worker-launch cargo, Persona prompt injection, evaluator, and three self-certifying tests: 700 net lines. Family admission owners derive exact dependencies from typed state. Worker-launch schema v2 and Persona projector prompt v1 refuse the old writable shape. Core 378/378, OpenRouter runtime 27/27, packaged runtime 13/13, and Persona re-entry 1/1 pass. operator_surface_subtraction: Exact ef92e853 deletes the callerless view-lens registry, legacy acceptance-bundle builders, test-only raw-JSON result interpreters, and six tests: 797 net lines. Exact a292979d and 77e817c1 delete the duplicate CRRC recommendation algorithm, its unused input model, and four tests: 206 lines. Exact 3b94bf6e and 59c5e3a6 delete the nested duplicate status view, false auxiliary mode, and ignored status arguments. Exact 7c9b0cf3 deletes the fixed synthetic job table, role-board job cargo/mappers, and its test: 338 net lines. Exact 2ce91461 deletes the scene/planning Mind reconstructions, duplicate self-policy crate, unused prompt templates, four counterfeit schemas, and ten producer/source-text tests: 1,723 net lines. Exact 78836f3b deletes eight unconsumed status tableaux, the pressure calculator production only called without telemetry, its unreachable compaction action, one counterfeit schema, and six tests: 518 net lines. Exact f10f7fb3 deletes the final twelve epiphany.surface.* schemas and ten catalog entries after every one proved producerless and consumerless: 692 pure deletions. Exact ab3cacfb deletes thirty-one more producerless contracts, the false runtime-session mutation mouth, every Epiphany-owned Rider/Unity command schema, a callerless prompt-context module, its test-only specialist prompt system, and four self-affirming tests: 3,514 net lines. Exact 16d85b1b deletes six duplicate JSON-schema builder tests and two OpenAI-runtime self-source searches: 209 pure test-line deletions. Exact 06f93f70 deletes the test-only inverse OpenAI-to-native request mapper and makes two retained tests follow canonical native-to-provider derivation: sixty net lines. Exact 0091e0e1 later removes two unread adapter-status schemas and catalog entries; the local catalog now has twenty live or portable contracts. Brokkr owns Unity capabilities through CultMesh/Eve; a future Rider daemon owns Rider. Status retains Mind identity, exact current work, one action/reason decision, readable role lanes, and operator thought sealing. Core checks cleanly; retained provider and focused request-flow tests pass. @@ -137,9 +138,9 @@ current_status: yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,723 lines, 53 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, coordinator artifact/status cargo, and uninhabited aggregate state-model DTO families are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the registered-type and test-liability audit after exact 9abadfe7. Trace each remaining registered document, public runtime surface, observer, and verifier to a producer, reader, and consequential invariant; delete complete dead authority slices, duplicate decision companions, write-only mirrors, unread projections, re-export-only API, no-op callback lanes, and self-affirming tests. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, exact Persona terminal consequences, exact provider requests/receipts, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + next_action: Resume the registered-type, field-cargo, and test-liability audit after exact 2a435eb5. Trace each remaining registered document, public runtime surface, serialized field, observer, and verifier to a producer, reader, and consequential invariant; delete complete dead authority slices, duplicate decision companions, write-only mirrors, unread projections, re-export-only API, no-op callback lanes, and self-affirming tests. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, exact Persona terminal consequences, exact provider requests/receipts, and the complete unrun Model Atlas inter-swarm vertical slice. Do not mistake component tests for collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Session/job documents carry only lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. The sole standalone diagnostic session creator refuses identity collisions; there is no lenient ensure/rebase mouth. It exposes no aggregate status head, mutable adapter-status shadow, uninhabited generic planning mirror, duplicate Continuity recovery copy, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, public typed-fulfillment machinery, or producerless Imagination review contract. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v9/v25, runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,723 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Session/job documents carry only lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. The sole standalone diagnostic session creator refuses identity collisions; there is no lenient ensure/rebase mouth. It exposes no aggregate status head, mutable adapter-status shadow, uninhabited generic planning mirror, duplicate Continuity recovery copy, global revision, generic role patch, caller-authored mutation surface, duplicate prompt-state projection, persisted family launch-binding document, standalone verdict-driven Modeling writer, coordinator artifact/status cargo, public typed-fulfillment machinery, or producerless Imagination review contract. Completed model-session retention writes one private resurrection tombstone. Archived worker retention writes one decision-bearing historical record with exact request/terminal identity, deletion digest, decision context, structured role result, and terminal job records; duplicate IDs, timestamps, count summaries, and returned archive vectors own nothing and are absent. Coordinator terminal receipts retain only terminal Self decision and exact resident-launch provenance. Mind/runtime writable epochs are v10/v26, runtime session/job catalog schemas are v1, archived-session schema is v1, archived-worker-attempt schema/type is v2, coordinator-run-receipt schema/type is v1, and claim-obligation schema is v3. The spine is 9,723 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each remaining public surface and verifier to a live consumer and consequential invariant; do not replace deleted authority with registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. From ffd91c20e98bdd4a9cd9526e5d5477fae6998c79 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 06:25:06 +0200 Subject: [PATCH 041/340] Delete fixed routing and retention cargo --- epiphany-core/src/bin/epiphany-swarm.rs | 6 +----- epiphany-core/src/eyes_gateway.rs | 23 ++++++++++------------- epiphany-core/src/persona_social_state.rs | 11 +++++++---- epiphany-core/src/resident_self.rs | 18 ++++++++---------- epiphany-core/src/runtime_spine.rs | 2 +- 5 files changed, 27 insertions(+), 33 deletions(-) diff --git a/epiphany-core/src/bin/epiphany-swarm.rs b/epiphany-core/src/bin/epiphany-swarm.rs index a1e1fa2c..d2474654 100644 --- a/epiphany-core/src/bin/epiphany-swarm.rs +++ b/epiphany-core/src/bin/epiphany-swarm.rs @@ -135,11 +135,7 @@ fn require_resident_git(executable: &str) -> Result<()> { fn maintain_resident_runtime(args: &Args, state: &ResidentSelfState) -> Result<()> { retain_runtime_receipts(args, state)?; - retain_resident_self_lifecycles( - &args.state_store, - args.retained_closed_lifecycles, - Utc::now().timestamp_millis().max(0) as u64, - )?; + retain_resident_self_lifecycles(&args.state_store, args.retained_closed_lifecycles)?; retain_runtime_worker_attempts(args)?; Ok(()) } diff --git a/epiphany-core/src/eyes_gateway.rs b/epiphany-core/src/eyes_gateway.rs index 221af786..a572e99c 100644 --- a/epiphany-core/src/eyes_gateway.rs +++ b/epiphany-core/src/eyes_gateway.rs @@ -6,7 +6,7 @@ pub const EYES_SOURCE_LOOKUP_RECEIPT_TYPE: &str = "epiphany.eyes.source_lookup_r pub const EYES_EVIDENCE_PACKET_TYPE: &str = "epiphany.eyes.evidence_packet"; pub const EYES_SOURCE_LOOKUP_RECEIPT_SCHEMA_VERSION: &str = "epiphany.eyes.source_lookup_receipt.v0"; -pub const EYES_EVIDENCE_PACKET_SCHEMA_VERSION: &str = "epiphany.eyes.evidence_packet.v1"; +pub const EYES_EVIDENCE_PACKET_SCHEMA_VERSION: &str = "epiphany.eyes.evidence_packet.v2"; #[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] #[cultcache( @@ -58,26 +58,24 @@ pub struct EyesEvidencePacket { #[cultcache(key = 3)] pub source_job_id: String, #[cultcache(key = 4)] - pub source_role_id: String, - #[cultcache(key = 5)] pub evidence_ids: Vec, - #[cultcache(key = 6)] + #[cultcache(key = 5)] pub observation_ids: Vec, - #[cultcache(key = 7)] + #[cultcache(key = 6)] pub source_refs: Vec, - #[cultcache(key = 8)] + #[cultcache(key = 7)] pub summary: String, - #[cultcache(key = 9)] + #[cultcache(key = 8)] pub uncertainty: String, - #[cultcache(key = 10)] + #[cultcache(key = 9)] pub emitted_at: String, - #[cultcache(key = 11)] + #[cultcache(key = 10)] pub contract: String, - #[cultcache(key = 12, default)] + #[cultcache(key = 11, default)] pub source_lookup_receipt_ids: Vec, - #[cultcache(key = 13)] + #[cultcache(key = 12)] pub research_request_id: String, - #[cultcache(key = 14)] + #[cultcache(key = 13)] pub decision_context_id: String, } @@ -129,7 +127,6 @@ pub fn eyes_evidence_packet_from_research_finding( packet_id, source_result_id: finding.runtime_result_id.clone().unwrap_or_default(), source_job_id: finding.runtime_job_id.clone().unwrap_or_default(), - source_role_id: "research".to_string(), evidence_ids, observation_ids, source_refs, diff --git a/epiphany-core/src/persona_social_state.rs b/epiphany-core/src/persona_social_state.rs index 07fc9b87..b74106aa 100644 --- a/epiphany-core/src/persona_social_state.rs +++ b/epiphany-core/src/persona_social_state.rs @@ -21,7 +21,6 @@ pub const PERSONA_CONVERSATION_RETENTION_PLAN_SCHEMA_VERSION: &str = pub struct PersonaSocialMention { pub id: String, pub target_role_id: String, - pub target_agent_id: String, pub source_surface: String, pub channel_id: String, pub message_id: String, @@ -146,7 +145,7 @@ pub struct PersonaTurnBlockedEvidence { pub bridge_receipt_sha256: Option, } -pub const PERSONA_SOCIAL_MENTION_TYPE: &str = "epiphany.persona.social_mention.v1"; +pub const PERSONA_SOCIAL_MENTION_TYPE: &str = "epiphany.persona.social_mention.v2"; pub const PERSONA_SOCIAL_TURN_REQUEST_TYPE: &str = "epiphany.persona.turn_request.v1"; pub const PERSONA_SOCIAL_TURN_TERMINAL_TYPE: &str = "epiphany.persona.turn_terminal.v1"; pub const PERSONA_SOCIAL_RETENTION_HEAD_TYPE: &str = "epiphany.persona.retention_head.v1"; @@ -175,7 +174,7 @@ pub struct PersonaSocialQueueMentionOptions { #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache( - type = "epiphany.persona.social_mention.v1", + type = "epiphany.persona.social_mention.v2", schema = "PersonaSocialMentionDocument" )] pub struct PersonaSocialMentionDocument { @@ -234,6 +233,11 @@ pub fn persona_social_cache(store_path: impl AsRef) -> Result { register_persona_social_types(&mut cache)?; let mut identities = HashSet::new(); for envelope in SingleFileMessagePackBackingStore::new(store_path.as_ref()).pull_all()? { + if envelope.r#type == "epiphany.persona.social_mention.v1" { + return Err(anyhow!( + "Persona social store contains an obsolete writable mention epoch" + )); + } if !is_persona_social_type(&envelope.r#type) { continue; } @@ -289,7 +293,6 @@ pub fn queue_persona_social_mention( mention: PersonaSocialMention { id: mention_id.clone(), target_role_id: options.target_role_id.clone(), - target_agent_id: "epiphany.Persona".into(), source_surface: options.source_surface, channel_id: options.channel_id, message_id: options.message_id, diff --git a/epiphany-core/src/resident_self.rs b/epiphany-core/src/resident_self.rs index 692cd8bf..896c2161 100644 --- a/epiphany-core/src/resident_self.rs +++ b/epiphany-core/src/resident_self.rs @@ -8,7 +8,7 @@ use std::collections::{BTreeSet, HashSet}; use std::path::{Path, PathBuf}; pub const RESIDENT_SELF_STATE_KEY: &str = "resident-self"; -pub const RESIDENT_SELF_STATE_SCHEMA_VERSION: &str = "epiphany.resident_self.state.v2"; +pub const RESIDENT_SELF_STATE_SCHEMA_VERSION: &str = "epiphany.resident_self.state.v3"; pub const RESIDENT_SELF_PRESSURE_SCHEMA_VERSION: &str = "epiphany.resident_self.pressure.v0"; pub const RESIDENT_SELF_COORDINATOR_CONTINUATION_PRESSURE_KIND: &str = "coordinator-internal-continuation"; @@ -24,7 +24,7 @@ pub const RESIDENT_SELF_TERMINAL_RECEIPT_SCHEMA_VERSION: &str = "epiphany.resident_self.terminal_receipt.v1"; pub const RESIDENT_SELF_CHILD_CLAIM_SCHEMA_VERSION: &str = "epiphany.resident_self.child_claim.v0"; pub const RESIDENT_SELF_RETENTION_HEAD_SCHEMA_VERSION: &str = - "epiphany.resident_self.retention_head.v0"; + "epiphany.resident_self.retention_head.v1"; pub const RESIDENT_SELF_RETENTION_HEAD_KEY: &str = "resident-self-retention"; #[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] @@ -239,7 +239,7 @@ pub struct ResidentSelfChildClaim { #[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] #[cultcache( - type = "epiphany.resident_self.retention_head.v0", + type = "epiphany.resident_self.retention_head.v1", schema = "ResidentSelfRetentionHead" )] pub struct ResidentSelfRetentionHead { @@ -253,9 +253,7 @@ pub struct ResidentSelfRetentionHead { pub retired_envelope_count: u64, #[cultcache(key = 4)] pub retired_chain_digest: String, - #[cultcache(key = 5)] - pub retained_at_millis: u64, - #[cultcache(key = 6, default)] + #[cultcache(key = 5, default)] pub private_state_exposed: bool, } @@ -766,7 +764,9 @@ fn state_cache(path: &Path) -> Result { for envelope in SingleFileMessagePackBackingStore::new(path).pull_all()? { if matches!( envelope.r#type.as_str(), - "epiphany.resident_self.heartbeat_grant.v0" | "epiphany.resident_self.terminal_ack.v0" + "epiphany.resident_self.heartbeat_grant.v0" + | "epiphany.resident_self.terminal_ack.v0" + | "epiphany.resident_self.retention_head.v0" ) { return Err(anyhow!( "resident Self store contains a pre-cut heartbeat lifecycle document" @@ -2529,7 +2529,6 @@ pub fn resident_self_terminal_receipts(path: &Path) -> Result Result> { let cache = state_cache(path)?; let state = cache @@ -2671,7 +2670,6 @@ pub fn retain_resident_self_lifecycles( head.retired_envelope_count + deletions.len() as u64 }), retired_chain_digest: digest_parts(digest_inputs), - retained_at_millis: now_millis, private_state_exposed: false, }; let (replacement, _) = cache.prepare_entry(RESIDENT_SELF_RETENTION_HEAD_KEY, &head)?; @@ -2715,7 +2713,7 @@ mod pressure_replay_tests { let store = temp.path().join("resident.cc"); let cache = state_cache(&store)?; let mut state = ResidentSelfState::default(); - state.schema_version = "epiphany.resident_self.state.v1".into(); + state.schema_version = "epiphany.resident_self.state.v2".into(); SingleFileMessagePackBackingStore::new(&store) .push(&cache.prepare_entry(RESIDENT_SELF_STATE_KEY, &state)?.0)?; let before = std::fs::read(&store)?; diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index bf12654d..722137f8 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -85,7 +85,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v26"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v27"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; pub const RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.model_execution_binding.v0"; From cec8a0db1c3bfb2f3894ff31dcf9b0fa04c07ffb Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 06:27:35 +0200 Subject: [PATCH 042/340] Record routing cargo hard cut --- notes/epiphany-current-algorithmic-map.md | 23 +++++++++++--- notes/epiphany-fork-implementation-plan.md | 7 +++++ notes/fresh-workspace-handoff.md | 34 +++++++++++++++------ state/ledgers.msgpack | Bin 705804 -> 706679 bytes state/map.yaml | 7 +++-- 5 files changed, 53 insertions(+), 18 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 776611d9..64f43f8a 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `2a435eb5` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for singular Persona/tool provenance; +Latest committed implementation cut: `ffd91c20` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for fixed routing/retention cargo removal; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -33,7 +33,7 @@ Mind/runtime receipts own decisions and lifecycle identity; keyed RepoModel documents own repository structure; scratch and retrieval inputs belong to sealed reasoning passes. Two callerless OpenAI-runtime mouths and eight definition-only type constants are also gone. The cut is 291 pure deletions; -the state-model crate is 398 lines. It does not touch the still-unrun Atlas +the state-model crate is 366 lines. It does not touch the still-unrun Atlas inter-swarm path. Provider observability is typed consequence, not a no-op callback shelf. Exact @@ -50,8 +50,21 @@ and removes a linked-event vector that repeated `effect_document_id` plus a relationship slot every producer left empty. The memory keeps the exact Interpreter effect document and decision context. Tool receipts advance to v1 and remove an always-empty raw-result reference; exact result JSON or error is -the receipt consequence. Mind/runtime writable epochs are v10/v26, and old -stores refuse rather than inheriting the retired shapes. +the receipt consequence. Mind/runtime writable epochs were v10/v26 at that +cut, and old stores refuse rather than inheriting the retired shapes. + +Routing identity lives at the owner, not in every payload. Exact `ffd91c20` +deletes the fixed Research role from Eyes evidence packets because their typed +family plus request and decision-context identities already own provenance. It +deletes the fixed Epiphany Persona agent label from each social mention because +the Persona-only queue and immutable turn request own routing. Resident Self +retention keeps cumulative lifecycle/envelope counts and its exact chained +deletion digest; it no longer accepts a clock merely to persist an unread +timestamp outside that chain. The live shapes are Eyes evidence packet v2, +Persona social mention v2, Resident Self state v3/retention head v1, and +Mind/runtime v10/v27. Model Atlas is unchanged and remains unaccepted until a +live inter-swarm exchange exercises publication, transport, verification, +admission, wake, and withdrawal end to end. CultMesh contains no JSON-derived operator snapshot, coordinator receipt, Hands gate, role-review event, unauthenticated Odin/Eve provider row, or daemon diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 73f14948..fa918bb5 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -350,6 +350,13 @@ Cut in this order: deleting duplicate effect-event provenance, an always-empty relationship, and an always-empty raw-result reference. Mind/runtime epochs are v10/v26; old writable stores refuse without migration. + Exact `ffd91c20` deletes three more derived fields: the fixed Research role + from Eyes packets, the fixed Epiphany Persona agent from queued mentions, + and the unread Resident Self retention timestamp. Their owning request/ + context, Persona queue/turn request, and chained retention digest remain. + Eyes packet v2, Persona mention v2, Resident Self state v3/retention head v1, + and runtime v27 form the hard cut. Model Atlas remains intact for its first + live inter-swarm collaboration run; component proofs are not acceptance. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index f4141a31..b2223363 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `2a435eb5` -Current worktree: documentation/evidence for singular Persona/tool provenance; +Latest committed implementation cut: `ffd91c20` +Current worktree: documentation/evidence for fixed routing/retention cargo removal; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `2a435eb5` is the current +production symlink body and is inactive. Exact `ffd91c20` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,20 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `ffd91c20` removes three fixed or non-causal fields outside Model Atlas. +The Eyes evidence packet no longer repeats `source_role_id = research`; its +request and decision-context identities own provenance. A Persona mention no +longer repeats `target_agent_id = epiphany.Persona`; the Persona-owned queue and +turn request own routing. Resident Self retention no longer accepts a clock +only to store an unread `retained_at_millis`; counts plus the chained deletion +digest remain the retention consequence. Eyes packet v2, Persona social mention +v2, Resident Self state v3/retention head v1, and runtime v27 form a hard cut. +Core and the swarm, model-runtime, and Persona-service entrypoints compile; +Persona admission 7/7, Persona decision/retention 5/5, keyed Modeling/Research +1/1, and both writable-epoch refusals 1/1 pass. The maintained source delta is +6 net deletions. Model Atlas is untouched. Its component proofs are not a live +inter-swarm collaboration result; that trial has not run. + Exact `2a435eb5` makes Persona-memory and tool-receipt provenance singular. Persona-memory v2 retains the exact Interpreter effect-document and decision- context IDs; its linked-event vector repeated that same effect ID and its @@ -896,13 +910,13 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action -The Ox17 deployment lane is paused. Continue the source/test-authority audit -from exact `0bb6a883`; do not compile or deploy through Idunn yet. Inspect the -remaining production modules and tests by owner, consumer, invariant, and -failure mode. Delete an abstraction with the tests that merely animate it when -it has no decision-bearing consumer. Preserve the keyed Mind, sealed reasoning, -direct Body-to-Modeling flow, family admission owners, Persona social state, -provider boundaries, and consequence-verifying receipts. +The Ox17 deployment lane is paused. Continue the registered-document and test- +liability audit from exact `ffd91c20`; do not compile or deploy through Idunn +yet. Delete an abstraction with tests that merely animate it when it has no +decision-bearing consumer. Preserve keyed Mind, sealed reasoning, direct Body- +to-Modeling flow, family admission owners, Persona social state, provider +boundaries, consequence-verifying receipts, and the complete Model Atlas +vertical slice until its first live inter-swarm collaboration trial. Yggdrasil previously exposed 96 GiB of dead native Cargo targets after interrupted full-workspace builds; exact cleanup returned the builder target diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index d82407d28d0a0542f73c5f788d6526c9faee6cb2..6869df0647b1719a8137980a5fafdaac8c9e4ba0 100644 GIT binary patch delta 830 zcmZ8f&uddb5H_jSHi95{5D^*i($Xd|ks9nf6$yB$#I`3dVceaUw`AXLy1OqwPC0lG z#DkZRe?#%$MLZPIlm0tio%dcM#ly$4yEF5B-^{#!xA*76-p4zY8|{O`gZ8T*S86}c zK0mCSS1K>xEUIr8)e0j&HyBqL*BG0O>x?bN_LoJqHn~{-o^IEc_b+Oj)%L;i)7Pzg z^NpxGMG+v5<NrH7?tf>pkJZgR;Ej`#QcqIvrf<}J`-5L4r zm>-Ow9*Q9a@HTUT`p##L`l-@ddDzK}Ba}tv+NKH~q#ESqMZyWYjlwdFO0VNKyIINdg&Rm$cJi+^ zKjZ?y2Mh$`$4xh1Yk?#u9JfljE@OcyhqOBoTbBYtf=+_SLIhUJe^hIZ%N|RPqMi?y zyUiBk%u@rN@r~7!82YFzamygYMDjJefKIa$!Scb~?c2-x_u9>Q1Vftf_>V0w1^2Sa zE{e%PtJ#YF^OP%C%chYPNy&=Z=g~kYk_h|+UAhlxUa-E3E*-CWSNG(`N)T}Gj@)cy tmEpb%n~r$W4LIXbr`-H Date: Mon, 24 Aug 2026 06:43:33 +0200 Subject: [PATCH 043/340] Delete duplicate provider stream persistence --- Cargo.toml | 2 +- epiphany-core/src/reasoning_context.rs | 14 --- epiphany-core/src/runtime_spine.rs | 71 +------------- epiphany-openai-adapter/src/lib.rs | 29 +----- epiphany-openai-codex-spine/src/lib.rs | 2 - .../src/bin/epiphany-model-runtime.rs | 1 - .../src/bin/epiphany-openai-runtime.rs | 2 - epiphany-openai-runtime/src/lib.rs | 27 +----- notes/codex-auth-spine-inventory.md | 25 +++-- .../epiphany.openai-model-receipt.schema.json | 18 ---- ...hany.openai-model-stream-event.schema.json | 93 ------------------- schemas/cultnet/index.json | 22 ----- 12 files changed, 18 insertions(+), 288 deletions(-) delete mode 100644 epiphany-openai-runtime/src/bin/epiphany-model-runtime.rs delete mode 100644 schemas/cultnet/epiphany.openai-model-receipt.schema.json delete mode 100644 schemas/cultnet/epiphany.openai-model-stream-event.schema.json diff --git a/Cargo.toml b/Cargo.toml index 4f7c6291..899cee5c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -99,7 +99,7 @@ path = "epiphany-core/src/bin/epiphany-mvp-coordinator.rs" [[bin]] name = "epiphany-model-runtime" -path = "epiphany-openai-runtime/src/bin/epiphany-model-runtime.rs" +path = "epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs" required-features = ["openai-runtime"] [[bin]] diff --git a/epiphany-core/src/reasoning_context.rs b/epiphany-core/src/reasoning_context.rs index 597001ba..b231d3ce 100644 --- a/epiphany-core/src/reasoning_context.rs +++ b/epiphany-core/src/reasoning_context.rs @@ -2330,26 +2330,12 @@ mod tests { text: "optional transcript".into(), }, }; - let provider_delta = epiphany_openai_adapter::EpiphanyOpenAiStreamEvent { - schema_id: epiphany_openai_adapter::OPENAI_ADAPTER_EVENT_SCHEMA_ID.into(), - request_id: terminal_native.request_id.clone(), - sequence: 0, - payload: epiphany_openai_adapter::EpiphanyOpenAiStreamPayload::TextDelta { - text: "optional transcript".into(), - }, - }; cache = runtime_spine_cache(&store)?; cache.put("request-2:00000000", &native_delta)?; - cache.put("request-2:00000000", &provider_delta)?; assert!( cache .delete::("request-2:00000000")? ); - assert!( - cache.delete::( - "request-2:00000000" - )? - ); cache.pull_all_backing_stores()?; let retained = cache .get::(&context.context_id)? diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index 722137f8..885d521c 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -50,10 +50,7 @@ use epiphany_model_adapter::EpiphanyModelReceipt; use epiphany_model_adapter::EpiphanyModelRequest; use epiphany_model_adapter::EpiphanyModelStreamEvent; use epiphany_model_adapter::EpiphanyModelStreamPayload; -use epiphany_openai_adapter::EpiphanyOpenAiModelReceipt; use epiphany_openai_adapter::EpiphanyOpenAiModelRequest; -use epiphany_openai_adapter::EpiphanyOpenAiStreamEvent; -use epiphany_openai_adapter::EpiphanyOpenAiStreamPayload; use epiphany_tool_adapter::EpiphanyToolInvocationIntent; use epiphany_tool_adapter::EpiphanyToolInvocationReceipt; use epiphany_tool_adapter::TOOL_ADAPTER_INVOCATION_INTENT_SCHEMA_ID; @@ -85,7 +82,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v27"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v28"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; pub const RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.model_execution_binding.v0"; @@ -860,8 +857,6 @@ fn runtime_spine_schema_cache() -> Result { cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; - cache.register_entry_type::()?; - cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; @@ -2137,31 +2132,12 @@ fn archive_completed_model_session( ) }) .collect::>(); - let mut provider_events = cache - .get_all::()? - .into_iter() - .filter(|event| event.request_id == *request_id) - .collect::>(); - provider_events.sort_by_key(|event| event.sequence); - let provider_terminals = provider_events - .iter() - .filter(|event| { - matches!( - &event.payload, - EpiphanyOpenAiStreamPayload::Completed { .. } - | EpiphanyOpenAiStreamPayload::Failed { .. } - ) - }) - .collect::>(); if native_terminals.len() != 1 - || provider_terminals.len() != 1 || native_events.last().map(|event| event.sequence) != native_terminals.first().map(|event| event.sequence) - || provider_events.last().map(|event| event.sequence) - != provider_terminals.first().map(|event| event.sequence) { return Err(anyhow!( - "runtime session archive requires one native and provider terminal stream event" + "runtime session archive requires one terminal model stream event" )); } match &native_terminals[0].payload { @@ -2181,30 +2157,6 @@ fn archive_completed_model_session( } _ => unreachable!("terminal event filtered above"), } - match &provider_terminals[0].payload { - EpiphanyOpenAiStreamPayload::Completed { receipt } => { - if cache - .get::(request_id)? - .as_ref() - != Some(receipt) - { - return Err(anyhow!( - "runtime session archive found inconsistent provider model receipt" - )); - } - } - EpiphanyOpenAiStreamPayload::Failed { .. } => { - if cache - .get::(request_id)? - .is_some() - { - return Err(anyhow!( - "failed provider model stream retained a success receipt" - )); - } - } - _ => unreachable!("terminal event filtered above"), - } } let mut tool_bindings = cache @@ -2295,16 +2247,6 @@ fn archive_completed_model_session( format!("{}:{:08}", event.request_id, event.sequence), )); } - for event in cache - .get_all::()? - .into_iter() - .filter(|event| event.request_id == binding.request_id) - { - retired_identities.insert(( - EpiphanyOpenAiStreamEvent::TYPE.to_string(), - format!("{}:{:08}", event.request_id, event.sequence), - )); - } if cache .get::(&binding.request_id)? .is_some() @@ -2314,15 +2256,6 @@ fn archive_completed_model_session( binding.request_id.clone(), )); } - if cache - .get::(&binding.request_id)? - .is_some() - { - retired_identities.insert(( - EpiphanyOpenAiModelReceipt::TYPE.to_string(), - binding.request_id.clone(), - )); - } } for binding in &tool_bindings { retired_identities.insert(( diff --git a/epiphany-openai-adapter/src/lib.rs b/epiphany-openai-adapter/src/lib.rs index 52b7bcd3..2bb7ee0a 100644 --- a/epiphany-openai-adapter/src/lib.rs +++ b/epiphany-openai-adapter/src/lib.rs @@ -4,8 +4,6 @@ use serde::Deserialize; use serde::Serialize; pub const OPENAI_ADAPTER_REQUEST_SCHEMA_ID: &str = "epiphany.openai_model_request.v1"; -pub const OPENAI_ADAPTER_EVENT_SCHEMA_ID: &str = "epiphany.openai_model_stream_event.v0"; -pub const OPENAI_ADAPTER_RECEIPT_SCHEMA_ID: &str = "epiphany.openai_model_receipt.v0"; #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] pub enum EpiphanyOpenAiWireDialect { Responses, @@ -164,19 +162,10 @@ pub enum EpiphanyOpenAiInputItem { }, } -#[derive(Debug, Clone, PartialEq, DatabaseEntry)] -#[cultcache( - type = "epiphany.openai_model_stream_event.v0", - schema = "EpiphanyOpenAiStreamEvent" -)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct EpiphanyOpenAiStreamEvent { - #[cultcache(key = 0)] - pub schema_id: String, - #[cultcache(key = 1)] pub request_id: String, - #[cultcache(key = 2)] pub sequence: u64, - #[cultcache(key = 3)] pub payload: EpiphanyOpenAiStreamPayload, } @@ -201,34 +190,20 @@ pub enum EpiphanyOpenAiStreamPayload { }, } -#[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] -#[cultcache( - type = "epiphany.openai_model_receipt.v0", - schema = "EpiphanyOpenAiModelReceipt" -)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct EpiphanyOpenAiModelReceipt { - #[cultcache(key = 0)] - pub schema_id: String, - #[cultcache(key = 1)] pub request_id: String, - #[cultcache(key = 2)] pub model: String, - #[cultcache(key = 3, default)] pub response_id: Option, - #[cultcache(key = 4, default)] pub input_tokens: Option, - #[cultcache(key = 5, default)] pub output_tokens: Option, - #[cultcache(key = 6, default)] pub reasoning_output_tokens: Option, - #[cultcache(key = 7, default)] pub transport: Option, } impl EpiphanyOpenAiModelReceipt { pub fn new(request_id: impl Into, model: impl Into) -> Self { Self { - schema_id: OPENAI_ADAPTER_RECEIPT_SCHEMA_ID.to_string(), request_id: request_id.into(), model: model.into(), response_id: None, diff --git a/epiphany-openai-codex-spine/src/lib.rs b/epiphany-openai-codex-spine/src/lib.rs index 7dcfee54..2c9ec7c7 100644 --- a/epiphany-openai-codex-spine/src/lib.rs +++ b/epiphany-openai-codex-spine/src/lib.rs @@ -462,7 +462,6 @@ fn push_openrouter_event( payload: EpiphanyOpenAiStreamPayload, ) { events.push(EpiphanyOpenAiStreamEvent { - schema_id: epiphany_openai_adapter::OPENAI_ADAPTER_EVENT_SCHEMA_ID.to_string(), request_id: request_id.to_string(), sequence: events.len() as u64, payload, @@ -1211,7 +1210,6 @@ impl EpiphanyResponsesStreamState { fn push_payload(&mut self, payload: EpiphanyOpenAiStreamPayload) { self.events.push(EpiphanyOpenAiStreamEvent { - schema_id: epiphany_openai_adapter::OPENAI_ADAPTER_EVENT_SCHEMA_ID.to_string(), request_id: self.request_id.clone(), sequence: self.sequence, payload, diff --git a/epiphany-openai-runtime/src/bin/epiphany-model-runtime.rs b/epiphany-openai-runtime/src/bin/epiphany-model-runtime.rs deleted file mode 100644 index 00d98da6..00000000 --- a/epiphany-openai-runtime/src/bin/epiphany-model-runtime.rs +++ /dev/null @@ -1 +0,0 @@ -include!("epiphany-openai-runtime.rs"); diff --git a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs index 475eb7ef..20ca5678 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs @@ -1456,7 +1456,6 @@ mod tests { &model_request, &[ EpiphanyOpenAiStreamEvent { - schema_id: epiphany_openai_adapter::OPENAI_ADAPTER_EVENT_SCHEMA_ID.to_string(), request_id: request_id.to_string(), sequence: 0, payload: EpiphanyOpenAiStreamPayload::ToolCall { @@ -1466,7 +1465,6 @@ mod tests { }, }, EpiphanyOpenAiStreamEvent { - schema_id: epiphany_openai_adapter::OPENAI_ADAPTER_EVENT_SCHEMA_ID.to_string(), request_id: request_id.to_string(), sequence: 1, payload: EpiphanyOpenAiStreamPayload::Completed { receipt }, diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index e43ef6a0..b0f21b48 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -193,7 +193,6 @@ where match future.await { Ok(events) => events, Err(err) => vec![EpiphanyOpenAiStreamEvent { - schema_id: epiphany_openai_adapter::OPENAI_ADAPTER_EVENT_SCHEMA_ID.to_string(), request_id: request.request_id.clone(), sequence: 0, payload: EpiphanyOpenAiStreamPayload::Failed { @@ -368,11 +367,8 @@ fn record_openai_events( if let EpiphanyModelStreamPayload::Completed { receipt } = &model_event.payload { cache.put(model_receipt_key(&receipt.request_id), receipt)?; } - let key = openai_event_key(&event.request_id, event.sequence); - cache.put(key, event)?; match &event.payload { EpiphanyOpenAiStreamPayload::Completed { receipt: completed } => { - cache.put(openai_receipt_key(&completed.request_id), completed)?; receipt = Some(completed.clone()); } EpiphanyOpenAiStreamPayload::Failed { message } => { @@ -434,7 +430,7 @@ fn record_openai_events( verdict: verdict.to_string(), summary, result_id, - receipt_id: receipt.map(|item| openai_receipt_key(&item.request_id)), + receipt_id: receipt.map(|item| item.request_id), tool_intent_ids: tool_intents .into_iter() .map(|intent| intent.intent_id) @@ -527,7 +523,6 @@ fn push_compacted_event( payload: EpiphanyOpenAiStreamPayload, ) { compacted.push(EpiphanyOpenAiStreamEvent { - schema_id: source.schema_id.clone(), request_id: source.request_id.clone(), sequence: compacted.len() as u64, payload, @@ -1069,14 +1064,6 @@ pub fn default_options( } } -pub fn openai_event_key(request_id: &str, sequence: u64) -> String { - format!("{request_id}:{sequence:08}") -} - -pub fn openai_receipt_key(request_id: &str) -> String { - request_id.to_string() -} - pub fn model_request_key(request_id: &str) -> String { request_id.to_string() } @@ -3338,7 +3325,6 @@ mod tests { payload: EpiphanyOpenAiStreamPayload, ) -> EpiphanyOpenAiStreamEvent { EpiphanyOpenAiStreamEvent { - schema_id: epiphany_openai_adapter::OPENAI_ADAPTER_EVENT_SCHEMA_ID.to_string(), request_id: request_id.to_string(), sequence, payload, @@ -3404,7 +3390,7 @@ mod tests { } #[test] - fn records_typed_openai_documents_in_runtime_store() -> Result<()> { + fn records_one_native_model_stream_in_runtime_store() -> Result<()> { let temp = tempdir()?; let store = temp.path().join("runtime.msgpack"); let native_request = EpiphanyModelRequest::new( @@ -3438,7 +3424,6 @@ mod tests { receipt.response_id = Some("resp-1".to_string()); receipt.transport = Some("test".to_string()); let events = vec![EpiphanyOpenAiStreamEvent { - schema_id: epiphany_openai_adapter::OPENAI_ADAPTER_EVENT_SCHEMA_ID.to_string(), request_id: "req-1".to_string(), sequence: 0, payload: EpiphanyOpenAiStreamPayload::Completed { receipt }, @@ -3459,12 +3444,6 @@ mod tests { ); assert!(cache.get::("req-1")?.is_some()); assert!(cache.get::("req-1")?.is_some()); - assert!( - cache - .get::("req-1:00000000")? - .is_some() - ); - assert!(cache.get::("req-1")?.is_some()); assert_eq!( runtime_job_snapshot(&store, &options.job_id)? .expect("snapshot") @@ -3930,7 +3909,6 @@ mod tests { receipt.transport = Some("test".to_string()); let events = vec![ EpiphanyOpenAiStreamEvent { - schema_id: epiphany_openai_adapter::OPENAI_ADAPTER_EVENT_SCHEMA_ID.to_string(), request_id: "req-tools".to_string(), sequence: 0, payload: EpiphanyOpenAiStreamPayload::ToolCall { @@ -3940,7 +3918,6 @@ mod tests { }, }, EpiphanyOpenAiStreamEvent { - schema_id: epiphany_openai_adapter::OPENAI_ADAPTER_EVENT_SCHEMA_ID.to_string(), request_id: "req-tools".to_string(), sequence: 1, payload: EpiphanyOpenAiStreamPayload::Completed { receipt }, diff --git a/notes/codex-auth-spine-inventory.md b/notes/codex-auth-spine-inventory.md index 32565b8a..606fb4c2 100644 --- a/notes/codex-auth-spine-inventory.md +++ b/notes/codex-auth-spine-inventory.md @@ -146,27 +146,24 @@ making the pure document crate depend on Codex. The transport wrapper is now also in that spine. It maps typed `EpiphanyOpenAiModelRequest` documents into a local serializable Responses request body, resolves credentials through vendored `codex-login`, chooses the -ChatGPT/OpenAI base URL from auth mode, opens an HTTP Responses SSE stream with -`codex-client`, and converts stream deltas/completion into typed -`EpiphanyOpenAiStreamEvent` / `EpiphanyOpenAiModelReceipt` documents. It no +ChatGPT/OpenAI base URL from auth mode, opens the selected HTTP stream with +`codex-client`, and converts provider deltas/completion into transient +`EpiphanyOpenAiStreamEvent` / `EpiphanyOpenAiModelReceipt` values. It no longer imports Codex `ResponsesApiRequest`, `ResponsesClient`, `ResponseEvent`, provider config, model-provider, or broad app-server workflow. Its narrow direct imports preserve Codex-compatible auth identity without letting Codex own Epiphany request/state shape. -`schemas/cultnet/` contains publication schemas for OpenAI model request, -stream event, and terminal receipt. Live providers own their -CultMesh/CultNet catalogs. The native runtime accepts the document types -registered by the actual CultCache runtime schema; there is no standalone -hello/catalog CLI or hand-maintained mutation-contract mirror. +`schemas/cultnet/` publishes only the exact OpenAI-compatible provider request. +Provider stream values are normalized immediately into the native model event +and receipt family; they are not a second CultCache or CultNet authority. The native runtime route is the operator and daemon edge. -`epiphany-openai-adapter` documents -derive CultCache `DatabaseEntry`, `epiphany-core::runtime_spine_cache` -registers OpenAI request/stream-event/receipt documents, and the -outside-vendor `epiphany-openai-runtime` crate records typed OpenAI model-turn -requests, stream events, terminal receipts, runtime sessions, jobs, and job -results into the native runtime spine. Its `model-turn` command opens the +`epiphany-openai-adapter` keeps the provider request as a CultCache +`DatabaseEntry`; `epiphany-core::runtime_spine_cache` registers that request +beside the native request/event/receipt family. The outside-vendor +`epiphany-openai-runtime` records those native model documents, runtime +sessions, jobs, and job results into the runtime spine. Its model command opens the Codex-backed transport through the typed spine; its `smoke` command proves the CultCache route without touching the network. This is the first native caller for the advertised OpenAI CultNet contract. diff --git a/schemas/cultnet/epiphany.openai-model-receipt.schema.json b/schemas/cultnet/epiphany.openai-model-receipt.schema.json deleted file mode 100644 index 861c4a8d..00000000 --- a/schemas/cultnet/epiphany.openai-model-receipt.schema.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.openai-model-receipt.schema.json", - "title": "Epiphany OpenAI Model Receipt", - "type": "object", - "required": ["schema_id", "request_id", "model"], - "properties": { - "schema_id": { "const": "epiphany.openai_model_receipt.v0" }, - "request_id": { "type": "string" }, - "model": { "type": "string" }, - "response_id": { "type": ["string", "null"] }, - "input_tokens": { "type": ["integer", "null"], "minimum": 0 }, - "output_tokens": { "type": ["integer", "null"], "minimum": 0 }, - "reasoning_output_tokens": { "type": ["integer", "null"], "minimum": 0 }, - "transport": { "type": ["string", "null"] } - }, - "additionalProperties": false -} diff --git a/schemas/cultnet/epiphany.openai-model-stream-event.schema.json b/schemas/cultnet/epiphany.openai-model-stream-event.schema.json deleted file mode 100644 index 265bab5e..00000000 --- a/schemas/cultnet/epiphany.openai-model-stream-event.schema.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.openai-model-stream-event.schema.json", - "title": "Epiphany OpenAI Model Stream Event", - "type": "object", - "required": ["schema_id", "request_id", "sequence", "payload"], - "properties": { - "schema_id": { "const": "epiphany.openai_model_stream_event.v0" }, - "request_id": { "type": "string" }, - "sequence": { "type": "integer", "minimum": 0 }, - "payload": { - "oneOf": [ - { "$ref": "#/$defs/text_delta" }, - { "$ref": "#/$defs/reasoning_delta" }, - { "$ref": "#/$defs/tool_call" }, - { "$ref": "#/$defs/completed" }, - { "$ref": "#/$defs/failed" } - ] - } - }, - "additionalProperties": false, - "$defs": { - "text_delta": { - "type": "object", - "required": ["TextDelta"], - "properties": { - "TextDelta": { - "type": "object", - "required": ["text"], - "properties": { "text": { "type": "string" } }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "reasoning_delta": { - "type": "object", - "required": ["ReasoningDelta"], - "properties": { - "ReasoningDelta": { - "type": "object", - "required": ["text"], - "properties": { "text": { "type": "string" } }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "tool_call": { - "type": "object", - "required": ["ToolCall"], - "properties": { - "ToolCall": { - "type": "object", - "required": ["call_id", "name", "arguments"], - "properties": { - "call_id": { "type": "string" }, - "name": { "type": "string" }, - "arguments": { "type": "string" } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "completed": { - "type": "object", - "required": ["Completed"], - "properties": { - "Completed": { - "type": "object", - "required": ["receipt"], - "properties": { "receipt": { "$ref": "epiphany.openai-model-receipt.schema.json" } }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "failed": { - "type": "object", - "required": ["Failed"], - "properties": { - "Failed": { - "type": "object", - "required": ["message"], - "properties": { "message": { "type": "string" } }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - } -} diff --git a/schemas/cultnet/index.json b/schemas/cultnet/index.json index c8e70ac9..e63c6e86 100644 --- a/schemas/cultnet/index.json +++ b/schemas/cultnet/index.json @@ -166,28 +166,6 @@ "title": "Epiphany OpenAI Model Request", "path": "epiphany.openai-model-request.schema.json" }, - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.openai-model-stream-event.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.openai_model_stream_event.v0", - "documentType": "epiphany.openai_model_stream_event.v0", - "title": "Epiphany OpenAI Model Stream Event", - "path": "epiphany.openai-model-stream-event.schema.json" - }, - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.openai-model-receipt.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.openai_model_receipt.v0", - "documentType": "epiphany.openai_model_receipt.v0", - "title": "Epiphany OpenAI Model Receipt", - "path": "epiphany.openai-model-receipt.schema.json" - }, { "schemaId": "https://gamecult.dev/cultnet/gamecult.persona_state.v0.schema.json", "kind": "document_payload", From 3a8cd673e8133933d5ee285b2835a8163167eae3 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 06:46:43 +0200 Subject: [PATCH 044/340] Record singular model-stream ownership --- notes/epiphany-current-algorithmic-map.md | 14 +++++++++++-- notes/epiphany-fork-implementation-plan.md | 6 ++++++ notes/fresh-workspace-handoff.md | 22 +++++++++++++++++---- state/ledgers.msgpack | Bin 706679 -> 707589 bytes state/map.yaml | 9 +++++---- 5 files changed, 41 insertions(+), 10 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 64f43f8a..e1e2dccb 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `ffd91c20` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for fixed routing/retention cargo removal; +Latest committed implementation cut: `fe118e13` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for singular native model-stream ownership; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -66,6 +66,16 @@ Mind/runtime v10/v27. Model Atlas is unchanged and remains unaccepted until a live inter-swarm exchange exercises publication, transport, verification, admission, wake, and withdrawal end to end. +Provider transport is not a second state machine. Exact `fe118e13` keeps the +exact provider request as durable decision input, but makes provider events and +receipts transient values. The runtime immediately lowers each into the native +model event/receipt family that already owns tool continuation, assistant-text +reconstruction, terminal validation, and bounded retention. The provider +event/receipt CultCache registrations, archive requirements, schema IDs, and +public CultNet schemas are deleted. Runtime advances to v28; the public catalog +has 18 schemas. `epiphany-model-runtime` now points directly at its executable +body instead of compiling through an include-only shell. Atlas is untouched. + CultMesh contains no JSON-derived operator snapshot, coordinator receipt, Hands gate, role-review event, unauthenticated Odin/Eve provider row, or daemon tool directory. Native runtime and keyed Mind receipts remain the owners; old diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index fa918bb5..ba17c5b7 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -357,6 +357,12 @@ Cut in this order: Eyes packet v2, Persona mention v2, Resident Self state v3/retention head v1, and runtime v27 form the hard cut. Model Atlas remains intact for its first live inter-swarm collaboration run; component proofs are not acceptance. + Exact `fe118e13` makes provider events and receipts transient transport + values and deletes their duplicate CultCache/CultNet authority. One native + model stream/receipt family now owns continuation, reconstruction, terminal + validation, and retention; the exact provider request remains durable audit + input. Runtime advances to v28, the catalog drops to 18 schemas, and the + model-runtime include shell is gone. Atlas remains unchanged and unaccepted. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index b2223363..0e363e69 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `ffd91c20` -Current worktree: documentation/evidence for fixed routing/retention cargo removal; +Latest committed implementation cut: `fe118e13` +Current worktree: documentation/evidence for singular native model-stream ownership; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `ffd91c20` is the current +production symlink body and is inactive. Exact `fe118e13` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,20 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `fe118e13` removes the second persisted copy of every provider stream +event and terminal receipt. OpenAI/OpenRouter transport values now normalize +immediately into the native `EpiphanyModelStreamEvent` and +`EpiphanyModelReceipt` family used by tool continuation, assistant +reconstruction, terminal validation, and runtime retention. The exact provider +request remains durable in every decision context. Duplicate runtime writes, +registrations, archival validation/deletion, provider schema IDs, two public +CultNet schemas/index rows, and the include-only model-runtime shell are gone. +Runtime advances to v28 and the public catalog has 18 schemas. The cut removes +270 net maintained lines. Adapter 1/1, provider spine 14/14, reasoning context +8/8, OpenAI runtime 23/23, model entrypoint 11/11, swarm 4/4, epoch refusal +1/1, and release construction 15/15 pass. Model Atlas is untouched; its live +inter-swarm collaboration trial remains open. + Exact `ffd91c20` removes three fixed or non-causal fields outside Model Atlas. The Eyes evidence packet no longer repeats `source_role_id = research`; its request and decision-context identities own provenance. A Persona mention no @@ -911,7 +925,7 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action The Ox17 deployment lane is paused. Continue the registered-document and test- -liability audit from exact `ffd91c20`; do not compile or deploy through Idunn +liability audit from exact `fe118e13`; do not compile or deploy through Idunn yet. Delete an abstraction with tests that merely animate it when it has no decision-bearing consumer. Preserve keyed Mind, sealed reasoning, direct Body- to-Modeling flow, family admission owners, Persona social state, provider diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 6869df0647b1719a8137980a5fafdaac8c9e4ba0..9672610796ceae1ca948a26fb1cdf5290eef461b 100644 GIT binary patch delta 769 zcmY*XKWh|06!$I~leLtDLqr|~t6Xl~h{!=^^r&e>|&DiFj)bIxf!AdSy)A>2ng1hAxU)LgF}&nMd!%})G2mg%c5S}h^wP- zih!>C`z4w?5Dp0lsa2%hvnG4lzN zgmp_c6MFo>NK_AN9qU6L9sgJ8V~S+i%z?;BjqlX6u=aOm!r>k(2$fGky7KA74s-1q z2NF~AWHg9EQs_Xx(1CK~y8|}tMBrK*giA9TV&#Qo{V!%wI4Mqe?pJB08B@TQ0~ zZ@?Bi94Oo^RM^CDQuZ-vi6d}kpRWlmYssWjRY+ViT8+!(S+ga4hDtFr!oX;b{ZtuR zlV(63hReN)-7}-SJE6<~GT|ZVo$__y5$BtlJf}K?de_UhZj?{oMe{ch|Ia>&m@ z6d_ykmNbGiX_0f}wc`$~Nnv^2ki<#(=3~^F=eOaFu6k3W1C9dp;$FMlKAfGq-iEwd v9B{iETf=*Xgd3AK_Pi1PK%ESo7AetG7S%8=oh}nRc Q9f&!Am~;D7Cay Date: Mon, 24 Aug 2026 06:50:03 +0200 Subject: [PATCH 045/340] Delete dead runtime CultNet contracts --- ...phany.runtime.archived-session.schema.json | 36 ------------- .../epiphany.runtime.event.schema.json | 52 ------------------- schemas/cultnet/index.json | 22 -------- 3 files changed, 110 deletions(-) delete mode 100644 schemas/cultnet/epiphany.runtime.archived-session.schema.json delete mode 100644 schemas/cultnet/epiphany.runtime.event.schema.json diff --git a/schemas/cultnet/epiphany.runtime.archived-session.schema.json b/schemas/cultnet/epiphany.runtime.archived-session.schema.json deleted file mode 100644 index 27465dd2..00000000 --- a/schemas/cultnet/epiphany.runtime.archived-session.schema.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.runtime.archived-session.schema.json", - "title": "Epiphany Archived Runtime Session", - "description": "Permanent tombstone and evidence accumulator for one fully closed model-session execution generation.", - "type": "object", - "additionalProperties": false, - "properties": { - "schemaVersion": { "type": "string", "const": "epiphany.runtime.archived_session.v0" }, - "archiveId": { "type": "string", "minLength": 1 }, - "sessionId": { "type": "string", "minLength": 1 }, - "archivedAt": { "type": "string", "format": "date-time" }, - "jobIds": { "type": "array", "items": { "type": "string", "minLength": 1 }, "uniqueItems": true }, - "jobResultIds": { "type": "array", "items": { "type": "string", "minLength": 1 }, "uniqueItems": true }, - "modelRequestIds": { "type": "array", "items": { "type": "string", "minLength": 1 }, "uniqueItems": true }, - "toolIntentIds": { "type": "array", "items": { "type": "string", "minLength": 1 }, "uniqueItems": true }, - "terminalJobStatusCounts": { "type": "object", "additionalProperties": { "type": "integer", "minimum": 0 } }, - "retiredTypeCounts": { "type": "object", "additionalProperties": { "type": "integer", "minimum": 0 } }, - "retiredEnvelopeCount": { "type": "integer", "minimum": 1 }, - "retiredChainDigest": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" } - }, - "required": [ - "schemaVersion", - "archiveId", - "sessionId", - "archivedAt", - "jobIds", - "jobResultIds", - "modelRequestIds", - "toolIntentIds", - "terminalJobStatusCounts", - "retiredTypeCounts", - "retiredEnvelopeCount", - "retiredChainDigest" - ] -} diff --git a/schemas/cultnet/epiphany.runtime.event.schema.json b/schemas/cultnet/epiphany.runtime.event.schema.json deleted file mode 100644 index 36325bdf..00000000 --- a/schemas/cultnet/epiphany.runtime.event.schema.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.runtime.event.schema.json", - "title": "Epiphany Runtime Event", - "description": "Append-only native runtime event projection.", - "type": "object", - "additionalProperties": true, - "properties": { - "schemaVersion": { - "type": "string" - }, - "eventId": { - "type": "string" - }, - "occurredAt": { - "type": "string" - }, - "eventType": { - "type": "string" - }, - "source": { - "type": "string" - }, - "sessionId": { - "type": [ - "string", - "null" - ] - }, - "jobId": { - "type": [ - "string", - "null" - ] - }, - "summary": { - "type": "string" - }, - "metadata": { - "type": "object", - "additionalProperties": true - } - }, - "required": [ - "schemaVersion", - "eventId", - "occurredAt", - "eventType", - "source", - "summary" - ] -} diff --git a/schemas/cultnet/index.json b/schemas/cultnet/index.json index e63c6e86..0b07c971 100644 --- a/schemas/cultnet/index.json +++ b/schemas/cultnet/index.json @@ -45,17 +45,6 @@ "title": "Epiphany Runtime Tool Execution Binding", "path": "epiphany.runtime.tool-execution-binding.schema.json" }, - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.runtime.archived-session.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.runtime.archived_session.v0", - "documentType": "epiphany.runtime.archived_session", - "title": "Epiphany Archived Runtime Session", - "path": "epiphany.runtime.archived-session.schema.json" - }, { "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.runtime.job.schema.json", "kind": "document_payload", @@ -78,17 +67,6 @@ "title": "Epiphany Runtime Job Result", "path": "epiphany.runtime.job-result.schema.json" }, - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.runtime.event.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.runtime_spine.v0", - "documentType": "epiphany.runtime.event", - "title": "Epiphany Runtime Event", - "path": "epiphany.runtime.event.schema.json" - }, { "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.coordinator-run-receipt.schema.json", "kind": "document_payload", From 8bb0719bc6bdb66d7104ae1b72a4947ba823018a Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 07:03:42 +0200 Subject: [PATCH 046/340] Collapse CultNet catalog to earned boundaries --- docs/epiphany_body_whitepaper.tex | 2 +- schemas/cultnet/README.md | 19 +-- ...iphany.coordinator-run-receipt.schema.json | 37 ----- .../epiphany.model-receipt.schema.json | 19 --- .../epiphany.model-request.schema.json | 105 ------------- .../epiphany.model-stream-event.schema.json | 94 ------------ .../epiphany.runtime.identity.schema.json | 48 ------ .../epiphany.runtime.job-result.schema.json | 63 -------- .../cultnet/epiphany.runtime.job.schema.json | 40 ----- ...untime.model-execution-binding.schema.json | 27 ---- .../epiphany.runtime.session.schema.json | 40 ----- ...runtime.tool-execution-binding.schema.json | 25 --- .../cultnet/epiphany.state-ledger.schema.json | 36 ----- ...piphany.tool-invocation-intent.schema.json | 30 ---- ...iphany.tool-invocation-receipt.schema.json | 30 ---- schemas/cultnet/index.json | 143 ------------------ 16 files changed, 9 insertions(+), 749 deletions(-) delete mode 100644 schemas/cultnet/epiphany.coordinator-run-receipt.schema.json delete mode 100644 schemas/cultnet/epiphany.model-receipt.schema.json delete mode 100644 schemas/cultnet/epiphany.model-request.schema.json delete mode 100644 schemas/cultnet/epiphany.model-stream-event.schema.json delete mode 100644 schemas/cultnet/epiphany.runtime.identity.schema.json delete mode 100644 schemas/cultnet/epiphany.runtime.job-result.schema.json delete mode 100644 schemas/cultnet/epiphany.runtime.job.schema.json delete mode 100644 schemas/cultnet/epiphany.runtime.model-execution-binding.schema.json delete mode 100644 schemas/cultnet/epiphany.runtime.session.schema.json delete mode 100644 schemas/cultnet/epiphany.runtime.tool-execution-binding.schema.json delete mode 100644 schemas/cultnet/epiphany.state-ledger.schema.json delete mode 100644 schemas/cultnet/epiphany.tool-invocation-intent.schema.json delete mode 100644 schemas/cultnet/epiphany.tool-invocation-receipt.schema.json diff --git a/docs/epiphany_body_whitepaper.tex b/docs/epiphany_body_whitepaper.tex index 973b94bb..a857393c 100644 --- a/docs/epiphany_body_whitepaper.tex +++ b/docs/epiphany_body_whitepaper.tex @@ -170,7 +170,7 @@ publication, sealed forensic artifacts, or named quarantine experiments. the Body. It imports and registers: \begin{itemize} - \item runtime identity, session, job, job-result, and event records; + \item runtime identity, session, job, and job-result records; \item worker launch requests and role/reorient worker result documents; \item model adapter, OpenAI adapter, and tool adapter documents; \item sealed reasoning bases, decision contexts, typed pass failures, and diff --git a/schemas/cultnet/README.md b/schemas/cultnet/README.md index 405b6aba..30c1a711 100644 --- a/schemas/cultnet/README.md +++ b/schemas/cultnet/README.md @@ -16,20 +16,17 @@ verbs. - `index.json`: publication manifest for providers that expose these contracts. - `*.schema.json`: top-level JSON Schema receipts for payload/document shapes. -The payload receipts are deliberately practical rather than religiously -exhaustive. They publish the stable top-level structure Aquarium needs for -inspection, visualization, and control without pretending every nested app -server object deserves to be duplicated into a second baroque schema maze. +The catalog contains only contracts that cross an owned boundary. Runtime-local +CultCache documents are discovered from the runtime's native registration and +projected by their owning CultMesh provider. They are not copied into a second +hand-maintained JSON registry. ## Main Families -- `epiphany.runtime.*`: native runtime-spine identity, session, job, job - result, and event documents. -- keyed Mind documents and `epiphany.state-ledger`: durable typed state and - exact decision/commit receipts the runtime lives on. -- model, tool, and provider-boundary contracts used by the native runtime. -- `gamecult.persona_state.v0` and `epiphany.work_organ_state.v0`: portable - state contracts whose owners may live outside this repository. +- `epiphany.openai_model_request.v1`: the exact provider request crossing the + OpenAI-compatible transport boundary. +- `gamecult.persona_state.v0`: portable public Persona state. +- `epiphany.work_organ_state.v0`: portable state for lean work organs. The catalog publishes contracts the executable body actually produces or consumes. Editor capabilities are provider-owned CultMesh/Eve surfaces, not diff --git a/schemas/cultnet/epiphany.coordinator-run-receipt.schema.json b/schemas/cultnet/epiphany.coordinator-run-receipt.schema.json deleted file mode 100644 index 00f061b5..00000000 --- a/schemas/cultnet/epiphany.coordinator-run-receipt.schema.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.coordinator-run-receipt.schema.json", - "title": "Epiphany Coordinator Run Receipt", - "description": "Typed terminal decision and exact resident-launch provenance emitted by the local coordinator. Operator artifacts remain non-authoritative projections.", - "type": "object", - "required": [ - "schema_version", - "receipt_id", - "session_id", - "thread_id", - "mode", - "status", - "final_action", - "created_at" - ], - "properties": { - "schema_version": { "const": "epiphany.coordinator_run_receipt.v1" }, - "receipt_id": { "type": "string" }, - "session_id": { "type": "string" }, - "thread_id": { "type": "string" }, - "mode": { "enum": ["plan", "execute"] }, - "status": { "type": "string" }, - "final_action": { "type": "string" }, - "final_reason": { "type": ["string", "null"] }, - "created_at": { "type": "string" }, - "resident_grant_id": { "type": ["string", "null"] }, - "resident_launch_digest": { "type": ["string", "null"] }, - "resident_policy_digest": { "type": ["string", "null"] }, - "resident_argv_digest": { "type": ["string", "null"] }, - "resident_objective_digest": { "type": ["string", "null"] }, - "resident_release_commit": { "type": ["string", "null"] }, - "resident_release_manifest_digest": { "type": ["string", "null"] }, - "resident_executable_digest": { "type": ["string", "null"] } - }, - "additionalProperties": false -} diff --git a/schemas/cultnet/epiphany.model-receipt.schema.json b/schemas/cultnet/epiphany.model-receipt.schema.json deleted file mode 100644 index 314f1094..00000000 --- a/schemas/cultnet/epiphany.model-receipt.schema.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.model-receipt.schema.json", - "title": "Epiphany Model Receipt", - "type": "object", - "required": ["schema_id", "request_id", "provider", "model"], - "properties": { - "schema_id": { "const": "epiphany.model_receipt.v0" }, - "request_id": { "type": "string" }, - "provider": { "type": "string" }, - "model": { "type": "string" }, - "provider_response_id": { "type": ["string", "null"] }, - "input_tokens": { "type": ["integer", "null"], "minimum": 0 }, - "output_tokens": { "type": ["integer", "null"], "minimum": 0 }, - "reasoning_output_tokens": { "type": ["integer", "null"], "minimum": 0 }, - "transport": { "type": ["string", "null"] } - }, - "additionalProperties": false -} diff --git a/schemas/cultnet/epiphany.model-request.schema.json b/schemas/cultnet/epiphany.model-request.schema.json deleted file mode 100644 index 8474b826..00000000 --- a/schemas/cultnet/epiphany.model-request.schema.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.model-request.schema.json", - "title": "Epiphany Model Request", - "type": "object", - "required": ["schema_id", "request_id", "conversation_id", "provider", "model", "instructions", "input"], - "properties": { - "schema_id": { "const": "epiphany.model_request.v0" }, - "request_id": { "type": "string" }, - "conversation_id": { "type": "string" }, - "provider": { "type": "string" }, - "model": { "type": "string" }, - "instructions": { "type": "string" }, - "input": { - "type": "array", - "items": { "$ref": "#/$defs/input_item" } - }, - "reasoning_effort": { "type": ["string", "null"] }, - "reasoning_summary": { "type": ["string", "null"] }, - "service_tier": { "type": ["string", "null"] }, - "output_contract_id": { "type": ["string", "null"] }, - "previous_response_id": { "type": ["string", "null"] }, - "tools": { - "type": "array", - "items": { - "type": "object", - "required": ["name", "description", "parameters_json"], - "properties": { - "name": { "type": "string" }, - "description": { "type": "string" }, - "parameters_json": { "type": "string" } - }, - "additionalProperties": false - } - }, - "output_schema_json": { "type": ["string", "null"] }, - "source_worker_job_id": { "type": ["string", "null"] } - }, - "additionalProperties": false, - "$defs": { - "input_item": { - "oneOf": [ - { - "type": "object", - "required": ["ToolCall"], - "properties": { - "ToolCall": { - "type": "object", - "required": ["call_id", "name", "arguments"], - "properties": { - "call_id": { "type": "string" }, - "name": { "type": "string" }, - "arguments": { "type": "string" } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": ["UserText"], - "properties": { - "UserText": { - "type": "object", - "required": ["text"], - "properties": { "text": { "type": "string" } }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": ["AssistantText"], - "properties": { - "AssistantText": { - "type": "object", - "required": ["text"], - "properties": { "text": { "type": "string" } }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": ["ToolResult"], - "properties": { - "ToolResult": { - "type": "object", - "required": ["call_id", "output"], - "properties": { - "call_id": { "type": "string" }, - "output": { "type": "string" } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - ] - } - } -} diff --git a/schemas/cultnet/epiphany.model-stream-event.schema.json b/schemas/cultnet/epiphany.model-stream-event.schema.json deleted file mode 100644 index 0ab9e1b5..00000000 --- a/schemas/cultnet/epiphany.model-stream-event.schema.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.model-stream-event.schema.json", - "title": "Epiphany Model Stream Event", - "type": "object", - "required": ["schema_id", "request_id", "provider", "sequence", "payload"], - "properties": { - "schema_id": { "const": "epiphany.model_stream_event.v0" }, - "request_id": { "type": "string" }, - "provider": { "type": "string" }, - "sequence": { "type": "integer", "minimum": 0 }, - "payload": { - "oneOf": [ - { "$ref": "#/$defs/text_delta" }, - { "$ref": "#/$defs/reasoning_delta" }, - { "$ref": "#/$defs/tool_call" }, - { "$ref": "#/$defs/completed" }, - { "$ref": "#/$defs/failed" } - ] - } - }, - "additionalProperties": false, - "$defs": { - "text_delta": { - "type": "object", - "required": ["TextDelta"], - "properties": { - "TextDelta": { - "type": "object", - "required": ["text"], - "properties": { "text": { "type": "string" } }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "reasoning_delta": { - "type": "object", - "required": ["ReasoningDelta"], - "properties": { - "ReasoningDelta": { - "type": "object", - "required": ["text"], - "properties": { "text": { "type": "string" } }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "tool_call": { - "type": "object", - "required": ["ToolCall"], - "properties": { - "ToolCall": { - "type": "object", - "required": ["call_id", "name", "arguments"], - "properties": { - "call_id": { "type": "string" }, - "name": { "type": "string" }, - "arguments": { "type": "string" } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "completed": { - "type": "object", - "required": ["Completed"], - "properties": { - "Completed": { - "type": "object", - "required": ["receipt"], - "properties": { "receipt": { "$ref": "epiphany.model-receipt.schema.json" } }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "failed": { - "type": "object", - "required": ["Failed"], - "properties": { - "Failed": { - "type": "object", - "required": ["message"], - "properties": { "message": { "type": "string" } }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - } -} diff --git a/schemas/cultnet/epiphany.runtime.identity.schema.json b/schemas/cultnet/epiphany.runtime.identity.schema.json deleted file mode 100644 index 1758fb02..00000000 --- a/schemas/cultnet/epiphany.runtime.identity.schema.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.runtime.identity.schema.json", - "title": "Epiphany Runtime Identity", - "description": "Identity record for the native Epiphany runtime spine.", - "type": "object", - "additionalProperties": true, - "properties": { - "schemaVersion": { - "type": "string", - "description": "Runtime identity payload version." - }, - "runtimeId": { - "type": "string" - }, - "displayName": { - "type": "string" - }, - "runtimeKind": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "supportedDocumentTypes": { - "type": "array", - "items": { - "type": "string" - } - }, - "metadata": { - "type": "object", - "additionalProperties": true - } - }, - "required": [ - "schemaVersion", - "runtimeId", - "displayName", - "runtimeKind", - "createdAt", - "updatedAt", - "supportedDocumentTypes" - ] -} diff --git a/schemas/cultnet/epiphany.runtime.job-result.schema.json b/schemas/cultnet/epiphany.runtime.job-result.schema.json deleted file mode 100644 index 7c1ba9b7..00000000 --- a/schemas/cultnet/epiphany.runtime.job-result.schema.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.runtime.job-result.schema.json", - "title": "Epiphany Runtime Job Result", - "description": "Reviewable runtime-spine job result.", - "type": "object", - "additionalProperties": true, - "properties": { - "schemaVersion": { - "type": "string" - }, - "resultId": { - "type": "string" - }, - "jobId": { - "type": "string" - }, - "sessionId": { - "type": "string" - }, - "role": { - "type": "string" - }, - "verdict": { - "type": "string" - }, - "summary": { - "type": "string" - }, - "completedAt": { - "type": "string" - }, - "nextSafeMove": { - "type": "string" - }, - "evidenceRefs": { - "type": "array", - "items": { - "type": "string" - } - }, - "artifactRefs": { - "type": "array", - "items": { - "type": "string" - } - }, - "metadata": { - "type": "object", - "additionalProperties": true - } - }, - "required": [ - "schemaVersion", - "resultId", - "jobId", - "sessionId", - "role", - "verdict", - "summary", - "completedAt" - ] -} diff --git a/schemas/cultnet/epiphany.runtime.job.schema.json b/schemas/cultnet/epiphany.runtime.job.schema.json deleted file mode 100644 index 92509000..00000000 --- a/schemas/cultnet/epiphany.runtime.job.schema.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.runtime.job.schema.json", - "title": "Epiphany Runtime Job", - "description": "Native runtime-spine job state.", - "type": "object", - "additionalProperties": false, - "properties": { - "schemaVersion": { - "type": "string" - }, - "jobId": { - "type": "string" - }, - "sessionId": { - "type": "string" - }, - "role": { - "type": "string" - }, - "status": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "schemaVersion", - "jobId", - "sessionId", - "role", - "status", - "createdAt", - "updatedAt" - ] -} diff --git a/schemas/cultnet/epiphany.runtime.model-execution-binding.schema.json b/schemas/cultnet/epiphany.runtime.model-execution-binding.schema.json deleted file mode 100644 index 03067621..00000000 --- a/schemas/cultnet/epiphany.runtime.model-execution-binding.schema.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.runtime.model-execution-binding.schema.json", - "title": "Epiphany Runtime Model Execution Binding", - "description": "Immutable ownership edge from one native/provider model request pair to its runtime session and job.", - "type": "object", - "additionalProperties": false, - "properties": { - "schemaVersion": { "type": "string", "const": "epiphany.runtime.model_execution_binding.v0" }, - "bindingId": { "type": "string", "minLength": 1 }, - "requestId": { "type": "string", "minLength": 1 }, - "sessionId": { "type": "string", "minLength": 1 }, - "jobId": { "type": "string", "minLength": 1 }, - "provider": { "type": "string", "minLength": 1 }, - "boundAt": { "type": "string", "format": "date-time" }, - "sourceWorkerJobId": { "type": ["string", "null"] } - }, - "required": [ - "schemaVersion", - "bindingId", - "requestId", - "sessionId", - "jobId", - "provider", - "boundAt" - ] -} diff --git a/schemas/cultnet/epiphany.runtime.session.schema.json b/schemas/cultnet/epiphany.runtime.session.schema.json deleted file mode 100644 index c569faa4..00000000 --- a/schemas/cultnet/epiphany.runtime.session.schema.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.runtime.session.schema.json", - "title": "Epiphany Runtime Session", - "description": "Native runtime-spine session state.", - "type": "object", - "additionalProperties": false, - "properties": { - "schemaVersion": { - "type": "string" - }, - "sessionId": { - "type": "string" - }, - "objective": { - "type": "string" - }, - "status": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "updatedAt": { - "type": "string" - }, - "coordinatorNote": { - "type": "string" - } - }, - "required": [ - "schemaVersion", - "sessionId", - "objective", - "status", - "createdAt", - "updatedAt", - "coordinatorNote" - ] -} diff --git a/schemas/cultnet/epiphany.runtime.tool-execution-binding.schema.json b/schemas/cultnet/epiphany.runtime.tool-execution-binding.schema.json deleted file mode 100644 index 4941fc8c..00000000 --- a/schemas/cultnet/epiphany.runtime.tool-execution-binding.schema.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.runtime.tool-execution-binding.schema.json", - "title": "Epiphany Runtime Tool Execution Binding", - "description": "Immutable ownership edge from one tool intent to its runtime session, job, and optional model execution.", - "type": "object", - "additionalProperties": false, - "properties": { - "schemaVersion": { "type": "string", "const": "epiphany.runtime.tool_execution_binding.v0" }, - "bindingId": { "type": "string", "minLength": 1 }, - "intentId": { "type": "string", "minLength": 1 }, - "sessionId": { "type": "string", "minLength": 1 }, - "jobId": { "type": "string", "minLength": 1 }, - "modelRequestId": { "type": ["string", "null"] }, - "boundAt": { "type": "string", "format": "date-time" } - }, - "required": [ - "schemaVersion", - "bindingId", - "intentId", - "sessionId", - "jobId", - "boundAt" - ] -} diff --git a/schemas/cultnet/epiphany.state-ledger.schema.json b/schemas/cultnet/epiphany.state-ledger.schema.json deleted file mode 100644 index 9cdb7c6f..00000000 --- a/schemas/cultnet/epiphany.state-ledger.schema.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.state-ledger.schema.json", - "title": "Epiphany State Ledger", - "description": "Durable branch/evidence ledger entry.", - "type": "object", - "additionalProperties": true, - "properties": { - "schemaVersion": { - "type": "string" - }, - "branches": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - }, - "evidence": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - }, - "extra": { - "type": "object", - "additionalProperties": true - } - }, - "required": [ - "schemaVersion", - "branches", - "evidence" - ] -} diff --git a/schemas/cultnet/epiphany.tool-invocation-intent.schema.json b/schemas/cultnet/epiphany.tool-invocation-intent.schema.json deleted file mode 100644 index 625b8371..00000000 --- a/schemas/cultnet/epiphany.tool-invocation-intent.schema.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.tool-invocation-intent.schema.json", - "title": "Epiphany Tool Invocation Intent", - "description": "Coordinator-owned typed request to call a tool through an adapter. Raw MCP arguments remain string cargo until the adapter validates them.", - "type": "object", - "required": [ - "schema_id", - "intent_id", - "adapter", - "server", - "tool_name", - "arguments_json", - "caller", - "reason", - "created_at" - ], - "properties": { - "schema_id": { "const": "epiphany.tool_invocation_intent.v0" }, - "intent_id": { "type": "string" }, - "adapter": { "type": "string" }, - "server": { "type": "string" }, - "tool_name": { "type": "string" }, - "arguments_json": { "type": "string" }, - "caller": { "type": "string" }, - "reason": { "type": "string" }, - "created_at": { "type": "string" } - }, - "additionalProperties": false -} diff --git a/schemas/cultnet/epiphany.tool-invocation-receipt.schema.json b/schemas/cultnet/epiphany.tool-invocation-receipt.schema.json deleted file mode 100644 index 0470eb72..00000000 --- a/schemas/cultnet/epiphany.tool-invocation-receipt.schema.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.tool-invocation-receipt.schema.json", - "title": "Epiphany Tool Invocation Receipt", - "description": "Typed receipt from a tool adapter after it executes or refuses a tool invocation.", - "type": "object", - "required": [ - "schema_id", - "receipt_id", - "intent_id", - "adapter", - "server", - "tool_name", - "status", - "completed_at" - ], - "properties": { - "schema_id": { "const": "epiphany.tool_invocation_receipt.v1" }, - "receipt_id": { "type": "string" }, - "intent_id": { "type": "string" }, - "adapter": { "type": "string" }, - "server": { "type": "string" }, - "tool_name": { "type": "string" }, - "status": { "type": "string" }, - "completed_at": { "type": "string", "format": "date-time" }, - "result_json": { "type": ["string", "null"] }, - "error": { "type": ["string", "null"] } - }, - "additionalProperties": false -} diff --git a/schemas/cultnet/index.json b/schemas/cultnet/index.json index 0b07c971..0c201ec7 100644 --- a/schemas/cultnet/index.json +++ b/schemas/cultnet/index.json @@ -1,138 +1,6 @@ { "schemaVersion": "epiphany.cultnet_catalog.v0", "schemas": [ - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.runtime.identity.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.runtime_spine.v0", - "documentType": "epiphany.runtime.identity", - "title": "Epiphany Runtime Identity", - "path": "epiphany.runtime.identity.schema.json" - }, - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.runtime.session.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.runtime_spine.v1", - "documentType": "epiphany.runtime.session", - "title": "Epiphany Runtime Session", - "path": "epiphany.runtime.session.schema.json" - }, - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.runtime.model-execution-binding.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.runtime.model_execution_binding.v0", - "documentType": "epiphany.runtime.model_execution_binding", - "title": "Epiphany Runtime Model Execution Binding", - "path": "epiphany.runtime.model-execution-binding.schema.json" - }, - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.runtime.tool-execution-binding.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.runtime.tool_execution_binding.v0", - "documentType": "epiphany.runtime.tool_execution_binding", - "title": "Epiphany Runtime Tool Execution Binding", - "path": "epiphany.runtime.tool-execution-binding.schema.json" - }, - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.runtime.job.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.runtime_spine.v1", - "documentType": "epiphany.runtime.job", - "title": "Epiphany Runtime Job", - "path": "epiphany.runtime.job.schema.json" - }, - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.runtime.job-result.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.runtime_spine.v0", - "documentType": "epiphany.runtime.job_result", - "title": "Epiphany Runtime Job Result", - "path": "epiphany.runtime.job-result.schema.json" - }, - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.coordinator-run-receipt.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.coordinator_run_receipt.v1", - "documentType": "epiphany.coordinator_run_receipt.v1", - "title": "Epiphany Coordinator Run Receipt", - "path": "epiphany.coordinator-run-receipt.schema.json" - }, - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.model-request.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.model_request.v0", - "documentType": "epiphany.model_request.v0", - "title": "Epiphany Model Request", - "path": "epiphany.model-request.schema.json" - }, - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.model-stream-event.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.model_stream_event.v0", - "documentType": "epiphany.model_stream_event.v0", - "title": "Epiphany Model Stream Event", - "path": "epiphany.model-stream-event.schema.json" - }, - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.model-receipt.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.model_receipt.v0", - "documentType": "epiphany.model_receipt.v0", - "title": "Epiphany Model Receipt", - "path": "epiphany.model-receipt.schema.json" - }, - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.tool-invocation-intent.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.tool_invocation_intent.v0", - "documentType": "epiphany.tool_invocation_intent.v0", - "title": "Epiphany Tool Invocation Intent", - "path": "epiphany.tool-invocation-intent.schema.json" - }, - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.tool-invocation-receipt.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.tool_invocation_receipt.v1", - "documentType": "epiphany.tool_invocation_receipt.v1", - "title": "Epiphany Tool Invocation Receipt", - "path": "epiphany.tool-invocation-receipt.schema.json" - }, { "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.openai-model-request.schema.json", "kind": "document_payload", @@ -165,17 +33,6 @@ "documentType": "epiphany.work_organ_state.v0", "title": "Epiphany Work Organ State v0", "path": "epiphany.work_organ_state.v0.schema.json" - }, - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.state-ledger.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.state_ledger.v0", - "documentType": "epiphany.state_ledger", - "title": "Epiphany State Ledger", - "path": "epiphany.state-ledger.schema.json" } ] } From 755bc60f5d61968e43925b34b7ac8aca0e83b71b Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 07:05:10 +0200 Subject: [PATCH 047/340] Record earned CultNet boundaries --- notes/epiphany-current-algorithmic-map.md | 17 +++++++++++++-- notes/epiphany-fork-implementation-plan.md | 6 ++++++ notes/fresh-workspace-handoff.md | 23 +++++++++++++++++---- state/ledgers.msgpack | Bin 707589 -> 708531 bytes state/map.yaml | 5 +++-- 5 files changed, 43 insertions(+), 8 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index e1e2dccb..2c779bab 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `fe118e13` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for singular native model-stream ownership; +Latest committed implementation cut: `8bb0719b` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for earned CultNet publication boundaries; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -76,6 +76,19 @@ public CultNet schemas are deleted. Runtime advances to v28; the public catalog has 18 schemas. `epiphany-model-runtime` now points directly at its executable body instead of compiling through an include-only shell. Atlas is untouched. +Schema publication is not a shadow registry. Exact `dbed11b3` deletes the +nonexistent runtime-event contract and the obsolete public schema for the +private archived-session tombstone. Exact `8bb0719b` then removes every +runtime-local identity, session, job, binding, coordinator, native model/tool, +and state-ledger JSON mirror. Those documents remain typed CultCache state and +are discovered from the native registration or projected by their owning +CultMesh provider; no live CultNet crossing consumed the hand-maintained JSON, +and several schemas contradicted their Rust owners. The catalog now contains +only three earned portable boundaries: the exact OpenAI-compatible provider +request, `gamecult.persona_state.v0`, and `epiphany.work_organ_state.v0`. The +two cuts remove 850 net maintained lines. Atlas remains untouched and untested +end to end. + CultMesh contains no JSON-derived operator snapshot, coordinator receipt, Hands gate, role-review event, unauthenticated Odin/Eve provider row, or daemon tool directory. Native runtime and keyed Mind receipts remain the owners; old diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index ba17c5b7..eeb421ba 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -363,6 +363,12 @@ Cut in this order: validation, and retention; the exact provider request remains durable audit input. Runtime advances to v28, the catalog drops to 18 schemas, and the model-runtime include shell is gone. Atlas remains unchanged and unaccepted. + Exact `dbed11b3` and `8bb0719b` delete the remaining hand-maintained schema + shadow registry. Runtime-local CultCache documents are discovered from the + native registration or projected by their owning provider; they are not + republished as stale JSON. The catalog now contains only the exact provider + request plus the portable Persona and work-organ contracts. The cut removes + 850 net maintained lines. Atlas remains unchanged and unaccepted. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 0e363e69..34031285 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `fe118e13` -Current worktree: documentation/evidence for singular native model-stream ownership; +Latest committed implementation cut: `8bb0719b` +Current worktree: documentation/evidence for earned CultNet publication boundaries; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `fe118e13` is the current +production symlink body and is inactive. Exact `8bb0719b` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,21 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `dbed11b3` and `8bb0719b` delete the false hand-maintained CultNet schema +registry. The first cut removes the nonexistent runtime-event contract and the +obsolete public schema for the private archived-session tombstone. The second +removes runtime-local identity, session, job, binding, coordinator, native +model/tool, and state-ledger JSON mirrors. Those documents remain typed +CultCache state and are discovered from native registration or projected by +their owning CultMesh provider; no live CultNet crossing consumed their schema +files, and several files contradicted their Rust owners. The catalog now +contains only the exact OpenAI-compatible provider request plus the portable +Persona and work-organ contracts: 3 rows, 3 files, 0 missing, 0 unindexed, and +0 internal contract references. The cuts remove 850 net maintained lines. No +Rust build was activated because runtime source and registrations are +unchanged. Model Atlas is untouched; live inter-swarm collaboration remains +unproven. + Exact `fe118e13` removes the second persisted copy of every provider stream event and terminal receipt. OpenAI/OpenRouter transport values now normalize immediately into the native `EpiphanyModelStreamEvent` and @@ -925,7 +940,7 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action The Ox17 deployment lane is paused. Continue the registered-document and test- -liability audit from exact `fe118e13`; do not compile or deploy through Idunn +liability audit from exact `8bb0719b`; do not compile or deploy through Idunn yet. Delete an abstraction with tests that merely animate it when it has no decision-bearing consumer. Preserve keyed Mind, sealed reasoning, direct Body- to-Modeling flow, family admission owners, Persona social state, provider diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 9672610796ceae1ca948a26fb1cdf5290eef461b..f5dec80e103e1ec2a91a7e4085248fabf57ed654 100644 GIT binary patch delta 893 zcmYjPJ#Q015XBDU<0MKDNJxwX5=Cs|kXVFJAw&U42_k8r+uI%cR@vLV%))=nE)RD4n>&N8*FP^L zXCF>)wT@b?{kJFW_b2TZS3H-vE^=MsTIO2eTIE{%e$q~gU-j8!Em^&{b5|f_U~^zNI{{&fc4Gi$(8Bj(u7?M;4`6I1%xB*10DC^ zAVaXu;)Hv&0jRV==h($@?4+}SB0~f&NRLH85F|4_M%DG`y>=FY%Tpg11eEroC{Pd# zHTm#x0k_;WP6|_hzO#INnrf@G9d#Jp5r2u`r~`a3DCCaEz8jn~orbh|2R<-y*Pt39 zftMNP!b8Z={>PZ26s3=9z(k~lme4P{mtK@Urv) zTxF5`%p@s-FmA-~Rr9~l)`PR=I6eSua@Z@-K6=`fE-zS3YLGpflM^15$dHAZmL3X6 zLB#tPjPI;yrl}kqb{&m`o$2ktv;DnYC zv<*mB7@lOFA6q65nOAr}-GNQ^Vy1>%Lc;2zxaSYpoK3LwooDB Date: Mon, 24 Aug 2026 07:17:54 +0200 Subject: [PATCH 048/340] Remove unowned release dependencies --- Cargo.lock | 332 +++-------------------- Cargo.toml | 9 - epiphany-core/Cargo.toml | 1 - epiphany-openai-auth-spine/.gitignore | 1 - epiphany-openai-codex-spine/Cargo.toml | 1 - epiphany-openai-runtime/Cargo.toml | 1 - epiphany-release-construction/Cargo.toml | 1 - epiphany-tool-mcp-runtime/src/main.rs | 4 +- 8 files changed, 33 insertions(+), 317 deletions(-) delete mode 100644 epiphany-openai-auth-spine/.gitignore diff --git a/Cargo.lock b/Cargo.lock index ecf1894d..cc4b3415 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,7 +24,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ - "crypto-common 0.1.7", + "crypto-common", "generic-array", ] @@ -481,7 +481,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" dependencies = [ - "digest 0.10.7", + "digest", ] [[package]] @@ -493,15 +493,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "block-buffer" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" -dependencies = [ - "hybrid-array", -] - [[package]] name = "block-padding" version = "0.3.3" @@ -679,7 +670,7 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "crypto-common 0.1.7", + "crypto-common", "inout", "zeroize", ] @@ -742,12 +733,6 @@ dependencies = [ "cc", ] -[[package]] -name = "cmov" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" - [[package]] name = "cmp_any" version = "0.8.1" @@ -768,7 +753,7 @@ dependencies = [ "reqwest 0.12.28", "serde", "serde_json", - "sha2 0.10.9", + "sha2", ] [[package]] @@ -879,7 +864,7 @@ dependencies = [ "serde", "serde_json", "serde_path_to_error", - "sha2 0.10.9", + "sha2", "thiserror 2.0.20", "tokio", "toml", @@ -956,7 +941,7 @@ dependencies = [ "reqwest 0.12.28", "serde", "serde_json", - "sha2 0.10.9", + "sha2", "thiserror 2.0.20", "tiny_http", "tokio", @@ -1215,12 +1200,6 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" -[[package]] -name = "const-oid" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" - [[package]] name = "const_format" version = "0.2.36" @@ -1390,15 +1369,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "crypto-common" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" -dependencies = [ - "hybrid-array", -] - [[package]] name = "crypto_box" version = "0.9.1" @@ -1480,15 +1450,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "ctutils" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" -dependencies = [ - "cmov", -] - [[package]] name = "cultcache-rs" version = "0.1.0" @@ -1537,7 +1498,7 @@ dependencies = [ "chrono", "cultcache-rs", "ed25519-dalek", - "hmac 0.12.1", + "hmac", "pretty_assertions", "rand 0.9.5", "rmp-serde", @@ -1545,7 +1506,7 @@ dependencies = [ "serde", "serde_bytes", "serde_json", - "sha2 0.10.9", + "sha2", "socket2 0.5.10", "tempfile", "uuid", @@ -1561,7 +1522,7 @@ dependencies = [ "cfg-if", "cpufeatures 0.2.17", "curve25519-dalek-derive", - "digest 0.10.7", + "digest", "fiat-crypto", "rustc_version", "subtle", @@ -1644,7 +1605,7 @@ dependencies = [ "hkdf", "num", "once_cell", - "sha2 0.10.9", + "sha2", "zeroize", ] @@ -1665,7 +1626,7 @@ version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ - "const-oid 0.9.6", + "const-oid", "zeroize", ] @@ -1737,23 +1698,11 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.4", - "crypto-common 0.1.7", + "block-buffer", + "crypto-common", "subtle", ] -[[package]] -name = "digest" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" -dependencies = [ - "block-buffer 0.12.1", - "const-oid 0.10.2", - "crypto-common 0.2.2", - "ctutils", -] - [[package]] name = "dirs" version = "6.0.0" @@ -1901,7 +1850,7 @@ dependencies = [ "curve25519-dalek", "ed25519", "serde", - "sha2 0.10.9", + "sha2", "subtle", "zeroize", ] @@ -2000,12 +1949,11 @@ dependencies = [ "ghostlight-persona-projection", "ignore", "libc", - "pretty_assertions", "rmp-serde", "semver", "serde", "serde_json", - "sha2 0.10.9", + "sha2", "tempfile", "uuid", "windows-sys 0.59.0", @@ -2036,11 +1984,10 @@ dependencies = [ "codex-client", "codex-login", "epiphany-openai-adapter", - "futures", "http", "serde", "serde_json", - "sha2 0.10.9", + "sha2", "tokio", ] @@ -2055,12 +2002,11 @@ dependencies = [ "epiphany-model-adapter", "epiphany-openai-adapter", "epiphany-openai-codex-spine", - "epiphany-state-model", "epiphany-tool-adapter", "rmp-serde", "serde", "serde_json", - "sha2 0.10.9", + "sha2", "tempfile", "tokio", "uuid", @@ -2074,29 +2020,20 @@ dependencies = [ "chrono", "ctrlc", "cultcache-rs", - "cultmesh-rs", "cultnet-rs", "epiphany-core", "epiphany-model-adapter", "epiphany-openai-adapter", "epiphany-openai-runtime", - "epiphany-state-model", "epiphany-tool-adapter", "epiphany-tool-mcp-runtime", - "http", - "ignore", - "postgres", - "reqwest 0.13.4", - "rmcp 2.2.0", "rmp-serde", - "semver", "serde", "serde_json", - "sha2 0.10.9", + "sha2", "tempfile", "tokio", "toml", - "tracing", "uuid", ] @@ -2110,8 +2047,7 @@ dependencies = [ "fs2", "rmp-serde", "serde", - "serde_json", - "sha2 0.10.9", + "sha2", "tempfile", "uuid", ] @@ -2148,7 +2084,7 @@ dependencies = [ "rmcp 2.2.0", "serde", "serde_json", - "sha2 0.10.9", + "sha2", "tempfile", "tokio", "toml", @@ -2216,12 +2152,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "fallible-iterator" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" - [[package]] name = "fastrand" version = "2.5.0" @@ -2510,7 +2440,7 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] @@ -2556,7 +2486,7 @@ version = "0.1.0" source = "git+https://github.com/GameCult/Ghostlight.git?rev=22281891cbf9258db80c15a9fd465e6fa251e7dd#22281891cbf9258db80c15a9fd465e6fa251e7dd" dependencies = [ "serde", - "sha2 0.10.9", + "sha2", ] [[package]] @@ -2728,7 +2658,7 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ - "hmac 0.12.1", + "hmac", ] [[package]] @@ -2737,16 +2667,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "hmac" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" -dependencies = [ - "digest 0.11.3", + "digest", ] [[package]] @@ -2809,15 +2730,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" -[[package]] -name = "hybrid-array" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" -dependencies = [ - "typenum", -] - [[package]] name = "hyper" version = "1.11.0" @@ -3597,16 +3509,6 @@ version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8863b587001c1b9a8a4e36008cebc6b3612cb1226fe2de94858e06092687b608" -[[package]] -name = "md-5" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" -dependencies = [ - "cfg-if", - "digest 0.11.3", -] - [[package]] name = "md5" version = "0.8.1" @@ -3676,7 +3578,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "windows-sys 0.61.2", ] @@ -4036,15 +3938,6 @@ dependencies = [ "objc2-foundation", ] -[[package]] -name = "objc2-system-configuration" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7216bd11cbda54ccabcab84d523dc93b858ec75ecfb3a7d89513fa22464da396" -dependencies = [ - "objc2-core-foundation", -] - [[package]] name = "objc2-ui-kit" version = "0.3.2" @@ -4348,16 +4241,6 @@ dependencies = [ "indexmap 2.14.0", ] -[[package]] -name = "phf" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" -dependencies = [ - "phf_shared 0.13.1", - "serde", -] - [[package]] name = "phf_shared" version = "0.11.3" @@ -4367,15 +4250,6 @@ dependencies = [ "siphasher", ] -[[package]] -name = "phf_shared" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" -dependencies = [ - "siphasher", -] - [[package]] name = "pin-project" version = "1.1.13" @@ -4491,49 +4365,6 @@ version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" -[[package]] -name = "postgres" -version = "0.19.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ad20e0aa0b24f5a394eab4f78c781d248982b22b25cecc7e3aa46a681605bd" -dependencies = [ - "bytes", - "fallible-iterator", - "futures-util", - "log", - "tokio", - "tokio-postgres", -] - -[[package]] -name = "postgres-protocol" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08808e3c483c46e999108051c78334f473d5adb59d78bb80a1268c7e6aa6c514" -dependencies = [ - "base64", - "byteorder", - "bytes", - "fallible-iterator", - "hmac 0.13.0", - "md-5", - "memchr", - "rand 0.10.2", - "sha2 0.11.0", - "stringprep", -] - -[[package]] -name = "postgres-types" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "851ca9db4932932d69f3ea811b1abe63087a0f740a47692619dd40d4899b68be" -dependencies = [ - "bytes", - "fallible-iterator", - "postgres-protocol", -] - [[package]] name = "potential_utf" version = "0.1.5" @@ -5002,7 +4833,7 @@ dependencies = [ "rama-macros", "rama-utils", "serde", - "sha2 0.10.9", + "sha2", "socket2 0.6.5", "tokio", ] @@ -5369,7 +5200,6 @@ checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" dependencies = [ "base64", "bytes", - "futures-channel", "futures-core", "futures-util", "http", @@ -5825,7 +5655,7 @@ dependencies = [ "once_cell", "rand 0.8.7", "serde", - "sha2 0.10.9", + "sha2", "zbus", ] @@ -6047,7 +5877,7 @@ checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" dependencies = [ "cfg-if", "cpufeatures 0.2.17", - "digest 0.10.7", + "digest", ] [[package]] @@ -6064,18 +5894,7 @@ checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures 0.2.17", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" -dependencies = [ - "cfg-if", - "cpufeatures 0.3.0", - "digest 0.11.3", + "digest", ] [[package]] @@ -6339,21 +6158,10 @@ checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" dependencies = [ "new_debug_unreachable", "parking_lot", - "phf_shared 0.11.3", + "phf_shared", "precomputed-hash", ] -[[package]] -name = "stringprep" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" -dependencies = [ - "unicode-bidi", - "unicode-normalization", - "unicode-properties", -] - [[package]] name = "strsim" version = "0.10.0" @@ -6698,32 +6506,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-postgres" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a528f7d280f6d5b9cd149635c8705b0dd049754bc67d81d31fa25169a93809d3" -dependencies = [ - "async-trait", - "byteorder", - "bytes", - "fallible-iterator", - "futures-channel", - "futures-util", - "log", - "parking_lot", - "percent-encoding", - "phf", - "pin-project-lite", - "postgres-protocol", - "postgres-types", - "rand 0.10.2", - "socket2 0.6.5", - "tokio", - "tokio-util", - "whoami", -] - [[package]] name = "tokio-rustls" version = "0.26.4" @@ -7133,33 +6915,12 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" -[[package]] -name = "unicode-bidi" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" - [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" -[[package]] -name = "unicode-normalization" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-properties" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" - [[package]] name = "unicode-segmentation" version = "1.13.3" @@ -7184,7 +6945,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ - "crypto-common 0.1.7", + "crypto-common", "subtle", ] @@ -7293,15 +7054,6 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" -[[package]] -name = "wasi" -version = "0.14.7+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" -dependencies = [ - "wasip2", -] - [[package]] name = "wasip2" version = "1.0.4+wasi-0.2.12" @@ -7311,15 +7063,6 @@ dependencies = [ "wit-bindgen", ] -[[package]] -name = "wasite" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66fe902b4a6b8028a753d5424909b764ccf79b7a209eac9bf97e59cda9f71a42" -dependencies = [ - "wasi 0.14.7+wasi-0.2.4", -] - [[package]] name = "wasm-bindgen" version = "0.2.127" @@ -7470,19 +7213,6 @@ dependencies = [ "libc", ] -[[package]] -name = "whoami" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "998767ef88740d1f5b0682a9c53c24431453923962269c2db68ee43788c5a40d" -dependencies = [ - "libc", - "libredox", - "objc2-system-configuration", - "wasite", - "web-sys", -] - [[package]] name = "widestring" version = "1.2.1" diff --git a/Cargo.toml b/Cargo.toml index 899cee5c..e0756aff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,28 +26,19 @@ anyhow = "1" chrono = "0.4.44" ctrlc = { version = "3.5.1", features = ["termination"] } cultcache-rs = { path = "vendor/cultcache-rs" } -cultmesh-rs = { path = "vendor/cultmesh-rs" } cultnet-rs = { path = "vendor/cultnet-rs" } epiphany-core = { path = "epiphany-core" } epiphany-model-adapter = { path = "epiphany-model-adapter" } epiphany-openai-adapter = { path = "epiphany-openai-adapter" } epiphany-openai-runtime = { path = "epiphany-openai-runtime", optional = true } -epiphany-state-model = { path = "epiphany-state-model" } epiphany-tool-adapter = { path = "epiphany-tool-adapter" } epiphany-tool-mcp-runtime = { path = "epiphany-tool-mcp-runtime", optional = true } -http = "1" -ignore = "0.4.23" -postgres = "0.19" -reqwest = { version = "0.13.2", default-features = false, features = ["blocking", "json", "rustls"] } rmp-serde = "1" -rmcp = { version = "2.2.0", default-features = false, features = ["client", "transport-child-process", "transport-streamable-http-client-reqwest"] } serde = { version = "1", features = ["derive"] } serde_json = "1" -semver = { version = "1", features = ["serde"] } sha2 = "0.10" tokio = { version = "1", features = ["io-util", "macros", "process", "rt", "rt-multi-thread", "time"] } toml = "0.9" -tracing = "0.1.44" uuid = { version = "1", features = ["serde", "v4"] } [features] diff --git a/epiphany-core/Cargo.toml b/epiphany-core/Cargo.toml index 6b417ed7..891efb46 100644 --- a/epiphany-core/Cargo.toml +++ b/epiphany-core/Cargo.toml @@ -33,7 +33,6 @@ sha2 = "0.10" uuid = { version = "1", features = ["serde", "v4", "v5"] } [dev-dependencies] -pretty_assertions = "1.4.1" tempfile = "3" [target.'cfg(windows)'.dependencies] diff --git a/epiphany-openai-auth-spine/.gitignore b/epiphany-openai-auth-spine/.gitignore deleted file mode 100644 index b83d2226..00000000 --- a/epiphany-openai-auth-spine/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target/ diff --git a/epiphany-openai-codex-spine/Cargo.toml b/epiphany-openai-codex-spine/Cargo.toml index a8708abd..179e3a18 100644 --- a/epiphany-openai-codex-spine/Cargo.toml +++ b/epiphany-openai-codex-spine/Cargo.toml @@ -14,7 +14,6 @@ anyhow = "1" codex-client = { path = "../vendor/codex/codex-rs/codex-client" } codex-login = { path = "../vendor/codex/codex-rs/login" } epiphany-openai-adapter = { path = "../epiphany-openai-adapter" } -futures = "0.3" http = "1" serde = "1" serde_json = "1" diff --git a/epiphany-openai-runtime/Cargo.toml b/epiphany-openai-runtime/Cargo.toml index 21a86974..d089f3e1 100644 --- a/epiphany-openai-runtime/Cargo.toml +++ b/epiphany-openai-runtime/Cargo.toml @@ -27,5 +27,4 @@ tokio = { version = "1", features = ["macros", "rt-multi-thread"] } uuid = { version = "1", features = ["v4"] } [dev-dependencies] -epiphany-state-model = { path = "../epiphany-state-model" } tempfile = "3" diff --git a/epiphany-release-construction/Cargo.toml b/epiphany-release-construction/Cargo.toml index b45b95e2..75f80c71 100644 --- a/epiphany-release-construction/Cargo.toml +++ b/epiphany-release-construction/Cargo.toml @@ -17,7 +17,6 @@ cultcache-rs = { path = "../vendor/cultcache-rs" } fs2 = "0.4" rmp-serde = "1" serde = { version = "1", features = ["derive"] } -serde_json = "1" sha2 = "0.10" uuid = { version = "1", features = ["v4"] } diff --git a/epiphany-tool-mcp-runtime/src/main.rs b/epiphany-tool-mcp-runtime/src/main.rs index 5237d6d6..dc2ea72f 100644 --- a/epiphany-tool-mcp-runtime/src/main.rs +++ b/epiphany-tool-mcp-runtime/src/main.rs @@ -1,7 +1,6 @@ use anyhow::{Context, Result, anyhow}; use epiphany_tool_adapter::{ - EPIPHANY_TOOL_RUNTIME_ADAPTER_ID, EpiphanyToolInvocationIntent, EpiphanyToolInvocationReceipt, - tool_invocation_intent_key, + EpiphanyToolInvocationIntent, EpiphanyToolInvocationReceipt, tool_invocation_intent_key, }; use epiphany_tool_mcp_runtime::{ McpRuntimeConfig, current_utc_timestamp, execute_epiphany_public, execute_epiphany_source, @@ -216,6 +215,7 @@ fn bound(value: &str, limit: usize) -> String { #[cfg(test)] mod tests { use super::*; + use epiphany_tool_adapter::EPIPHANY_TOOL_RUNTIME_ADAPTER_ID; use epiphany_tool_adapter::tool_invocation_receipt_key; #[test] From 00522e6037bf86c942bc21f5737b862415ffa21f Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 07:18:51 +0200 Subject: [PATCH 049/340] Record release dependency ownership --- notes/epiphany-current-algorithmic-map.md | 16 ++++++++++++-- notes/epiphany-fork-implementation-plan.md | 6 ++++++ notes/fresh-workspace-handoff.md | 24 +++++++++++++++++---- state/ledgers.msgpack | Bin 708531 -> 709645 bytes state/map.yaml | 3 ++- 5 files changed, 42 insertions(+), 7 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 2c779bab..b7c8c20b 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `8bb0719b` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for earned CultNet publication boundaries; +Latest committed implementation cut: `695af6c6` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for release dependency ownership; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -89,6 +89,18 @@ request, `gamecult.persona_state.v0`, and `epiphany.work_organ_state.v0`. The two cuts remove 850 net maintained lines. Atlas remains untouched and untested end to end. +Dependency ownership follows source ownership. Exact `695af6c6` deletes +thirteen manifest edges with no consumer in their owning package, plus the +tracked marker that kept the extinct `epiphany-openai-auth-spine` directory +alive. The release bundle no longer directly owns nine libraries used only by +leaf crates or not used at all; four leaf/dev manifests drop their own dead +edges. The lock graph contracts from 757 to 732 packages, including removal of +the orphan PostgreSQL and duplicate newer crypto chains. All nine production +entrypoints and the affected library/test targets compile individually. The +cut removes 284 net manifest, lock, and source lines. Package-scoped cleanup of +the five compiled packages removed 124.2 GiB of disposable historical build +artifacts without removing the prebuilt state tool. Atlas is untouched. + CultMesh contains no JSON-derived operator snapshot, coordinator receipt, Hands gate, role-review event, unauthenticated Odin/Eve provider row, or daemon tool directory. Native runtime and keyed Mind receipts remain the owners; old diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index eeb421ba..932678fa 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -369,6 +369,12 @@ Cut in this order: republished as stale JSON. The catalog now contains only the exact provider request plus the portable Persona and work-organ contracts. The cut removes 850 net maintained lines. Atlas remains unchanged and unaccepted. + Exact `695af6c6` deletes thirteen unowned dependency declarations and the + final tracked marker for the extinct OpenAI auth-spine crate. The lock graph + contracts from 757 to 732 packages; all nine production entrypoints and the + affected library/test targets compile individually. Package-scoped cleanup + removes 124.2 GiB of reproducible artifacts while preserving the prebuilt + state tool. Atlas remains unchanged and unaccepted. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 34031285..27297266 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `8bb0719b` -Current worktree: documentation/evidence for earned CultNet publication boundaries; +Latest committed implementation cut: `695af6c6` +Current worktree: documentation/evidence for release dependency ownership; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `8bb0719b` is the current +production symlink body and is inactive. Exact `695af6c6` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,22 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `695af6c6` removes thirteen Cargo dependency declarations with no +consumer in their owning package, the tracked `.gitignore` that kept the +extinct `epiphany-openai-auth-spine` directory alive, and a production-only +unused import. The release bundle no longer directly owns nine libraries used +only by leaf crates or not used anywhere in its executable sources; affected +leaf/dev manifests drop unused `serde_json`, `futures`, `pretty_assertions`, +and a dev-only state-model edge. The lock graph contracts from 757 to 732 +packages and the cut removes 284 net manifest, lock, and source lines. All nine +production binaries compile individually; release construction and the OpenAI +Codex spine compile; core and OpenAI-runtime library test targets compile. +Package-scoped cleanup removes 56,581 disposable files and 124.2 GiB from the +five packages compiled during verification. The shared target is 108.42 GiB, +the prebuilt state tool remains healthy, and no alternate target root was +created. Model Atlas is untouched; live inter-swarm collaboration remains +unproven. + Exact `dbed11b3` and `8bb0719b` delete the false hand-maintained CultNet schema registry. The first cut removes the nonexistent runtime-event contract and the obsolete public schema for the private archived-session tombstone. The second @@ -940,7 +956,7 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action The Ox17 deployment lane is paused. Continue the registered-document and test- -liability audit from exact `8bb0719b`; do not compile or deploy through Idunn +liability audit from exact `695af6c6`; do not compile or deploy through Idunn yet. Delete an abstraction with tests that merely animate it when it has no decision-bearing consumer. Preserve keyed Mind, sealed reasoning, direct Body- to-Modeling flow, family admission owners, Persona social state, provider diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index f5dec80e103e1ec2a91a7e4085248fabf57ed654..b6b856def816dc31f352d42e266ce0e9a1bd4d67 100644 GIT binary patch delta 1020 zcmY*YJ#W-N6y!n($x);tgo5ZvR1n9?U2>N|L=mD0QGpN*G+|>u-z~9so!#~2uHgy_ zD$2-Z3K~jK3Q9UEJ|untH5~;#v-U-RIH{El zu%9WBN~GkBhz{^WCd>gFO0=my^3X{ICeCHv7izSkfmH7Oo}GUN5DrMFn6zTbjgE`R z!>(wRjv%10fRkCSjSK0K)($FD7M98C!bDIT%a~NPp0I&Brl?3=#en9jt(f& z%4+~uVsu6uoegrDHrCpd!)4J!?;gjy9~Iu0I=%MhIw^LLDwRW3anz~<^1!v-wSAOg zgAHjry^|8!{5JyHN2W%CCem3hQ?4T7YGxcJ0vrMtIhk?!UN^7Y@Nym?+U@(aqhlVD z%{^o)_sxGmTjj5hvscIU`iLA1r5f=s*O7F6?b|Apw?CwZb<-<0!t}%xRWlhO73D2Z zlm27sbc4=j3u9rCve<|01lnt_TJ80)P50zoZ|OLjOzr?(pE QI}mdKG3WNFOk8qj0a=U|bpQYW diff --git a/state/map.yaml b/state/map.yaml index 41bfe4ea..fcc8580e 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -56,6 +56,7 @@ current_status: fixed_routing_and_retention_cargo_cut: Exact ffd91c20 deletes EyesEvidencePacket.source_role_id, PersonaSocialMention.target_agent_id, and ResidentSelfRetentionHead.retained_at_millis. Each producer supplied one fixed or non-causal value and no consumer read it; the request/context, Persona queue plus turn request, and retention chain remain the real owners. Eyes packet v2, Persona mention v2, Resident Self state v3/retention head v1, and runtime v27 form a hard cut. Core and the three consuming release entrypoints compile; consequential Persona, Research, and epoch-refusal proofs pass. The maintained source delta is 6 net deletions. Atlas is untouched; no live inter-swarm collaboration has run. provider_stream_authority_cut: Exact fe118e13 makes OpenAI/OpenRouter events and receipts transient transport values. The runtime immediately normalizes them into the single persisted native model event/receipt family used by tool continuation, assistant reconstruction, terminal validation, and bounded retention. Duplicate provider writes, registrations, archive requirements, schema IDs, two public schemas/index rows, and the include-only model-runtime shell are gone; the exact provider request remains durable. Runtime advances to v28 and the catalog drops to 18 schemas. The cut removes 270 net maintained lines. Adapter 1/1, provider spine 14/14, reasoning context 8/8, runtime 23/23, model entrypoint 11/11, swarm 4/4, epoch refusal 1/1, and release construction 15/15 pass. Atlas is untouched; live inter-swarm collaboration remains unproven. cultnet_catalog_authority_cut: Exact dbed11b3 and 8bb0719b delete the hand-maintained JSON shadow registry. The nonexistent runtime-event contract and obsolete public archived-session tombstone schema disappear first. Runtime-local identity, session, job, binding, coordinator, native model/tool, and state-ledger schemas then disappear because no live CultNet provider carries them and several contradicted their Rust owners. Typed CultCache registration and owner-projected CultMesh state remain authoritative. The catalog has exactly three earned boundaries: the exact OpenAI-compatible provider request, gamecult.persona_state.v0, and epiphany.work_organ_state.v0. Parse/path/unindexed/forbidden-contract checks pass at 3/3/0/0/0. The cuts remove 850 net maintained lines. Atlas is untouched; live inter-swarm collaboration remains unproven. + release_dependency_ownership_cut: Exact 695af6c6 deletes thirteen unowned Cargo dependency declarations, the last tracked marker for the extinct epiphany-openai-auth-spine crate, and one production-only unused import. The root release package no longer claims nine libraries absent from every executable source; affected leaf/dev manifests drop four more dead edges. The lock graph contracts from 757 to 732 packages and the source/manifest/lock delta is 284 net deletions. All nine production entrypoints, both affected libraries, and both affected library test targets compile individually. Package-scoped cleanup removes 56,581 disposable files and 124.2 GiB from the five compiled package caches; the shared target is 108.42 GiB and the prebuilt state tool remains healthy. Atlas is untouched; live inter-swarm collaboration remains unproven. atlas_authoring_cut: Exact ce306e23 preserves the complete inter-swarm Atlas vertical slice while deleting its duplicate local offer/claim authoring authority. Ordinary Modeling through RepoModel operations is the sole owner of provider offers and consumer claims; Atlas retains signed publication, trust, transport, deterministic projection, Soul verification, Self impact admission, Resident Self wake, brakes, and Eve lowering. Two direct write-intent types, their runtime commit APIs and registry entries, 518 planner lines, and two tests that animated only that duplicate path are gone. The runtime proof now creates offers/claims through RepoModel before proving exact verification admission and Body-drift refusal. The cut removes 593 net source lines; the three-repository direct/transitive Modeling proof passes. These are component proofs only: no live inter-swarm collaboration has yet run, so the Atlas vertical slice remains protected until Gate 1 exercises it end to end. Runtime writable epoch is v14. autonomous_proposal_binding_cut: Exact 5d507bfd reduces Self's autonomous Imagination-to-Modeling origin binding from a 22-field duplicate archive to six causal join fields: schema, exact direction-result identity, selected option ordinal, worker job identity, and exact worker-result/launch digests. Proposal identity and payload, direction request, runtime/thread, typed model projection, Body/domain binding, selected option content, and canonical Modeling-request identity are checked directly from their owning immutable documents. The atomic proposal plus binding plus Modeling-request commit and its broad keyed-lifecycle proof remain; 60 net source lines are gone. Runtime writable epoch is v15. hands_verification_derivation_cut: Exact 6ccc7dd2 deletes the 20-field transient Hands receipt-chain summary. The Hands commit owner now derives the exact Verification request directly from the persisted patch, command, and commit receipts plus the frontier authority; no copied schema, job, grant, command-output, Git, path, summary, or timestamp fields mediate that handoff. Atomic Hands-to-Verification admission and the concurrent Persona/Hands lifecycle proof remain. The cut removes 43 net source lines without adding state, schema, or tests. @@ -141,7 +142,7 @@ current_status: yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,656 lines, 53 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, coordinator artifact/status cargo, and uninhabited aggregate state-model DTO families are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the registered-document and test-liability audit after exact 8bb0719b. Delete only complete dead authority slices and tests with no consequential claim. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, Persona consequences, exact native/provider requests, governed tool receipts, and the complete unrun Model Atlas vertical slice. Component tests are not collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + next_action: Resume the registered-document and test-liability audit after exact 695af6c6. Delete only complete dead authority slices and tests with no consequential claim. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, Persona consequences, exact native/provider requests, governed tool receipts, and the complete unrun Model Atlas vertical slice. Component tests are not collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v28. The spine is 9,656 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. From 65bf044f5c38760ea395bc117734035f15aef5d5 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 07:47:27 +0200 Subject: [PATCH 050/340] Remove shadow Hands receipt metadata --- .../src/coordinator_objective_intake.rs | 1 - epiphany-core/src/eyes_gateway.rs | 2 - epiphany-core/src/hands_gateway.rs | 71 +++++++------------ epiphany-core/src/lib.rs | 15 ---- epiphany-core/src/runtime_spine.rs | 13 +--- epiphany-core/src/substrate_gate.rs | 2 - epiphany-core/src/surfaces/mod.rs | 2 - epiphany-core/src/surfaces/reorient.rs | 13 ---- 8 files changed, 26 insertions(+), 93 deletions(-) delete mode 100644 epiphany-core/src/surfaces/reorient.rs diff --git a/epiphany-core/src/coordinator_objective_intake.rs b/epiphany-core/src/coordinator_objective_intake.rs index 7464ff52..4a209846 100644 --- a/epiphany-core/src/coordinator_objective_intake.rs +++ b/epiphany-core/src/coordinator_objective_intake.rs @@ -9,7 +9,6 @@ use sha2::{Digest, Sha256}; use std::path::Path; pub const USER_OBJECTIVE_INTAKE_SCHEMA_VERSION: &str = "gamecult.epiphany.user_objective_intake.v0"; -pub const USER_OBJECTIVE_INTAKE_TYPE: &str = "epiphany.coordinator.user_objective_intake"; pub const USER_OBJECTIVE_INTAKE_CONTRACT: &str = "The human supplies the initial objective. Self records that assertion and the canonical keyed Mind objective in one CAS. Thread identity is provenance only. Repeated identical intake is read-idempotent; replacement requires a separate reviewed adoption flow."; #[derive(Debug, Clone)] diff --git a/epiphany-core/src/eyes_gateway.rs b/epiphany-core/src/eyes_gateway.rs index a572e99c..f6c6ceef 100644 --- a/epiphany-core/src/eyes_gateway.rs +++ b/epiphany-core/src/eyes_gateway.rs @@ -2,8 +2,6 @@ use crate::EpiphanyResearchDecision; use crate::EpiphanyRoleFindingInterpretation; use cultcache_rs::DatabaseEntry; -pub const EYES_SOURCE_LOOKUP_RECEIPT_TYPE: &str = "epiphany.eyes.source_lookup_receipt"; -pub const EYES_EVIDENCE_PACKET_TYPE: &str = "epiphany.eyes.evidence_packet"; pub const EYES_SOURCE_LOOKUP_RECEIPT_SCHEMA_VERSION: &str = "epiphany.eyes.source_lookup_receipt.v0"; pub const EYES_EVIDENCE_PACKET_SCHEMA_VERSION: &str = "epiphany.eyes.evidence_packet.v2"; diff --git a/epiphany-core/src/hands_gateway.rs b/epiphany-core/src/hands_gateway.rs index 3e2866ea..eea8c087 100644 --- a/epiphany-core/src/hands_gateway.rs +++ b/epiphany-core/src/hands_gateway.rs @@ -5,9 +5,6 @@ pub const HANDS_PATCH_RECEIPT_TYPE: &str = "epiphany.hands.patch_receipt"; pub const HANDS_COMMIT_RECEIPT_TYPE: &str = "epiphany.hands.commit_receipt"; pub const HANDS_ACTION_INTENT_SCHEMA_VERSION: &str = "epiphany.hands.action_intent.v1"; pub const HANDS_ACTION_REVIEW_SCHEMA_VERSION: &str = "epiphany.hands.action_review.v0"; -pub const HANDS_COMMAND_RECEIPT_SCHEMA_VERSION: &str = "epiphany.hands.command_receipt.v0"; -pub const HANDS_PATCH_RECEIPT_SCHEMA_VERSION: &str = "epiphany.hands.patch_receipt.v0"; -pub const HANDS_COMMIT_RECEIPT_SCHEMA_VERSION: &str = "epiphany.hands.commit_receipt.v0"; #[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] #[cultcache(type = "epiphany.hands.action_intent", schema = "HandsActionIntent")] @@ -69,25 +66,21 @@ pub struct HandsActionReview { #[cultcache(type = "epiphany.hands.patch_receipt", schema = "HandsPatchReceipt")] pub struct HandsPatchReceipt { #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] pub receipt_id: String, - #[cultcache(key = 2)] + #[cultcache(key = 1)] pub intent_id: String, - #[cultcache(key = 3)] + #[cultcache(key = 2)] pub review_id: String, - #[cultcache(key = 4)] + #[cultcache(key = 3)] pub substrate_gate_grant_receipt_id: String, - #[cultcache(key = 5)] + #[cultcache(key = 4)] pub runtime_job_id: String, - #[cultcache(key = 6)] + #[cultcache(key = 5)] pub changed_paths: Vec, - #[cultcache(key = 7)] + #[cultcache(key = 6)] pub summary: String, - #[cultcache(key = 8)] + #[cultcache(key = 7)] pub emitted_at: String, - #[cultcache(key = 9)] - pub contract: String, } #[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] @@ -97,58 +90,50 @@ pub struct HandsPatchReceipt { )] pub struct HandsCommandReceipt { #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] pub receipt_id: String, - #[cultcache(key = 2)] + #[cultcache(key = 1)] pub intent_id: String, - #[cultcache(key = 3)] + #[cultcache(key = 2)] pub review_id: String, - #[cultcache(key = 4)] + #[cultcache(key = 3)] pub substrate_gate_grant_receipt_id: String, - #[cultcache(key = 5)] + #[cultcache(key = 4)] pub runtime_job_id: String, - #[cultcache(key = 6)] + #[cultcache(key = 5)] pub command: String, - #[cultcache(key = 7)] + #[cultcache(key = 6)] pub exit_code: String, - #[cultcache(key = 8)] + #[cultcache(key = 7)] pub stdout_artifact: String, - #[cultcache(key = 9)] + #[cultcache(key = 8)] pub stderr_artifact: String, - #[cultcache(key = 10)] + #[cultcache(key = 9)] pub summary: String, - #[cultcache(key = 11)] + #[cultcache(key = 10)] pub emitted_at: String, - #[cultcache(key = 12)] - pub contract: String, } #[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] #[cultcache(type = "epiphany.hands.commit_receipt", schema = "HandsCommitReceipt")] pub struct HandsCommitReceipt { #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] pub receipt_id: String, - #[cultcache(key = 2)] + #[cultcache(key = 1)] pub intent_id: String, - #[cultcache(key = 3)] + #[cultcache(key = 2)] pub review_id: String, - #[cultcache(key = 4)] + #[cultcache(key = 3)] pub runtime_job_id: String, - #[cultcache(key = 5)] + #[cultcache(key = 4)] pub commit_sha: String, - #[cultcache(key = 6)] + #[cultcache(key = 5)] pub branch: String, - #[cultcache(key = 7)] + #[cultcache(key = 6)] pub changed_paths: Vec, - #[cultcache(key = 8)] + #[cultcache(key = 7)] pub summary: String, - #[cultcache(key = 9)] + #[cultcache(key = 8)] pub emitted_at: String, - #[cultcache(key = 10)] - pub contract: String, } pub fn hands_action_review_for_intent( @@ -181,7 +166,6 @@ pub fn hands_patch_receipt_for_review( emitted_at: String, ) -> HandsPatchReceipt { HandsPatchReceipt { - schema_version: HANDS_PATCH_RECEIPT_SCHEMA_VERSION.to_string(), receipt_id, intent_id: intent.intent_id.clone(), review_id: review.review_id.clone(), @@ -190,7 +174,6 @@ pub fn hands_patch_receipt_for_review( changed_paths, summary, emitted_at, - contract: "Hands patch receipt proves which files changed under the reviewed action and named Substrate Gate grant; Soul and Mind still decide verification and durable admission.".to_string(), } } @@ -207,7 +190,6 @@ pub fn hands_command_receipt_for_review( emitted_at: String, ) -> HandsCommandReceipt { HandsCommandReceipt { - schema_version: HANDS_COMMAND_RECEIPT_SCHEMA_VERSION.to_string(), receipt_id, intent_id: intent.intent_id.clone(), review_id: review.review_id.clone(), @@ -219,7 +201,6 @@ pub fn hands_command_receipt_for_review( stderr_artifact, summary, emitted_at, - contract: "Hands command receipt proves which command ran, where output evidence lives, and which reviewed action plus Substrate Gate grant authorized it.".to_string(), } } @@ -234,7 +215,6 @@ pub fn hands_commit_receipt_for_review( emitted_at: String, ) -> HandsCommitReceipt { HandsCommitReceipt { - schema_version: HANDS_COMMIT_RECEIPT_SCHEMA_VERSION.to_string(), receipt_id, intent_id: intent.intent_id.clone(), review_id: review.review_id.clone(), @@ -244,6 +224,5 @@ pub fn hands_commit_receipt_for_review( changed_paths, summary, emitted_at, - contract: "Hands commit receipt proves a repository commit consequence after a reviewed action; it is still subject to Soul verification and Mind admission.".to_string(), } } diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index 7da0e1d7..300d6bda 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -76,7 +76,6 @@ pub use atlas::*; pub use causal_work_identity::*; pub use coordinator_objective_intake::USER_OBJECTIVE_INTAKE_CONTRACT; pub use coordinator_objective_intake::USER_OBJECTIVE_INTAKE_SCHEMA_VERSION; -pub use coordinator_objective_intake::USER_OBJECTIVE_INTAKE_TYPE; pub use coordinator_objective_intake::UserObjectiveIntake; pub use coordinator_objective_intake::UserObjectiveIntakeApplied; pub use coordinator_objective_intake::UserObjectiveIntakeInput; @@ -109,9 +108,7 @@ pub use epiphany_state_model::EpiphanyMemoryEdge; pub use epiphany_state_model::EpiphanyMemoryLifecycle; pub use epiphany_state_model::EpiphanyMemoryNode; pub use eyes_gateway::EYES_EVIDENCE_PACKET_SCHEMA_VERSION; -pub use eyes_gateway::EYES_EVIDENCE_PACKET_TYPE; pub use eyes_gateway::EYES_SOURCE_LOOKUP_RECEIPT_SCHEMA_VERSION; -pub use eyes_gateway::EYES_SOURCE_LOOKUP_RECEIPT_TYPE; pub use eyes_gateway::EyesEvidencePacket; pub use eyes_gateway::EyesSourceLookupReceipt; pub use eyes_gateway::eyes_evidence_packet_from_research_finding; @@ -217,7 +214,6 @@ pub use repository_body_observer::*; pub use resident_readiness::*; pub use resident_self::*; pub use runtime_spine::ARCHIVED_RUNTIME_WORKER_ATTEMPT_SCHEMA_VERSION; -pub use runtime_spine::ARCHIVED_RUNTIME_WORKER_ATTEMPT_TYPE; pub use runtime_spine::COORDINATOR_DEATH_RECOVERY_SCHEMA_VERSION; pub use runtime_spine::COORDINATOR_RUN_RECEIPT_SCHEMA_VERSION; pub use runtime_spine::COORDINATOR_RUN_RECEIPT_TYPE; @@ -243,24 +239,15 @@ pub use runtime_spine::EpiphanyRuntimeWorkerProcessClaim; pub use runtime_spine::ModelPassFailureTerminalOptions; pub use runtime_spine::RUNTIME_IDENTITY_KEY; pub use runtime_spine::RUNTIME_IDENTITY_TYPE; -pub use runtime_spine::RUNTIME_JOB_RESULT_TYPE; -pub use runtime_spine::RUNTIME_JOB_TYPE; pub use runtime_spine::RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION; -pub use runtime_spine::RUNTIME_MODEL_EXECUTION_BINDING_TYPE; pub use runtime_spine::RUNTIME_REORIENT_WORKER_RESULT_SCHEMA_VERSION; -pub use runtime_spine::RUNTIME_REORIENT_WORKER_RESULT_TYPE; pub use runtime_spine::RUNTIME_ROLE_WORKER_RESULT_SCHEMA_VERSION; -pub use runtime_spine::RUNTIME_ROLE_WORKER_RESULT_TYPE; -pub use runtime_spine::RUNTIME_SESSION_TYPE; pub use runtime_spine::RUNTIME_SPINE_SCHEMA_VERSION; pub use runtime_spine::RUNTIME_SWARM_BINDING_KEY; pub use runtime_spine::RUNTIME_SWARM_BINDING_SCHEMA_VERSION; pub use runtime_spine::RUNTIME_TOOL_EXECUTION_BINDING_SCHEMA_VERSION; -pub use runtime_spine::RUNTIME_TOOL_EXECUTION_BINDING_TYPE; pub use runtime_spine::RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION; -pub use runtime_spine::RUNTIME_WORKER_LAUNCH_REQUEST_TYPE; pub use runtime_spine::RUNTIME_WORKER_PROCESS_CLAIM_SCHEMA_VERSION; -pub use runtime_spine::RUNTIME_WORKER_PROCESS_CLAIM_TYPE; pub use runtime_spine::RepoFrontierResearchContinuationAction; pub use runtime_spine::RepoFrontierResearchLifecycle; pub use runtime_spine::RepoFrontierResearchLifecycleStage; @@ -342,7 +329,6 @@ pub use state_ledger::append_state_evidence; pub use state_ledger::close_state_branch; pub use state_ledger::load_state_ledger; pub use substrate_gate::SUBSTRATE_GATE_REPO_ACCESS_GRANT_RECEIPT_SCHEMA_VERSION; -pub use substrate_gate::SUBSTRATE_GATE_REPO_ACCESS_GRANT_RECEIPT_TYPE; pub use substrate_gate::SubstrateGateRepoAccessGrantReceipt; pub use substrate_gate::substrate_gate_coordinator_implementation_grant; pub use substrate_gate::substrate_gate_operation_for_governed_tool; @@ -354,7 +340,6 @@ pub use surfaces::EpiphanyCoordinatorInput; pub use surfaces::EpiphanyCoordinatorRoleStatus; pub use surfaces::EpiphanyCrrcAction; pub use surfaces::EpiphanyCrrcResultStatus; -pub use surfaces::EpiphanyReorientAction; pub use surfaces::EpiphanyReorientFindingInterpretation; pub use surfaces::EpiphanyReorientWorkerLaunchDocument; pub use surfaces::EpiphanyResearchDecision; diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index 885d521c..a1246f36 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -67,22 +67,11 @@ use std::path::Path; use std::path::PathBuf; pub const RUNTIME_IDENTITY_TYPE: &str = "epiphany.runtime.identity"; -pub const RUNTIME_SESSION_TYPE: &str = "epiphany.runtime.session"; -pub const RUNTIME_JOB_TYPE: &str = "epiphany.runtime.job"; -pub const RUNTIME_MODEL_EXECUTION_BINDING_TYPE: &str = "epiphany.runtime.model_execution_binding"; -pub const RUNTIME_TOOL_EXECUTION_BINDING_TYPE: &str = "epiphany.runtime.tool_execution_binding"; -pub const RUNTIME_WORKER_LAUNCH_REQUEST_TYPE: &str = "epiphany.runtime.worker_launch_request"; -pub const RUNTIME_WORKER_PROCESS_CLAIM_TYPE: &str = "epiphany.runtime.worker_process_claim.v0"; -pub const ARCHIVED_RUNTIME_WORKER_ATTEMPT_TYPE: &str = - "epiphany.runtime.archived_worker_attempt.v2"; -pub const RUNTIME_ROLE_WORKER_RESULT_TYPE: &str = "epiphany.runtime.role_worker_result"; -pub const RUNTIME_REORIENT_WORKER_RESULT_TYPE: &str = "epiphany.runtime.reorient_worker_result"; -pub const RUNTIME_JOB_RESULT_TYPE: &str = "epiphany.runtime.job_result"; pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt.v1"; pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v28"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v29"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; pub const RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.model_execution_binding.v0"; diff --git a/epiphany-core/src/substrate_gate.rs b/epiphany-core/src/substrate_gate.rs index 4477c249..76adb335 100644 --- a/epiphany-core/src/substrate_gate.rs +++ b/epiphany-core/src/substrate_gate.rs @@ -1,7 +1,5 @@ use cultcache_rs::DatabaseEntry; -pub const SUBSTRATE_GATE_REPO_ACCESS_GRANT_RECEIPT_TYPE: &str = - "epiphany.substrate_gate.repo_access_grant_receipt"; pub const SUBSTRATE_GATE_REPO_ACCESS_GRANT_RECEIPT_SCHEMA_VERSION: &str = "epiphany.substrate_gate.repo_access_grant_receipt.v0"; pub const SUBSTRATE_GATE_SOURCE_READ_OPERATION: &str = "read"; diff --git a/epiphany-core/src/surfaces/mod.rs b/epiphany-core/src/surfaces/mod.rs index 80eb8eb9..a40e5898 100644 --- a/epiphany-core/src/surfaces/mod.rs +++ b/epiphany-core/src/surfaces/mod.rs @@ -1,7 +1,6 @@ mod coordinator_contract; mod coordinator_decision; mod crrc; -mod reorient; mod research_decision; mod role_board; mod role_result; @@ -11,7 +10,6 @@ pub use coordinator_contract::*; pub use coordinator_decision::recommend_coordinator_action; pub use crrc::EpiphanyCrrcAction; pub use crrc::EpiphanyCrrcResultStatus; -pub use reorient::EpiphanyReorientAction; pub use research_decision::EpiphanyResearchDecision; pub use role_board::EpiphanyRoleBoardInput; pub use role_board::EpiphanyRoleBoardLane; diff --git a/epiphany-core/src/surfaces/reorient.rs b/epiphany-core/src/surfaces/reorient.rs deleted file mode 100644 index adfc9033..00000000 --- a/epiphany-core/src/surfaces/reorient.rs +++ /dev/null @@ -1,13 +0,0 @@ -use serde::{Deserialize, Serialize}; - -/// Display projection of an accepted keyed continuity decision. -/// -/// This enum does not decide whether Reorientation should run. The keyed -/// current-work owner in `reorientation_work` owns launch, wait, review, and -/// admission behavior. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub enum EpiphanyReorientAction { - Resume, - Regather, -} From e65fa9f4a730875f859057c3874b69215f61f6a9 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 07:49:33 +0200 Subject: [PATCH 051/340] Record lean Hands receipt authority --- notes/epiphany-current-algorithmic-map.md | 18 +++++++++++++++--- notes/epiphany-fork-implementation-plan.md | 9 ++++++++- notes/fresh-workspace-handoff.md | 20 ++++++++++++++++---- state/ledgers.msgpack | Bin 709645 -> 710216 bytes state/map.yaml | 7 ++++--- 5 files changed, 43 insertions(+), 11 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index b7c8c20b..8e7c469e 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `695af6c6` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for release dependency ownership; +Latest committed implementation cut: `65bf044f` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for Hands receipt authority subtraction; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -101,6 +101,18 @@ cut removes 284 net manifest, lock, and source lines. Package-scoped cleanup of the five compiled packages removed 124.2 GiB of disposable historical build artifacts without removing the prebuilt state tool. Atlas is untouched. +Hands consequence receipts carry consequence, not doctrine commentary. Exact +`65bf044f` removes fixed schema-version strings and unread contract prose from +the patch, command, and commit documents. CultCache owns their type/schema +identity; admission still proves exact intent, review, Substrate Gate grant, +runtime job, affected paths or command, immutable receipt identity, and the +resulting consequence. Fourteen unused shadow type constants and one callerless +reorient display enum are also gone. Runtime advances to v29; old writable +state refuses. The existing lifecycle proof carries Hands concurrently with a +Persona admission and creates exact Verification work, while package cleanup +removes the 678.6 MiB it generated. The cut removes 67 net maintained lines. +Atlas remains the untouched, unaccepted collaboration slice. + CultMesh contains no JSON-derived operator snapshot, coordinator receipt, Hands gate, role-review event, unauthenticated Odin/Eve provider row, or daemon tool directory. Native runtime and keyed Mind receipts remain the owners; old @@ -1043,7 +1055,7 @@ Accepted through the local `5b799b12` source boundary: Open before Model Atlas Gate 1 resumes: -1. let Idunn compile, test, and seal exact build-affecting source `b0a4978d`; +1. let Idunn compile, test, and seal exact build-affecting source `65bf044f`; 2. use that exact package in private fresh-store Ox17; stop after three provider failures total, and prove direct Body Modeling, typed refusal-to-retry if exercised, Hands through Verification, exact context diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 932678fa..eac2995a 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -224,7 +224,7 @@ Delete or demote: Keep the five-day shakedown, Ox17 deployment, and Model Atlas operational Gate 1 paused. Continue the source-subtraction and test-authority audit from exact -`b0a4978d`. The current sequence has deleted the semantic-memory/workspace-coverage +`65bf044f`. The current sequence has deleted the semantic-memory/workspace-coverage projection system, its local daemon supervisor, and the surviving generic RepoModel profile, impossible lifecycle, producerless receipt/summary, and decorative scoring axes. Modeling consumes typed Body and keyed RepoModel state @@ -375,6 +375,13 @@ Cut in this order: affected library/test targets compile individually. Package-scoped cleanup removes 124.2 GiB of reproducible artifacts while preserving the prebuilt state tool. Atlas remains unchanged and unaccepted. + Exact `65bf044f` removes redundant schema/prose cargo from the three Hands + consequence receipts, fourteen unused shadow type constants, and one + callerless reorient display enum. CultCache owns document type/schema + identity; exact intent, review, grant, job, consequence, and immutable + receipt identity remain. Runtime advances to v29. The concurrent + Persona/Hands-to-Verification proof and old-epoch refusal pass; package + cleanup removes 678.6 MiB. Atlas remains unchanged and unaccepted. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 27297266..d763ead8 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `695af6c6` -Current worktree: documentation/evidence for release dependency ownership; +Latest committed implementation cut: `65bf044f` +Current worktree: documentation/evidence for Hands receipt authority subtraction; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `695af6c6` is the current +production symlink body and is inactive. Exact `65bf044f` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,18 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `65bf044f` removes fixed schema-version strings and unread contract prose +from Hands patch, command, and commit receipts. CultCache already owns their +type/schema identity; exact intent, review, Substrate Gate grant, runtime job, +paths or command, consequence summary, time, and immutable envelope remain the +admission proof. Fourteen definition-only shadow type constants and one +callerless reorient display enum are also gone. Runtime advances to v29 and old +writable state refuses. The existing keyed lifecycle proof passes Hands through +concurrent Persona admission into exact Verification work (1/1); epoch refusal +passes (1/1). Package cleanup removes the generated 678.6 MiB. The cut removes +67 net maintained lines. Model Atlas is untouched: component proofs are not +collaboration acceptance, and no live inter-swarm exchange has run. + Exact `695af6c6` removes thirteen Cargo dependency declarations with no consumer in their owning package, the tracked `.gitignore` that kept the extinct `epiphany-openai-auth-spine` directory alive, and a production-only @@ -956,7 +968,7 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action The Ox17 deployment lane is paused. Continue the registered-document and test- -liability audit from exact `695af6c6`; do not compile or deploy through Idunn +liability audit from exact `65bf044f`; do not compile or deploy through Idunn yet. Delete an abstraction with tests that merely animate it when it has no decision-bearing consumer. Preserve keyed Mind, sealed reasoning, direct Body- to-Modeling flow, family admission owners, Persona social state, provider diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index b6b856def816dc31f352d42e266ce0e9a1bd4d67..c97a2934a989ebcc9ab5af9f8e5793c9f8642f75 100644 GIT binary patch delta 529 zcmXw!v1=7U5XQYzqq!7T0Sk)(5tQV;7&-50Y*YvcBBW3Y8=2hBOx{y)w=e8so3yUcvwZ{B{``u=h2^W|hCpX}wui*IMLzt_H8 zO^%b~+3Q96W|1bMp`I0;6P*{Wi7tpPiq=mTX*T=a|C+65{iPq-TAEMZeSLrBak{ZT z!;+!6eOTSh^9npQZc0I_idLaz2xUzT?zG+of=ZK70V?kr;F?692p*wTp>I#K&690V zWQfI~a?vx9g=k|S1))aeI^cOrP&yk}%mc_II4eJB40%Igh<09+Br6?SgL5Don{7Zf zMO%vTklT69cxVWGw5%I~&}wnvO$XCkccocuSF040{^ch@8^cqXq?rz^?U7uD#h2(K zcBALyb)`#W?JTs&wH#sK?rJSLLR?1g1 QI}mdKG3WNFOk5Qg0eGhuR{#J2 diff --git a/state/map.yaml b/state/map.yaml index fcc8580e..e89a8ec8 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -52,11 +52,12 @@ current_status: summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error; Eyes evidence packet v2 relies on its request/context identity for Research provenance; Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v28. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. Hands consequence receipts carry only their exact causal bindings and consequence; CultCache owns type/schema identity. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error; Eyes evidence packet v2 relies on its request/context identity for Research provenance; Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v29. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. fixed_routing_and_retention_cargo_cut: Exact ffd91c20 deletes EyesEvidencePacket.source_role_id, PersonaSocialMention.target_agent_id, and ResidentSelfRetentionHead.retained_at_millis. Each producer supplied one fixed or non-causal value and no consumer read it; the request/context, Persona queue plus turn request, and retention chain remain the real owners. Eyes packet v2, Persona mention v2, Resident Self state v3/retention head v1, and runtime v27 form a hard cut. Core and the three consuming release entrypoints compile; consequential Persona, Research, and epoch-refusal proofs pass. The maintained source delta is 6 net deletions. Atlas is untouched; no live inter-swarm collaboration has run. provider_stream_authority_cut: Exact fe118e13 makes OpenAI/OpenRouter events and receipts transient transport values. The runtime immediately normalizes them into the single persisted native model event/receipt family used by tool continuation, assistant reconstruction, terminal validation, and bounded retention. Duplicate provider writes, registrations, archive requirements, schema IDs, two public schemas/index rows, and the include-only model-runtime shell are gone; the exact provider request remains durable. Runtime advances to v28 and the catalog drops to 18 schemas. The cut removes 270 net maintained lines. Adapter 1/1, provider spine 14/14, reasoning context 8/8, runtime 23/23, model entrypoint 11/11, swarm 4/4, epoch refusal 1/1, and release construction 15/15 pass. Atlas is untouched; live inter-swarm collaboration remains unproven. cultnet_catalog_authority_cut: Exact dbed11b3 and 8bb0719b delete the hand-maintained JSON shadow registry. The nonexistent runtime-event contract and obsolete public archived-session tombstone schema disappear first. Runtime-local identity, session, job, binding, coordinator, native model/tool, and state-ledger schemas then disappear because no live CultNet provider carries them and several contradicted their Rust owners. Typed CultCache registration and owner-projected CultMesh state remain authoritative. The catalog has exactly three earned boundaries: the exact OpenAI-compatible provider request, gamecult.persona_state.v0, and epiphany.work_organ_state.v0. Parse/path/unindexed/forbidden-contract checks pass at 3/3/0/0/0. The cuts remove 850 net maintained lines. Atlas is untouched; live inter-swarm collaboration remains unproven. release_dependency_ownership_cut: Exact 695af6c6 deletes thirteen unowned Cargo dependency declarations, the last tracked marker for the extinct epiphany-openai-auth-spine crate, and one production-only unused import. The root release package no longer claims nine libraries absent from every executable source; affected leaf/dev manifests drop four more dead edges. The lock graph contracts from 757 to 732 packages and the source/manifest/lock delta is 284 net deletions. All nine production entrypoints, both affected libraries, and both affected library test targets compile individually. Package-scoped cleanup removes 56,581 disposable files and 124.2 GiB from the five compiled package caches; the shared target is 108.42 GiB and the prebuilt state tool remains healthy. Atlas is untouched; live inter-swarm collaboration remains unproven. + hands_receipt_authority_cut: Exact 65bf044f removes fixed schema-version strings and unread contract prose from Hands patch, command, and commit receipts. Their CultCache envelope owns type/schema identity; the exact intent, review, Substrate Gate grant, runtime job, consequence, and immutable receipt envelope remain the admission proof. Fourteen definition-only shadow type constants and one callerless reorient display enum are also gone. Runtime advances to v29 and old writable state refuses. The existing keyed lifecycle proof passes exact Hands through concurrent Persona admission into Verification, and package cleanup removes its 678.6 MiB compiler footprint. The cut removes 67 net maintained lines. Atlas is untouched; no live inter-swarm collaboration has run. atlas_authoring_cut: Exact ce306e23 preserves the complete inter-swarm Atlas vertical slice while deleting its duplicate local offer/claim authoring authority. Ordinary Modeling through RepoModel operations is the sole owner of provider offers and consumer claims; Atlas retains signed publication, trust, transport, deterministic projection, Soul verification, Self impact admission, Resident Self wake, brakes, and Eve lowering. Two direct write-intent types, their runtime commit APIs and registry entries, 518 planner lines, and two tests that animated only that duplicate path are gone. The runtime proof now creates offers/claims through RepoModel before proving exact verification admission and Body-drift refusal. The cut removes 593 net source lines; the three-repository direct/transitive Modeling proof passes. These are component proofs only: no live inter-swarm collaboration has yet run, so the Atlas vertical slice remains protected until Gate 1 exercises it end to end. Runtime writable epoch is v14. autonomous_proposal_binding_cut: Exact 5d507bfd reduces Self's autonomous Imagination-to-Modeling origin binding from a 22-field duplicate archive to six causal join fields: schema, exact direction-result identity, selected option ordinal, worker job identity, and exact worker-result/launch digests. Proposal identity and payload, direction request, runtime/thread, typed model projection, Body/domain binding, selected option content, and canonical Modeling-request identity are checked directly from their owning immutable documents. The atomic proposal plus binding plus Modeling-request commit and its broad keyed-lifecycle proof remain; 60 net source lines are gone. Runtime writable epoch is v15. hands_verification_derivation_cut: Exact 6ccc7dd2 deletes the 20-field transient Hands receipt-chain summary. The Hands commit owner now derives the exact Verification request directly from the persisted patch, command, and commit receipts plus the frontier authority; no copied schema, job, grant, command-output, Git, path, summary, or timestamp fields mediate that handoff. Atomic Hands-to-Verification admission and the concurrent Persona/Hands lifecycle proof remain. The cut removes 43 net source lines without adding state, schema, or tests. @@ -142,9 +143,9 @@ current_status: yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,656 lines, 53 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, coordinator artifact/status cargo, and uninhabited aggregate state-model DTO families are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the registered-document and test-liability audit after exact 695af6c6. Delete only complete dead authority slices and tests with no consequential claim. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, Persona consequences, exact native/provider requests, governed tool receipts, and the complete unrun Model Atlas vertical slice. Component tests are not collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + next_action: Resume the registered-document and test-liability audit after exact 65bf044f. Delete only complete dead authority slices and tests with no consequential claim. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, Persona consequences, exact native/provider requests, governed tool receipts, and the complete unrun Model Atlas vertical slice. Component tests are not collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v28. The spine is 9,656 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v29. Hands consequence documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. The spine is 9,645 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. From d9a196a0173b70f9b48ae4e12a9ec87a6313c1cc Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 08:20:43 +0200 Subject: [PATCH 052/340] Collapse autonomous proposal origin authority --- epiphany-core/src/current_work.rs | 2 +- epiphany-core/src/repo_model_gateway.rs | 32 ++---- epiphany-core/src/runtime_spine.rs | 137 +++++++++--------------- 3 files changed, 59 insertions(+), 112 deletions(-) diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index 73115155..043a2d26 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -3077,7 +3077,7 @@ pub fn launch_current_proposal_modeling_work( .get::(&request.proposal_id)? .ok_or_else(|| anyhow!("proposal Modeling launch lost its proposal"))?; crate::runtime_spine::validate_repo_frontier_work_proposal(&proposal)?; - crate::runtime_spine::validate_autonomous_proposal_binding(&cache, &proposal)?; + crate::runtime_spine::validate_autonomous_proposal_origin(&cache, &proposal)?; let identity = cache .get::(crate::RUNTIME_IDENTITY_KEY)? .ok_or_else(|| anyhow!("proposal Modeling launch requires runtime identity"))?; diff --git a/epiphany-core/src/repo_model_gateway.rs b/epiphany-core/src/repo_model_gateway.rs index 477c2f03..f24c1697 100644 --- a/epiphany-core/src/repo_model_gateway.rs +++ b/epiphany-core/src/repo_model_gateway.rs @@ -61,16 +61,14 @@ pub const REPO_FRONTIER_RESEARCH_REQUEST_CONTRACT: &str = "epiphany.repo_frontier_research_request.v3"; pub const REPO_FRONTIER_WORK_PROPOSAL_CONTRACT: &str = "epiphany.repo_frontier_work_proposal.inert.v3"; -pub const REPO_FRONTIER_AUTONOMOUS_PROPOSAL_BINDING_SCHEMA_VERSION: &str = - "epiphany.self.repo_frontier_autonomous_proposal_binding.v2"; pub const RUNTIME_REPOSITORY_DOMAIN_BINDING_KEY: &str = "runtime-repository-domain-binding"; pub const RUNTIME_REPOSITORY_DOMAIN_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.repository_domain_binding.v0"; pub const RUNTIME_REPOSITORY_DOMAIN_BINDING_CONTRACT: &str = "deployment configuration binds one organizational repository name to one exact authenticated repository Body; Self may consume but not relabel it"; pub const REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_SCHEMA_VERSION: &str = - "epiphany.coordinator.repo_frontier_proposal_modeling_request.v0"; + "epiphany.coordinator.repo_frontier_proposal_modeling_request.v1"; pub const REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_CONTRACT: &str = - "epiphany.repo_frontier_proposal_modeling_request.v0"; + "epiphany.repo_frontier_proposal_modeling_request.v1"; pub const REPO_FRONTIER_PLAN_MIND_REQUEST_SCHEMA_VERSION: &str = "epiphany.self.repo_frontier_plan_mind_request.v1"; pub const REPO_FRONTIER_PLAN_MIND_REQUEST_CONTRACT: &str = @@ -110,26 +108,6 @@ pub fn repo_frontier_proposal_payload_sha256( Ok(format!("{:x}", Sha256::digest(content))) } -#[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] -#[cultcache( - type = "epiphany.self.repo_frontier_autonomous_proposal_binding", - schema = "RepoFrontierAutonomousProposalBinding" -)] -pub struct RepoFrontierAutonomousProposalBinding { - #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] - pub direction_result_id: String, - #[cultcache(key = 2)] - pub option_ordinal: u32, - #[cultcache(key = 3)] - pub direction_worker_job_id: String, - #[cultcache(key = 4)] - pub direction_worker_result_sha256: String, - #[cultcache(key = 5)] - pub direction_worker_launch_sha256: String, -} - #[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] #[cultcache( type = "epiphany.runtime.repository_domain_binding", @@ -182,6 +160,12 @@ pub struct RepoFrontierProposalModelingRequest { pub selected_at: String, #[cultcache(key = 9)] pub contract: String, + #[cultcache(key = 10)] + pub direction_result_id: String, + #[cultcache(key = 11)] + pub direction_option_ordinal: u32, + #[cultcache(key = 12)] + pub direction_worker_job_id: String, } #[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index a1246f36..4ad4d0af 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -9,7 +9,6 @@ use crate::eyes_gateway::EyesEvidencePacket; use crate::eyes_gateway::EyesSourceLookupReceipt; use crate::hands_gateway::*; use crate::repo_model_gateway::{ - REPO_FRONTIER_AUTONOMOUS_PROPOSAL_BINDING_SCHEMA_VERSION, REPO_FRONTIER_HANDS_AUTHORITY_CONTRACT, REPO_FRONTIER_HANDS_AUTHORITY_SCHEMA_VERSION, REPO_FRONTIER_MODELING_REQUEST_CONTRACT, REPO_FRONTIER_MODELING_REQUEST_SCHEMA_VERSION, REPO_FRONTIER_PLAN_CANDIDATE_SCHEMA_VERSION, REPO_FRONTIER_PLAN_DECISION_CONTRACT, @@ -23,11 +22,11 @@ use crate::repo_model_gateway::{ REPO_FRONTIER_ROUTE_CONTRACT, REPO_FRONTIER_ROUTE_SCHEMA_VERSION, REPO_FRONTIER_WORK_PROPOSAL_CONTRACT, REPO_FRONTIER_WORK_PROPOSAL_SCHEMA_VERSION, RUNTIME_REPOSITORY_DOMAIN_BINDING_CONTRACT, RUNTIME_REPOSITORY_DOMAIN_BINDING_KEY, - RUNTIME_REPOSITORY_DOMAIN_BINDING_SCHEMA_VERSION, RepoFrontierAutonomousProposalBinding, - RepoFrontierHandsAuthority, RepoFrontierModelingRequest, RepoFrontierNextOrgan, - RepoFrontierPlanCandidate, RepoFrontierPlanDecision, RepoFrontierPlanDecisionReceipt, - RepoFrontierPlanMindDecision, RepoFrontierPlanMindRequest, RepoFrontierPlanningFailureReview, - RepoFrontierPlanningLifecycle, RepoFrontierPlanningLifecycleStage, RepoFrontierPlanningRequest, + RUNTIME_REPOSITORY_DOMAIN_BINDING_SCHEMA_VERSION, RepoFrontierHandsAuthority, + RepoFrontierModelingRequest, RepoFrontierNextOrgan, RepoFrontierPlanCandidate, + RepoFrontierPlanDecision, RepoFrontierPlanDecisionReceipt, RepoFrontierPlanMindDecision, + RepoFrontierPlanMindRequest, RepoFrontierPlanningFailureReview, RepoFrontierPlanningLifecycle, + RepoFrontierPlanningLifecycleStage, RepoFrontierPlanningRequest, RepoFrontierProposalModelingRequest, RepoFrontierResearchRequest, RepoFrontierRoute, RepoFrontierVerdictDisposition, RepoFrontierWorkProposal, RuntimeRepositoryDomainBinding, }; @@ -71,7 +70,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v29"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v30"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; pub const RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.model_execution_binding.v0"; @@ -816,7 +815,6 @@ fn runtime_spine_schema_cache() -> Result { cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; - cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; @@ -4556,7 +4554,7 @@ fn validated_proposal_modeling_worker_fulfillment( .get::(&request.proposal_id)? .ok_or_else(|| anyhow!("proposal Modeling fulfillment proposal is missing"))?; validate_repo_frontier_work_proposal(&proposal)?; - validate_autonomous_proposal_origin_binding(cache, &proposal)?; + validate_autonomous_proposal_origin_request(cache, &proposal)?; let launch = cache .get::(&result.job_id)? .ok_or_else(|| anyhow!("proposal Modeling fulfillment worker launch is missing"))?; @@ -4888,48 +4886,36 @@ pub(crate) fn validate_repo_frontier_work_proposal( Ok(()) } -fn validate_autonomous_proposal_origin_binding( +fn validate_autonomous_proposal_origin_request( cache: &CultCache, proposal: &RepoFrontierWorkProposal, -) -> Result<( - RepoFrontierAutonomousProposalBinding, - RepoFrontierProposalModelingRequest, -)> { - let binding_id = format!("autonomous-proposal-binding-{}", proposal.proposal_id); - let binding = cache - .get::(&binding_id)? - .ok_or_else(|| anyhow!("Imagination proposal lacks its autonomous origin binding"))?; - let result = cache - .get::(&binding.direction_result_id)? - .ok_or_else(|| anyhow!("autonomous proposal binding lost its direction result"))?; - let request = cache - .get::(&result.request_id)? - .ok_or_else(|| anyhow!("autonomous proposal binding lost its direction request"))?; +) -> Result { + let identity = require_identity(cache)?; let modeling_request_id = crate::proposal_modeling_request_id( - &request.runtime_id, + &identity.runtime_id, &proposal.proposal_id, &proposal.payload_sha256, ); let modeling_request = cache .get::(&modeling_request_id)? - .ok_or_else(|| anyhow!("autonomous proposal binding lost its Modeling request"))?; + .ok_or_else(|| anyhow!("Imagination proposal lacks its Modeling request"))?; validate_repo_frontier_proposal_modeling_request(&modeling_request)?; + let result = cache + .get::( + &modeling_request.direction_result_id, + )? + .ok_or_else(|| anyhow!("autonomous proposal request lost its direction result"))?; + let request = cache + .get::(&result.request_id)? + .ok_or_else(|| anyhow!("autonomous proposal request lost its direction request"))?; let worker_result = cache - .get::(&binding.direction_worker_job_id)? - .ok_or_else(|| anyhow!("autonomous proposal binding lost its Imagination worker result"))?; + .get::(&modeling_request.direction_worker_job_id)? + .ok_or_else(|| anyhow!("autonomous proposal request lost its Imagination worker result"))?; let worker_launch = cache - .get::(&binding.direction_worker_job_id)? - .ok_or_else(|| anyhow!("autonomous proposal binding lost its Imagination worker launch"))?; + .get::(&modeling_request.direction_worker_job_id)? + .ok_or_else(|| anyhow!("autonomous proposal request lost its Imagination worker launch"))?; crate::validate_admitted_model_direction_consideration_request(&request)?; crate::validate_admitted_model_direction_consideration_result(&request, &result)?; - let worker_result_sha256 = format!( - "{:x}", - Sha256::digest(rmp_serde::to_vec_named(&worker_result)?) - ); - let worker_launch_sha256 = format!( - "{:x}", - Sha256::digest(rmp_serde::to_vec_named(&worker_launch)?) - ); let worker_direction = worker_result .admitted_model_direction_consideration_result()? .ok_or_else(|| anyhow!("autonomous proposal worker result lost its direction cargo"))?; @@ -4941,8 +4927,8 @@ fn validate_autonomous_proposal_origin_binding( }; let option = result .option_drafts - .get(binding.option_ordinal as usize) - .ok_or_else(|| anyhow!("autonomous proposal binding names a missing option"))?; + .get(modeling_request.direction_option_ordinal as usize) + .ok_or_else(|| anyhow!("autonomous proposal request names a missing option"))?; let route = cache .get::(crate::RUNTIME_BODY_STORE_BINDING_KEY)? .ok_or_else(|| anyhow!("autonomous proposal requires repository Body binding"))?; @@ -4950,17 +4936,9 @@ fn validate_autonomous_proposal_origin_binding( .get::(RUNTIME_REPOSITORY_DOMAIN_BINDING_KEY)? .ok_or_else(|| anyhow!("autonomous proposal requires repository domain binding"))?; let chain_checks = [ - ( - "worker result hash", - binding.direction_worker_result_sha256 == worker_result_sha256, - ), - ( - "worker launch hash", - binding.direction_worker_launch_sha256 == worker_launch_sha256, - ), ( "worker job", - worker_result.job_id == binding.direction_worker_job_id, + worker_result.job_id == modeling_request.direction_worker_job_id, ), ( "worker role", @@ -4979,7 +4957,7 @@ fn validate_autonomous_proposal_origin_binding( result.result_id == crate::admitted_model_direction_consideration_result_id_for_launch( &request.request_id, - &binding.direction_worker_job_id, + &modeling_request.direction_worker_job_id, ), ), ( @@ -4988,6 +4966,10 @@ fn validate_autonomous_proposal_origin_binding( .role .eq_ignore_ascii_case(EPIPHANY_IMAGINATION_OWNER_ROLE), ), + ( + "launch job", + worker_launch.job_id == modeling_request.direction_worker_job_id, + ), ( "launch binding", worker_launch.binding_id == EPIPHANY_IMAGINATION_ROLE_BINDING_ID, @@ -5009,8 +4991,7 @@ fn validate_autonomous_proposal_origin_binding( "autonomous proposal Imagination chain mismatch: {failed}" )); } - if binding.schema_version != REPO_FRONTIER_AUTONOMOUS_PROPOSAL_BINDING_SCHEMA_VERSION - || binding.direction_result_id != result.result_id + if modeling_request.direction_result_id != result.result_id || modeling_request.proposal_id != proposal.proposal_id || modeling_request.proposal_payload_sha256 != proposal.payload_sha256 || modeling_request.runtime_id != request.runtime_id @@ -5028,14 +5009,14 @@ fn validate_autonomous_proposal_origin_binding( { return Err(anyhow!("autonomous proposal origin binding mismatch")); } - Ok((binding, modeling_request)) + Ok(modeling_request) } -pub(crate) fn validate_autonomous_proposal_binding( +pub(crate) fn validate_autonomous_proposal_origin( cache: &CultCache, proposal: &RepoFrontierWorkProposal, -) -> Result { - let (binding, modeling_request) = validate_autonomous_proposal_origin_binding(cache, proposal)?; +) -> Result<()> { + let modeling_request = validate_autonomous_proposal_origin_request(cache, proposal)?; let route = cache .get::(crate::RUNTIME_BODY_STORE_BINDING_KEY)? .ok_or_else(|| anyhow!("autonomous proposal requires repository Body binding"))?; @@ -5050,7 +5031,7 @@ pub(crate) fn validate_autonomous_proposal_binding( { return Err(anyhow!("autonomous proposal Body binding mismatch")); } - Ok(binding) + Ok(()) } pub(crate) fn validate_repo_frontier_proposal_modeling_request( @@ -5065,6 +5046,8 @@ pub(crate) fn validate_repo_frontier_proposal_modeling_request( || request.thread_id.trim().is_empty() || request.repository.trim().is_empty() || request.workspace.trim().is_empty() + || request.direction_result_id.trim().is_empty() + || request.direction_worker_job_id.trim().is_empty() || request.request_id != crate::proposal_modeling_request_id( &request.runtime_id, @@ -5248,17 +5231,6 @@ pub(crate) fn promote_autonomous_direction_options_for_modeling( )); } let direction_worker = direction_workers.remove(0); - let direction_launch = opening - .get::(&direction_worker.job_id)? - .ok_or_else(|| anyhow!("autonomous proposal direction worker lost its launch"))?; - let direction_worker_result_sha256 = format!( - "{:x}", - Sha256::digest(rmp_serde::to_vec_named(&direction_worker)?) - ); - let direction_worker_launch_sha256 = format!( - "{:x}", - Sha256::digest(rmp_serde::to_vec_named(&direction_launch)?) - ); for (ordinal, option) in result.option_drafts.iter().enumerate() { if option.title.trim().is_empty() || option.summary.trim().is_empty() { return Err(anyhow!("autonomous direction option is empty")); @@ -5308,15 +5280,6 @@ pub(crate) fn promote_autonomous_direction_options_for_modeling( contract: REPO_FRONTIER_WORK_PROPOSAL_CONTRACT.into(), }; validate_repo_frontier_work_proposal(&proposal)?; - let binding_id = format!("autonomous-proposal-binding-{proposal_id}"); - let binding = RepoFrontierAutonomousProposalBinding { - schema_version: REPO_FRONTIER_AUTONOMOUS_PROPOSAL_BINDING_SCHEMA_VERSION.into(), - direction_result_id: result.result_id.clone(), - option_ordinal: ordinal as u32, - direction_worker_job_id: direction_worker.job_id.clone(), - direction_worker_result_sha256: direction_worker_result_sha256.clone(), - direction_worker_launch_sha256: direction_worker_launch_sha256.clone(), - }; let selection = RepoFrontierProposalModelingRequest { schema_version: REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_SCHEMA_VERSION.into(), request_id: crate::proposal_modeling_request_id( @@ -5332,40 +5295,40 @@ pub(crate) fn promote_autonomous_direction_options_for_modeling( workspace: body_binding.git_top_level.clone(), selected_at: selected_at.into(), contract: REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_CONTRACT.into(), + direction_result_id: result.result_id.clone(), + direction_option_ordinal: ordinal as u32, + direction_worker_job_id: direction_worker.job_id.clone(), }; validate_repo_frontier_proposal_modeling_request(&selection)?; let mut current = runtime_spine_cache(runtime_store)?; current.pull_all_backing_stores()?; let existing = ( current.get::(&proposal.proposal_id)?, - current.get::(&binding_id)?, current.get::(&selection.request_id)?, ); - let replay_selection_matches = existing.2.as_ref().is_some_and(|existing_selection| { + let replay_selection_matches = existing.1.as_ref().is_some_and(|existing_selection| { let mut replay_selection = selection.clone(); replay_selection.selected_at = existing_selection.selected_at.clone(); existing_selection == &replay_selection }); - if let (Some(existing_proposal), Some(_), Some(existing_selection)) = &existing { - validate_autonomous_proposal_binding(¤t, existing_proposal)?; + if let (Some(existing_proposal), Some(existing_selection)) = &existing { + validate_autonomous_proposal_origin(¤t, existing_proposal)?; if existing_proposal == &proposal && replay_selection_matches { promoted.push(existing_selection.clone()); continue; } } - if existing.0.is_some() || existing.1.is_some() || existing.2.is_some() { + if existing.0.is_some() || existing.1.is_some() { return Err(anyhow!( - "autonomous proposal promotion companion collision for {}: proposalPresent={} bindingPresent={} selectionPresent={} proposalMatches={} selectionMatches={}", + "autonomous proposal promotion companion collision for {}: proposalPresent={} selectionPresent={} proposalMatches={} selectionMatches={}", proposal.proposal_id, existing.0.is_some(), existing.1.is_some(), - existing.2.is_some(), existing.0.as_ref() == Some(&proposal), replay_selection_matches, )); } let (proposal_envelope, _) = current.prepare_entry(&proposal.proposal_id, &proposal)?; - let (binding_envelope, _) = current.prepare_entry(&binding_id, &binding)?; let (selection_envelope, _) = current.prepare_entry(&selection.request_id, &selection)?; let mut expected = vec![ @@ -5416,7 +5379,7 @@ pub(crate) fn promote_autonomous_direction_options_for_modeling( expected.push(envelope); } let mut replacement = expected.clone(); - replacement.extend([proposal_envelope, binding_envelope, selection_envelope]); + replacement.extend([proposal_envelope, selection_envelope]); if !SingleFileMessagePackBackingStore::new(runtime_store) .compare_and_swap_batch(&expected, replacement)? { @@ -8423,7 +8386,7 @@ fn validate_archivable_typed_worker_launch( .get::(&request.proposal_id)? .ok_or_else(|| anyhow!("archived proposal Modeling launch lost its proposal"))?; validate_repo_frontier_work_proposal(&proposal)?; - validate_autonomous_proposal_origin_binding(cache, &proposal)?; + validate_autonomous_proposal_origin_request(cache, &proposal)?; let projection = match &document { EpiphanyWorkerLaunchDocument::Role(document) => { document.proposal_modeling_context.as_ref() From ce3f90df6cfcdceff9ae30975d8c8269c1058498 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 08:32:45 +0200 Subject: [PATCH 053/340] Record proposal origin authority collapse --- notes/epiphany-current-algorithmic-map.md | 17 ++++++++++++++--- notes/epiphany-fork-implementation-plan.md | 9 ++++++++- notes/fresh-workspace-handoff.md | 21 +++++++++++++++++---- state/ledgers.msgpack | Bin 710216 -> 711043 bytes state/map.yaml | 7 ++++--- 5 files changed, 43 insertions(+), 11 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 8e7c469e..ae40f8bd 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `65bf044f` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for Hands receipt authority subtraction; +Latest committed implementation cut: `d9a196a0` on `codex/epiphany-shakedown-live` +Current worktree cut: documentation/evidence for autonomous proposal origin collapse; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -113,6 +113,17 @@ Persona admission and creates exact Verification work, while package cleanup removes the 678.6 MiB it generated. The cut removes 67 net maintained lines. Atlas remains the untouched, unaccepted collaboration slice. +Autonomous proposal origin has one owner. Exact `d9a196a0` folds the direction +result, option ordinal, and worker job identities into the Proposal-Modeling +request that already owns selection. The separate binding document, schema, +registration, third atomic write, collision branch, and copied launch/result +hashes are deleted. Promotion still strongly reads the immutable direction +request/result and worker launch/result while inserting one proposal/request +pair; launch, fulfillment, and archival validate the same request-owned chain. +Runtime advances to v30. The full keyed lifecycle and old-store refusal pass; +package cleanup removes 677.6 MiB. The cut removes 53 net maintained lines and +does not touch the unrun Atlas crossing. + CultMesh contains no JSON-derived operator snapshot, coordinator receipt, Hands gate, role-review event, unauthenticated Odin/Eve provider row, or daemon tool directory. Native runtime and keyed Mind receipts remain the owners; old @@ -1055,7 +1066,7 @@ Accepted through the local `5b799b12` source boundary: Open before Model Atlas Gate 1 resumes: -1. let Idunn compile, test, and seal exact build-affecting source `65bf044f`; +1. let Idunn compile, test, and seal exact build-affecting source `d9a196a0`; 2. use that exact package in private fresh-store Ox17; stop after three provider failures total, and prove direct Body Modeling, typed refusal-to-retry if exercised, Hands through Verification, exact context diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index eac2995a..1bbd3f81 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -224,7 +224,7 @@ Delete or demote: Keep the five-day shakedown, Ox17 deployment, and Model Atlas operational Gate 1 paused. Continue the source-subtraction and test-authority audit from exact -`65bf044f`. The current sequence has deleted the semantic-memory/workspace-coverage +`d9a196a0`. The current sequence has deleted the semantic-memory/workspace-coverage projection system, its local daemon supervisor, and the surviving generic RepoModel profile, impossible lifecycle, producerless receipt/summary, and decorative scoring axes. Modeling consumes typed Body and keyed RepoModel state @@ -382,6 +382,13 @@ Cut in this order: receipt identity remain. Runtime advances to v29. The concurrent Persona/Hands-to-Verification proof and old-epoch refusal pass; package cleanup removes 678.6 MiB. Atlas remains unchanged and unaccepted. + Exact `d9a196a0` makes the Proposal-Modeling request the sole owner of + autonomous proposal origin. The companion binding document, schema, + registration, third CAS write, collision branch, and copied worker hashes + are gone; exact direction-result, option-ordinal, and worker-job identities + live on the request. Runtime advances to v30. The full keyed lifecycle and + old-store refusal pass; package cleanup removes 677.6 MiB. Atlas remains + unchanged and unaccepted. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index d763ead8..5af8aa65 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `65bf044f` -Current worktree: documentation/evidence for Hands receipt authority subtraction; +Latest committed implementation cut: `d9a196a0` +Current worktree: documentation/evidence for autonomous proposal origin collapse; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `65bf044f` is the current +production symlink body and is inactive. Exact `d9a196a0` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,19 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `d9a196a0` makes `RepoFrontierProposalModelingRequest` the sole durable +owner of autonomous proposal origin. It carries the exact direction-result, +option-ordinal, and worker-job identities. The separate binding type, schema +constant, runtime registration, third CAS envelope, replay collision branch, +and duplicate worker-result/launch hashes are gone. The referenced launch and +result remain immutable typed documents and promotion strongly reads them when +atomically inserting the proposal/request pair. Runtime advances to v30. The +existing full keyed lifecycle passes promotion, concurrent launch, retry +ancestry, Modeling admission, concurrent Persona/Hands, and Verification +(1/1); epoch refusal passes (1/1). Package cleanup removes 677.6 MiB. The cut +removes 53 net maintained lines. Atlas remains untouched and no live +inter-swarm collaboration has run. + Exact `65bf044f` removes fixed schema-version strings and unread contract prose from Hands patch, command, and commit receipts. CultCache already owns their type/schema identity; exact intent, review, Substrate Gate grant, runtime job, @@ -968,7 +981,7 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action The Ox17 deployment lane is paused. Continue the registered-document and test- -liability audit from exact `65bf044f`; do not compile or deploy through Idunn +liability audit from exact `d9a196a0`; do not compile or deploy through Idunn yet. Delete an abstraction with tests that merely animate it when it has no decision-bearing consumer. Preserve keyed Mind, sealed reasoning, direct Body- to-Modeling flow, family admission owners, Persona social state, provider diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index c97a2934a989ebcc9ab5af9f8e5793c9f8642f75..8e2e95988ce08f84ac0e99f60fe48fa1ae520cd5 100644 GIT binary patch delta 726 zcmX|;&u-H|5XN!JzZ!AjP^oYkR0$Q;P2v_(wVVKf;7|#Lss}DGu_y78_3n0eohGLo zdf)|!{05v5Ldtj;H-eKOI6j*-KFk^ctGchSF0-z%uClJNuCrFZ%^KnSXZd5i8iqR$j@ospGQJz! zp03<@Hpaw5x{vXG2iuTnDbYA`;4=a&yjD8bh1)h(8|_enwqhU@^n^-<8h}ts%zjE6a8Hrx&ho@EDA4(RM-aVke7=&T*Nj{QEInzg16g zOjh(OX8fW2^ef!F<6tvx#rNy1N#U7zu16f{;cof%OSpEgB5g1k;(&k?qbkgQPiJqh P*?~jxq*=Dk!x#SmQTYQr delta 75 zcmZqPtbJmQ_69LVUQ;U*b1M_GsACLVS5-GFGZr#3hBi-SYM;u)2*e Date: Mon, 24 Aug 2026 08:50:03 +0200 Subject: [PATCH 054/340] Collapse repository domain binding --- epiphany-core/src/bin/epiphany-swarm.rs | 20 ++++++------- epiphany-core/src/current_work.rs | 6 +--- epiphany-core/src/repo_model_gateway.rs | 19 +------------ epiphany-core/src/runtime_spine.rs | 37 ++++--------------------- 4 files changed, 16 insertions(+), 66 deletions(-) diff --git a/epiphany-core/src/bin/epiphany-swarm.rs b/epiphany-core/src/bin/epiphany-swarm.rs index d2474654..d8cbaa6e 100644 --- a/epiphany-core/src/bin/epiphany-swarm.rs +++ b/epiphany-core/src/bin/epiphany-swarm.rs @@ -10,19 +10,17 @@ use epiphany_core::{ derive_resident_cognition_readiness, enqueue_resident_self_pressure_idempotent, import_bifrost_persona_feedback_deliveries, ingest_resident_self_current_work_pressure, issue_resident_self_grant, live_resident_self_typed_request_ids, - load_epiphany_cultmesh_swarm_brake, - load_resident_self_state, materialize_resident_self_domain_obligations, - observe_process_instance, prepare_resident_self_launch, - publish_resident_provider_readiness, reap_exited_child_process, + load_epiphany_cultmesh_swarm_brake, load_resident_self_state, + materialize_resident_self_domain_obligations, observe_process_instance, + prepare_resident_self_launch, publish_resident_provider_readiness, reap_exited_child_process, recover_dead_runtime_worker_attempts, resident_cognitive_runtime_id, resident_prepared_launch_thread_id, resident_self_child_claim, resident_self_local_provider_status, retain_completed_runtime_sessions, - retain_failed_runtime_worker_attempts, - retain_fulfilled_runtime_worker_attempts, retain_resident_self_lifecycles, - runtime_worker_process_claims, settle_resident_self_exited_coordinator, - settle_resident_self_receipt_free_dead_coordinator, terminate_process_instance, - validate_persona_feedback_store_separation, validate_resident_self_coordinator_receipt_binding, - validate_resident_self_store_separation, + retain_failed_runtime_worker_attempts, retain_fulfilled_runtime_worker_attempts, + retain_resident_self_lifecycles, runtime_worker_process_claims, + settle_resident_self_exited_coordinator, settle_resident_self_receipt_free_dead_coordinator, + terminate_process_instance, validate_persona_feedback_store_separation, + validate_resident_self_coordinator_receipt_binding, validate_resident_self_store_separation, }; use serde_json::json; use std::collections::BTreeMap; @@ -264,7 +262,6 @@ fn cycle( bind_runtime_repository_domain( &args.policy.runtime_store, &args.feedback_target_repository, - &Utc::now().to_rfc3339(), )?; materialize_resident_self_domain_obligations( &args.policy.runtime_store, @@ -806,5 +803,4 @@ mod brake_tests { )?); Ok(()) } - } diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index 043a2d26..e453566e 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -3950,11 +3950,7 @@ mod tests { let (body_binding, _) = crate::load_repository_body_status(std::path::Path::new(&route.body_store_path))? .expect("runtime Body store remains authenticated"); - crate::bind_runtime_repository_domain( - &store, - "GameCult/Epiphany", - "2026-08-17T00:00:05.100Z", - )?; + crate::bind_runtime_repository_domain(&store, "GameCult/Epiphany")?; let direction_request = crate::commit_admitted_model_direction_consideration_request( &store, "2026-08-17T00:00:05.200Z", diff --git a/epiphany-core/src/repo_model_gateway.rs b/epiphany-core/src/repo_model_gateway.rs index f24c1697..d2551d88 100644 --- a/epiphany-core/src/repo_model_gateway.rs +++ b/epiphany-core/src/repo_model_gateway.rs @@ -62,9 +62,6 @@ pub const REPO_FRONTIER_RESEARCH_REQUEST_CONTRACT: &str = pub const REPO_FRONTIER_WORK_PROPOSAL_CONTRACT: &str = "epiphany.repo_frontier_work_proposal.inert.v3"; pub const RUNTIME_REPOSITORY_DOMAIN_BINDING_KEY: &str = "runtime-repository-domain-binding"; -pub const RUNTIME_REPOSITORY_DOMAIN_BINDING_SCHEMA_VERSION: &str = - "epiphany.runtime.repository_domain_binding.v0"; -pub const RUNTIME_REPOSITORY_DOMAIN_BINDING_CONTRACT: &str = "deployment configuration binds one organizational repository name to one exact authenticated repository Body; Self may consume but not relabel it"; pub const REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_SCHEMA_VERSION: &str = "epiphany.coordinator.repo_frontier_proposal_modeling_request.v1"; pub const REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_CONTRACT: &str = @@ -115,23 +112,9 @@ pub fn repo_frontier_proposal_payload_sha256( )] pub struct RuntimeRepositoryDomainBinding { #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] - pub binding_id: String, - #[cultcache(key = 2)] pub repository_full_name: String, - #[cultcache(key = 3)] - pub runtime_id: String, - #[cultcache(key = 4)] - pub swarm_id: String, - #[cultcache(key = 5)] - pub workspace_id: String, - #[cultcache(key = 6)] + #[cultcache(key = 1)] pub body_binding_sha256: String, - #[cultcache(key = 7)] - pub bound_at: String, - #[cultcache(key = 8)] - pub contract: String, } #[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index 4ad4d0af..bc25d061 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -21,11 +21,10 @@ use crate::repo_model_gateway::{ REPO_FRONTIER_RESEARCH_REQUEST_CONTRACT, REPO_FRONTIER_RESEARCH_REQUEST_SCHEMA_VERSION, REPO_FRONTIER_ROUTE_CONTRACT, REPO_FRONTIER_ROUTE_SCHEMA_VERSION, REPO_FRONTIER_WORK_PROPOSAL_CONTRACT, REPO_FRONTIER_WORK_PROPOSAL_SCHEMA_VERSION, - RUNTIME_REPOSITORY_DOMAIN_BINDING_CONTRACT, RUNTIME_REPOSITORY_DOMAIN_BINDING_KEY, - RUNTIME_REPOSITORY_DOMAIN_BINDING_SCHEMA_VERSION, RepoFrontierHandsAuthority, - RepoFrontierModelingRequest, RepoFrontierNextOrgan, RepoFrontierPlanCandidate, - RepoFrontierPlanDecision, RepoFrontierPlanDecisionReceipt, RepoFrontierPlanMindDecision, - RepoFrontierPlanMindRequest, RepoFrontierPlanningFailureReview, RepoFrontierPlanningLifecycle, + RUNTIME_REPOSITORY_DOMAIN_BINDING_KEY, RepoFrontierHandsAuthority, RepoFrontierModelingRequest, + RepoFrontierNextOrgan, RepoFrontierPlanCandidate, RepoFrontierPlanDecision, + RepoFrontierPlanDecisionReceipt, RepoFrontierPlanMindDecision, RepoFrontierPlanMindRequest, + RepoFrontierPlanningFailureReview, RepoFrontierPlanningLifecycle, RepoFrontierPlanningLifecycleStage, RepoFrontierPlanningRequest, RepoFrontierProposalModelingRequest, RepoFrontierResearchRequest, RepoFrontierRoute, RepoFrontierVerdictDisposition, RepoFrontierWorkProposal, RuntimeRepositoryDomainBinding, @@ -70,7 +69,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v30"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v31"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; pub const RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.model_execution_binding.v0"; @@ -4996,13 +4995,7 @@ fn validate_autonomous_proposal_origin_request( || modeling_request.proposal_payload_sha256 != proposal.payload_sha256 || modeling_request.runtime_id != request.runtime_id || modeling_request.thread_id != request.thread_id - || domain.schema_version != RUNTIME_REPOSITORY_DOMAIN_BINDING_SCHEMA_VERSION - || domain.contract != RUNTIME_REPOSITORY_DOMAIN_BINDING_CONTRACT - || domain.binding_id != RUNTIME_REPOSITORY_DOMAIN_BINDING_KEY || domain.repository_full_name != modeling_request.repository - || domain.runtime_id != route.runtime_id - || domain.swarm_id != route.swarm_id - || domain.workspace_id != route.workspace_id || domain.body_binding_sha256 != route.body_binding_sha256 || proposal.title != option.title || proposal.body != option.summary @@ -5066,7 +5059,6 @@ pub(crate) fn validate_repo_frontier_proposal_modeling_request( pub fn bind_runtime_repository_domain( runtime_store: impl AsRef, repository_full_name: &str, - bound_at: &str, ) -> Result { if !repository_full_name.starts_with("GameCult/") || repository_full_name["GameCult/".len()..].trim().is_empty() @@ -5076,8 +5068,6 @@ pub fn bind_runtime_repository_domain( "runtime repository domain requires a canonical GameCult name" )); } - chrono::DateTime::parse_from_rfc3339(bound_at) - .map_err(|_| anyhow!("runtime repository domain timestamp must be RFC3339"))?; let runtime_store = runtime_store.as_ref(); let mut cache = runtime_spine_cache(runtime_store)?; cache.pull_all_backing_stores()?; @@ -5096,22 +5086,13 @@ pub fn bind_runtime_repository_domain( return Err(anyhow!("runtime repository domain Body authority mismatch")); } let binding = RuntimeRepositoryDomainBinding { - schema_version: RUNTIME_REPOSITORY_DOMAIN_BINDING_SCHEMA_VERSION.into(), - binding_id: RUNTIME_REPOSITORY_DOMAIN_BINDING_KEY.into(), repository_full_name: repository_full_name.into(), - runtime_id: route.runtime_id.clone(), - swarm_id: route.swarm_id.clone(), - workspace_id: route.workspace_id.clone(), body_binding_sha256: route.body_binding_sha256.clone(), - bound_at: bound_at.into(), - contract: RUNTIME_REPOSITORY_DOMAIN_BINDING_CONTRACT.into(), }; if let Some(existing) = cache.get::(RUNTIME_REPOSITORY_DOMAIN_BINDING_KEY)? { - let mut replay = binding; - replay.bound_at = existing.bound_at.clone(); - return if replay == existing { + return if binding == existing { Ok(existing) } else { Err(anyhow!("runtime repository domain is immutable")) @@ -5193,13 +5174,7 @@ pub(crate) fn promote_autonomous_direction_options_for_modeling( != route.body_binding_sha256 || Path::new(workspace).canonicalize()? != Path::new(&body_binding.git_top_level).canonicalize()? - || domain.schema_version != RUNTIME_REPOSITORY_DOMAIN_BINDING_SCHEMA_VERSION - || domain.contract != RUNTIME_REPOSITORY_DOMAIN_BINDING_CONTRACT - || domain.binding_id != RUNTIME_REPOSITORY_DOMAIN_BINDING_KEY || domain.repository_full_name != repository - || domain.runtime_id != route.runtime_id - || domain.swarm_id != route.swarm_id - || domain.workspace_id != route.workspace_id || domain.body_binding_sha256 != route.body_binding_sha256 { return Err(anyhow!( From 4003258b8f50b1009aa8065e5ee7a57e463c9bea Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 08:52:12 +0200 Subject: [PATCH 055/340] Record minimal repository identity authority --- notes/epiphany-current-algorithmic-map.md | 17 +++++++++++++-- notes/epiphany-fork-implementation-plan.md | 8 ++++++- notes/fresh-workspace-handoff.md | 23 ++++++++++++++++----- state/ledgers.msgpack | Bin 711043 -> 711692 bytes state/map.yaml | 5 +++-- 5 files changed, 43 insertions(+), 10 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index ae40f8bd..9bff097a 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,7 +1,7 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `d9a196a0` on `codex/epiphany-shakedown-live` +Latest committed implementation cut: `6f5d6600` on `codex/epiphany-shakedown-live` Current worktree cut: documentation/evidence for autonomous proposal origin collapse; Ox17 remains paused @@ -124,6 +124,19 @@ Runtime advances to v30. The full keyed lifecycle and old-store refusal pass; package cleanup removes 677.6 MiB. The cut removes 53 net maintained lines and does not touch the unrun Atlas crossing. +Repository-domain identity is one small typed receipt, not a second Body. +Exact `6f5d6600` retains the canonical organizational repository name and exact +authenticated Body hash, then deletes the copied runtime, swarm, workspace, +fixed envelope identity/schema prose, and binding timestamp. CultCache and the +authenticated Body route already own those facts. Bootstrap still validates +the live Body and atomically strong-reads runtime identity plus the Body route; +proposal promotion and fulfillment still refuse repository or Body-hash +substitution. Runtime advances to v31. The full keyed lifecycle and old-store +refusal pass; package cleanup removes 677.2 MiB. The cut removes 50 net +maintained lines. Atlas remains protected until a real inter-swarm exchange +exercises publication, trust, transport, projection, verification, admission, +wake, brake, and re-entry together. + CultMesh contains no JSON-derived operator snapshot, coordinator receipt, Hands gate, role-review event, unauthenticated Odin/Eve provider row, or daemon tool directory. Native runtime and keyed Mind receipts remain the owners; old @@ -1066,7 +1079,7 @@ Accepted through the local `5b799b12` source boundary: Open before Model Atlas Gate 1 resumes: -1. let Idunn compile, test, and seal exact build-affecting source `d9a196a0`; +1. let Idunn compile, test, and seal exact build-affecting source `6f5d6600`; 2. use that exact package in private fresh-store Ox17; stop after three provider failures total, and prove direct Body Modeling, typed refusal-to-retry if exercised, Hands through Verification, exact context diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 1bbd3f81..056460c4 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -224,7 +224,7 @@ Delete or demote: Keep the five-day shakedown, Ox17 deployment, and Model Atlas operational Gate 1 paused. Continue the source-subtraction and test-authority audit from exact -`d9a196a0`. The current sequence has deleted the semantic-memory/workspace-coverage +`6f5d6600`. The current sequence has deleted the semantic-memory/workspace-coverage projection system, its local daemon supervisor, and the surviving generic RepoModel profile, impossible lifecycle, producerless receipt/summary, and decorative scoring axes. Modeling consumes typed Body and keyed RepoModel state @@ -241,6 +241,12 @@ admission, wake, brake, and Eve path until Gate 1 exercises the complete crossin Streamlining may remove duplicate authors and process shells; it may not spend the only end-to-end collaboration path before it has carried real traffic. +Exact `6f5d6600` reduces the immutable repository-domain receipt to the +canonical organizational repository name and exact authenticated Body hash. +Runtime/swarm/workspace belong to the Body route; envelope type/key/schema +belong to CultCache; binding time and fixed prose own nothing. The typed receipt +still prevents deployment input from relabeling the Body after admission. + Resident Self now solely imports authenticated Bifrost deliveries; exact `3dda58a5` deletes the standalone Persona feedback ingress and its old Starfire snapshot seam. Exact `56267201` deletes the three unadmitted Atlas daemon diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 5af8aa65..fe69d0dc 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,9 +2,9 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `d9a196a0` -Current worktree: documentation/evidence for autonomous proposal origin collapse; -Ox17 remains paused +Latest committed implementation cut: `6f5d6600` +Current pass: repository-domain binding collapse landed and documented; Ox17 +remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `d9a196a0` is the current +production symlink body and is inactive. Exact `6f5d6600` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,19 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `6f5d6600` preserves the immutable typed repository-domain receipt while +cutting it from nine fields to the two facts it alone owns: the canonical +organizational repository name and the exact authenticated Body hash. +CultCache owns the envelope type, key, and schema; the authenticated Body route +owns runtime, swarm, and workspace. Binding time and fixed contract prose owned +no behavior. Bootstrap still authenticates the live Body and atomically +strong-reads runtime identity plus Body route; proposal promotion and +fulfillment still refuse repository or Body-hash substitution. Runtime advances +to v31. The full keyed lifecycle and old-store refusal pass (1/1 each), package +cleanup removes 677.2 MiB, and the cut removes 50 net maintained lines. Atlas +remains protected: no live inter-swarm collaboration has run, so component +tests cannot authorize narrowing its only complete crossing. + Exact `d9a196a0` makes `RepoFrontierProposalModelingRequest` the sole durable owner of autonomous proposal origin. It carries the exact direction-result, option-ordinal, and worker-job identities. The separate binding type, schema @@ -981,7 +994,7 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action The Ox17 deployment lane is paused. Continue the registered-document and test- -liability audit from exact `d9a196a0`; do not compile or deploy through Idunn +liability audit from exact `6f5d6600`; do not compile or deploy through Idunn yet. Delete an abstraction with tests that merely animate it when it has no decision-bearing consumer. Preserve keyed Mind, sealed reasoning, direct Body- to-Modeling flow, family admission owners, Persona social state, provider diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 8e2e95988ce08f84ac0e99f60fe48fa1ae520cd5..f4906639d5044864952dc0c50c3219535d019890 100644 GIT binary patch delta 590 zcmYk2zi!k(5XSLA;Lgy3(m+O{BX`C*at_K>xd>4p8ia(PfxY!OUS+*&_Rn2hQKX=u zJ^3vVQi|jWDAOQOL@8)#cm`%23W`s=+L`(G_s#Li=9jb0Z|l+R$=2@p>AUaO;)~xW z52KG!^yYZg`@HH!q;Os*-5{-zZjx@1`lP|>su%zH*`6N_;ojXW?8X}pdT*Z{ zG43EMCV7^nDbxlnngv>LCAPyy{rh_cIf~lB+&eIsdrn2+z-i!2X(c$5@SIh+?`3GH zwG~dA1{A$PExm11H@N$0rt=0$X3GRZ=RV^lf?g^Ms1_)7jUaMVPPpc=rCP?pSBEIv5#bxov-) z5AIzNb$(OItqGix(52E&Xw}&jUKTW65d=jmyv6?$YSS@|LMpI+PCq#xW)paI#RiKf zTT?j1hVZ2*kT+an=d9&=KC-l^;7G>dYi8{fCTaWrYrOFSYf+a>H6tE+XpAXeQ*Wgg rWR~shBx86fW(n*$$!sVvLCYk5hdiunj+_NxrQ6FNG4zQNXl2P?=PJ@+ delta 73 zcmeC#q20V$dxHccw~?Whfnn4!2Cf?ko0S<085zTxr!uuqWnu(k5X}t4EI`Z(#B4y! Q4#XTl%(;Ck6W6 Date: Mon, 24 Aug 2026 09:07:42 +0200 Subject: [PATCH 056/340] Strip objective intake ceremony --- .../src/bin/epiphany-mvp-coordinator.rs | 60 ++++--------------- .../src/coordinator_objective_intake.rs | 50 ++++++---------- epiphany-core/src/lib.rs | 2 - epiphany-core/src/runtime_spine.rs | 2 +- 4 files changed, 30 insertions(+), 84 deletions(-) diff --git a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs index a7eb507a..7c49679d 100644 --- a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs +++ b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs @@ -373,7 +373,7 @@ fn run_coordinator(args: &Args) -> Result { "threadId": thread_id, "grantId": claim.grant_id, "preparationId": preparation_id, - "mindProjectionDigest": intake.mind.projection_digest, + "mindProjectionDigest": intake.mind_projection_digest, "commitReceiptId": intake.commit_receipt.receipt_id, "canonicalObjectiveChanged": intake.changed, })); @@ -387,7 +387,7 @@ fn run_coordinator(args: &Args) -> Result { startup_events.push(json!({ "type": "operatorObjectiveIntake", "threadId": thread_id, - "mindProjectionDigest": intake.mind.projection_digest, + "mindProjectionDigest": intake.mind_projection_digest, "commitReceiptId": intake.commit_receipt.receipt_id, "changed": intake.changed, })); @@ -2183,52 +2183,6 @@ mod tests { Ok(()) } - #[test] - fn operator_objective_intake_creates_once_and_refuses_replacement() -> Result<()> { - let temp = tempfile::tempdir()?; - let store = temp.path().join("runtime.cc"); - epiphany_core::initialize_runtime_spine( - &store, - epiphany_core::RuntimeSpineInitOptions { - runtime_id: "objective-intake-bin".into(), - display_name: "Objective intake bin".into(), - created_at: "2026-08-14T00:00:00Z".into(), - }, - )?; - - let first = intake_operator_objective( - &store, - "thread-1", - "Map the machine", - "cli://epiphany-mvp-coordinator", - )?; - assert!(first.changed); - assert_eq!(first.mind.objective.as_deref(), Some("Map the machine")); - - let repeated = intake_operator_objective( - &store, - "thread-1", - " Map the machine ", - "cli://epiphany-mvp-coordinator", - )?; - assert!(!repeated.changed); - assert_eq!( - repeated.mind.projection_digest, - first.mind.projection_digest - ); - assert_eq!(repeated.commit_receipt, first.commit_receipt); - - let error = intake_operator_objective( - &store, - "thread-1", - "Replace the machine", - "cli://epiphany-mvp-coordinator", - ) - .expect_err("objective replacement must require a typed adoption flow"); - assert!(error.to_string().contains("refusing to replace")); - Ok(()) - } - #[test] fn resident_operator_objective_uses_the_authenticated_grant_as_provenance() -> Result<()> { let temp = tempfile::tempdir()?; @@ -2249,9 +2203,15 @@ mod tests { "resident-self-grant://grant-1", )?; assert!(applied.changed); - assert_eq!(applied.intake.source_ref, "resident-self-grant://grant-1"); + let mut cache = epiphany_core::runtime_spine_cache(&store)?; + cache.pull_all_backing_stores()?; + let intakes = cache.get_all::()?; + assert_eq!(intakes.len(), 1); + assert_eq!(intakes[0].source_ref, "resident-self-grant://grant-1"); assert_eq!( - applied.mind.objective.as_deref(), + epiphany_core::assemble_mind_view(&store)? + .objective + .as_deref(), Some("Keep the objective in Mind") ); assert!( diff --git a/epiphany-core/src/coordinator_objective_intake.rs b/epiphany-core/src/coordinator_objective_intake.rs index 4a209846..4d8bab2c 100644 --- a/epiphany-core/src/coordinator_objective_intake.rs +++ b/epiphany-core/src/coordinator_objective_intake.rs @@ -1,16 +1,13 @@ use crate::{ EpiphanyMindCommitAuthority, EpiphanyMindCommitOutcome, EpiphanyMindCommitReceipt, - EpiphanyMindDocumentVersion, EpiphanyMindObjectiveDocument, EpiphanyMindView, - MIND_OBJECTIVE_KEY, assemble_mind_view, commit_operator_mind_mutation, runtime_spine_cache, + EpiphanyMindDocumentVersion, EpiphanyMindObjectiveDocument, MIND_OBJECTIVE_KEY, + assemble_mind_view, commit_operator_mind_mutation, runtime_spine_cache, }; use anyhow::{Result, anyhow}; use cultcache_rs::DatabaseEntry; use sha2::{Digest, Sha256}; use std::path::Path; -pub const USER_OBJECTIVE_INTAKE_SCHEMA_VERSION: &str = "gamecult.epiphany.user_objective_intake.v0"; -pub const USER_OBJECTIVE_INTAKE_CONTRACT: &str = "The human supplies the initial objective. Self records that assertion and the canonical keyed Mind objective in one CAS. Thread identity is provenance only. Repeated identical intake is read-idempotent; replacement requires a separate reviewed adoption flow."; - #[derive(Debug, Clone)] pub struct UserObjectiveIntakeInput { pub thread_id: String, @@ -27,29 +24,20 @@ pub struct UserObjectiveIntakeInput { )] pub struct UserObjectiveIntake { #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] - pub intake_id: String, - #[cultcache(key = 2)] pub thread_id: String, - #[cultcache(key = 3)] + #[cultcache(key = 1)] pub objective: String, - #[cultcache(key = 4)] - pub objective_sha256: String, - #[cultcache(key = 5)] + #[cultcache(key = 2)] pub source_actor: String, - #[cultcache(key = 6)] + #[cultcache(key = 3)] pub source_ref: String, - #[cultcache(key = 7)] + #[cultcache(key = 4)] pub submitted_at: String, - #[cultcache(key = 8)] - pub contract: String, } #[derive(Debug, Clone)] pub struct UserObjectiveIntakeApplied { - pub intake: UserObjectiveIntake, - pub mind: EpiphanyMindView, + pub mind_projection_digest: String, pub commit_receipt: EpiphanyMindCommitReceipt, pub changed: bool, } @@ -70,7 +58,6 @@ pub fn intake_user_objective( { return Err(anyhow!("invalid typed user-objective intake")); } - let objective_sha256 = format!("{:x}", Sha256::digest(objective.as_bytes())); let intake_id = format!("user-objective-{:x}", Sha256::digest(thread_id.as_bytes())); let mut cache = runtime_spine_cache(store)?; @@ -81,7 +68,6 @@ pub fn intake_user_objective( .ok_or_else(|| anyhow!("typed user-objective intake lost its Mind objective"))?; if existing.thread_id != thread_id || existing.objective != objective - || existing.objective_sha256 != objective_sha256 || existing.source_actor != source_actor || existing.source_ref != source_ref || objective_document.objective.trim() != objective @@ -112,8 +98,7 @@ pub fn intake_user_objective( }) .ok_or_else(|| anyhow!("typed user-objective intake lost its Mind commit receipt"))?; return Ok(UserObjectiveIntakeApplied { - intake: existing, - mind: assemble_mind_view(store)?, + mind_projection_digest: assemble_mind_view(store)?.projection_digest, commit_receipt: receipt, changed: false, }); @@ -127,15 +112,11 @@ pub fn intake_user_objective( )); } let intake = UserObjectiveIntake { - schema_version: USER_OBJECTIVE_INTAKE_SCHEMA_VERSION.into(), - intake_id: intake_id.clone(), thread_id: thread_id.to_string(), objective: objective.to_string(), - objective_sha256, source_actor: source_actor.to_string(), source_ref: source_ref.to_string(), submitted_at: input.submitted_at, - contract: USER_OBJECTIVE_INTAKE_CONTRACT.into(), }; let provenance = cache.prepare_entry(&intake_id, &intake)?.0; let objective_write = crate::mind_documents::prepare_mind_document( @@ -159,8 +140,7 @@ pub fn intake_user_objective( } }; Ok(UserObjectiveIntakeApplied { - intake, - mind: assemble_mind_view(store)?, + mind_projection_digest: assemble_mind_view(store)?.projection_digest, commit_receipt, changed: true, }) @@ -195,7 +175,10 @@ mod tests { )?; let first = intake_user_objective(&store, input("Map the machine"))?; assert!(first.changed); - assert_eq!(first.mind.objective.as_deref(), Some("Map the machine")); + assert_eq!( + assemble_mind_view(&store)?.objective.as_deref(), + Some("Map the machine") + ); assert_eq!( first.commit_receipt.invariant_owner, "Self.user_objective_intake" @@ -208,11 +191,16 @@ mod tests { .iter() .all(|envelope| envelope.r#type != "epiphany.thread_state") ); + let after_first = std::fs::read(&store)?; let repeated = intake_user_objective(&store, input(" Map the machine "))?; assert!(!repeated.changed); - assert_eq!(repeated.intake, first.intake); + assert_eq!( + repeated.mind_projection_digest, + first.mind_projection_digest + ); assert_eq!(repeated.commit_receipt, first.commit_receipt); + assert_eq!(std::fs::read(&store)?, after_first); let before = std::fs::read(&store)?; let error = intake_user_objective(&store, input("Replace the machine")) diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index 300d6bda..7de1f3af 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -74,8 +74,6 @@ pub use agent_launch::epiphany_role_label; pub use agent_launch::epiphany_role_launch_output_schema; pub use atlas::*; pub use causal_work_identity::*; -pub use coordinator_objective_intake::USER_OBJECTIVE_INTAKE_CONTRACT; -pub use coordinator_objective_intake::USER_OBJECTIVE_INTAKE_SCHEMA_VERSION; pub use coordinator_objective_intake::UserObjectiveIntake; pub use coordinator_objective_intake::UserObjectiveIntakeApplied; pub use coordinator_objective_intake::UserObjectiveIntakeInput; diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index bc25d061..cbd4ad0d 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -69,7 +69,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v31"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v32"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; pub const RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.model_execution_binding.v0"; From 93b8fa8c158e847feee1f7aff2f9506f86951b71 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 09:10:48 +0200 Subject: [PATCH 057/340] Record lean objective intake authority --- notes/epiphany-current-algorithmic-map.md | 20 ++++++++++++++++--- notes/epiphany-fork-implementation-plan.md | 9 ++++++++- notes/fresh-workspace-handoff.md | 22 +++++++++++++++++---- state/ledgers.msgpack | Bin 711692 -> 712378 bytes state/map.yaml | 5 +++-- 5 files changed, 46 insertions(+), 10 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 9bff097a..02c7b6a1 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `6f5d6600` on `codex/epiphany-shakedown-live` -Current worktree cut: documentation/evidence for autonomous proposal origin collapse; +Latest committed implementation cut: `952dcd9f` on `codex/epiphany-shakedown-live` +Current pass: operator-objective intake collapse landed and documented; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -137,6 +137,20 @@ maintained lines. Atlas remains protected until a real inter-swarm exchange exercises publication, trust, transport, projection, verification, admission, wake, brake, and re-entry together. +Operator objective intake carries the human assertion, not a second objective +model. Exact `952dcd9f` keeps thread provenance, objective text, source actor +and reference, and submission time, while deleting fixed schema prose, stored +key identity, a digest of the already-hashed payload, and contract text. The +singleton Mind objective remains the active state and the commit receipt still +binds its exact operator provenance atomically. The outcome exposes only the +projection digest, commit receipt, and changed bit. A binary test that merely +repeated the library seed/idempotency/refusal proof is deleted; the library +proof now requires byte-identical replay and the resident-grant provenance +proof remains. Runtime advances to v32. The three focused proofs pass and the +cut removes 54 net maintained lines. Package cleanup removes 18.5 GiB; the +1.7 MiB state tool is preserved while another 961.1 MiB of regenerated build +artifacts is removed. Atlas is untouched. + CultMesh contains no JSON-derived operator snapshot, coordinator receipt, Hands gate, role-review event, unauthenticated Odin/Eve provider row, or daemon tool directory. Native runtime and keyed Mind receipts remain the owners; old @@ -1079,7 +1093,7 @@ Accepted through the local `5b799b12` source boundary: Open before Model Atlas Gate 1 resumes: -1. let Idunn compile, test, and seal exact build-affecting source `6f5d6600`; +1. let Idunn compile, test, and seal exact build-affecting source `952dcd9f`; 2. use that exact package in private fresh-store Ox17; stop after three provider failures total, and prove direct Body Modeling, typed refusal-to-retry if exercised, Hands through Verification, exact context diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 056460c4..703f9275 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -224,7 +224,7 @@ Delete or demote: Keep the five-day shakedown, Ox17 deployment, and Model Atlas operational Gate 1 paused. Continue the source-subtraction and test-authority audit from exact -`6f5d6600`. The current sequence has deleted the semantic-memory/workspace-coverage +`952dcd9f`. The current sequence has deleted the semantic-memory/workspace-coverage projection system, its local daemon supervisor, and the surviving generic RepoModel profile, impossible lifecycle, producerless receipt/summary, and decorative scoring axes. Modeling consumes typed Body and keyed RepoModel state @@ -247,6 +247,13 @@ Runtime/swarm/workspace belong to the Body route; envelope type/key/schema belong to CultCache; binding time and fixed prose own nothing. The typed receipt still prevents deployment input from relabeling the Body after admission. +Exact `952dcd9f` reduces operator-objective intake to the human assertion and +its actual provenance. CultCache owns envelope identity and schema; the +singleton Mind objective owns active state; the exact Mind commit receipt owns +atomic admission. One coordinator-binary test that only repeated the library +proof is gone, while byte-idempotency, replacement refusal, and resident-grant +provenance remain covered. + Resident Self now solely imports authenticated Bifrost deliveries; exact `3dda58a5` deletes the standalone Persona feedback ingress and its old Starfire snapshot seam. Exact `56267201` deletes the three unadmitted Atlas daemon diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index fe69d0dc..75feb28e 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `6f5d6600` -Current pass: repository-domain binding collapse landed and documented; Ox17 +Latest committed implementation cut: `952dcd9f` +Current pass: operator-objective intake collapse landed and documented; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `6f5d6600` is the current +production symlink body and is inactive. Exact `952dcd9f` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,20 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `952dcd9f` keeps the typed human objective assertion and its atomic +singleton Mind-objective commit, but removes the fixed schema prose, stored key +identity, derived objective digest, and contract text from the intake payload. +The public outcome now returns only the current Mind projection digest, exact +commit receipt, and changed bit; it no longer exports a full intake or full +Mind view that production never consumed. The coordinator-binary test that +only replayed the library seed/idempotency/refusal proof is deleted. The library +proof now requires byte-identical replay, while the wrapper-specific +resident-grant provenance proof remains. Runtime advances to v32. Objective +intake, resident provenance, and old-store refusal pass (1/1 each). The cut +removes 54 net maintained lines. Initial package cleanup removes 18.5 GiB; the +1.7 MiB state tool is then preserved across cleanup of 961.1 MiB regenerated +artifacts. Atlas is untouched. + Exact `6f5d6600` preserves the immutable typed repository-domain receipt while cutting it from nine fields to the two facts it alone owns: the canonical organizational repository name and the exact authenticated Body hash. @@ -994,7 +1008,7 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action The Ox17 deployment lane is paused. Continue the registered-document and test- -liability audit from exact `6f5d6600`; do not compile or deploy through Idunn +liability audit from exact `952dcd9f`; do not compile or deploy through Idunn yet. Delete an abstraction with tests that merely animate it when it has no decision-bearing consumer. Preserve keyed Mind, sealed reasoning, direct Body- to-Modeling flow, family admission owners, Persona social state, provider diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index f4906639d5044864952dc0c50c3219535d019890..00dfece7fe0a9d19963e98a4e9939d410a3c6096 100644 GIT binary patch delta 719 zcmYjPJ&)5s5GCR35{ZU_28xj=&-TS8xw{+{Cm}?EK7aPBcm3wgn>YUOb@%&^-A}hVHx7={!BIAR_488y&*t;p z&S|If^4+@oe%2Hpuql!C{;YPX?{t=JeUl zomKbk!zC()@hHe<8sN*Ngy7^`)QJHtL4(ulq~seTqyrUE~^kX54aGyR#NhEwJcaC Fe*rcb{I&o9 delta 75 zcmdnBSG#A2_69LVUNb9GLn|YTsACLVw_a{mW-Mf63~!#w)IODo5r{!FGZ3=?F)I+W S0Wmuea{w{t_Nh!<L diff --git a/state/map.yaml b/state/map.yaml index 204d1df5..efae3fbe 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -52,7 +52,7 @@ current_status: summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. Hands consequence receipts carry only their exact causal bindings and consequence; CultCache owns type/schema identity. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error; Eyes evidence packet v2 relies on its request/context identity for Research provenance; Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v31. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. Hands consequence receipts carry only their exact causal bindings and consequence; CultCache owns type/schema identity. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error; Eyes evidence packet v2 relies on its request/context identity for Research provenance; Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v32. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. fixed_routing_and_retention_cargo_cut: Exact ffd91c20 deletes EyesEvidencePacket.source_role_id, PersonaSocialMention.target_agent_id, and ResidentSelfRetentionHead.retained_at_millis. Each producer supplied one fixed or non-causal value and no consumer read it; the request/context, Persona queue plus turn request, and retention chain remain the real owners. Eyes packet v2, Persona mention v2, Resident Self state v3/retention head v1, and runtime v27 form a hard cut. Core and the three consuming release entrypoints compile; consequential Persona, Research, and epoch-refusal proofs pass. The maintained source delta is 6 net deletions. Atlas is untouched; no live inter-swarm collaboration has run. provider_stream_authority_cut: Exact fe118e13 makes OpenAI/OpenRouter events and receipts transient transport values. The runtime immediately normalizes them into the single persisted native model event/receipt family used by tool continuation, assistant reconstruction, terminal validation, and bounded retention. Duplicate provider writes, registrations, archive requirements, schema IDs, two public schemas/index rows, and the include-only model-runtime shell are gone; the exact provider request remains durable. Runtime advances to v28 and the catalog drops to 18 schemas. The cut removes 270 net maintained lines. Adapter 1/1, provider spine 14/14, reasoning context 8/8, runtime 23/23, model entrypoint 11/11, swarm 4/4, epoch refusal 1/1, and release construction 15/15 pass. Atlas is untouched; live inter-swarm collaboration remains unproven. cultnet_catalog_authority_cut: Exact dbed11b3 and 8bb0719b delete the hand-maintained JSON shadow registry. The nonexistent runtime-event contract and obsolete public archived-session tombstone schema disappear first. Runtime-local identity, session, job, binding, coordinator, native model/tool, and state-ledger schemas then disappear because no live CultNet provider carries them and several contradicted their Rust owners. Typed CultCache registration and owner-projected CultMesh state remain authoritative. The catalog has exactly three earned boundaries: the exact OpenAI-compatible provider request, gamecult.persona_state.v0, and epiphany.work_organ_state.v0. Parse/path/unindexed/forbidden-contract checks pass at 3/3/0/0/0. The cuts remove 850 net maintained lines. Atlas is untouched; live inter-swarm collaboration remains unproven. @@ -60,6 +60,7 @@ current_status: hands_receipt_authority_cut: Exact 65bf044f removes fixed schema-version strings and unread contract prose from Hands patch, command, and commit receipts. Their CultCache envelope owns type/schema identity; the exact intent, review, Substrate Gate grant, runtime job, consequence, and immutable receipt envelope remain the admission proof. Fourteen definition-only shadow type constants and one callerless reorient display enum are also gone. Runtime advances to v29 and old writable state refuses. The existing keyed lifecycle proof passes exact Hands through concurrent Persona admission into Verification, and package cleanup removes its 678.6 MiB compiler footprint. The cut removes 67 net maintained lines. Atlas is untouched; no live inter-swarm collaboration has run. autonomous_proposal_origin_authority_cut: Exact d9a196a0 makes RepoFrontierProposalModelingRequest the sole durable owner of autonomous proposal origin. It carries the exact direction result, option ordinal, and worker job identities. The separate binding type, schema constant, registry entry, third CAS envelope, replay collision branch, and worker-result/launch hash echoes are gone. The referenced launch and result remain immutable typed documents and promotion strongly reads them atomically with the proposal/request pair. Runtime advances to v30. The full keyed lifecycle passes promotion, concurrent launch, retry ancestry, Modeling admission, concurrent Persona/Hands, and Verification; package cleanup removes 677.6 MiB. The cut removes 53 net maintained lines. Atlas is untouched; live inter-swarm collaboration remains unproven. repository_domain_binding_cut: Exact 6f5d6600 keeps the immutable typed repository-domain receipt but reduces it to its two causal facts, the canonical organizational repository name and exact authenticated Body hash. CultCache owns envelope type, key, and schema; the authenticated Body route owns runtime, swarm, and workspace; binding time and fixed prose own no decision. Binding still validates the live Body and atomically strong-reads runtime identity plus Body route, while promotion and fulfillment refuse repository or Body-hash substitution. Runtime advances to v31. The full keyed lifecycle and old-store refusal pass; package cleanup removes 677.2 MiB. The cut removes 50 net maintained lines. Atlas remains protected until a real inter-swarm collaboration trial exercises the complete crossing. + operator_objective_intake_cut: Exact 952dcd9f preserves the typed human assertion and atomic singleton Mind-objective commit while deleting four persisted echoes: fixed schema prose, key identity, objective digest, and contract text. The public outcome now returns only the Mind projection digest, exact commit receipt, and whether the commit changed state; it no longer carries a full intake or over-broad Mind view. The coordinator-binary test that merely replayed the library seed/idempotency/refusal proof is gone; the library proof is strengthened to require byte-identical replay and the wrapper-specific resident-grant provenance proof remains. Runtime advances to v32. All three focused proofs pass. The maintained cut removes 54 net lines. Package cleanup removed 18.5 GiB, then the 1.7 MiB state tool was preserved across cleanup of 961.1 MiB regenerated artifacts. Atlas is untouched. atlas_authoring_cut: Exact ce306e23 preserves the complete inter-swarm Atlas vertical slice while deleting its duplicate local offer/claim authoring authority. Ordinary Modeling through RepoModel operations is the sole owner of provider offers and consumer claims; Atlas retains signed publication, trust, transport, deterministic projection, Soul verification, Self impact admission, Resident Self wake, brakes, and Eve lowering. Two direct write-intent types, their runtime commit APIs and registry entries, 518 planner lines, and two tests that animated only that duplicate path are gone. The runtime proof now creates offers/claims through RepoModel before proving exact verification admission and Body-drift refusal. The cut removes 593 net source lines; the three-repository direct/transitive Modeling proof passes. These are component proofs only: no live inter-swarm collaboration has yet run, so the Atlas vertical slice remains protected until Gate 1 exercises it end to end. Runtime writable epoch is v14. autonomous_proposal_binding_cut: Exact 5d507bfd reduces Self's autonomous Imagination-to-Modeling origin binding from a 22-field duplicate archive to six causal join fields: schema, exact direction-result identity, selected option ordinal, worker job identity, and exact worker-result/launch digests. Proposal identity and payload, direction request, runtime/thread, typed model projection, Body/domain binding, selected option content, and canonical Modeling-request identity are checked directly from their owning immutable documents. The atomic proposal plus binding plus Modeling-request commit and its broad keyed-lifecycle proof remain; 60 net source lines are gone. Runtime writable epoch is v15. hands_verification_derivation_cut: Exact 6ccc7dd2 deletes the 20-field transient Hands receipt-chain summary. The Hands commit owner now derives the exact Verification request directly from the persisted patch, command, and commit receipts plus the frontier authority; no copied schema, job, grant, command-output, Git, path, summary, or timestamp fields mediate that handoff. Atomic Hands-to-Verification admission and the concurrent Persona/Hands lifecycle proof remain. The cut removes 43 net source lines without adding state, schema, or tests. @@ -145,7 +146,7 @@ current_status: yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,656 lines, 53 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, coordinator artifact/status cargo, and uninhabited aggregate state-model DTO families are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the registered-document and test-liability audit after exact 6f5d6600. Delete only complete dead authority slices and tests with no consequential claim. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, Persona consequences, exact native/provider requests, governed tool receipts, and the complete unrun Model Atlas vertical slice. Component tests are not collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + next_action: Resume the registered-document and test-liability audit after exact 952dcd9f. Delete only complete dead authority slices and tests with no consequential claim. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, Persona consequences, exact native/provider requests, governed tool receipts, and the complete unrun Model Atlas vertical slice. Component tests are not collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v30. Hands consequence documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. The spine is 9,608 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. From 718ce9c1e3290b05a94f6c7a0ad4293033a8d9fe Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 09:34:21 +0200 Subject: [PATCH 058/340] Collapse frontier document envelope duplication --- .../src/bin/epiphany-mvp-coordinator.rs | 4 - epiphany-core/src/current_work.rs | 8 -- epiphany-core/src/repo_model_gateway.rs | 78 ---------------- epiphany-core/src/runtime_spine.rs | 88 +++---------------- epiphany-core/src/soul_gateway.rs | 14 --- epiphany-openai-runtime/src/lib.rs | 13 --- 6 files changed, 14 insertions(+), 191 deletions(-) diff --git a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs index 7c49679d..35b5bd3a 100644 --- a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs +++ b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs @@ -10,8 +10,6 @@ use epiphany_core::HANDS_COMMAND_RECEIPT_TYPE; use epiphany_core::HANDS_COMMIT_RECEIPT_TYPE; use epiphany_core::HANDS_PATCH_RECEIPT_TYPE; use epiphany_core::HandsActionIntent; -use epiphany_core::REPO_FRONTIER_HANDS_AUTHORITY_CONTRACT; -use epiphany_core::REPO_FRONTIER_HANDS_AUTHORITY_SCHEMA_VERSION; use epiphany_core::RepoFrontierHandsAuthority; use epiphany_core::RuntimeSpineInitOptions; use epiphany_core::finalize_coordinator_run; @@ -1612,7 +1610,6 @@ fn record_hands_implementation_gate( ]; put_hands_action_review(runtime_store, &review)?; let authority = RepoFrontierHandsAuthority { - schema_version: REPO_FRONTIER_HANDS_AUTHORITY_SCHEMA_VERSION.to_string(), authority_id: format!("repo-frontier-hands-authority-{}", intent.intent_id), route_id: route.route_id.clone(), model_projection_digest: route.model_projection_digest.clone(), @@ -1624,7 +1621,6 @@ fn record_hands_implementation_gate( substrate_grant_receipt_id: grant_id.clone(), requested_paths: requested_paths.clone(), granted_at: review.reviewed_at.clone(), - contract: REPO_FRONTIER_HANDS_AUTHORITY_CONTRACT.to_string(), }; put_repo_frontier_hands_authority(runtime_store, &authority)?; diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index e453566e..7dbf2acc 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -2039,7 +2039,6 @@ pub fn accept_frontier_verification_result( }; audit.validate()?; let verdict = crate::SoulVerdictReceipt { - schema_version: crate::SOUL_VERDICT_RECEIPT_SCHEMA_VERSION.into(), receipt_id: format!("soul-verdict-{}", result.result_id), source_result_id: result.result_id.clone(), source_job_id: result.job_id.clone(), @@ -2048,7 +2047,6 @@ pub fn accept_frontier_verification_result( evidence_ids, risks: result.risks.clone(), emitted_at: accepted_at.to_string(), - contract: "Soul verdict emitted by the exact Verification Mind admission owner.".into(), verification_request_id: request.request_id.clone(), frontier_route_id: request.route_id.clone(), }; @@ -4533,7 +4531,6 @@ mod tests { Sha256::digest(rmp_serde::to_vec_named(&frontier_item)?) ); let route = crate::RepoFrontierRoute { - schema_version: crate::REPO_FRONTIER_ROUTE_SCHEMA_VERSION.into(), route_id: "route-proposal-frontier".into(), next_organ: crate::RepoFrontierNextOrgan::Hands, model_projection_digest: model.projection_digest.clone(), @@ -4547,7 +4544,6 @@ mod tests { authorized_paths: frontier_item.repository_scope.clone(), adopted_plan: frontier_item.adopted_plan.clone(), selected_at: "2026-08-17T00:00:14Z".into(), - contract: crate::REPO_FRONTIER_ROUTE_CONTRACT.into(), }; accepted_cache.put(&route.route_id, &route)?; @@ -4591,7 +4587,6 @@ mod tests { ]; crate::put_hands_action_review(&store, &hands_review)?; let hands_authority = crate::RepoFrontierHandsAuthority { - schema_version: crate::REPO_FRONTIER_HANDS_AUTHORITY_SCHEMA_VERSION.into(), authority_id: "repo-frontier-hands-authority-verification-fixture".into(), route_id: route.route_id.clone(), model_projection_digest: route.model_projection_digest.clone(), @@ -4603,7 +4598,6 @@ mod tests { substrate_grant_receipt_id: grant.receipt_id.clone(), requested_paths: route.authorized_paths.clone(), granted_at: hands_review.reviewed_at.clone(), - contract: crate::REPO_FRONTIER_HANDS_AUTHORITY_CONTRACT.into(), }; crate::put_repo_frontier_hands_authority(&store, &hands_authority)?; let hands_patch = crate::hands_patch_receipt_for_review( @@ -5474,7 +5468,6 @@ mod tests { crate::EpiphanyDecisionContext::new(&planning_basis, planning_native, Vec::new())?; crate::put_decision_context(&store, &planning_context)?; let mut candidate = crate::RepoFrontierPlanCandidate { - schema_version: crate::REPO_FRONTIER_PLAN_CANDIDATE_SCHEMA_VERSION.into(), candidate_id: "pending".into(), planning_request_id: planning_request.request_id.clone(), model_projection_digest: planning_request.model_projection_digest.clone(), @@ -5489,7 +5482,6 @@ mod tests { rollback_steps: vec!["revert the keyed Planning commit".into()], commit_message: "Migrate Planning to keyed Mind authority".into(), proposed_at: "2026-08-17T00:00:21.800Z".into(), - contract: crate::REPO_FRONTIER_PLANNING_CONTRACT.into(), }; candidate.candidate_id = crate::canonical_repo_frontier_plan_candidate_id(&candidate)?; let planning_result = crate::EpiphanyRuntimeRoleWorkerResult { diff --git a/epiphany-core/src/repo_model_gateway.rs b/epiphany-core/src/repo_model_gateway.rs index d2551d88..fcbd9370 100644 --- a/epiphany-core/src/repo_model_gateway.rs +++ b/epiphany-core/src/repo_model_gateway.rs @@ -33,43 +33,7 @@ use cultcache_rs::DatabaseEntry; use serde::{Deserialize, Serialize}; use sha2::{Digest, Sha256}; -pub const REPO_FRONTIER_ROUTE_SCHEMA_VERSION: &str = "epiphany.self.repo_frontier_route.v2"; -pub const REPO_FRONTIER_HANDS_AUTHORITY_SCHEMA_VERSION: &str = - "epiphany.hands.repo_frontier_authority.v0"; -pub const REPO_FRONTIER_ROUTE_CONTRACT: &str = "epiphany.repo_frontier_route.v2"; -pub const REPO_FRONTIER_HANDS_AUTHORITY_CONTRACT: &str = - "epiphany.repo_frontier_hands_authority.v0"; -pub const REPO_FRONTIER_MODELING_REQUEST_SCHEMA_VERSION: &str = - "epiphany.modeling.repo_frontier_verdict_request.v1"; -pub const REPO_FRONTIER_MODELING_REQUEST_CONTRACT: &str = - "epiphany.repo_frontier_verdict_modeling_request.v1"; -pub const REPO_FRONTIER_WORK_PROPOSAL_SCHEMA_VERSION: &str = - "epiphany.repo_frontier_work_proposal.v3"; -pub const REPO_FRONTIER_PLANNING_REQUEST_SCHEMA_VERSION: &str = - "epiphany.self.repo_frontier_planning_request.v4"; -pub const REPO_FRONTIER_PLAN_CANDIDATE_SCHEMA_VERSION: &str = - "epiphany.imagination.repo_frontier_plan_candidate.v0"; -pub const REPO_FRONTIER_PLAN_DECISION_RECEIPT_SCHEMA_VERSION: &str = - "epiphany.mind.repo_frontier_plan_decision_receipt.v2"; -pub const REPO_FRONTIER_PLAN_DECISION_CONTRACT: &str = "epiphany.repo_frontier_plan_decision.v0"; -pub const REPO_FRONTIER_PLANNING_CONTRACT: &str = "epiphany.repo_frontier_planning.v4"; -pub const REPO_FRONTIER_PLANNING_FAILURE_REVIEW_SCHEMA_VERSION: &str = - "epiphany.self.repo_frontier_planning_failure_review.v0"; -pub const REPO_FRONTIER_RESEARCH_REQUEST_SCHEMA_VERSION: &str = - "epiphany.self.repo_frontier_research_request.v3"; -pub const REPO_FRONTIER_RESEARCH_REQUEST_CONTRACT: &str = - "epiphany.repo_frontier_research_request.v3"; -pub const REPO_FRONTIER_WORK_PROPOSAL_CONTRACT: &str = - "epiphany.repo_frontier_work_proposal.inert.v3"; pub const RUNTIME_REPOSITORY_DOMAIN_BINDING_KEY: &str = "runtime-repository-domain-binding"; -pub const REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_SCHEMA_VERSION: &str = - "epiphany.coordinator.repo_frontier_proposal_modeling_request.v1"; -pub const REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_CONTRACT: &str = - "epiphany.repo_frontier_proposal_modeling_request.v1"; -pub const REPO_FRONTIER_PLAN_MIND_REQUEST_SCHEMA_VERSION: &str = - "epiphany.self.repo_frontier_plan_mind_request.v1"; -pub const REPO_FRONTIER_PLAN_MIND_REQUEST_CONTRACT: &str = - "epiphany.repo_frontier_plan_mind_request.v1"; #[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] #[cultcache( @@ -77,8 +41,6 @@ pub const REPO_FRONTIER_PLAN_MIND_REQUEST_CONTRACT: &str = schema = "RepoFrontierWorkProposal" )] pub struct RepoFrontierWorkProposal { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub proposal_id: String, #[cultcache(key = 2)] @@ -91,8 +53,6 @@ pub struct RepoFrontierWorkProposal { pub constraints: Vec, #[cultcache(key = 6)] pub evidence_refs: Vec, - #[cultcache(key = 7)] - pub contract: String, } pub fn repo_frontier_proposal_payload_sha256( @@ -123,8 +83,6 @@ pub struct RuntimeRepositoryDomainBinding { schema = "RepoFrontierProposalModelingRequest" )] pub struct RepoFrontierProposalModelingRequest { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub request_id: String, #[cultcache(key = 2)] @@ -141,8 +99,6 @@ pub struct RepoFrontierProposalModelingRequest { pub workspace: String, #[cultcache(key = 8)] pub selected_at: String, - #[cultcache(key = 9)] - pub contract: String, #[cultcache(key = 10)] pub direction_result_id: String, #[cultcache(key = 11)] @@ -157,8 +113,6 @@ pub struct RepoFrontierProposalModelingRequest { schema = "RepoFrontierPlanningRequest" )] pub struct RepoFrontierPlanningRequest { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub request_id: String, #[cultcache(key = 2)] @@ -175,8 +129,6 @@ pub struct RepoFrontierPlanningRequest { pub repository_scope: Vec, #[cultcache(key = 8)] pub requested_at: String, - #[cultcache(key = 9)] - pub contract: String, #[cultcache(key = 10)] pub runtime_id: String, /// Exact current documents that own whether this planning work remains @@ -195,8 +147,6 @@ pub struct RepoFrontierPlanningRequest { schema = "RepoFrontierResearchRequest" )] pub struct RepoFrontierResearchRequest { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub request_id: String, #[cultcache(key = 2)] @@ -213,8 +163,6 @@ pub struct RepoFrontierResearchRequest { pub requested_at: String, #[cultcache(key = 8)] pub runtime_id: String, - #[cultcache(key = 10)] - pub contract: String, /// Immutable public source identities already owned by the admitted /// frontier. This is dedicated retrieval authority, not worker-authored /// evidence or a search hint. @@ -233,8 +181,6 @@ pub struct RepoFrontierResearchRequest { schema = "RepoFrontierPlanCandidate" )] pub struct RepoFrontierPlanCandidate { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub candidate_id: String, #[cultcache(key = 2)] @@ -263,8 +209,6 @@ pub struct RepoFrontierPlanCandidate { pub commit_message: String, #[cultcache(key = 14)] pub proposed_at: String, - #[cultcache(key = 15)] - pub contract: String, } #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] @@ -310,8 +254,6 @@ pub struct RepoFrontierPlanningLifecycle { schema = "RepoFrontierPlanMindRequest" )] pub struct RepoFrontierPlanMindRequest { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub request_id: String, #[cultcache(key = 2)] @@ -328,8 +270,6 @@ pub struct RepoFrontierPlanMindRequest { pub runtime_id: String, #[cultcache(key = 9)] pub requested_at: String, - #[cultcache(key = 10)] - pub contract: String, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] @@ -350,8 +290,6 @@ pub struct RepoFrontierPlanMindDecision { schema = "RepoFrontierPlanDecisionReceipt" )] pub struct RepoFrontierPlanDecisionReceipt { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub decision_id: String, #[cultcache(key = 2)] @@ -374,8 +312,6 @@ pub struct RepoFrontierPlanDecisionReceipt { pub rationale: String, #[cultcache(key = 11)] pub decided_at: String, - #[cultcache(key = 12)] - pub contract: String, #[cultcache(key = 13)] pub decision_source: RepoFrontierPlanDecisionSource, } @@ -399,8 +335,6 @@ pub enum RepoFrontierVerdictDisposition { schema = "RepoFrontierModelingRequest" )] pub struct RepoFrontierModelingRequest { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub request_id: String, #[cultcache(key = 2)] @@ -425,8 +359,6 @@ pub struct RepoFrontierModelingRequest { pub allowed_disposition: RepoFrontierVerdictDisposition, #[cultcache(key = 12)] pub requested_at: String, - #[cultcache(key = 13)] - pub contract: String, } #[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] @@ -435,8 +367,6 @@ pub struct RepoFrontierModelingRequest { schema = "RepoFrontierPlanningFailureReview" )] pub struct RepoFrontierPlanningFailureReview { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub review_id: String, #[cultcache(key = 2)] @@ -465,8 +395,6 @@ pub enum RepoFrontierNextOrgan { schema = "RepoFrontierRoute" )] pub struct RepoFrontierRoute { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub route_id: String, #[cultcache(key = 2)] @@ -493,8 +421,6 @@ pub struct RepoFrontierRoute { pub adopted_plan: Option, #[cultcache(key = 13)] pub selected_at: String, - #[cultcache(key = 14)] - pub contract: String, } #[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] @@ -503,8 +429,6 @@ pub struct RepoFrontierRoute { schema = "RepoFrontierHandsAuthority" )] pub struct RepoFrontierHandsAuthority { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub authority_id: String, #[cultcache(key = 2)] @@ -527,6 +451,4 @@ pub struct RepoFrontierHandsAuthority { pub requested_paths: Vec, #[cultcache(key = 11)] pub granted_at: String, - #[cultcache(key = 12)] - pub contract: String, } diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index cbd4ad0d..7d945a2a 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -9,18 +9,6 @@ use crate::eyes_gateway::EyesEvidencePacket; use crate::eyes_gateway::EyesSourceLookupReceipt; use crate::hands_gateway::*; use crate::repo_model_gateway::{ - REPO_FRONTIER_HANDS_AUTHORITY_CONTRACT, REPO_FRONTIER_HANDS_AUTHORITY_SCHEMA_VERSION, - REPO_FRONTIER_MODELING_REQUEST_CONTRACT, REPO_FRONTIER_MODELING_REQUEST_SCHEMA_VERSION, - REPO_FRONTIER_PLAN_CANDIDATE_SCHEMA_VERSION, REPO_FRONTIER_PLAN_DECISION_CONTRACT, - REPO_FRONTIER_PLAN_DECISION_RECEIPT_SCHEMA_VERSION, REPO_FRONTIER_PLAN_MIND_REQUEST_CONTRACT, - REPO_FRONTIER_PLAN_MIND_REQUEST_SCHEMA_VERSION, REPO_FRONTIER_PLANNING_CONTRACT, - REPO_FRONTIER_PLANNING_FAILURE_REVIEW_SCHEMA_VERSION, - REPO_FRONTIER_PLANNING_REQUEST_SCHEMA_VERSION, - REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_CONTRACT, - REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_SCHEMA_VERSION, - REPO_FRONTIER_RESEARCH_REQUEST_CONTRACT, REPO_FRONTIER_RESEARCH_REQUEST_SCHEMA_VERSION, - REPO_FRONTIER_ROUTE_CONTRACT, REPO_FRONTIER_ROUTE_SCHEMA_VERSION, - REPO_FRONTIER_WORK_PROPOSAL_CONTRACT, REPO_FRONTIER_WORK_PROPOSAL_SCHEMA_VERSION, RUNTIME_REPOSITORY_DOMAIN_BINDING_KEY, RepoFrontierHandsAuthority, RepoFrontierModelingRequest, RepoFrontierNextOrgan, RepoFrontierPlanCandidate, RepoFrontierPlanDecision, RepoFrontierPlanDecisionReceipt, RepoFrontierPlanMindDecision, RepoFrontierPlanMindRequest, @@ -69,7 +57,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v32"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v33"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; pub const RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.model_execution_binding.v0"; @@ -4865,9 +4853,7 @@ pub(crate) fn runtime_typed_request_fulfillment( pub(crate) fn validate_repo_frontier_work_proposal( proposal: &RepoFrontierWorkProposal, ) -> Result<()> { - if proposal.schema_version != REPO_FRONTIER_WORK_PROPOSAL_SCHEMA_VERSION - || proposal.contract != REPO_FRONTIER_WORK_PROPOSAL_CONTRACT - || proposal.proposal_id.trim().is_empty() + if proposal.proposal_id.trim().is_empty() || proposal.title.trim().is_empty() || proposal.body.trim().is_empty() { @@ -5030,9 +5016,7 @@ pub(crate) fn validate_autonomous_proposal_origin( pub(crate) fn validate_repo_frontier_proposal_modeling_request( request: &RepoFrontierProposalModelingRequest, ) -> Result<()> { - if request.schema_version != REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_SCHEMA_VERSION - || request.contract != REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_CONTRACT - || request.request_id.trim().is_empty() + if request.request_id.trim().is_empty() || request.proposal_id.trim().is_empty() || request.proposal_payload_sha256.trim().is_empty() || request.runtime_id.trim().is_empty() @@ -5245,18 +5229,15 @@ pub(crate) fn promote_autonomous_direction_options_for_modeling( &evidence_refs, )?; let proposal = RepoFrontierWorkProposal { - schema_version: REPO_FRONTIER_WORK_PROPOSAL_SCHEMA_VERSION.into(), proposal_id: proposal_id.clone(), payload_sha256: payload_sha256.clone(), title: option.title.clone(), body: option.summary.clone(), constraints: result.uncertainties.clone(), evidence_refs, - contract: REPO_FRONTIER_WORK_PROPOSAL_CONTRACT.into(), }; validate_repo_frontier_work_proposal(&proposal)?; let selection = RepoFrontierProposalModelingRequest { - schema_version: REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_SCHEMA_VERSION.into(), request_id: crate::proposal_modeling_request_id( &identity.runtime_id, &proposal_id, @@ -5269,7 +5250,6 @@ pub(crate) fn promote_autonomous_direction_options_for_modeling( repository: repository.into(), workspace: body_binding.git_top_level.clone(), selected_at: selected_at.into(), - contract: REPO_FRONTIER_PROPOSAL_MODELING_REQUEST_CONTRACT.into(), direction_result_id: result.result_id.clone(), direction_option_ordinal: ordinal as u32, direction_worker_job_id: direction_worker.job_id.clone(), @@ -5444,7 +5424,6 @@ pub fn select_and_commit_repo_frontier_planning_request( return Ok(existing); } let request = RepoFrontierPlanningRequest { - schema_version: REPO_FRONTIER_PLANNING_REQUEST_SCHEMA_VERSION.into(), request_id: request_id.clone(), model_projection_digest: basis.projection_digest.clone(), model_source_documents: basis.source_documents.clone(), @@ -5453,7 +5432,6 @@ pub fn select_and_commit_repo_frontier_planning_request( selected_organ: "Imagination".into(), repository_scope: item.repository_scope.clone(), requested_at: at.into(), - contract: REPO_FRONTIER_PLANNING_CONTRACT.into(), runtime_id: identity.runtime_id, frontier_authority_documents, claim_obligation_documents, @@ -5493,9 +5471,7 @@ fn validate_repo_frontier_planning_request( source_documents: request.model_source_documents.clone(), }; basis.validate()?; - if request.schema_version != REPO_FRONTIER_PLANNING_REQUEST_SCHEMA_VERSION - || request.contract != REPO_FRONTIER_PLANNING_CONTRACT - || request.runtime_id.trim().is_empty() + if request.runtime_id.trim().is_empty() || request.frontier_item_id.trim().is_empty() || request.frontier_item_hash.trim().is_empty() || request.selected_organ != "Imagination" @@ -5657,7 +5633,6 @@ pub fn commit_repo_frontier_plan_mind_request( &candidate_sha256, ); let request = RepoFrontierPlanMindRequest { - schema_version: REPO_FRONTIER_PLAN_MIND_REQUEST_SCHEMA_VERSION.into(), request_id: request_id.clone(), planning_request_id: planning.request_id.clone(), imagination_result_id: result.result_id.clone(), @@ -5666,7 +5641,6 @@ pub fn commit_repo_frontier_plan_mind_request( candidate_sha256, runtime_id: planning.runtime_id.clone(), requested_at: requested_at.into(), - contract: REPO_FRONTIER_PLAN_MIND_REQUEST_CONTRACT.into(), }; if let Some(existing) = cache.get::(&request_id)? { let mut retry = request.clone(); @@ -5719,10 +5693,7 @@ fn validate_repo_frontier_plan_mind_request_identity( cache: &CultCache, request: &RepoFrontierPlanMindRequest, ) -> Result<(RepoFrontierPlanningRequest, RepoFrontierPlanCandidate)> { - if request.schema_version != REPO_FRONTIER_PLAN_MIND_REQUEST_SCHEMA_VERSION - || request.contract != REPO_FRONTIER_PLAN_MIND_REQUEST_CONTRACT - || chrono::DateTime::parse_from_rfc3339(&request.requested_at).is_err() - { + if chrono::DateTime::parse_from_rfc3339(&request.requested_at).is_err() { return Err(anyhow!("invalid typed Mind request")); } let result = cache @@ -5792,9 +5763,7 @@ fn validate_repo_frontier_plan_candidate_against_request( candidate: &RepoFrontierPlanCandidate, request: &RepoFrontierPlanningRequest, ) -> Result<()> { - if candidate.schema_version != REPO_FRONTIER_PLAN_CANDIDATE_SCHEMA_VERSION - || candidate.contract != REPO_FRONTIER_PLANNING_CONTRACT - || candidate.selected_fields_invalid() + if candidate.selected_fields_invalid() || candidate.planning_request_id != request.request_id || candidate.model_projection_digest != request.model_projection_digest || candidate.model_source_documents != request.model_source_documents @@ -5914,7 +5883,6 @@ fn commit_repo_frontier_plan_decision_inner( Sha256::digest(planning.request_id.as_bytes()) ); let receipt = RepoFrontierPlanDecisionReceipt { - schema_version: REPO_FRONTIER_PLAN_DECISION_RECEIPT_SCHEMA_VERSION.into(), decision_id: decision_id.clone(), planning_request_id: planning.request_id.clone(), candidate_id: candidate.candidate_id.clone(), @@ -5926,7 +5894,6 @@ fn commit_repo_frontier_plan_decision_inner( decision, rationale, decided_at: decided_at.clone(), - contract: REPO_FRONTIER_PLAN_DECISION_CONTRACT.into(), decision_source: decision_source.clone(), }; if let Some(existing) = cache.get::(&decision_id)? { @@ -6088,7 +6055,6 @@ pub fn select_and_commit_repo_frontier_route( Sha256::digest(route_seed.as_bytes()) ); let route = RepoFrontierRoute { - schema_version: REPO_FRONTIER_ROUTE_SCHEMA_VERSION.to_string(), route_id: route_id.clone(), next_organ: RepoFrontierNextOrgan::Hands, model_projection_digest: basis.projection_digest.clone(), @@ -6106,7 +6072,6 @@ pub fn select_and_commit_repo_frontier_route( .unwrap_or_else(|| item.repository_scope.clone()), adopted_plan: item.adopted_plan.clone(), selected_at: at.to_string(), - contract: REPO_FRONTIER_ROUTE_CONTRACT.to_string(), }; if let Some(existing) = cache.get::(&route_id)? { let mut retry = route.clone(); @@ -6298,9 +6263,7 @@ fn planning_claim_obligation_envelopes( fn validate_repo_frontier_research_request( request: &RepoFrontierResearchRequest, ) -> Result { - if request.schema_version != REPO_FRONTIER_RESEARCH_REQUEST_SCHEMA_VERSION - || request.contract != REPO_FRONTIER_RESEARCH_REQUEST_CONTRACT - || request.runtime_id.is_empty() + if request.runtime_id.is_empty() || chrono::DateTime::parse_from_rfc3339(&request.requested_at).is_err() || request.frontier_item_id.is_empty() || request.frontier_item_hash.is_empty() @@ -6509,7 +6472,6 @@ fn repo_frontier_research_request_for_admitted_item( )); } Ok(RepoFrontierResearchRequest { - schema_version: REPO_FRONTIER_RESEARCH_REQUEST_SCHEMA_VERSION.to_string(), request_id: crate::frontier_research_request_id(runtime_id, &item.id, &item_hash), model_projection_digest: basis.projection_digest.clone(), model_source_documents: basis.source_documents.clone(), @@ -6519,7 +6481,6 @@ fn repo_frontier_research_request_for_admitted_item( repository_scope: item.repository_scope.clone(), requested_at: requested_at.to_string(), runtime_id: runtime_id.to_string(), - contract: REPO_FRONTIER_RESEARCH_REQUEST_CONTRACT.to_string(), public_source_refs, }) } @@ -6807,9 +6768,7 @@ fn repo_frontier_research_request_is_actionable( cache: &CultCache, request: &RepoFrontierResearchRequest, ) -> Result { - if request.schema_version != REPO_FRONTIER_RESEARCH_REQUEST_SCHEMA_VERSION - || request.contract != REPO_FRONTIER_RESEARCH_REQUEST_CONTRACT - || request.repository_scope.is_empty() + if request.repository_scope.is_empty() || !crate::memory_graph::repo_paths_are_canonical_and_safe(&request.repository_scope) { return Err(anyhow!("invalid frontier Research request")); @@ -6831,8 +6790,7 @@ pub(crate) fn repo_frontier_planning_failure_review( let Some(review) = cache.get::(&review_id)? else { return Ok(None); }; - if review.schema_version != REPO_FRONTIER_PLANNING_FAILURE_REVIEW_SCHEMA_VERSION - || review.review_id != review_id + if review.review_id != review_id || review.planning_request_id != planning_request_id || review.pass_kind != pass_kind || review.job_id != result.job_id @@ -6875,7 +6833,6 @@ pub fn review_repo_frontier_planning_failure( .get::(job_id)? .ok_or_else(|| anyhow!("planning failure review lost its typed result"))?; let review = RepoFrontierPlanningFailureReview { - schema_version: REPO_FRONTIER_PLANNING_FAILURE_REVIEW_SCHEMA_VERSION.into(), review_id: repo_frontier_planning_failure_review_id(&result.result_id), planning_request_id: planning_request_id.clone(), pass_kind: pass_kind.into(), @@ -7461,9 +7418,7 @@ fn validate_repo_frontier_hands_authority_chain( && intent.plan_action.is_empty() } }; - if route.schema_version != REPO_FRONTIER_ROUTE_SCHEMA_VERSION - || route.contract != REPO_FRONTIER_ROUTE_CONTRACT - || intent.schema_version != HANDS_ACTION_INTENT_SCHEMA_VERSION + if intent.schema_version != HANDS_ACTION_INTENT_SCHEMA_VERSION || review.schema_version != HANDS_ACTION_REVIEW_SCHEMA_VERSION || grant.schema_version != SUBSTRATE_GATE_REPO_ACCESS_GRANT_RECEIPT_SCHEMA_VERSION || intent.contract.trim().is_empty() @@ -7518,9 +7473,7 @@ pub fn put_repo_frontier_hands_authority( authority: &RepoFrontierHandsAuthority, ) -> Result<()> { let store_path = store_path.as_ref(); - if authority.schema_version != REPO_FRONTIER_HANDS_AUTHORITY_SCHEMA_VERSION - || authority.contract != REPO_FRONTIER_HANDS_AUTHORITY_CONTRACT - || chrono::DateTime::parse_from_rfc3339(&authority.granted_at).is_err() + if chrono::DateTime::parse_from_rfc3339(&authority.granted_at).is_err() || !crate::memory_graph::repo_paths_are_canonical_and_safe(&authority.requested_paths) || authority.requested_paths.is_empty() { @@ -7549,9 +7502,7 @@ pub fn put_repo_frontier_hands_authority( path == scope || path.starts_with(&format!("{}/", scope.trim_end_matches(['/', '\\']))) }) }); - if route.schema_version != REPO_FRONTIER_ROUTE_SCHEMA_VERSION - || route.contract != REPO_FRONTIER_ROUTE_CONTRACT - || route.next_organ != RepoFrontierNextOrgan::Hands + if route.next_organ != RepoFrontierNextOrgan::Hands || authority.route_id != route.route_id || authority.model_projection_digest != route.model_projection_digest || authority.model_source_documents != route.model_source_documents @@ -7647,9 +7598,7 @@ fn worker_result_has_keyed_mind_commit( pub(crate) fn validate_repo_frontier_verification_request_intrinsic( request: &RepoFrontierVerificationRequest, ) -> Result { - if request.schema_version != REPO_FRONTIER_VERIFICATION_REQUEST_SCHEMA_VERSION - || request.contract != REPO_FRONTIER_VERIFICATION_REQUEST_CONTRACT - || chrono::DateTime::parse_from_rfc3339(&request.requested_at).is_err() + if chrono::DateTime::parse_from_rfc3339(&request.requested_at).is_err() || [ request.request_id.as_str(), request.route_id.as_str(), @@ -7800,8 +7749,7 @@ pub(crate) fn derive_repo_frontier_modeling_request( verdict: &SoulVerdictReceipt, ) -> Result { let identity = require_identity(cache)?; - if verdict.schema_version != SOUL_VERDICT_RECEIPT_SCHEMA_VERSION - || verdict.receipt_id.trim().is_empty() + if verdict.receipt_id.trim().is_empty() || verdict.source_result_id.trim().is_empty() || verdict.source_job_id.trim().is_empty() || chrono::DateTime::parse_from_rfc3339(&verdict.emitted_at).is_err() @@ -7851,8 +7799,6 @@ pub(crate) fn derive_repo_frontier_modeling_request( || verdict.summary != result.summary || verdict.risks != result.risks || verdict_evidence != result_evidence - || verification_request.schema_version != REPO_FRONTIER_VERIFICATION_REQUEST_SCHEMA_VERSION - || verification_request.contract != REPO_FRONTIER_VERIFICATION_REQUEST_CONTRACT || verification_request.route_id != route.route_id || verification_request.model_projection_digest != route.model_projection_digest || verification_request.model_source_documents != route.model_source_documents @@ -7873,7 +7819,6 @@ pub(crate) fn derive_repo_frontier_modeling_request( &route.route_id, ); let request = RepoFrontierModelingRequest { - schema_version: REPO_FRONTIER_MODELING_REQUEST_SCHEMA_VERSION.to_string(), request_id: request_id.clone(), model_projection_digest: route.model_projection_digest.clone(), model_source_documents: route.model_source_documents.clone(), @@ -7886,7 +7831,6 @@ pub(crate) fn derive_repo_frontier_modeling_request( verification_job_id: result.job_id.clone(), allowed_disposition: disposition, requested_at: verdict.emitted_at.clone(), - contract: REPO_FRONTIER_MODELING_REQUEST_CONTRACT.to_string(), }; Ok(request) } @@ -7941,7 +7885,6 @@ fn derive_repo_frontier_verification_request_for_chain( .map(|existing| existing.requested_at) .unwrap_or_else(|| commit.emitted_at.clone()); let request = RepoFrontierVerificationRequest { - schema_version: REPO_FRONTIER_VERIFICATION_REQUEST_SCHEMA_VERSION.to_string(), request_id, route_id: authority.route_id.clone(), model_projection_digest: authority.model_projection_digest.clone(), @@ -7954,7 +7897,6 @@ fn derive_repo_frontier_verification_request_for_chain( hands_command_receipt_id: command.receipt_id.clone(), hands_commit_receipt_id: commit.receipt_id.clone(), requested_at, - contract: REPO_FRONTIER_VERIFICATION_REQUEST_CONTRACT.to_string(), frontier_authority_documents, }; Ok(request) @@ -8031,8 +7973,6 @@ fn validate_hands_consequence_grant( .is_some_and(|plan| command != plan.effective_command()) }) || !paths_covered - || authority.schema_version != REPO_FRONTIER_HANDS_AUTHORITY_SCHEMA_VERSION - || authority.contract != REPO_FRONTIER_HANDS_AUTHORITY_CONTRACT || authority.hands_review_id != review.review_id || authority.substrate_grant_receipt_id != grant.receipt_id || authority.requested_paths != intent.requested_paths diff --git a/epiphany-core/src/soul_gateway.rs b/epiphany-core/src/soul_gateway.rs index 0af3cce3..09a093cf 100644 --- a/epiphany-core/src/soul_gateway.rs +++ b/epiphany-core/src/soul_gateway.rs @@ -1,16 +1,8 @@ use cultcache_rs::DatabaseEntry; -pub const REPO_FRONTIER_VERIFICATION_REQUEST_SCHEMA_VERSION: &str = - "epiphany.soul.repo_frontier_verification_request.v2"; -pub const REPO_FRONTIER_VERIFICATION_REQUEST_CONTRACT: &str = - "epiphany.repo_frontier_verification_request.v2"; -pub const SOUL_VERDICT_RECEIPT_SCHEMA_VERSION: &str = "epiphany.soul.verdict_receipt.v1"; - #[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] #[cultcache(type = "epiphany.soul.verdict_receipt", schema = "SoulVerdictReceipt")] pub struct SoulVerdictReceipt { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub receipt_id: String, #[cultcache(key = 2)] @@ -27,8 +19,6 @@ pub struct SoulVerdictReceipt { pub risks: Vec, #[cultcache(key = 8)] pub emitted_at: String, - #[cultcache(key = 9)] - pub contract: String, #[cultcache(key = 10, default)] pub verification_request_id: String, #[cultcache(key = 11, default)] @@ -41,8 +31,6 @@ pub struct SoulVerdictReceipt { schema = "RepoFrontierVerificationRequest" )] pub struct RepoFrontierVerificationRequest { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub request_id: String, #[cultcache(key = 2)] @@ -67,8 +55,6 @@ pub struct RepoFrontierVerificationRequest { pub hands_commit_receipt_id: String, #[cultcache(key = 12)] pub requested_at: String, - #[cultcache(key = 13)] - pub contract: String, #[cultcache(key = 14)] pub frontier_authority_documents: Vec, } diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index b0f21b48..a91655b2 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -1824,7 +1824,6 @@ fn role_worker_result_from_ingress( safe_paths.sort(); safe_paths.dedup(); let mut candidate = epiphany_core::RepoFrontierPlanCandidate { - schema_version: epiphany_core::REPO_FRONTIER_PLAN_CANDIDATE_SCHEMA_VERSION.to_string(), candidate_id: String::new(), planning_request_id: frontier_planning_context .map(|context| context.request_id.clone()) @@ -1849,7 +1848,6 @@ fn role_worker_result_from_ingress( rollback_steps: clean_string_vec(&ingress.rollback_steps), commit_message: ingress.commit_message.trim().to_string(), proposed_at: completed_at.to_string(), - contract: epiphany_core::REPO_FRONTIER_PLANNING_CONTRACT.to_string(), }; match epiphany_core::canonical_repo_frontier_plan_candidate_id(&candidate) { Ok(candidate_id) => { @@ -2975,10 +2973,6 @@ mod tests { candidate.candidate_id, epiphany_core::canonical_repo_frontier_plan_candidate_id(&candidate)? ); - assert_eq!( - candidate.schema_version, - epiphany_core::REPO_FRONTIER_PLAN_CANDIDATE_SCHEMA_VERSION - ); assert_eq!(candidate.safe_paths, ["src", "tests"]); Ok(()) } @@ -3234,8 +3228,6 @@ mod tests { schema_version: epiphany_core::REPO_FRONTIER_PLAN_MIND_CONTEXT_SCHEMA_VERSION.into(), contract: epiphany_core::REPO_FRONTIER_PLAN_MIND_CONTEXT_CONTRACT.into(), request: epiphany_core::RepoFrontierPlanMindRequest { - schema_version: epiphany_core::REPO_FRONTIER_PLAN_MIND_REQUEST_SCHEMA_VERSION - .into(), request_id: "mind-request-1".into(), planning_request_id: "planning-request-1".into(), imagination_result_id: "imagination-result-1".into(), @@ -3244,10 +3236,8 @@ mod tests { candidate_sha256: "candidate-hash-1".into(), runtime_id: "runtime-1".into(), requested_at: "2026-07-15T09:59:00Z".into(), - contract: epiphany_core::REPO_FRONTIER_PLAN_MIND_REQUEST_CONTRACT.into(), }, planning_request: epiphany_core::RepoFrontierPlanningRequest { - schema_version: epiphany_core::REPO_FRONTIER_PLANNING_REQUEST_SCHEMA_VERSION.into(), request_id: "planning-request-1".into(), model_projection_digest: "model-projection-1".into(), model_source_documents: Vec::new(), @@ -3258,11 +3248,9 @@ mod tests { selected_organ: "Imagination".into(), repository_scope: vec!["epiphany-openai-runtime".into()], requested_at: "2026-07-15T09:58:00Z".into(), - contract: epiphany_core::REPO_FRONTIER_PLANNING_CONTRACT.into(), runtime_id: "runtime-1".into(), }, candidate: epiphany_core::RepoFrontierPlanCandidate { - schema_version: epiphany_core::REPO_FRONTIER_PLAN_CANDIDATE_SCHEMA_VERSION.into(), candidate_id: "candidate-1".into(), planning_request_id: "planning-request-1".into(), model_projection_digest: "model-projection-1".into(), @@ -3277,7 +3265,6 @@ mod tests { rollback_steps: vec!["revert".into()], commit_message: "Derive Mind identity".into(), proposed_at: "2026-07-15T09:59:00Z".into(), - contract: epiphany_core::REPO_FRONTIER_PLANNING_CONTRACT.into(), }, }; let result = role_worker_result_from_ingress( From 9d511485175dc1c72f66011c38e42c77cbd3c814 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 09:37:38 +0200 Subject: [PATCH 059/340] Record frontier envelope authority cut --- notes/epiphany-current-algorithmic-map.md | 19 +++++++++++++++--- notes/epiphany-fork-implementation-plan.md | 13 +++++++++++- notes/fresh-workspace-handoff.md | 22 +++++++++++++++++---- state/ledgers.msgpack | Bin 712378 -> 713190 bytes state/map.yaml | 9 +++++---- 5 files changed, 51 insertions(+), 12 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 02c7b6a1..24ecc2f7 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `952dcd9f` on `codex/epiphany-shakedown-live` -Current pass: operator-objective intake collapse landed and documented; +Latest committed implementation cut: `718ce9c1` on `codex/epiphany-shakedown-live` +Current pass: repository-frontier envelope duplication collapsed; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -151,6 +151,19 @@ cut removes 54 net maintained lines. Package cleanup removes 18.5 GiB; the 1.7 MiB state tool is preserved while another 961.1 MiB of regenerated build artifacts is removed. Atlas is untouched. +Repository-frontier documents carry decisions, not their own envelope labels. +Exact `718ce9c1` removes fixed schema-version fields and contract slogans from +thirteen durable documents across Proposal, Proposal-Modeling, Planning, +Research, plan candidate, PlanMind, plan decision, route, Hands authority, +Verification, Soul verdict, and post-verdict Modeling. CultCache envelope +identity plus runtime epoch v33 owns the internal shape. Semantic identity, +exact source versions, strong dependencies, decision context, evidence, +disposition, and consequence remain. Sealed worker contexts keep their schema +and contract because they are part of the exact request the model saw. The +full keyed lifecycle, epoch refusal, provider candidate mapping, core library, +and release-owned coordinator target pass. The cut removes 177 net maintained +lines and leaves the unrun Atlas crossing untouched. + CultMesh contains no JSON-derived operator snapshot, coordinator receipt, Hands gate, role-review event, unauthenticated Odin/Eve provider row, or daemon tool directory. Native runtime and keyed Mind receipts remain the owners; old @@ -1093,7 +1106,7 @@ Accepted through the local `5b799b12` source boundary: Open before Model Atlas Gate 1 resumes: -1. let Idunn compile, test, and seal exact build-affecting source `952dcd9f`; +1. let Idunn compile, test, and seal exact build-affecting source `718ce9c1`; 2. use that exact package in private fresh-store Ox17; stop after three provider failures total, and prove direct Body Modeling, typed refusal-to-retry if exercised, Hands through Verification, exact context diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 703f9275..62c3ef03 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -224,7 +224,7 @@ Delete or demote: Keep the five-day shakedown, Ox17 deployment, and Model Atlas operational Gate 1 paused. Continue the source-subtraction and test-authority audit from exact -`952dcd9f`. The current sequence has deleted the semantic-memory/workspace-coverage +`718ce9c1`. The current sequence has deleted the semantic-memory/workspace-coverage projection system, its local daemon supervisor, and the surviving generic RepoModel profile, impossible lifecycle, producerless receipt/summary, and decorative scoring axes. Modeling consumes typed Body and keyed RepoModel state @@ -254,6 +254,17 @@ atomic admission. One coordinator-binary test that only repeated the library proof is gone, while byte-idempotency, replacement refusal, and resident-grant provenance remain covered. +Exact `718ce9c1` applies the same ownership rule across the complete durable +repository-frontier chain. Thirteen Proposal, Planning, Research, PlanMind, +Hands, Verification, Soul, and Modeling documents no longer persist fixed +schema/version labels or contract slogans already owned by CultCache and the +runtime epoch. Their semantic identities, strong dependencies, exact source +versions, decision contexts, evidence, dispositions, and consequences remain. +Sealed worker contexts retain explicit schema and contract fields because they +are exact model input. Runtime advances to v33. Atlas is untouched and remains +protected until a real inter-swarm collaboration run exercises the complete +crossing. + Resident Self now solely imports authenticated Bifrost deliveries; exact `3dda58a5` deletes the standalone Persona feedback ingress and its old Starfire snapshot seam. Exact `56267201` deletes the three unadmitted Atlas daemon diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 75feb28e..328f6584 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `952dcd9f` -Current pass: operator-objective intake collapse landed and documented; Ox17 +Latest committed implementation cut: `718ce9c1` +Current pass: repository-frontier envelope duplication collapsed; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `952dcd9f` is the current +production symlink body and is inactive. Exact `718ce9c1` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,20 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `718ce9c1` removes fixed schema-version fields and fixed contract prose +from thirteen durable repository-frontier documents spanning Proposal through +Planning, PlanMind, Hands, Verification, Soul verdict, Research, and Modeling. +CultCache envelopes and runtime epoch v33 own their internal type/schema +identity. Semantic IDs, exact source-document versions, strong dependencies, +decision contexts, dispositions, evidence, and consequences remain. Sealed +worker contexts retain explicit schema and contract fields because those bytes +are part of the exact model input. The full keyed lifecycle, old-store refusal, +provider candidate mapping, core library, and release-owned coordinator target +pass. The cut removes 177 net maintained lines. Focused verification generated +9.61 GB across 12,514 files; cleanup returned the shared target to the single +1.78 MB state inspector. Atlas is untouched. Its first real inter-swarm +collaboration run remains required before any narrowing of the crossing. + Exact `952dcd9f` keeps the typed human objective assertion and its atomic singleton Mind-objective commit, but removes the fixed schema prose, stored key identity, derived objective digest, and contract text from the intake payload. @@ -1008,7 +1022,7 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action The Ox17 deployment lane is paused. Continue the registered-document and test- -liability audit from exact `952dcd9f`; do not compile or deploy through Idunn +liability audit from exact `718ce9c1`; do not compile or deploy through Idunn yet. Delete an abstraction with tests that merely animate it when it has no decision-bearing consumer. Preserve keyed Mind, sealed reasoning, direct Body- to-Modeling flow, family admission owners, Persona social state, provider diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 00dfece7fe0a9d19963e98a4e9939d410a3c6096..b89659786c24ce678f9397ad54098272930887fd 100644 GIT binary patch delta 719 zcmXw0O=}cE5Op?wBqJDuM1$l|AfB>2VRmCSS#OCSc+iU==t1c8RCb%~>F)H$ew-Hd z;6e1Z%*7ue2nvE119}yL7xADMe}#%Q>v(v~P}TL`t5@&dul+n+d$kgsZf$m&%?BTk z#orHKUy2T*=>C&w?dh}@5z6lz;W*(0;UwV{VV6=cD(J&8nTv=d(2af2QxFVI4!dB{r>fDs z2ZL4%^iY9N9<5@s@&zIz8sW!R!I4e+<#6kos{_tt*@E}l=j8GO#s08jJlN82K+dkPZH^-4L+n(B$Sgtda4WUe+NM@<6 z|Bonv8^z+wc)2)w5ua-rs|Vzpct}rV%p>H?7@@j#qP7T9>{({VKqS0Bb5(qP9A8`l z&ukYx80K68chDEVKgBDP4m8qso2C>}`5s!aFF5n%xhy)71q6evPyU&Q?PN2Bn>*`i zvwkJrpnJ+H?;&$w0`X^*Wsg~UUdjF2(t%cTO!q}dllB(e-k~&0?+ZdXgPbm0{P_}} eU))2^ff|q0ZvjjI delta 73 zcmaEMSbNuA?F|x)+=d2LMkZ0m7`X0E->l47$jBJcJe8?^Dib3RgJ@ Date: Mon, 24 Aug 2026 10:06:53 +0200 Subject: [PATCH 060/340] Collapse runtime child schema echoes --- .../src/bin/epiphany-mvp-coordinator.rs | 3 - epiphany-core/src/current_work.rs | 11 +- epiphany-core/src/lib.rs | 9 -- epiphany-core/src/reasoning_context.rs | 5 - epiphany-core/src/reorientation_work.rs | 4 +- epiphany-core/src/resident_self.rs | 1 - epiphany-core/src/runtime_spine.rs | 109 +++--------------- epiphany-openai-runtime/src/lib.rs | 10 -- 8 files changed, 15 insertions(+), 137 deletions(-) diff --git a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs index 35b5bd3a..8fa9fc09 100644 --- a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs +++ b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs @@ -2,7 +2,6 @@ use anyhow::Context; use anyhow::Result; use anyhow::anyhow; use chrono::SecondsFormat; -use epiphany_core::COORDINATOR_RUN_RECEIPT_SCHEMA_VERSION; use epiphany_core::COORDINATOR_RUN_RECEIPT_TYPE; use epiphany_core::EpiphanyCoordinatorRunReceipt; use epiphany_core::HANDS_ACTION_INTENT_SCHEMA_VERSION; @@ -1327,7 +1326,6 @@ fn run_coordinator(args: &Args) -> Result { ]; let receipt_created_at = now(); let coordinator_run_receipt = EpiphanyCoordinatorRunReceipt { - schema_version: COORDINATOR_RUN_RECEIPT_SCHEMA_VERSION.to_string(), receipt_id: format!( "coordinator-run-{}-{}", sanitize_id(&thread_id), @@ -1431,7 +1429,6 @@ fn failed_coordinator_run_receipt( ) -> EpiphanyCoordinatorRunReceipt { let created_at = now(); EpiphanyCoordinatorRunReceipt { - schema_version: COORDINATOR_RUN_RECEIPT_SCHEMA_VERSION.to_string(), receipt_id: format!( "coordinator-run-{}-failed-{}", sanitize_id(thread_id), diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index 7dbf2acc..0bcae08a 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -799,8 +799,7 @@ fn body_modeling_launches( return Err(anyhow!("Body Modeling launch used reorientation authority")); } }; - if launch.schema_version != crate::RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION - || launch.role != crate::EPIPHANY_MODELING_OWNER_ROLE + if launch.role != crate::EPIPHANY_MODELING_OWNER_ROLE || launch.binding_id != crate::EPIPHANY_MODELING_ROLE_BINDING_ID || document.thread_id() != launch.job_id || role.role_id != "modeling" @@ -3871,7 +3870,6 @@ mod tests { let context = crate::EpiphanyDecisionContext::new(&reasoning_basis, native, Vec::new())?; cache.put(&context.context_id, &context)?; let result = crate::EpiphanyRuntimeRoleWorkerResult { - schema_version: crate::RUNTIME_ROLE_WORKER_RESULT_SCHEMA_VERSION.into(), result_id: "body-result".into(), job_id: launch.job_id.clone(), role_id: "modeling".into(), @@ -4006,7 +4004,6 @@ mod tests { terminal: true, }; let direction_worker_result = crate::EpiphanyRuntimeRoleWorkerResult { - schema_version: crate::RUNTIME_ROLE_WORKER_RESULT_SCHEMA_VERSION.into(), result_id: "direction-worker-result".into(), job_id: direction_job_id.clone(), role_id: "imagination".into(), @@ -4267,7 +4264,6 @@ mod tests { }], )?; let proposal_result = crate::EpiphanyRuntimeRoleWorkerResult { - schema_version: crate::RUNTIME_ROLE_WORKER_RESULT_SCHEMA_VERSION.into(), result_id: result_id.into(), job_id: proposal_job_id.clone(), role_id: "modeling".into(), @@ -4808,7 +4804,6 @@ mod tests { "2026-08-17T00:00:14.900Z", )?; let verification_result = crate::EpiphanyRuntimeRoleWorkerResult { - schema_version: crate::RUNTIME_ROLE_WORKER_RESULT_SCHEMA_VERSION.into(), result_id: "verification-result".into(), job_id: verification_job_id.clone(), role_id: "verification".into(), @@ -5154,7 +5149,6 @@ mod tests { }], )?; let verdict_result = crate::EpiphanyRuntimeRoleWorkerResult { - schema_version: crate::RUNTIME_ROLE_WORKER_RESULT_SCHEMA_VERSION.into(), result_id: verdict_result_id.into(), job_id: verdict_job_id.clone(), role_id: "modeling".into(), @@ -5485,7 +5479,6 @@ mod tests { }; candidate.candidate_id = crate::canonical_repo_frontier_plan_candidate_id(&candidate)?; let planning_result = crate::EpiphanyRuntimeRoleWorkerResult { - schema_version: crate::RUNTIME_ROLE_WORKER_RESULT_SCHEMA_VERSION.into(), result_id: "planning-result".into(), job_id: planning_job.clone(), role_id: "imagination".into(), @@ -5617,7 +5610,6 @@ mod tests { decided_at: "2026-08-17T00:00:22.300Z".into(), }; let mind_result = crate::EpiphanyRuntimeRoleWorkerResult { - schema_version: crate::RUNTIME_ROLE_WORKER_RESULT_SCHEMA_VERSION.into(), result_id: "plan-mind-result".into(), job_id: mind_job.clone(), role_id: "mindAdmissionReview".into(), @@ -5844,7 +5836,6 @@ mod tests { investigation_checkpoint: None, }; let research_result = crate::EpiphanyRuntimeRoleWorkerResult { - schema_version: crate::RUNTIME_ROLE_WORKER_RESULT_SCHEMA_VERSION.into(), result_id: "research-result".into(), job_id: research_job.clone(), role_id: "research".into(), diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index 7de1f3af..6b66e774 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -211,9 +211,6 @@ pub use repo_model_gateway::*; pub use repository_body_observer::*; pub use resident_readiness::*; pub use resident_self::*; -pub use runtime_spine::ARCHIVED_RUNTIME_WORKER_ATTEMPT_SCHEMA_VERSION; -pub use runtime_spine::COORDINATOR_DEATH_RECOVERY_SCHEMA_VERSION; -pub use runtime_spine::COORDINATOR_RUN_RECEIPT_SCHEMA_VERSION; pub use runtime_spine::COORDINATOR_RUN_RECEIPT_TYPE; pub use runtime_spine::EPIPHANY_RUNTIME_ROOT_SESSION_ID; pub use runtime_spine::EpiphanyArchivedRuntimeWorkerAttempt; @@ -237,15 +234,9 @@ pub use runtime_spine::EpiphanyRuntimeWorkerProcessClaim; pub use runtime_spine::ModelPassFailureTerminalOptions; pub use runtime_spine::RUNTIME_IDENTITY_KEY; pub use runtime_spine::RUNTIME_IDENTITY_TYPE; -pub use runtime_spine::RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION; -pub use runtime_spine::RUNTIME_REORIENT_WORKER_RESULT_SCHEMA_VERSION; -pub use runtime_spine::RUNTIME_ROLE_WORKER_RESULT_SCHEMA_VERSION; pub use runtime_spine::RUNTIME_SPINE_SCHEMA_VERSION; pub use runtime_spine::RUNTIME_SWARM_BINDING_KEY; pub use runtime_spine::RUNTIME_SWARM_BINDING_SCHEMA_VERSION; -pub use runtime_spine::RUNTIME_TOOL_EXECUTION_BINDING_SCHEMA_VERSION; -pub use runtime_spine::RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION; -pub use runtime_spine::RUNTIME_WORKER_PROCESS_CLAIM_SCHEMA_VERSION; pub use runtime_spine::RepoFrontierResearchContinuationAction; pub use runtime_spine::RepoFrontierResearchLifecycle; pub use runtime_spine::RepoFrontierResearchLifecycleStage; diff --git a/epiphany-core/src/reasoning_context.rs b/epiphany-core/src/reasoning_context.rs index b231d3ce..5e5fa002 100644 --- a/epiphany-core/src/reasoning_context.rs +++ b/epiphany-core/src/reasoning_context.rs @@ -1943,7 +1943,6 @@ mod tests { fn role_launch() -> Result { let document = EpiphanyWorkerLaunchDocument::Role(role_document()); Ok(EpiphanyRuntimeWorkerLaunchRequest { - schema_version: crate::RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION.into(), job_id: "pass-1".into(), binding_id: crate::EPIPHANY_IMAGINATION_ROLE_BINDING_ID.into(), role: "Imagination".into(), @@ -2446,7 +2445,6 @@ mod tests { let failure_summary = "Provider refused before assistant output.".to_string(); let failure_role_result = crate::EpiphanyRuntimeRoleWorkerResult { - schema_version: crate::RUNTIME_ROLE_WORKER_RESULT_SCHEMA_VERSION.to_string(), result_id: format!("result-worker-{}", reasoning_basis.pass_id), job_id: reasoning_basis.pass_id.clone(), role_id: role_terminal_semantic_role(&reasoning_basis)?.expect("role pass"), @@ -2483,7 +2481,6 @@ mod tests { decision_context_id: context.context_id.clone(), }; let failure_runtime_result = crate::EpiphanyRuntimeJobResult { - schema_version: crate::RUNTIME_SPINE_SCHEMA_VERSION.to_string(), result_id: format!("result-runtime-{}", reasoning_basis.pass_id), job_id: reasoning_basis.pass_id.clone(), session_id: "failed-pass-session".into(), @@ -2690,7 +2687,6 @@ mod tests { assert!(audit_decision_context(&store, &context.context_id).is_err()); assert_eq!(backing.pull_all()?, before_unterminal_audit); let terminal_result = crate::EpiphanyRuntimeJobResult { - schema_version: crate::RUNTIME_SPINE_SCHEMA_VERSION.into(), result_id: "worker-result-1".into(), job_id: "pass-1".into(), session_id: "session-1".into(), @@ -2724,7 +2720,6 @@ mod tests { archive_cache.delete::(&terminal_result.result_id)? ); let archived = crate::EpiphanyArchivedRuntimeWorkerAttempt { - schema_version: crate::ARCHIVED_RUNTIME_WORKER_ATTEMPT_SCHEMA_VERSION.into(), job_id: "pass-1".into(), request_kind: "proposal-modeling".into(), request_id: "proposal-request-1".into(), diff --git a/epiphany-core/src/reorientation_work.rs b/epiphany-core/src/reorientation_work.rs index ca9886cc..73790667 100644 --- a/epiphany-core/src/reorientation_work.rs +++ b/epiphany-core/src/reorientation_work.rs @@ -206,8 +206,7 @@ fn reorientation_launch_document( return Err(anyhow!("reorientation owner carried a role launch")); } }; - if launch.schema_version != crate::RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION - || launch.role != crate::EPIPHANY_REORIENT_OWNER_ROLE + if launch.role != crate::EPIPHANY_REORIENT_OWNER_ROLE || launch.binding_id != crate::EPIPHANY_REORIENT_LAUNCH_BINDING_ID || document.schema_version != "epiphany.reorientation_launch_projection.v1" || document.request_id.trim().is_empty() @@ -1026,7 +1025,6 @@ mod tests { "2026-08-18T10:00:05Z", )?; let result = crate::EpiphanyRuntimeReorientWorkerResult { - schema_version: crate::RUNTIME_REORIENT_WORKER_RESULT_SCHEMA_VERSION.into(), result_id: "reorientation-result".into(), job_id: job_id.clone(), mode: "resume".into(), diff --git a/epiphany-core/src/resident_self.rs b/epiphany-core/src/resident_self.rs index 896c2161..50651cf9 100644 --- a/epiphany-core/src/resident_self.rs +++ b/epiphany-core/src/resident_self.rs @@ -1805,7 +1805,6 @@ pub fn recover_receipt_free_dead_coordinator_session( return Ok(None); } let recovery = crate::EpiphanyCoordinatorDeathRecovery { - schema_version: crate::runtime_spine::COORDINATOR_DEATH_RECOVERY_SCHEMA_VERSION.into(), recovery_id: format!("coordinator-death-recovery-{session_id}"), session_id, thread_id: lease.turn_id.clone(), diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index 7d945a2a..8d5f94f7 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -57,24 +57,8 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v33"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v34"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; -pub const RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION: &str = - "epiphany.runtime.model_execution_binding.v0"; -pub const RUNTIME_TOOL_EXECUTION_BINDING_SCHEMA_VERSION: &str = - "epiphany.runtime.tool_execution_binding.v0"; -const ARCHIVED_RUNTIME_SESSION_SCHEMA_VERSION: &str = "epiphany.runtime.archived_session.v1"; -pub const RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION: &str = - "epiphany.runtime.worker_launch_request.v2"; -pub const RUNTIME_WORKER_PROCESS_CLAIM_SCHEMA_VERSION: &str = - "epiphany.runtime.worker_process_claim.v0"; -pub const ARCHIVED_RUNTIME_WORKER_ATTEMPT_SCHEMA_VERSION: &str = - "epiphany.runtime.archived_worker_attempt.v2"; -pub const RUNTIME_ROLE_WORKER_RESULT_SCHEMA_VERSION: &str = - "epiphany.runtime.role_worker_result.v4"; -pub const RUNTIME_REORIENT_WORKER_RESULT_SCHEMA_VERSION: &str = - "epiphany.runtime.reorient_worker_result.v0"; -pub const COORDINATOR_RUN_RECEIPT_SCHEMA_VERSION: &str = "epiphany.coordinator_run_receipt.v1"; #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache(type = "epiphany.runtime.identity", schema = "EpiphanyRuntimeIdentity")] pub struct EpiphanyRuntimeIdentity { @@ -115,8 +99,6 @@ pub struct EpiphanyRuntimeSwarmBinding { #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache(type = "epiphany.runtime.session", schema = "EpiphanyRuntimeSession")] pub struct EpiphanyRuntimeSession { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub session_id: String, #[cultcache(key = 2)] @@ -134,8 +116,6 @@ pub struct EpiphanyRuntimeSession { #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache(type = "epiphany.runtime.job", schema = "EpiphanyRuntimeJob")] pub struct EpiphanyRuntimeJob { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub job_id: String, #[cultcache(key = 2)] @@ -156,8 +136,6 @@ pub struct EpiphanyRuntimeJob { schema = "EpiphanyRuntimeModelExecutionBinding" )] pub struct EpiphanyRuntimeModelExecutionBinding { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub binding_id: String, #[cultcache(key = 2)] @@ -182,8 +160,6 @@ pub struct EpiphanyRuntimeModelExecutionBinding { schema = "EpiphanyRuntimeToolExecutionBinding" )] pub struct EpiphanyRuntimeToolExecutionBinding { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub binding_id: String, #[cultcache(key = 2)] @@ -204,8 +180,6 @@ pub struct EpiphanyRuntimeToolExecutionBinding { schema = "EpiphanyArchivedRuntimeSession" )] struct EpiphanyArchivedRuntimeSession { - #[cultcache(key = 0)] - schema_version: String, #[cultcache(key = 1)] session_id: String, #[cultcache(key = 2)] @@ -224,8 +198,6 @@ struct EpiphanyArchivedRuntimeSession { schema = "EpiphanyRuntimeWorkerLaunchRequest" )] pub struct EpiphanyRuntimeWorkerLaunchRequest { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub job_id: String, #[cultcache(key = 2)] @@ -268,8 +240,6 @@ pub struct EpiphanyRuntimeWorkerLaunchRequest { schema = "EpiphanyRuntimeWorkerProcessClaim" )] pub struct EpiphanyRuntimeWorkerProcessClaim { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub claim_id: String, #[cultcache(key = 2)] @@ -300,8 +270,6 @@ pub struct EpiphanyRuntimeWorkerProcessClaim { schema = "EpiphanyArchivedRuntimeWorkerAttempt" )] pub struct EpiphanyArchivedRuntimeWorkerAttempt { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub job_id: String, #[cultcache(key = 2)] @@ -422,8 +390,6 @@ impl EpiphanyRuntimeWorkerLaunchRequest { schema = "EpiphanyRuntimeRoleWorkerResult" )] pub struct EpiphanyRuntimeRoleWorkerResult { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub result_id: String, #[cultcache(key = 2)] @@ -552,8 +518,6 @@ impl EpiphanyRuntimeRoleWorkerResult { schema = "EpiphanyRuntimeReorientWorkerResult" )] pub struct EpiphanyRuntimeReorientWorkerResult { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub result_id: String, #[cultcache(key = 2)] @@ -592,8 +556,6 @@ pub struct EpiphanyRuntimeReorientWorkerResult { schema = "EpiphanyRuntimeJobResult" )] pub struct EpiphanyRuntimeJobResult { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub result_id: String, #[cultcache(key = 2)] @@ -626,8 +588,6 @@ pub struct EpiphanyRuntimeJobResult { schema = "EpiphanyCoordinatorRunReceipt" )] pub struct EpiphanyCoordinatorRunReceipt { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub receipt_id: String, #[cultcache(key = 2)] @@ -1027,7 +987,6 @@ pub fn create_runtime_session( )); } let session = EpiphanyRuntimeSession { - schema_version: RUNTIME_SPINE_SCHEMA_VERSION.to_string(), session_id: options.session_id.clone(), objective: options.objective, status: EpiphanyRuntimeSessionStatus::Active, @@ -1224,7 +1183,6 @@ pub fn terminalize_model_pass_failure_session( model_job.status = EpiphanyRuntimeJobStatus::Failed; model_job.updated_at = options.failed_at.clone(); let model_result = EpiphanyRuntimeJobResult { - schema_version: RUNTIME_SPINE_SCHEMA_VERSION.to_string(), result_id: format!("result-model-pass-failure-{}", failure.failure_id), job_id: binding.job_id.clone(), session_id: binding.session_id.clone(), @@ -1319,7 +1277,6 @@ pub fn create_runtime_job( return Err(anyhow!("runtime job {:?} already exists", options.job_id)); } let job = EpiphanyRuntimeJob { - schema_version: RUNTIME_SPINE_SCHEMA_VERSION.to_string(), job_id: options.job_id.clone(), session_id: options.session_id.clone(), role: options.role, @@ -1426,7 +1383,6 @@ pub fn open_runtime_model_execution( let session = existing_session .clone() .unwrap_or_else(|| EpiphanyRuntimeSession { - schema_version: RUNTIME_SPINE_SCHEMA_VERSION.to_string(), session_id: session_options.session_id.clone(), objective: session_options.objective.clone(), status: EpiphanyRuntimeSessionStatus::Active, @@ -1453,7 +1409,6 @@ pub fn open_runtime_model_execution( )); } let job = EpiphanyRuntimeJob { - schema_version: RUNTIME_SPINE_SCHEMA_VERSION.to_string(), job_id: job_options.job_id.clone(), session_id: session.session_id.clone(), role: job_options.role, @@ -1478,7 +1433,6 @@ pub fn open_runtime_model_execution( )); } let binding = EpiphanyRuntimeModelExecutionBinding { - schema_version: RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION.to_string(), binding_id: binding_id.clone(), request_id: model_request.request_id.clone(), session_id: session.session_id.clone(), @@ -1656,7 +1610,6 @@ pub fn put_runtime_tool_execution_intent( } } let binding = EpiphanyRuntimeToolExecutionBinding { - schema_version: RUNTIME_TOOL_EXECUTION_BINDING_SCHEMA_VERSION.to_string(), binding_id: intent.intent_id.clone(), intent_id: intent.intent_id.clone(), session_id: session_id.to_string(), @@ -1700,8 +1653,7 @@ pub(crate) fn validate_runtime_model_execution_binding( let job = cache .get::(&binding.job_id)? .ok_or_else(|| anyhow!("model execution binding {request_id:?} lost its job"))?; - if binding.schema_version != RUNTIME_MODEL_EXECUTION_BINDING_SCHEMA_VERSION - || binding.binding_id != request_id + if binding.binding_id != request_id || binding.request_id != request_id || binding.provider != native.provider || binding.source_worker_job_id != native.source_worker_job_id @@ -1760,8 +1712,7 @@ pub(crate) fn validate_runtime_tool_execution_binding( let binding = cache .get::(intent_id)? .ok_or_else(|| anyhow!("tool execution intent {intent_id:?} is unbound"))?; - if binding.schema_version != RUNTIME_TOOL_EXECUTION_BINDING_SCHEMA_VERSION - || binding.binding_id != intent_id + if binding.binding_id != intent_id || binding.intent_id != intent_id || chrono::DateTime::parse_from_rfc3339(&binding.bound_at).is_err() { @@ -1864,8 +1815,7 @@ pub(crate) fn validate_terminal_tool_execution_family( intent: &EpiphanyToolInvocationIntent, receipt: &EpiphanyToolInvocationReceipt, ) -> Result<()> { - if binding.schema_version != RUNTIME_TOOL_EXECUTION_BINDING_SCHEMA_VERSION - || binding.binding_id != intent.intent_id + if binding.binding_id != intent.intent_id || binding.intent_id != intent.intent_id || binding.model_request_id != intent.model_request_id || intent.schema_id != TOOL_ADAPTER_INVOCATION_INTENT_SCHEMA_ID @@ -1935,8 +1885,7 @@ fn archive_completed_model_session( cache.pull_all_backing_stores()?; require_identity(&cache)?; if let Some(existing) = cache.get::(session_id)? { - if existing.schema_version != ARCHIVED_RUNTIME_SESSION_SCHEMA_VERSION - || existing.session_id != session_id + if existing.session_id != session_id || !existing.retired_chain_digest.starts_with("sha256:") { return Err(anyhow!("archived runtime session tombstone is invalid")); @@ -2275,7 +2224,6 @@ fn archive_completed_model_session( } } let archive = EpiphanyArchivedRuntimeSession { - schema_version: ARCHIVED_RUNTIME_SESSION_SCHEMA_VERSION.to_string(), session_id: session_id.to_string(), job_ids: job_ids.into_iter().collect(), model_request_ids: model_request_ids.into_iter().collect(), @@ -2386,7 +2334,6 @@ pub fn prepare_runtime_spine_heartbeat_job( } Some(existing) => existing, None => EpiphanyRuntimeSession { - schema_version: RUNTIME_SPINE_SCHEMA_VERSION.to_string(), session_id: options.session_id.clone(), objective: options.objective, status: EpiphanyRuntimeSessionStatus::Active, @@ -2408,7 +2355,6 @@ pub fn prepare_runtime_spine_heartbeat_job( )); } let job = EpiphanyRuntimeJob { - schema_version: RUNTIME_SPINE_SCHEMA_VERSION.to_string(), job_id: options.job_id.clone(), session_id: options.session_id.clone(), role: options.role.clone(), @@ -2417,7 +2363,6 @@ pub fn prepare_runtime_spine_heartbeat_job( updated_at: options.created_at.clone(), }; let request = EpiphanyRuntimeWorkerLaunchRequest { - schema_version: RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION.to_string(), job_id: options.job_id.clone(), binding_id: options.binding_id, role: options.role, @@ -3449,7 +3394,6 @@ pub fn claim_runtime_worker_process( } let claim_id = worker_process_claim_id(job_id); let claim = EpiphanyRuntimeWorkerProcessClaim { - schema_version: RUNTIME_WORKER_PROCESS_CLAIM_SCHEMA_VERSION.into(), claim_id: claim_id.clone(), job_id: job_id.into(), process_id: process.process_id, @@ -3772,7 +3716,6 @@ fn commit_runtime_worker_process_death( job.status = EpiphanyRuntimeJobStatus::Failed; job.updated_at = terminal_at.to_string(); let result = EpiphanyRuntimeJobResult { - schema_version: RUNTIME_SPINE_SCHEMA_VERSION.to_string(), result_id: format!("result-worker-death-{job_id}"), job_id: job_id.to_string(), session_id: job.session_id.clone(), @@ -3906,9 +3849,6 @@ pub fn put_runtime_role_worker_result( &result.decision_context_id, "role worker result decision context id", )?; - if result.schema_version != RUNTIME_ROLE_WORKER_RESULT_SCHEMA_VERSION { - return Err(anyhow!("role worker result schema version mismatch")); - } let mut cache = runtime_spine_cache(store_path)?; cache.pull_all_backing_stores()?; require_worker_decision_context(&cache, &result.decision_context_id, &result.job_id)?; @@ -4133,8 +4073,7 @@ pub fn put_runtime_role_worker_result( &request.request_id, &result.job_id, )?; - if worker_launch.schema_version != RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION - || worker_launch.job_id != result.job_id + if worker_launch.job_id != result.job_id || worker_launch.role != EPIPHANY_IMAGINATION_OWNER_ROLE || worker_launch.binding_id != EPIPHANY_IMAGINATION_ROLE_BINDING_ID || worker_launch.frontier_planning_request_id.as_deref() @@ -4279,8 +4218,7 @@ pub fn put_runtime_role_worker_result( EpiphanyWorkerLaunchDocument::Reorient(_) => None, }; crate::current_work::consideration_attempt_ordinal(request_id, &result.job_id)?; - if worker.schema_version != RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION - || worker.job_id != result.job_id + if worker.job_id != result.job_id || worker.role != EPIPHANY_IMAGINATION_OWNER_ROLE || worker.binding_id != EPIPHANY_IMAGINATION_ROLE_BINDING_ID || worker.imagination_consideration_request_id.as_deref() != Some(request_id) @@ -4354,8 +4292,7 @@ pub fn put_runtime_role_worker_result( &request.request_id, &result.job_id, )?; - if launch.schema_version != RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION - || launch.job_id != result.job_id + if launch.job_id != result.job_id || launch.role != EPIPHANY_MIND_OWNER_ROLE || launch.binding_id != EPIPHANY_MIND_ROLE_BINDING_ID || launch.frontier_plan_mind_request_id.as_deref() != Some(request.request_id.as_str()) @@ -4604,10 +4541,6 @@ fn validated_proposal_modeling_worker_fulfillment( proposal.payload_sha256 != proposal_payload_sha256, ), ("request.runtime", request.runtime_id != identity.runtime_id), - ( - "launch.schema", - launch.schema_version != RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION, - ), ("launch.job", launch.job_id != result.job_id), ( "launch.binding", @@ -4734,8 +4667,7 @@ pub(crate) fn runtime_typed_request_fulfillment( )); } if let Some(attempt) = archived_matches.first() { - if attempt.schema_version != ARCHIVED_RUNTIME_WORKER_ATTEMPT_SCHEMA_VERSION - || attempt.request_kind != request.kind() + if attempt.request_kind != request.kind() || !crate::WorkerProcessStatus::parse(&attempt.terminal_process_status)? .is_fulfilled_terminal() || !attempt.retired_chain_digest.starts_with("sha256:") @@ -7787,8 +7719,7 @@ pub(crate) fn derive_repo_frontier_modeling_request( "needs-review" | "needs-evidence" | "fail" => RepoFrontierVerdictDisposition::Blocked, _ => return Err(anyhow!("Soul verdict has no allowed frontier disposition")), }; - if result.schema_version != RUNTIME_ROLE_WORKER_RESULT_SCHEMA_VERSION - || !result.role_id.eq_ignore_ascii_case("verification") + if !result.role_id.eq_ignore_ascii_case("verification") || result.item_error.is_some() || result.result_id != verdict.source_result_id || result.job_id != verdict.source_job_id @@ -8275,9 +8206,7 @@ fn validate_archivable_typed_worker_launch( request_kind: &str, request_id: &str, ) -> Result<()> { - if launch.schema_version != RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION - || launch.job_id.trim().is_empty() - { + if launch.job_id.trim().is_empty() { return Err(anyhow!( "worker attempt archive found invalid immutable launch" )); @@ -8466,10 +8395,7 @@ fn archive_runtime_worker_attempt( cache.pull_all_backing_stores()?; require_identity(&cache)?; if let Some(existing) = cache.get::(job_id)? { - if existing.schema_version != ARCHIVED_RUNTIME_WORKER_ATTEMPT_SCHEMA_VERSION - || existing.job_id != job_id - || !existing.retired_chain_digest.starts_with("sha256:") - { + if existing.job_id != job_id || !existing.retired_chain_digest.starts_with("sha256:") { return Err(anyhow!("archived worker attempt tombstone is invalid")); } existing.validate_decision_record(fulfilled)?; @@ -8664,7 +8590,6 @@ fn archive_runtime_worker_attempt( } } let tombstone = EpiphanyArchivedRuntimeWorkerAttempt { - schema_version: ARCHIVED_RUNTIME_WORKER_ATTEMPT_SCHEMA_VERSION.into(), job_id: job_id.into(), request_kind: request_kind.into(), request_id: request_id.into(), @@ -8827,17 +8752,12 @@ fn coordinator_completion_summary(receipt: &EpiphanyCoordinatorRunReceipt) -> St ) } -pub const COORDINATOR_DEATH_RECOVERY_SCHEMA_VERSION: &str = - "epiphany.coordinator_death_recovery.v0"; - #[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] #[cultcache( type = "epiphany.coordinator_death_recovery.v0", schema = "EpiphanyCoordinatorDeathRecovery" )] pub struct EpiphanyCoordinatorDeathRecovery { - #[cultcache(key = 0)] - pub schema_version: String, #[cultcache(key = 1)] pub recovery_id: String, #[cultcache(key = 2)] @@ -8933,7 +8853,6 @@ pub fn open_coordinator_run( )); } let session = EpiphanyRuntimeSession { - schema_version: RUNTIME_SPINE_SCHEMA_VERSION.to_string(), session_id: session_id.to_string(), objective: objective.to_string(), status: EpiphanyRuntimeSessionStatus::Active, @@ -8998,8 +8917,7 @@ pub(crate) fn recover_coordinator_run_after_exact_process_death( expected_objective: &str, ) -> Result { validate_non_empty(expected_objective, "recovered coordinator objective")?; - if recovery.schema_version != COORDINATOR_DEATH_RECOVERY_SCHEMA_VERSION - || recovery.recovery_id != format!("coordinator-death-recovery-{}", recovery.session_id) + if recovery.recovery_id != format!("coordinator-death-recovery-{}", recovery.session_id) || recovery.session_id != coordinator_run_session_id( &recovery.thread_id, @@ -9226,7 +9144,6 @@ pub fn complete_runtime_job( job.status = terminal_status; job.updated_at = options.completed_at.clone(); let result = EpiphanyRuntimeJobResult { - schema_version: RUNTIME_SPINE_SCHEMA_VERSION.to_string(), result_id: options.result_id.clone(), job_id: options.job_id.clone(), session_id: job.session_id.clone(), diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index a91655b2..05077fa6 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -2001,7 +2001,6 @@ fn role_worker_result_from_ingress( (None, None) }; EpiphanyRuntimeRoleWorkerResult { - schema_version: epiphany_core::RUNTIME_ROLE_WORKER_RESULT_SCHEMA_VERSION.to_string(), repository_body_observation_basis: role_id .eq_ignore_ascii_case("modeling") .then(|| repository_body_observation_basis.cloned()) @@ -2094,7 +2093,6 @@ pub fn failed_frontier_planning_role_result( }; let summary = failure_summary.trim().to_string(); Ok(Some(EpiphanyRuntimeRoleWorkerResult { - schema_version: epiphany_core::RUNTIME_ROLE_WORKER_RESULT_SCHEMA_VERSION.to_string(), result_id: format!("result-worker-{}", launch_request.job_id), job_id: launch_request.job_id.clone(), role_id: document.role_id, @@ -2141,7 +2139,6 @@ fn reorient_worker_result_from_ingress( artifact_refs: Vec, ) -> EpiphanyRuntimeReorientWorkerResult { EpiphanyRuntimeReorientWorkerResult { - schema_version: epiphany_core::RUNTIME_REORIENT_WORKER_RESULT_SCHEMA_VERSION.to_string(), result_id: result_id.to_string(), job_id: launch_request.job_id.clone(), mode: clean_optional_string(result.mode.as_deref()) @@ -2558,7 +2555,6 @@ mod tests { #[test] fn proposal_modeling_ingress_composes_runtime_owned_patch_and_identity() -> Result<()> { let launch = EpiphanyRuntimeWorkerLaunchRequest { - schema_version: epiphany_core::RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION.into(), job_id: "proposal-job-1".into(), binding_id: epiphany_core::EPIPHANY_MODELING_ROLE_BINDING_ID.into(), role: epiphany_core::EPIPHANY_MODELING_OWNER_ROLE.into(), @@ -2692,7 +2688,6 @@ mod tests { scan_finished_at: "2026-08-14T00:00:01Z".into(), }; let launch = EpiphanyRuntimeWorkerLaunchRequest { - schema_version: epiphany_core::RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION.into(), job_id: "atlas-modeling-job".into(), binding_id: epiphany_core::EPIPHANY_MODELING_ROLE_BINDING_ID.into(), role: epiphany_core::EPIPHANY_MODELING_OWNER_ROLE.into(), @@ -2831,7 +2826,6 @@ mod tests { admitted_model_direction_consideration_context: None, }); let launch = EpiphanyRuntimeWorkerLaunchRequest { - schema_version: epiphany_core::RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION.into(), job_id: "proposal-job-1".into(), binding_id: epiphany_core::EPIPHANY_MODELING_ROLE_BINDING_ID.into(), role: epiphany_core::EPIPHANY_MODELING_OWNER_ROLE.into(), @@ -2909,7 +2903,6 @@ mod tests { }"#, )?; let launch = EpiphanyRuntimeWorkerLaunchRequest { - schema_version: epiphany_core::RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION.to_string(), job_id: "planning-job-1".into(), binding_id: epiphany_core::EPIPHANY_IMAGINATION_ROLE_BINDING_ID.into(), role: epiphany_core::EPIPHANY_IMAGINATION_OWNER_ROLE.into(), @@ -3068,7 +3061,6 @@ mod tests { }, }; let launch = EpiphanyRuntimeWorkerLaunchRequest { - schema_version: epiphany_core::RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION.into(), job_id: "consideration-job-1".into(), binding_id: epiphany_core::EPIPHANY_IMAGINATION_ROLE_BINDING_ID.into(), role: epiphany_core::EPIPHANY_IMAGINATION_OWNER_ROLE.into(), @@ -3159,7 +3151,6 @@ mod tests { admitted_model_direction_consideration_context: None, }); let launch = EpiphanyRuntimeWorkerLaunchRequest { - schema_version: epiphany_core::RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION.into(), job_id: "planning-job-failed".into(), binding_id: epiphany_core::EPIPHANY_IMAGINATION_ROLE_BINDING_ID.into(), role: epiphany_core::EPIPHANY_IMAGINATION_OWNER_ROLE.into(), @@ -3205,7 +3196,6 @@ mod tests { r#"{"roleId":"mindAdmissionReview","verdict":"adopt","summary":"bounded","nextSafeMove":"admit","filesInspected":[],"frontierPlanMindDecision":{"decision":"adopt","rationale":"Exact candidate is bounded and falsifiable."}}"#, )?; let launch = EpiphanyRuntimeWorkerLaunchRequest { - schema_version: epiphany_core::RUNTIME_WORKER_LAUNCH_REQUEST_SCHEMA_VERSION.into(), job_id: "mind-job-1".into(), binding_id: epiphany_core::EPIPHANY_MIND_ROLE_BINDING_ID.into(), role: epiphany_core::EPIPHANY_MIND_OWNER_ROLE.into(), From ad89b816a891a56dc9a93555646e78b60371b19f Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 10:11:32 +0200 Subject: [PATCH 061/340] Record runtime child epoch authority cut --- notes/epiphany-current-algorithmic-map.md | 17 +++++++++++++--- notes/epiphany-fork-implementation-plan.md | 10 +++++++++- notes/fresh-workspace-handoff.md | 22 +++++++++++++++++---- state/ledgers.msgpack | Bin 713190 -> 714134 bytes state/map.yaml | 9 +++++---- 5 files changed, 46 insertions(+), 12 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 24ecc2f7..9de245f1 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `718ce9c1` on `codex/epiphany-shakedown-live` -Current pass: repository-frontier envelope duplication collapsed; +Latest committed implementation cut: `a4356d1f` on `codex/epiphany-shakedown-live` +Current pass: runtime child epoch echoes collapsed; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -164,6 +164,17 @@ full keyed lifecycle, epoch refusal, provider candidate mapping, core library, and release-owned coordinator target pass. The cut removes 177 net maintained lines and leaves the unrun Atlas crossing untouched. +Runtime epoch identity is rooted, not repeated. Exact `a4356d1f` retains the +runtime identity and swarm binding epoch fields, then removes fixed +schema-version echoes from thirteen child documents covering sessions, jobs, +execution bindings, launches, process claims, results, coordinator receipts, +death recovery, and retained archives. Their semantic and causal payloads are +unchanged. Runtime v34 remains the hard old-store refusal boundary. The core +library, full keyed lifecycle, reorientation, failure audit, transcript-free +binding audit, provider mapping, coordinator, swarm, and model-runtime targets +pass. The cut removes 122 net maintained lines and leaves Atlas plus external +crossings untouched. + CultMesh contains no JSON-derived operator snapshot, coordinator receipt, Hands gate, role-review event, unauthenticated Odin/Eve provider row, or daemon tool directory. Native runtime and keyed Mind receipts remain the owners; old @@ -1106,7 +1117,7 @@ Accepted through the local `5b799b12` source boundary: Open before Model Atlas Gate 1 resumes: -1. let Idunn compile, test, and seal exact build-affecting source `718ce9c1`; +1. let Idunn compile, test, and seal exact build-affecting source `a4356d1f`; 2. use that exact package in private fresh-store Ox17; stop after three provider failures total, and prove direct Body Modeling, typed refusal-to-retry if exercised, Hands through Verification, exact context diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 62c3ef03..0b89d973 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -224,7 +224,7 @@ Delete or demote: Keep the five-day shakedown, Ox17 deployment, and Model Atlas operational Gate 1 paused. Continue the source-subtraction and test-authority audit from exact -`718ce9c1`. The current sequence has deleted the semantic-memory/workspace-coverage +`a4356d1f`. The current sequence has deleted the semantic-memory/workspace-coverage projection system, its local daemon supervisor, and the surviving generic RepoModel profile, impossible lifecycle, producerless receipt/summary, and decorative scoring axes. Modeling consumes typed Body and keyed RepoModel state @@ -265,6 +265,14 @@ are exact model input. Runtime advances to v33. Atlas is untouched and remains protected until a real inter-swarm collaboration run exercises the complete crossing. +Exact `a4356d1f` roots runtime schema authority in runtime identity plus swarm +binding and removes fixed schema-version echoes from thirteen child physiology +documents. Sessions, jobs, execution bindings, launches, process claims, +results, coordinator receipts, death recovery, and archives retain their exact +causal and lifecycle payloads. Runtime advances to v34; old-store refusal and +all affected consequence paths remain proven. No compatibility layer replaces +the deleted fields. Atlas and external crossing contracts are unchanged. + Resident Self now solely imports authenticated Bifrost deliveries; exact `3dda58a5` deletes the standalone Persona feedback ingress and its old Starfire snapshot seam. Exact `56267201` deletes the three unadmitted Atlas daemon diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 328f6584..5eea1eed 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `718ce9c1` -Current pass: repository-frontier envelope duplication collapsed; Ox17 +Latest committed implementation cut: `a4356d1f` +Current pass: runtime child epoch echoes collapsed; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `718ce9c1` is the current +production symlink body and is inactive. Exact `a4356d1f` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,20 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `a4356d1f` keeps runtime identity and swarm binding as the explicit +writable-root epoch owners, then removes fixed schema-version echoes from +thirteen child physiology documents: sessions, jobs, model/tool bindings, +archived sessions, launches, process claims, worker archives, role/reorientation +and generic job results, coordinator receipts, and coordinator death recovery. +Exact lifecycle identity, causal bindings, terminal outcomes, decision contexts, +and retention chains remain. Runtime advances to v34; old writable stores still +refuse byte-identically. Core, keyed lifecycle, reorientation audit, +model-failure audit, transcript-free binding audit, provider mapping, +coordinator, swarm, and model-runtime checks pass. The cut removes 122 net +maintained lines and leaves `runtime_spine.rs` at 9,440 lines. Verification +generated 10.92 GB across 16,251 files; cleanup restored the shared target to +the single 1.78 MB state inspector. Atlas and external crossings are untouched. + Exact `718ce9c1` removes fixed schema-version fields and fixed contract prose from thirteen durable repository-frontier documents spanning Proposal through Planning, PlanMind, Hands, Verification, Soul verdict, Research, and Modeling. @@ -1022,7 +1036,7 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action The Ox17 deployment lane is paused. Continue the registered-document and test- -liability audit from exact `718ce9c1`; do not compile or deploy through Idunn +liability audit from exact `a4356d1f`; do not compile or deploy through Idunn yet. Delete an abstraction with tests that merely animate it when it has no decision-bearing consumer. Preserve keyed Mind, sealed reasoning, direct Body- to-Modeling flow, family admission owners, Persona social state, provider diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index b89659786c24ce678f9397ad54098272930887fd..faaeaa77d4a4707711fb8c30255bd78b0382992f 100644 GIT binary patch delta 835 zcmYjPziSmi5cVbh%7KlLASgN@q{;jJUSbjvF%YaQ6tPGno4vVrYxZ_8yL)+g)e|ff z#LjrVe}P~j7FL3d;GduoL<<{BOTSBAB*nMO&g{&5^UeJHxbW)p!kf9;x#iVPd$rx$ z_;e!r;on}ZZP#iWPxhvs?oHKz>YfHp0;hn}z!~5yF!OG2D!Tja{LA;z z_uEyza{E{9(uL{A>$^e*68+xdQrt<%aS+P*a{tTBT+0uI%V<-XSeXF{PeZ4I*wox` z)&}C-%9QNTu=6BLT>kwUT^_ScEqh9w%_yYG1!hAsRXV0T9eHK79gHZpvdGv3ze=7x ztj5>rk=?|Z*_d@JSgVP5Sr!4#BNA{6hh#e(AB!7Wx5bXMD2!ZB8J}`zCDM}ALS=YQ zeoSIva8`56v2_Y0L{*}N>S*5=I{13|XMJY2{BSe6a%0q_LyfdbSdOG-QZa&57}ZIN z!V7(jU0|0f1CuR+v|0J$d313MQL6y7A=64-l*w>6>0SYI#7c-#>-ny<)M){<|Cp2V@@fc`4l&k;$%7Uo?=-J1)15W) ip?vl|nw`hGVLPC9rL}YxD`W;(P)74$Web^d-24ai!WO?Ngb!0`CI=vaA>S diff --git a/state/map.yaml b/state/map.yaml index 719b4f22..2aef592c 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -52,7 +52,7 @@ current_status: summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. Hands consequence receipts and repository-frontier documents carry only causal identity, strong dependencies, semantic payload, and consequence; CultCache plus the runtime epoch own internal type/schema identity. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error; Eyes evidence packet v2 relies on its request/context identity for Research provenance; Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v33. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error; Eyes evidence packet v2 relies on its request/context identity for Research provenance; Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v34. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. fixed_routing_and_retention_cargo_cut: Exact ffd91c20 deletes EyesEvidencePacket.source_role_id, PersonaSocialMention.target_agent_id, and ResidentSelfRetentionHead.retained_at_millis. Each producer supplied one fixed or non-causal value and no consumer read it; the request/context, Persona queue plus turn request, and retention chain remain the real owners. Eyes packet v2, Persona mention v2, Resident Self state v3/retention head v1, and runtime v27 form a hard cut. Core and the three consuming release entrypoints compile; consequential Persona, Research, and epoch-refusal proofs pass. The maintained source delta is 6 net deletions. Atlas is untouched; no live inter-swarm collaboration has run. provider_stream_authority_cut: Exact fe118e13 makes OpenAI/OpenRouter events and receipts transient transport values. The runtime immediately normalizes them into the single persisted native model event/receipt family used by tool continuation, assistant reconstruction, terminal validation, and bounded retention. Duplicate provider writes, registrations, archive requirements, schema IDs, two public schemas/index rows, and the include-only model-runtime shell are gone; the exact provider request remains durable. Runtime advances to v28 and the catalog drops to 18 schemas. The cut removes 270 net maintained lines. Adapter 1/1, provider spine 14/14, reasoning context 8/8, runtime 23/23, model entrypoint 11/11, swarm 4/4, epoch refusal 1/1, and release construction 15/15 pass. Atlas is untouched; live inter-swarm collaboration remains unproven. cultnet_catalog_authority_cut: Exact dbed11b3 and 8bb0719b delete the hand-maintained JSON shadow registry. The nonexistent runtime-event contract and obsolete public archived-session tombstone schema disappear first. Runtime-local identity, session, job, binding, coordinator, native model/tool, and state-ledger schemas then disappear because no live CultNet provider carries them and several contradicted their Rust owners. Typed CultCache registration and owner-projected CultMesh state remain authoritative. The catalog has exactly three earned boundaries: the exact OpenAI-compatible provider request, gamecult.persona_state.v0, and epiphany.work_organ_state.v0. Parse/path/unindexed/forbidden-contract checks pass at 3/3/0/0/0. The cuts remove 850 net maintained lines. Atlas is untouched; live inter-swarm collaboration remains unproven. @@ -62,6 +62,7 @@ current_status: repository_domain_binding_cut: Exact 6f5d6600 keeps the immutable typed repository-domain receipt but reduces it to its two causal facts, the canonical organizational repository name and exact authenticated Body hash. CultCache owns envelope type, key, and schema; the authenticated Body route owns runtime, swarm, and workspace; binding time and fixed prose own no decision. Binding still validates the live Body and atomically strong-reads runtime identity plus Body route, while promotion and fulfillment refuse repository or Body-hash substitution. Runtime advances to v31. The full keyed lifecycle and old-store refusal pass; package cleanup removes 677.2 MiB. The cut removes 50 net maintained lines. Atlas remains protected until a real inter-swarm collaboration trial exercises the complete crossing. operator_objective_intake_cut: Exact 952dcd9f preserves the typed human assertion and atomic singleton Mind-objective commit while deleting four persisted echoes: fixed schema prose, key identity, objective digest, and contract text. The public outcome now returns only the Mind projection digest, exact commit receipt, and whether the commit changed state; it no longer carries a full intake or over-broad Mind view. The coordinator-binary test that merely replayed the library seed/idempotency/refusal proof is gone; the library proof is strengthened to require byte-identical replay and the wrapper-specific resident-grant provenance proof remains. Runtime advances to v32. All three focused proofs pass. The maintained cut removes 54 net lines. Package cleanup removed 18.5 GiB, then the 1.7 MiB state tool was preserved across cleanup of 961.1 MiB regenerated artifacts. Atlas is untouched. frontier_document_envelope_cut: Exact 718ce9c1 removes fixed schema-version fields and contract slogans from thirteen durable repository-frontier documents spanning Proposal, Proposal-Modeling, Planning, Research, plan candidate, PlanMind, plan decision, route, Hands authority, Verification, Soul verdict, and post-verdict Modeling. CultCache envelopes plus runtime epoch v33 own internal shape identity; semantic IDs, exact source-document versions, strong-read chains, decision contexts, dispositions, evidence, and consequences remain. Sealed worker-context schema and contract fields remain because they define exact model input. The full keyed lifecycle, old-store refusal, provider candidate mapping, core library, and release-owned coordinator target pass. The cut removes 177 net maintained lines. Verification generated 9.61 GB across 12,514 files; cleanup restored the shared target to the single 1.78 MB state inspector. Atlas is untouched and remains protected until a real inter-swarm collaboration run exercises its complete crossing. + runtime_child_epoch_echo_cut: Exact a4356d1f makes runtime identity plus swarm binding the explicit writable-root epoch owners and removes repeated schema-version fields from thirteen child physiology documents: sessions, jobs, model/tool execution bindings, archived sessions, worker launches, process claims, worker archives, role/reorientation/job results, coordinator receipts, and coordinator death recovery. Their exact lifecycle identity, causal bindings, terminal outcomes, decision contexts, and retention chains remain. Runtime advances to v34 and old writable stores still refuse byte-identically. Core, keyed lifecycle, reorientation audit, model-failure audit, transcript-free binding audit, provider candidate mapping, coordinator, swarm, and model-runtime checks pass. The cut removes 122 net maintained lines and leaves runtime_spine.rs at 9,440 lines. Verification generated 10.92 GB across 16,251 files; cleanup restored the single 1.78 MB state inspector. Atlas and external crossings are untouched. atlas_authoring_cut: Exact ce306e23 preserves the complete inter-swarm Atlas vertical slice while deleting its duplicate local offer/claim authoring authority. Ordinary Modeling through RepoModel operations is the sole owner of provider offers and consumer claims; Atlas retains signed publication, trust, transport, deterministic projection, Soul verification, Self impact admission, Resident Self wake, brakes, and Eve lowering. Two direct write-intent types, their runtime commit APIs and registry entries, 518 planner lines, and two tests that animated only that duplicate path are gone. The runtime proof now creates offers/claims through RepoModel before proving exact verification admission and Body-drift refusal. The cut removes 593 net source lines; the three-repository direct/transitive Modeling proof passes. These are component proofs only: no live inter-swarm collaboration has yet run, so the Atlas vertical slice remains protected until Gate 1 exercises it end to end. Runtime writable epoch is v14. autonomous_proposal_binding_cut: Exact 5d507bfd reduces Self's autonomous Imagination-to-Modeling origin binding from a 22-field duplicate archive to six causal join fields: schema, exact direction-result identity, selected option ordinal, worker job identity, and exact worker-result/launch digests. Proposal identity and payload, direction request, runtime/thread, typed model projection, Body/domain binding, selected option content, and canonical Modeling-request identity are checked directly from their owning immutable documents. The atomic proposal plus binding plus Modeling-request commit and its broad keyed-lifecycle proof remain; 60 net source lines are gone. Runtime writable epoch is v15. hands_verification_derivation_cut: Exact 6ccc7dd2 deletes the 20-field transient Hands receipt-chain summary. The Hands commit owner now derives the exact Verification request directly from the persisted patch, command, and commit receipts plus the frontier authority; no copied schema, job, grant, command-output, Git, path, summary, or timestamp fields mediate that handoff. Atomic Hands-to-Verification admission and the concurrent Persona/Hands lifecycle proof remain. The cut removes 43 net source lines without adding state, schema, or tests. @@ -146,10 +147,10 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,523 lines, 53 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, coordinator artifact/status cargo, and uninhabited aggregate state-model DTO families are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the registered-document and test-liability audit after exact 718ce9c1. Delete only complete dead authority slices and tests with no consequential claim. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, Persona consequences, exact native/provider requests, governed tool receipts, and the complete unrun Model Atlas vertical slice. Component tests are not collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,440 lines, 53 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, coordinator artifact/status cargo, and uninhabited aggregate state-model DTO families are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Resume the registered-document and test-liability audit after exact a4356d1f. Delete only complete dead authority slices and tests with no consequential claim. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, Persona consequences, exact native/provider requests, governed tool receipts, and the complete unrun Model Atlas vertical slice. Component tests are not collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v33. Hands consequence and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata; sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. The spine is 9,523 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v34. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. The spine is 9,440 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. From e60b924f7352916c1268b098c4d6382ea3a081e1 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 10:32:34 +0200 Subject: [PATCH 062/340] Delete model runtime schema self-certificate --- epiphany-core/src/lib.rs | 1 - epiphany-core/src/runtime_spine.rs | 4 -- .../src/bin/epiphany-openai-runtime.rs | 59 ------------------- 3 files changed, 64 deletions(-) diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index 6b66e774..7c61a29e 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -292,7 +292,6 @@ pub use runtime_spine::runtime_hands_patch_receipt; pub(crate) use runtime_spine::runtime_has_actionable_hands_frontier; pub use runtime_spine::runtime_identity; pub use runtime_spine::runtime_job_snapshot; -pub use runtime_spine::runtime_registered_document_types; pub(crate) use runtime_spine::runtime_reorient_worker_result; pub use runtime_spine::runtime_repo_frontier_planning_lifecycle; pub(crate) use runtime_spine::runtime_repo_frontier_research_lifecycle; diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index 8d5f94f7..d489ae51 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -9230,10 +9230,6 @@ pub fn runtime_identity(store_path: impl AsRef) -> Result(RUNTIME_IDENTITY_KEY) } -pub fn runtime_registered_document_types() -> Result> { - Ok(runtime_spine_schema_cache()?.registered_entry_types()) -} - fn require_identity(cache: &CultCache) -> Result { cache .get::(RUNTIME_IDENTITY_KEY)? diff --git a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs index 20ca5678..d45109aa 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs @@ -47,8 +47,6 @@ use epiphany_tool_adapter::EpiphanyToolInvocationIntent; use epiphany_tool_adapter::tool_invocation_intent_key; use serde::Deserialize; use serde_json::json; -use sha2::Digest; -use sha2::Sha256; use uuid::Uuid; const DEFAULT_STORE: &str = "state/runtime-spine.msgpack"; @@ -59,63 +57,6 @@ async fn main() -> Result<()> { let mut args = env::args().skip(1); let command = args.next().unwrap_or_else(|| "usage".to_string()); match command.as_str() { - "preflight" => { - let mut store = PathBuf::from(DEFAULT_STORE); - let mut required_document_types = Vec::new(); - let mut args = args.peekable(); - while let Some(arg) = args.next() { - match arg.as_str() { - "--store" => { - store = - PathBuf::from(args.next().context("preflight missing --store value")?) - } - "--require-document-type" => required_document_types.push( - args.next() - .context("preflight missing --require-document-type value")?, - ), - other => return Err(anyhow!("unknown preflight argument: {other}")), - } - } - let identity = epiphany_core::runtime_identity(&store)? - .ok_or_else(|| anyhow!("runtime spine is absent at {}", store.display()))?; - let registered_document_types = epiphany_core::runtime_registered_document_types()?; - let missing: Vec = required_document_types - .iter() - .filter(|required| !registered_document_types.contains(required)) - .cloned() - .collect(); - if !missing.is_empty() { - return Err(anyhow!( - "runtime does not register required document types: {}", - missing.join(", ") - )); - } - let executable = env::current_exe()?.canonicalize()?; - let executable_sha256 = format!("{:x}", Sha256::digest(fs::read(&executable)?)); - let schema_catalog_sha256 = format!( - "{:x}", - Sha256::digest(registered_document_types.join("\n").as_bytes()) - ); - let preflight_witness_id = format!( - "openai-runtime-preflight-{}", - executable_sha256.chars().take(16).collect::() - ); - print_json(&json!({ - "schemaVersion": "epiphany.openai_runtime.preflight.v0", - "status": "passed", - "runtimeVersion": env!("CARGO_PKG_VERSION"), - "executable": executable, - "executableSha256": executable_sha256, - "schemaCatalogSha256": schema_catalog_sha256, - "preflightWitnessId": preflight_witness_id, - "runtimeStore": store, - "runtimeId": identity.runtime_id, - "requiredDocumentTypes": required_document_types, - "registeredDocumentTypes": registered_document_types, - "schemaPreflightPassed": true, - "privateStateExposed": false - }))?; - } "audit-decision" => { let mut store = PathBuf::from(DEFAULT_STORE); let mut context_id = None; From 3b991e40798b48c5d1a6208d5e63e31d14fd2e89 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 10:44:18 +0200 Subject: [PATCH 063/340] Collapse model runtime onto admitted workers --- .../src/bin/epiphany-openai-runtime.rs | 469 +----------------- 1 file changed, 1 insertion(+), 468 deletions(-) diff --git a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs index d45109aa..768e68ff 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs @@ -14,10 +14,7 @@ use std::time::Duration; use anyhow::Context; use anyhow::Result; use anyhow::anyhow; -use epiphany_model_adapter::EpiphanyModelInputItem; use epiphany_model_adapter::EpiphanyModelRequest; -use epiphany_model_adapter::MODEL_ADAPTER_REQUEST_SCHEMA_ID; -use epiphany_openai_adapter::EpiphanyOpenAiModelRequest; #[cfg(test)] use epiphany_openai_adapter::{ EpiphanyOpenAiModelReceipt, EpiphanyOpenAiStreamEvent, EpiphanyOpenAiStreamPayload, @@ -29,11 +26,9 @@ use epiphany_openai_runtime::EpiphanyWorkerRuntimeOptions; use epiphany_openai_runtime::OPENAI_RUNTIME_ROLE; use epiphany_openai_runtime::append_requested_public_source_receipts; use epiphany_openai_runtime::assistant_text_from_model_events; -use epiphany_openai_runtime::build_tool_followup_model_request; use epiphany_openai_runtime::build_worker_model_request; use epiphany_openai_runtime::complete_worker_job_from_assistant_text; use epiphany_openai_runtime::default_codex_home; -use epiphany_openai_runtime::default_options; use epiphany_openai_runtime::fail_model_backed_worker_job; use epiphany_openai_runtime::fail_worker_job; use epiphany_openai_runtime::load_worker_launch_request; @@ -45,9 +40,7 @@ use epiphany_openai_runtime::run_worker_launch_observed; use epiphany_openai_runtime::worker_model_session_id; use epiphany_tool_adapter::EpiphanyToolInvocationIntent; use epiphany_tool_adapter::tool_invocation_intent_key; -use serde::Deserialize; use serde_json::json; -use uuid::Uuid; const DEFAULT_STORE: &str = "state/runtime-spine.msgpack"; const DEFAULT_PROVIDER: &str = "openai-codex"; @@ -121,26 +114,6 @@ async fn main() -> Result<()> { } print_json(&epiphany_core::list_auditable_decision_contexts(&store)?)?; } - "model-turn" => { - let options = parse_model_turn_options(args.collect())?; - require_supported_provider(&options.provider)?; - let request_text = fs::read_to_string(&options.request_path) - .with_context(|| format!("failed to read {}", options.request_path.display()))?; - let output_last_message_path = options.output_last_message_path.clone(); - let request = parse_model_turn_request_json(&request_text) - .with_context(|| format!("failed to parse {}", options.request_path.display()))?; - let runtime_options = options.clone().into_runtime_options_for_model(&request); - let summary = - run_model_turn(&options.provider, runtime_options.clone(), request.clone()).await?; - let request_id = request.request_id; - if let Some(path) = output_last_message_path { - let text = - assistant_text_from_model_events(&runtime_options.store_path, &request_id)?; - fs::write(&path, text) - .with_context(|| format!("failed to write {}", path.display()))?; - } - print_json(&summary)?; - } "run-worker" => { let options = parse_run_worker_options(args.collect())?; require_supported_provider(&options.provider)?; @@ -195,188 +168,11 @@ async fn main() -> Result<()> { timeout_guard.store(true, Ordering::SeqCst); print_json(&summary)?; } - "tool-followup" => { - let options = parse_tool_followup_options(args.collect())?; - let request = build_tool_followup_model_request( - &options.store_path, - &options.request_id, - &options.followup_request_id, - )?; - if let Some(parent) = options.output.parent() { - fs::create_dir_all(parent) - .with_context(|| format!("failed to create {}", parent.display()))?; - } - fs::write(&options.output, serde_json::to_string_pretty(&request)?) - .with_context(|| format!("failed to write {}", options.output.display()))?; - print_json(&json!({ - "requestId": request.request_id, - "previousResponseId": request.previous_response_id, - "inputItems": request.input.len(), - "output": options.output, - }))?; - } - "tool-followup-turn" => { - let options = parse_tool_followup_turn_options(args.collect())?; - require_supported_provider(&options.provider)?; - let request = build_tool_followup_model_request( - &options.store_path, - &options.request_id, - &options.followup_request_id, - )?; - let output_last_message_path = options.output_last_message_path.clone(); - let provider = options.provider.clone(); - let runtime_options = options.into_runtime_options_for_model(&request); - let summary = - run_model_turn(&provider, runtime_options.clone(), request.clone()).await?; - if let Some(path) = output_last_message_path { - let text = assistant_text_from_model_events( - &runtime_options.store_path, - &request.request_id, - )?; - fs::write(&path, text) - .with_context(|| format!("failed to write {}", path.display()))?; - } - print_json(&summary)?; - } _ => return Err(anyhow!(usage())), } Ok(()) } -#[derive(Clone)] -struct ModelTurnCliOptions { - provider: String, - store_path: PathBuf, - codex_home: PathBuf, - provider_credential_path: Option, - request_path: PathBuf, - session_id: Option, - job_id: Option, - objective: Option, - default_model: Option, - output_last_message_path: Option, -} - -#[derive(Deserialize)] -#[serde(deny_unknown_fields)] -struct NativeModelRequestJson { - schema_id: String, - request_id: String, - conversation_id: String, - provider: String, - model: String, - instructions: String, - input: Vec, - reasoning_effort: Option, - reasoning_summary: Option, - service_tier: Option, - output_contract_id: Option, -} - -#[derive(Deserialize)] -enum ModelInputItemJson { - UserText(ModelTextJson), - AssistantText(ModelTextJson), - ToolResult(ModelToolResultJson), -} - -#[derive(Deserialize)] -#[serde(deny_unknown_fields)] -struct ModelTextJson { - text: String, -} - -#[derive(Deserialize)] -#[serde(deny_unknown_fields)] -struct ModelToolResultJson { - call_id: String, - output: String, -} - -impl ModelInputItemJson { - fn into_native(self) -> EpiphanyModelInputItem { - match self { - Self::UserText(item) => EpiphanyModelInputItem::UserText { text: item.text }, - Self::AssistantText(item) => EpiphanyModelInputItem::AssistantText { text: item.text }, - Self::ToolResult(item) => EpiphanyModelInputItem::ToolResult { - call_id: item.call_id, - output: item.output, - }, - } - } -} - -fn parse_model_turn_request_json(text: &str) -> Result { - let value: serde_json::Value = - serde_json::from_str(text).context("model-turn request is not valid JSON")?; - let schema_id = value - .as_object() - .and_then(|object| object.get("schema_id")) - .and_then(serde_json::Value::as_str) - .context("model-turn request must be an object with string schema_id")?; - match schema_id { - MODEL_ADAPTER_REQUEST_SCHEMA_ID => { - let request: NativeModelRequestJson = serde_json::from_value(value) - .context("model-turn native request violates epiphany.model_request.v0")?; - anyhow::ensure!( - request.schema_id == MODEL_ADAPTER_REQUEST_SCHEMA_ID, - "native model request schema_id is invalid" - ); - let mut typed = EpiphanyModelRequest::new( - request.request_id, - request.conversation_id, - request.provider, - request.model, - request.instructions, - ); - typed.input = request - .input - .into_iter() - .map(ModelInputItemJson::into_native) - .collect(); - typed.reasoning_effort = request.reasoning_effort; - typed.reasoning_summary = request.reasoning_summary; - typed.service_tier = request.service_tier; - typed.output_contract_id = request.output_contract_id; - Ok(typed) - } - other => Err(anyhow!( - "unsupported model-turn request schema_id {other:?}" - )), - } -} - -impl ModelTurnCliOptions { - fn into_runtime_options_for_model( - self, - request: &EpiphanyModelRequest, - ) -> EpiphanyOpenAiRuntimeOptions { - let openai_request = epiphany_openai_runtime::openai_request_from_model_request(request); - self.into_runtime_options(&openai_request) - } - - fn into_runtime_options( - self, - request: &EpiphanyOpenAiModelRequest, - ) -> EpiphanyOpenAiRuntimeOptions { - let mut options = default_options(self.store_path, self.codex_home, request); - options.provider_credential_path = self.provider_credential_path; - if let Some(session_id) = self.session_id { - options.session_id = session_id; - } - if let Some(job_id) = self.job_id { - options.job_id = job_id; - } - if let Some(objective) = self.objective { - options.objective = objective; - } - if let Some(default_model) = self.default_model { - options.default_model = Some(default_model); - } - options - } -} - #[derive(Clone)] struct RunWorkerCliOptions { provider: String, @@ -395,102 +191,6 @@ struct RunWorkerCliOptions { activation_token_sha256: String, } -struct ToolFollowupCliOptions { - store_path: PathBuf, - request_id: String, - followup_request_id: String, - output: PathBuf, -} - -struct ToolFollowupTurnCliOptions { - provider: String, - store_path: PathBuf, - codex_home: PathBuf, - provider_credential_path: Option, - request_id: String, - followup_request_id: String, - session_id: Option, - job_id: Option, - objective: Option, - default_model: Option, - output_last_message_path: Option, -} - -impl ToolFollowupTurnCliOptions { - fn into_runtime_options_for_model( - self, - request: &EpiphanyModelRequest, - ) -> EpiphanyOpenAiRuntimeOptions { - let openai_request = epiphany_openai_runtime::openai_request_from_model_request(request); - let mut options = default_options(self.store_path, self.codex_home, &openai_request); - options.provider_credential_path = self.provider_credential_path; - if let Some(session_id) = self.session_id { - options.session_id = session_id; - } - if let Some(job_id) = self.job_id { - options.job_id = job_id; - } - if let Some(objective) = self.objective { - options.objective = objective; - } - if let Some(default_model) = self.default_model { - options.default_model = Some(default_model); - } - options - } -} - -fn parse_model_turn_options(args: Vec) -> Result { - let mut provider = DEFAULT_PROVIDER.to_string(); - let mut store_path = PathBuf::from(DEFAULT_STORE); - let mut codex_home = default_codex_home()?; - let mut provider_credential_path = None; - let mut request_path = None; - let mut session_id = None; - let mut job_id = None; - let mut objective = None; - let mut default_model = None; - let mut output_last_message_path = None; - let mut iter = args.into_iter(); - while let Some(arg) = iter.next() { - match arg.as_str() { - "--provider" => provider = next_value(&mut iter, "--provider")?, - "--store" => store_path = PathBuf::from(next_value(&mut iter, "--store")?), - "--codex-home" => codex_home = PathBuf::from(next_value(&mut iter, "--codex-home")?), - "--provider-credential" => { - provider_credential_path = Some(PathBuf::from(next_value( - &mut iter, - "--provider-credential", - )?)) - } - "--request" => request_path = Some(PathBuf::from(next_value(&mut iter, "--request")?)), - "--session-id" => session_id = Some(next_value(&mut iter, "--session-id")?), - "--job-id" => job_id = Some(next_value(&mut iter, "--job-id")?), - "--objective" => objective = Some(next_value(&mut iter, "--objective")?), - "--default-model" => default_model = Some(next_value(&mut iter, "--default-model")?), - "--output-last-message" => { - output_last_message_path = Some(PathBuf::from(next_value( - &mut iter, - "--output-last-message", - )?)) - } - other => return Err(anyhow!("unknown model-turn argument: {other}")), - } - } - Ok(ModelTurnCliOptions { - provider, - store_path, - codex_home, - provider_credential_path, - request_path: request_path.context("model-turn requires --request")?, - session_id, - job_id, - objective, - default_model, - output_last_message_path, - }) -} - fn parse_run_worker_options(args: Vec) -> Result { let mut provider = DEFAULT_PROVIDER.to_string(); let mut store_path = PathBuf::from(DEFAULT_STORE); @@ -616,32 +316,6 @@ fn claim_and_wait_for_worker_activation(options: &RunWorkerCliOptions) -> Result } } -fn parse_tool_followup_options(args: Vec) -> Result { - let mut store_path = PathBuf::from(DEFAULT_STORE); - let mut request_id = None; - let mut followup_request_id = None; - let mut output = None; - let mut iter = args.into_iter(); - while let Some(arg) = iter.next() { - match arg.as_str() { - "--store" => store_path = PathBuf::from(next_value(&mut iter, "--store")?), - "--request-id" => request_id = Some(next_value(&mut iter, "--request-id")?), - "--followup-request-id" => { - followup_request_id = Some(next_value(&mut iter, "--followup-request-id")?) - } - "--output" => output = Some(PathBuf::from(next_value(&mut iter, "--output")?)), - other => return Err(anyhow!("unknown tool-followup argument: {other}")), - } - } - Ok(ToolFollowupCliOptions { - store_path, - request_id: request_id.context("tool-followup requires --request-id")?, - followup_request_id: followup_request_id - .unwrap_or_else(|| format!("tool-followup-{}", Uuid::new_v4())), - output: output.context("tool-followup requires --output")?, - }) -} - fn default_worker_model() -> String { env::var("EPIPHANY_MODEL") .or_else(|_| env::var("CODEX_MODEL")) @@ -1255,90 +929,6 @@ mod tests { assert_eq!(provider_request_timeout(Some(600)), None); } - #[test] - fn model_turn_json_ingress_accepts_published_native_object() -> Result<()> { - let request = parse_model_turn_request_json( - r#"{ - "schema_id":"epiphany.model_request.v0", - "request_id":"request-json-native", - "conversation_id":"conversation-json-native", - "provider":"openai-codex", - "model":"gpt-test", - "instructions":"Return awake.", - "input":[{"UserText":{"text":"awake"}}], - "reasoning_effort":"low" - }"#, - )?; - assert_eq!(request.request_id, "request-json-native"); - assert_eq!(request.reasoning_effort.as_deref(), Some("low")); - assert_eq!(request.input.len(), 1); - assert!(request.tools.is_empty()); - Ok(()) - } - - #[test] - fn model_turn_json_ingress_refuses_caller_authored_provider_object() { - let error = parse_model_turn_request_json( - r#"{ - "schema_id":"epiphany.openai_model_request.v1", - "request_id":"request-json-provider", - "conversation_id":"conversation-json-provider", - "model":"gpt-test", - "instructions":"Return awake.", - "input":[{"ToolResult":{"call_id":"call-1","output":"awake"}}], - "output_contract_id":"contract-1" - }"#, - ) - .expect_err("provider requests must be derived internally from native requests"); - assert!( - error - .to_string() - .contains("unsupported model-turn request schema_id") - ); - } - - #[test] - fn model_turn_json_ingress_refuses_persistence_arrays_and_unknown_fields() { - assert!(parse_model_turn_request_json(r#"["epiphany.model_request.v0"]"#).is_err()); - assert!( - parse_model_turn_request_json( - r#"{ - "schema_id":"epiphany.model_request.v0", - "request_id":"request-json-hostile", - "conversation_id":"conversation-json-hostile", - "provider":"openai-codex", - "model":"gpt-test", - "instructions":"Return awake.", - "input":[], - "reasoning_effort":null, - "reasoning_summary":null, - "service_tier":null, - "output_contract_id":null, - "persistence_payload":"forbidden" - }"#, - ) - .is_err() - ); - assert!( - parse_model_turn_request_json( - r#"{ - "schema_id":"epiphany.model_request.v0", - "request_id":"request-json-toolcall", - "conversation_id":"conversation-json-toolcall", - "provider":"openai-codex", - "model":"gpt-test", - "instructions":"Return awake.", - "input":[{"ToolCall":{"call_id":"call-1","name":"x","arguments":"{}"}}], - "reasoning_effort":null, - "reasoning_summary":null, - "service_tier":null, - "output_contract_id":null - }"#, - ) - .is_err() - ); - } - fn seed_pending_tool_summary( store: &Path, worker_job_id: &str, @@ -1875,63 +1465,6 @@ fn run_tool_adapter( serde_json::from_slice(&output.stdout).context("tool adapter returned invalid JSON") } -fn parse_tool_followup_turn_options(args: Vec) -> Result { - let mut provider = DEFAULT_PROVIDER.to_string(); - let mut store_path = PathBuf::from(DEFAULT_STORE); - let mut codex_home = default_codex_home()?; - let mut provider_credential_path = None; - let mut request_id = None; - let mut followup_request_id = None; - let mut session_id = None; - let mut job_id = None; - let mut objective = None; - let mut default_model = None; - let mut output_last_message_path = None; - let mut iter = args.into_iter(); - while let Some(arg) = iter.next() { - match arg.as_str() { - "--provider" => provider = next_value(&mut iter, "--provider")?, - "--store" => store_path = PathBuf::from(next_value(&mut iter, "--store")?), - "--codex-home" => codex_home = PathBuf::from(next_value(&mut iter, "--codex-home")?), - "--provider-credential" => { - provider_credential_path = Some(PathBuf::from(next_value( - &mut iter, - "--provider-credential", - )?)) - } - "--request-id" => request_id = Some(next_value(&mut iter, "--request-id")?), - "--followup-request-id" => { - followup_request_id = Some(next_value(&mut iter, "--followup-request-id")?) - } - "--session-id" => session_id = Some(next_value(&mut iter, "--session-id")?), - "--job-id" => job_id = Some(next_value(&mut iter, "--job-id")?), - "--objective" => objective = Some(next_value(&mut iter, "--objective")?), - "--default-model" => default_model = Some(next_value(&mut iter, "--default-model")?), - "--output-last-message" => { - output_last_message_path = Some(PathBuf::from(next_value( - &mut iter, - "--output-last-message", - )?)) - } - other => return Err(anyhow!("unknown tool-followup-turn argument: {other}")), - } - } - Ok(ToolFollowupTurnCliOptions { - provider, - store_path, - codex_home, - provider_credential_path, - request_id: request_id.context("tool-followup-turn requires --request-id")?, - followup_request_id: followup_request_id - .unwrap_or_else(|| format!("tool-followup-{}", Uuid::new_v4())), - session_id, - job_id, - objective, - default_model, - output_last_message_path, - }) -} - fn require_supported_provider(provider: &str) -> Result<()> { if matches!(provider, "openai-codex" | "openai" | "openrouter") { return Ok(()); @@ -1956,5 +1489,5 @@ fn now() -> String { } fn usage() -> &'static str { - "usage: epiphany-model-runtime [--provider openai-codex|openrouter] [--provider-credential path] [--store path] [--codex-home path] [--request path] [--request-id id] [--context-id id] [--followup-request-id id] [--output path] [--session-id id] [--job-id id] [--activation-token-sha256 hex] [--objective text] [--default-model model] [--output-last-message path] [--auto-tools --tool-adapter-bin path --mcp-config path --cwd path --max-tool-rounds n]" + "usage: epiphany-model-runtime [--provider openai-codex|openrouter] [--provider-credential path] [--store path] [--codex-home path] [--context-id id] [--output path] [--job-id id] [--activation-token-sha256 hex] [--default-model model] [--auto-tools --tool-adapter-bin path --mcp-config path --cwd path --max-tool-rounds n]" } From 189f108f76f300144e7a0e8a8a9d6e76591f6adb Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 10:47:12 +0200 Subject: [PATCH 064/340] Record admitted model runtime authority --- notes/epiphany-current-algorithmic-map.md | 16 ++++++++++--- notes/epiphany-fork-implementation-plan.md | 11 ++++++++- notes/fresh-workspace-handoff.md | 26 +++++++++++++++++---- state/ledgers.msgpack | Bin 714134 -> 715060 bytes state/map.yaml | 8 ++++--- 5 files changed, 50 insertions(+), 11 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 9de245f1..bf90ccff 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `a4356d1f` on `codex/epiphany-shakedown-live` -Current pass: runtime child epoch echoes collapsed; +Latest committed implementation cut: `3b991e40` on `codex/epiphany-shakedown-live` +Current pass: model-runtime diagnostic wrappers collapsed; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -175,6 +175,16 @@ binding audit, provider mapping, coordinator, swarm, and model-runtime targets pass. The cut removes 122 net maintained lines and leaves Atlas plus external crossings untouched. +The packaged model runtime has one execution authority. Exact `e60b924f` +deletes the callerless `preflight` JSON self-certificate and registered-type +catalog accessor; real store epoch admission and Idunn package witnesses own +compatibility and provenance. Exact `3b991e40` deletes the uncalled standalone +`model-turn`, `tool-followup`, and `tool-followup-turn` commands plus their +parser/DTO/test surfaces. `run-worker` remains the sole provider execution path +and retains internal tool continuation; `list-decisions` and `audit-decision` +retain transcript-free operator inspection. The two cuts remove 532 net +maintained lines. The remaining binary suite passes 8/8. Atlas is untouched. + CultMesh contains no JSON-derived operator snapshot, coordinator receipt, Hands gate, role-review event, unauthenticated Odin/Eve provider row, or daemon tool directory. Native runtime and keyed Mind receipts remain the owners; old @@ -1117,7 +1127,7 @@ Accepted through the local `5b799b12` source boundary: Open before Model Atlas Gate 1 resumes: -1. let Idunn compile, test, and seal exact build-affecting source `a4356d1f`; +1. let Idunn compile, test, and seal exact build-affecting source `3b991e40`; 2. use that exact package in private fresh-store Ox17; stop after three provider failures total, and prove direct Body Modeling, typed refusal-to-retry if exercised, Hands through Verification, exact context diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 0b89d973..680e3092 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -224,7 +224,7 @@ Delete or demote: Keep the five-day shakedown, Ox17 deployment, and Model Atlas operational Gate 1 paused. Continue the source-subtraction and test-authority audit from exact -`a4356d1f`. The current sequence has deleted the semantic-memory/workspace-coverage +`3b991e40`. The current sequence has deleted the semantic-memory/workspace-coverage projection system, its local daemon supervisor, and the surviving generic RepoModel profile, impossible lifecycle, producerless receipt/summary, and decorative scoring axes. Modeling consumes typed Body and keyed RepoModel state @@ -273,6 +273,15 @@ causal and lifecycle payloads. Runtime advances to v34; old-store refusal and all affected consequence paths remain proven. No compatibility layer replaces the deleted fields. Atlas and external crossing contracts are unchanged. +Exact `e60b924f` deletes the model runtime's callerless preflight JSON +self-certificate and registered-type catalog accessor. Exact `3b991e40` +collapses the packaged model runtime onto admitted `run-worker` plus +`list-decisions` and `audit-decision`. The three uncalled direct transport/tool +CLI paths, their parser/option types, and their self-contained ingress tests are +gone. Provider execution and tool continuation now have one production entry +path; transcript-free decision inspection remains. The two cuts remove 532 net +maintained lines without changing Mind/runtime schemas or Atlas. + Resident Self now solely imports authenticated Bifrost deliveries; exact `3dda58a5` deletes the standalone Persona feedback ingress and its old Starfire snapshot seam. Exact `56267201` deletes the three unadmitted Atlas daemon diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 5eea1eed..bdfbda6b 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `a4356d1f` -Current pass: runtime child epoch echoes collapsed; Ox17 +Latest committed implementation cut: `3b991e40` +Current pass: model-runtime diagnostic wrappers collapsed; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `a4356d1f` is the current +production symlink body and is inactive. Exact `3b991e40` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,24 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `e60b924f` deletes the callerless model-runtime `preflight` JSON +self-certificate and its public registered-type catalog accessor. The command +built a fresh empty schema cache and hashed its type-name list; it did not prove +the deployed store or package could execute a decision. Actual Mind/runtime +epoch admission and Idunn's frozen-package witnesses remain the owners. + +Exact `3b991e40` then collapses `epiphany-model-runtime` onto its three earned +commands: admitted `run-worker`, `list-decisions`, and `audit-decision`. +Standalone `model-turn`, `tool-followup`, and `tool-followup-turn`, their option +and JSON-ingress families, and three tests that animated only that dead ingress +are gone. `run-worker` still owns OpenAI/OpenRouter execution, automatic tool +continuation, typed terminal failure, and decision-context sealing. The +remaining binary suite passes 8/8 and the exact packaged binary check passes. +Together the cuts remove 532 net maintained lines and leave the binary source +at 1,493 lines. Verification generated 9.36 GB across 13,992 files; Cargo +removed 8.7 GiB and the shared target again contains only the 1.78 MB state +inspector. Atlas and all inter-swarm contracts remain untouched. + Exact `a4356d1f` keeps runtime identity and swarm binding as the explicit writable-root epoch owners, then removes fixed schema-version echoes from thirteen child physiology documents: sessions, jobs, model/tool bindings, @@ -1036,7 +1054,7 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action The Ox17 deployment lane is paused. Continue the registered-document and test- -liability audit from exact `a4356d1f`; do not compile or deploy through Idunn +liability audit from exact `3b991e40`; do not compile or deploy through Idunn yet. Delete an abstraction with tests that merely animate it when it has no decision-bearing consumer. Preserve keyed Mind, sealed reasoning, direct Body- to-Modeling flow, family admission owners, Persona social state, provider diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index faaeaa77d4a4707711fb8c30255bd78b0382992f..6d106aca4f8e04bd66912c192ce88ffa8fdf3505 100644 GIT binary patch delta 827 zcmYLHO=}cE5Op`vm=V+*B#U?`&|5OQNp=%=lan7IMAV1|gm~)huGwkR(>?Zwn?2>= z!K;@zKfpgADEbe)2p$BF9z+5j{1H}90v;aSR9E$@_p080UHJHY;eD%dp|`r;Ti*L} zCiye>;dE{e09+8o#Tn?~;qt{q^2z^=mD; zc6mx~9x(0!*OrEZm0ni;eVVim3nNgaHfS#kgwkTB%>cZY+)GWM2$nnq8VF(qiultKX~T70m25xg-f z&5TlJ9LhzatKK|sUOBvTf1CJx?kFQiX~C49+Ub3W$DvP zSrkyGwP82M>cOYk){+a7W?Qn_`+lc?s+ERTFU(MCW+%XN;_QBG2k!ad1T3r*UInn+H)fFUu delta 73 zcmdmTNqgF9?F|x)+=d2L2F6jx7`UDkZ&qe3WMqtLp32ldm5C9EK{PWEvj8zG5VHX> QI}mdKG3WNFOk9kQ0dhzd#sB~S diff --git a/state/map.yaml b/state/map.yaml index 2aef592c..7305b5a6 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -63,6 +63,8 @@ current_status: operator_objective_intake_cut: Exact 952dcd9f preserves the typed human assertion and atomic singleton Mind-objective commit while deleting four persisted echoes: fixed schema prose, key identity, objective digest, and contract text. The public outcome now returns only the Mind projection digest, exact commit receipt, and whether the commit changed state; it no longer carries a full intake or over-broad Mind view. The coordinator-binary test that merely replayed the library seed/idempotency/refusal proof is gone; the library proof is strengthened to require byte-identical replay and the wrapper-specific resident-grant provenance proof remains. Runtime advances to v32. All three focused proofs pass. The maintained cut removes 54 net lines. Package cleanup removed 18.5 GiB, then the 1.7 MiB state tool was preserved across cleanup of 961.1 MiB regenerated artifacts. Atlas is untouched. frontier_document_envelope_cut: Exact 718ce9c1 removes fixed schema-version fields and contract slogans from thirteen durable repository-frontier documents spanning Proposal, Proposal-Modeling, Planning, Research, plan candidate, PlanMind, plan decision, route, Hands authority, Verification, Soul verdict, and post-verdict Modeling. CultCache envelopes plus runtime epoch v33 own internal shape identity; semantic IDs, exact source-document versions, strong-read chains, decision contexts, dispositions, evidence, and consequences remain. Sealed worker-context schema and contract fields remain because they define exact model input. The full keyed lifecycle, old-store refusal, provider candidate mapping, core library, and release-owned coordinator target pass. The cut removes 177 net maintained lines. Verification generated 9.61 GB across 12,514 files; cleanup restored the shared target to the single 1.78 MB state inspector. Atlas is untouched and remains protected until a real inter-swarm collaboration run exercises its complete crossing. runtime_child_epoch_echo_cut: Exact a4356d1f makes runtime identity plus swarm binding the explicit writable-root epoch owners and removes repeated schema-version fields from thirteen child physiology documents: sessions, jobs, model/tool execution bindings, archived sessions, worker launches, process claims, worker archives, role/reorientation/job results, coordinator receipts, and coordinator death recovery. Their exact lifecycle identity, causal bindings, terminal outcomes, decision contexts, and retention chains remain. Runtime advances to v34 and old writable stores still refuse byte-identically. Core, keyed lifecycle, reorientation audit, model-failure audit, transcript-free binding audit, provider candidate mapping, coordinator, swarm, and model-runtime checks pass. The cut removes 122 net maintained lines and leaves runtime_spine.rs at 9,440 lines. Verification generated 10.92 GB across 16,251 files; cleanup restored the single 1.78 MB state inspector. Atlas and external crossings are untouched. + model_runtime_preflight_certificate_cut: Exact e60b924f deletes the callerless model-runtime preflight command, its JSON self-certificate, executable and schema-list hashes, fresh-cache required-type comparison, and the public runtime_registered_document_types accessor. Actual Mind/runtime epoch admission owns writable-store compatibility; Idunn's frozen-package witness owns executable provenance. The cut removes 64 net maintained lines without changing schemas or Atlas. + model_runtime_diagnostic_wrapper_cut: Exact 3b991e40 makes admitted run-worker the sole provider execution path and retains list-decisions plus audit-decision for transcript-free inspection. The uncalled standalone model-turn, tool-followup, and tool-followup-turn commands, their CLI DTOs/parsers, duplicate JSON ingress family, and three tests that animated only that dead ingress are gone. OpenAI/OpenRouter selection, activation capability, automatic tool continuation, bounded typed failure, decision-context sealing, and worker terminality remain. The packaged binary suite passes 8/8 and its exact check passes. The cut removes 468 net maintained lines and leaves the model-runtime binary source at 1,493 lines. Verification generated 9.36 GB across 13,992 files; Cargo removed 8.7 GiB and restored the shared target to the single 1.78 MB state inspector. Atlas and inter-swarm contracts are untouched. atlas_authoring_cut: Exact ce306e23 preserves the complete inter-swarm Atlas vertical slice while deleting its duplicate local offer/claim authoring authority. Ordinary Modeling through RepoModel operations is the sole owner of provider offers and consumer claims; Atlas retains signed publication, trust, transport, deterministic projection, Soul verification, Self impact admission, Resident Self wake, brakes, and Eve lowering. Two direct write-intent types, their runtime commit APIs and registry entries, 518 planner lines, and two tests that animated only that duplicate path are gone. The runtime proof now creates offers/claims through RepoModel before proving exact verification admission and Body-drift refusal. The cut removes 593 net source lines; the three-repository direct/transitive Modeling proof passes. These are component proofs only: no live inter-swarm collaboration has yet run, so the Atlas vertical slice remains protected until Gate 1 exercises it end to end. Runtime writable epoch is v14. autonomous_proposal_binding_cut: Exact 5d507bfd reduces Self's autonomous Imagination-to-Modeling origin binding from a 22-field duplicate archive to six causal join fields: schema, exact direction-result identity, selected option ordinal, worker job identity, and exact worker-result/launch digests. Proposal identity and payload, direction request, runtime/thread, typed model projection, Body/domain binding, selected option content, and canonical Modeling-request identity are checked directly from their owning immutable documents. The atomic proposal plus binding plus Modeling-request commit and its broad keyed-lifecycle proof remain; 60 net source lines are gone. Runtime writable epoch is v15. hands_verification_derivation_cut: Exact 6ccc7dd2 deletes the 20-field transient Hands receipt-chain summary. The Hands commit owner now derives the exact Verification request directly from the persisted patch, command, and commit receipts plus the frontier authority; no copied schema, job, grant, command-output, Git, path, summary, or timestamp fields mediate that handoff. Atomic Hands-to-Verification admission and the concurrent Persona/Hands lifecycle proof remain. The cut removes 43 net source lines without adding state, schema, or tests. @@ -147,10 +149,10 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,440 lines, 53 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, coordinator artifact/status cargo, and uninhabited aggregate state-model DTO families are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the registered-document and test-liability audit after exact a4356d1f. Delete only complete dead authority slices and tests with no consequential claim. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, Persona consequences, exact native/provider requests, governed tool receipts, and the complete unrun Model Atlas vertical slice. Component tests are not collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,436 lines, 52 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs now carry only lifecycle identity/status; terminal result documents own summaries and artifacts. The lenient duplicate session ensure writer is gone; the strict diagnostic creator refuses identity collisions. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, coordinator artifact/status cargo, uninhabited aggregate state-model DTO families, and public registered-type catalog are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Resume the registered-document and test-liability audit after exact 3b991e40. Delete only complete dead authority slices and tests with no consequential claim. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, Persona consequences, exact native/provider requests, governed tool receipts, and the complete unrun Model Atlas vertical slice. Component tests are not collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v34. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. The spine is 9,440 lines with 53 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v34. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. The spine is 9,436 lines with 52 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. From 83611f9b711af70ad2a4447aa4cd5c7eef64b7c9 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 11:06:25 +0200 Subject: [PATCH 065/340] Collapse Eyes acceptance into Mind commits --- epiphany-core/src/current_work.rs | 48 +++------ epiphany-core/src/eyes_gateway.rs | 163 ----------------------------- epiphany-core/src/lib.rs | 6 -- epiphany-core/src/runtime_spine.rs | 162 +++++++++++++--------------- 4 files changed, 87 insertions(+), 292 deletions(-) delete mode 100644 epiphany-core/src/eyes_gateway.rs diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index 0bcae08a..341e75fb 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -1731,21 +1731,24 @@ pub fn accept_frontier_research_result( )); } if let Some(receipt) = receipts.pop() { + receipt.validate()?; let request_id = result .repo_frontier_research_request_id .as_deref() .ok_or_else(|| anyhow!("frontier Research replay lost its request identity"))?; - let packet_id = format!("eyes-packet-{request_id}"); - let packet = cache - .get::(&packet_id)? - .ok_or_else(|| anyhow!("frontier Research replay lost its evidence packet"))?; - if packet.research_request_id != request_id - || packet.decision_context_id != result.decision_context_id - || !receipt - .writes - .iter() - .any(|write| write.document_type == crate::EpiphanyMindEvidenceDocument::TYPE) - { + if !receipt.strong_reads.iter().any(|read| { + read.document_type == crate::RepoFrontierResearchRequest::TYPE + && read.document_key == request_id + }) || !receipt.strong_reads.iter().any(|read| { + read.document_type == crate::EpiphanyRuntimeRoleWorkerResult::TYPE + && read.document_key == job_id + }) || !receipt.writes.iter().any(|write| { + matches!( + write.document_type.as_str(), + crate::EpiphanyMindEvidenceDocument::TYPE + | crate::EpiphanyMindObservationDocument::TYPE + ) + }) { return Err(anyhow!( "frontier Research replay does not preserve its exact accepted decision" )); @@ -1812,20 +1815,6 @@ pub fn accept_frontier_research_result( "frontier Research result did not expose every proposed evidence identity" )); } - let finding = crate::interpret_runtime_role_worker_result( - crate::EpiphanyRoleResultRoleId::Research, - &result, - ); - let packet_id = format!("eyes-packet-{}", request.request_id); - let packet = crate::eyes_evidence_packet_from_research_finding( - packet_id.clone(), - request.request_id.clone(), - result.decision_context_id.clone(), - &finding, - &decision, - &lookups, - accepted_at.to_string(), - ); let mut writes = Vec::new(); for evidence in &decision.evidence { writes.push(crate::mind_documents::prepare_mind_document( @@ -1889,14 +1878,12 @@ pub fn accept_frontier_research_result( } strong_reads.push(envelope.clone()); } - let packet_envelope = cache.prepare_entry(&packet_id, &packet)?.0; - match crate::reasoning_context::commit_mind_mutation_with_derived_companions( + match crate::reasoning_context::commit_mind_mutation( store_path, &result.decision_context_id, "Eyes.frontier_research", strong_reads, writes, - vec![packet_envelope], accepted_at, )? { crate::EpiphanyMindCommitOutcome::Committed(receipt) => Ok(receipt), @@ -6062,11 +6049,6 @@ mod tests { .get::(&observation.id)? .is_some() ); - let packet = admitted_research_cache - .get::(&format!("eyes-packet-{research_request_id}"))? - .expect("request-bound Eyes packet"); - assert_eq!(packet.research_request_id, research_request_id); - assert_eq!(packet.decision_context_id, research_context.context_id); let after_research = project_current_work(&store)?; assert!(after_research.research.continuation_action().is_none()); assert!(after_research.body_modeling.is_none()); diff --git a/epiphany-core/src/eyes_gateway.rs b/epiphany-core/src/eyes_gateway.rs deleted file mode 100644 index f6c6ceef..00000000 --- a/epiphany-core/src/eyes_gateway.rs +++ /dev/null @@ -1,163 +0,0 @@ -use crate::EpiphanyResearchDecision; -use crate::EpiphanyRoleFindingInterpretation; -use cultcache_rs::DatabaseEntry; - -pub const EYES_SOURCE_LOOKUP_RECEIPT_SCHEMA_VERSION: &str = - "epiphany.eyes.source_lookup_receipt.v0"; -pub const EYES_EVIDENCE_PACKET_SCHEMA_VERSION: &str = "epiphany.eyes.evidence_packet.v2"; - -#[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] -#[cultcache( - type = "epiphany.eyes.source_lookup_receipt", - schema = "EyesSourceLookupReceipt" -)] -pub struct EyesSourceLookupReceipt { - #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] - pub receipt_id: String, - #[cultcache(key = 2)] - pub source_job_id: String, - #[cultcache(key = 3)] - pub substrate_grant_receipt_id: String, - #[cultcache(key = 4)] - pub tool_intent_id: String, - #[cultcache(key = 5)] - pub tool_receipt_id: String, - #[cultcache(key = 6)] - pub provider: String, - #[cultcache(key = 7)] - pub repository: String, - #[cultcache(key = 8)] - pub revision: String, - #[cultcache(key = 9)] - pub path: String, - #[cultcache(key = 10)] - pub source_ref: String, - #[cultcache(key = 11)] - pub content_sha256: String, - #[cultcache(key = 12)] - pub byte_count: u64, - #[cultcache(key = 13)] - pub observed_at: String, - #[cultcache(key = 14)] - pub contract: String, -} - -#[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] -#[cultcache(type = "epiphany.eyes.evidence_packet", schema = "EyesEvidencePacket")] -pub struct EyesEvidencePacket { - #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] - pub packet_id: String, - #[cultcache(key = 2)] - pub source_result_id: String, - #[cultcache(key = 3)] - pub source_job_id: String, - #[cultcache(key = 4)] - pub evidence_ids: Vec, - #[cultcache(key = 5)] - pub observation_ids: Vec, - #[cultcache(key = 6)] - pub source_refs: Vec, - #[cultcache(key = 7)] - pub summary: String, - #[cultcache(key = 8)] - pub uncertainty: String, - #[cultcache(key = 9)] - pub emitted_at: String, - #[cultcache(key = 10)] - pub contract: String, - #[cultcache(key = 11, default)] - pub source_lookup_receipt_ids: Vec, - #[cultcache(key = 12)] - pub research_request_id: String, - #[cultcache(key = 13)] - pub decision_context_id: String, -} - -pub fn eyes_evidence_packet_from_research_finding( - packet_id: String, - research_request_id: String, - decision_context_id: String, - finding: &EpiphanyRoleFindingInterpretation, - decision: &EpiphanyResearchDecision, - source_lookups: &[EyesSourceLookupReceipt], - emitted_at: String, -) -> EyesEvidencePacket { - let evidence_ids = decision - .evidence - .iter() - .filter_map(|evidence| non_empty_string(&evidence.id)) - .collect::>(); - let observation_ids = decision - .observations - .iter() - .filter_map(|observation| non_empty_string(&observation.id)) - .collect::>(); - let mut source_refs = Vec::new(); - for evidence in &decision.evidence { - for code_ref in &evidence.code_refs { - let mut rendered = code_ref.path.display().to_string(); - if let Some(start_line) = code_ref.start_line { - rendered.push(':'); - rendered.push_str(&start_line.to_string()); - } - if let Some(end_line) = code_ref.end_line - && Some(end_line) != code_ref.start_line - { - rendered.push('-'); - rendered.push_str(&end_line.to_string()); - } - if let Some(symbol) = code_ref.symbol.as_deref().filter(|value| !value.is_empty()) { - rendered.push('#'); - rendered.push_str(symbol); - } - push_unique(&mut source_refs, rendered); - } - } - for lookup in source_lookups { - push_unique(&mut source_refs, lookup.source_ref.clone()); - } - EyesEvidencePacket { - schema_version: EYES_EVIDENCE_PACKET_SCHEMA_VERSION.to_string(), - packet_id, - source_result_id: finding.runtime_result_id.clone().unwrap_or_default(), - source_job_id: finding.runtime_job_id.clone().unwrap_or_default(), - evidence_ids, - observation_ids, - source_refs, - summary: finding.summary.clone().unwrap_or_default(), - uncertainty: if finding.evidence_gaps.is_empty() && finding.risks.is_empty() { - "no declared research gaps or risks".to_string() - } else { - finding - .evidence_gaps - .iter() - .chain(finding.risks.iter()) - .cloned() - .collect::>() - .join("; ") - }, - emitted_at, - contract: "Eyes packet emitted from a reviewed Research lane finding; it makes the source-gathering evidence claim citable before Mind admission.".to_string(), - source_lookup_receipt_ids: source_lookups - .iter() - .map(|lookup| lookup.receipt_id.clone()) - .collect(), - research_request_id, - decision_context_id, - } -} - -fn non_empty_string(value: &str) -> Option { - let value = value.trim(); - (!value.is_empty()).then(|| value.to_string()) -} - -fn push_unique(out: &mut Vec, value: String) { - if !out.contains(&value) { - out.push(value); - } -} diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index 7c61a29e..bcefb78f 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -6,7 +6,6 @@ mod coordinator_results; pub mod coordinator_status; mod cultmesh_integration; mod current_work; -mod eyes_gateway; mod hands_gateway; mod idunn_provider_health; mod idunn_runtime_health; @@ -105,11 +104,6 @@ pub use epiphany_state_model::EpiphanyMemoryDomain; pub use epiphany_state_model::EpiphanyMemoryEdge; pub use epiphany_state_model::EpiphanyMemoryLifecycle; pub use epiphany_state_model::EpiphanyMemoryNode; -pub use eyes_gateway::EYES_EVIDENCE_PACKET_SCHEMA_VERSION; -pub use eyes_gateway::EYES_SOURCE_LOOKUP_RECEIPT_SCHEMA_VERSION; -pub use eyes_gateway::EyesEvidencePacket; -pub use eyes_gateway::EyesSourceLookupReceipt; -pub use eyes_gateway::eyes_evidence_packet_from_research_finding; pub use hands_gateway::*; pub use idunn_provider_health::{ EPIPHANY_IDUNN_PROVIDER_HEALTH_ADMISSION_SCHEMA, EPIPHANY_IDUNN_PROVIDER_HEALTH_ADMISSION_TYPE, diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index d489ae51..b3c55eed 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -5,8 +5,6 @@ use crate::agent_launch::{ EPIPHANY_MIND_OWNER_ROLE, EPIPHANY_MIND_ROLE_BINDING_ID, EPIPHANY_MODELING_OWNER_ROLE, EPIPHANY_MODELING_ROLE_BINDING_ID, }; -use crate::eyes_gateway::EyesEvidencePacket; -use crate::eyes_gateway::EyesSourceLookupReceipt; use crate::hands_gateway::*; use crate::repo_model_gateway::{ RUNTIME_REPOSITORY_DOMAIN_BINDING_KEY, RepoFrontierHandsAuthority, RepoFrontierModelingRequest, @@ -57,7 +55,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v34"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v35"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache(type = "epiphany.runtime.identity", schema = "EpiphanyRuntimeIdentity")] @@ -781,8 +779,6 @@ fn runtime_spine_schema_cache() -> Result { cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; - cache.register_entry_type::()?; - cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; @@ -2986,10 +2982,16 @@ pub(crate) fn frontier_verification_request_for_launch( Ok(Some(request)) } +#[derive(Clone, Debug, PartialEq, Eq)] +pub(crate) struct AuthenticatedPublicSourceLookup { + pub receipt_id: String, + pub source_ref: String, +} + pub(crate) fn runtime_authenticated_public_source_lookups_for_worker( store_path: impl AsRef, worker_job_id: &str, -) -> Result> { +) -> Result> { validate_non_empty(worker_job_id, "public source worker job id")?; let mut cache = runtime_spine_cache(store_path)?; cache.pull_all_backing_stores()?; @@ -3000,7 +3002,7 @@ pub(crate) fn runtime_authenticated_public_source_lookups_for_worker( fn authenticated_public_source_lookup_receipts_for_worker( cache: &CultCache, worker_job_id: &str, -) -> Result> { +) -> Result> { validate_non_empty(worker_job_id, "public source worker job id")?; require_identity(cache)?; let launch = cache @@ -3011,7 +3013,6 @@ fn authenticated_public_source_lookup_receipts_for_worker( { return Err(anyhow!("public source evidence is Eyes-owned")); } - let grant_id = format!("substrate-grant-{worker_job_id}"); let model_request_ids = cache .get_all::()? .into_iter() @@ -3076,22 +3077,9 @@ fn authenticated_public_source_lookup_receipts_for_worker( { return Err(anyhow!("public source result provenance is substituted")); } - lookups.push(EyesSourceLookupReceipt { - schema_version: crate::EYES_SOURCE_LOOKUP_RECEIPT_SCHEMA_VERSION.to_string(), + lookups.push(AuthenticatedPublicSourceLookup { receipt_id: lookup_receipt_id, - source_job_id: worker_job_id.to_string(), - substrate_grant_receipt_id: grant_id.clone(), - tool_intent_id: intent.intent_id, - tool_receipt_id: receipt.receipt_id, - provider: "github".to_string(), - repository, - revision: source.revision().to_string(), - path: source.path().to_string(), source_ref, - content_sha256, - byte_count, - observed_at: receipt.completed_at, - contract: "Eyes admitted one bounded immutable public source only after authenticating its worker, causal request or model execution, tool, grant, provider identity, and content digest.".to_string(), }); } lookups.sort_by(|left, right| left.receipt_id.cmp(&right.receipt_id)); @@ -3105,7 +3093,7 @@ fn authenticated_public_source_lookup_receipts_for_worker( pub(crate) fn authenticated_requested_public_source_lookups_for_worker( cache: &CultCache, worker_job_id: &str, -) -> Result> { +) -> Result> { validate_non_empty(worker_job_id, "frontier public source worker job id")?; let launch = cache .get::(worker_job_id)? @@ -6326,8 +6314,7 @@ pub(crate) fn select_and_commit_repo_frontier_research_request( let (view, basis) = current_keyed_repo_model(&cache)?; let model = view.memory_context_projection(); let launches = cache.get_all::()?; - let packets = cache.get_all::()?; - let item = match next_repo_frontier_research_work(&cache, &model, &launches, &packets)? { + let item = match next_repo_frontier_research_work(&cache, &model, &launches)? { Some(NextRepoFrontierResearchWork::Existing(request)) => return Ok(request), Some(NextRepoFrontierResearchWork::Unrequested(item)) => item, None => { @@ -6467,7 +6454,7 @@ impl RepoFrontierResearchLifecycle { } /// Projects the next exact actionable Eyes frontier through request, worker, -/// review, and accepted-packet lifecycle. This is the launch-currency owner: +/// review, and accepted Mind-commit lifecycle. This is the launch-currency owner: /// an uncovered frontier is not launchable while its current attempt is still /// running or awaiting review. pub(crate) fn runtime_repo_frontier_research_lifecycle( @@ -6478,14 +6465,13 @@ pub(crate) fn runtime_repo_frontier_research_lifecycle( cache.pull_all_backing_stores()?; require_identity(&cache)?; let launches = cache.get_all::()?; - let packets = cache.get_all::()?; let jobs = cache.get_all::()?; let job_results = cache.get_all::()?; let role_results = cache.get_all::()?; let (view, _basis) = current_keyed_repo_model(&cache)?; let model = view.memory_context_projection(); - let work = next_repo_frontier_research_work(&cache, &model, &launches, &packets)?; + let work = next_repo_frontier_research_work(&cache, &model, &launches)?; let request = match work { Some(NextRepoFrontierResearchWork::Unrequested(item)) => { return Ok(RepoFrontierResearchLifecycle { @@ -6593,14 +6579,13 @@ fn next_repo_frontier_research_work( cache: &CultCache, model: &crate::EpiphanyMemoryGraphSnapshot, launches: &[EpiphanyRuntimeWorkerLaunchRequest], - packets: &[EyesEvidencePacket], ) -> Result> { let existing_actionable = actionable_repo_frontier_research_requests(cache)?; let mut existing_uncovered = existing_actionable .iter() .cloned() .filter_map(|request| { - match repo_frontier_research_request_is_covered(cache, &request, launches, packets) { + match repo_frontier_research_request_is_covered(cache, &request, launches) { Ok(false) => Some(Ok(request)), Ok(true) => None, Err(error) => Some(Err(error)), @@ -6632,7 +6617,6 @@ fn repo_frontier_research_request_is_covered( cache: &CultCache, request: &RepoFrontierResearchRequest, launches: &[EpiphanyRuntimeWorkerLaunchRequest], - packets: &[EyesEvidencePacket], ) -> Result { let mut matching_jobs = BTreeSet::new(); for launch in launches { @@ -6648,32 +6632,29 @@ fn repo_frontier_research_request_is_covered( } matching_jobs.insert(launch.job_id.as_str()); } - for packet in packets - .iter() - .filter(|packet| packet.research_request_id == request.request_id) - { - let result = cache.get::(&packet.source_job_id)?; - let archived = cache.get::(&packet.source_job_id)?; - let exact_live = result.as_ref().is_some_and(|result| { - matching_jobs.contains(result.job_id.as_str()) - && result.result_id == packet.source_result_id - && result.decision_context_id == packet.decision_context_id - && result.repo_frontier_research_request_id.as_deref() - == Some(request.request_id.as_str()) - }); - let exact_archived = archived.as_ref().is_some_and(|attempt| { - attempt.request_kind == "frontier-research" - && attempt.request_id == request.request_id - && attempt.fulfilled_result_id() == Some(packet.source_result_id.as_str()) - && attempt.decision_context_id() == Some(packet.decision_context_id.as_str()) - && attempt.decision.as_ref().is_some_and(|decision| { - decision.role_result.as_ref().is_some_and(|result| { - result.repo_frontier_research_request_id.as_deref() - == Some(request.request_id.as_str()) - }) - }) - }); - if exact_live || exact_archived { + for job_id in matching_jobs { + if let Some(result) = cache.get::(job_id)? + && result.repo_frontier_research_request_id.as_deref() + == Some(request.request_id.as_str()) + && result.role_id.eq_ignore_ascii_case("research") + && result.item_error.is_none() + && worker_result_has_keyed_mind_commit(cache, &result)? + { + return Ok(true); + } + if let Some(attempt) = cache.get::(job_id)? + && attempt.request_kind == "frontier-research" + && attempt.request_id == request.request_id + && let Some(decision) = attempt.decision.as_ref() + && let Some(result) = decision.role_result.as_ref() + && result.repo_frontier_research_request_id.as_deref() + == Some(request.request_id.as_str()) + && result.role_id.eq_ignore_ascii_case("research") + && result.item_error.is_none() + && attempt.fulfilled_result_id() == Some(result.result_id.as_str()) + && attempt.decision_context_id() == Some(result.decision_context_id.as_str()) + && worker_result_has_keyed_mind_commit(cache, result)? + { return Ok(true); } } @@ -7492,39 +7473,40 @@ fn worker_result_has_keyed_mind_commit( result: &EpiphanyRuntimeRoleWorkerResult, ) -> Result { require_worker_decision_context(cache, &result.decision_context_id, &result.job_id)?; - Ok(cache - .get_all::()? - .into_iter() - .any(|receipt| { - matches!( - receipt.authority, - crate::EpiphanyMindCommitAuthority::ModelDecisionContext { - ref decision_context_id - } if decision_context_id == &result.decision_context_id - ) && if result.role_id.eq_ignore_ascii_case("modeling") { - receipt.invariant_owner.starts_with("Modeling.") - && receipt - .writes - .iter() - .any(|write| write.document_type.starts_with("epiphany.mind.repo_model.")) - } else if result.role_id.eq_ignore_ascii_case("research") { - receipt.invariant_owner == "Eyes.frontier_research" - && receipt.writes.iter().any(|write| { - matches!( - write.document_type.as_str(), - crate::EpiphanyMindEvidenceDocument::TYPE - | crate::EpiphanyMindObservationDocument::TYPE - ) - }) - } else if result.role_id.eq_ignore_ascii_case("verification") { - receipt.invariant_owner == "Soul.verification" - && receipt.writes.iter().any(|write| { - write.document_type == crate::EpiphanyMindVerificationAuditDocument::TYPE - }) - } else { - false - } - })) + for receipt in cache.get_all::()? { + receipt.validate()?; + if matches!( + receipt.authority, + crate::EpiphanyMindCommitAuthority::ModelDecisionContext { + ref decision_context_id + } if decision_context_id == &result.decision_context_id + ) && if result.role_id.eq_ignore_ascii_case("modeling") { + receipt.invariant_owner.starts_with("Modeling.") + && receipt + .writes + .iter() + .any(|write| write.document_type.starts_with("epiphany.mind.repo_model.")) + } else if result.role_id.eq_ignore_ascii_case("research") { + receipt.invariant_owner == "Eyes.frontier_research" + && receipt.writes.iter().any(|write| { + matches!( + write.document_type.as_str(), + crate::EpiphanyMindEvidenceDocument::TYPE + | crate::EpiphanyMindObservationDocument::TYPE + ) + }) + } else if result.role_id.eq_ignore_ascii_case("verification") { + receipt.invariant_owner == "Soul.verification" + && receipt.writes.iter().any(|write| { + write.document_type == crate::EpiphanyMindVerificationAuditDocument::TYPE + }) + } else { + false + } { + return Ok(true); + } + } + Ok(false) } pub(crate) fn validate_repo_frontier_verification_request_intrinsic( From 87c14b50936e47c0fc98f51198b13797dc43b641 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 11:10:27 +0200 Subject: [PATCH 066/340] Record singular Eyes acceptance authority --- notes/epiphany-current-algorithmic-map.md | 25 ++++---- notes/epiphany-fork-implementation-plan.md | 10 ++-- notes/eyes-cultnet-contracts.md | 65 +++++++-------------- notes/fresh-workspace-handoff.md | 42 ++++++++----- notes/organ-dependency-contracts.md | 2 +- notes/soul-cultnet-contracts.md | 2 +- state/ledgers.msgpack | Bin 715060 -> 715663 bytes state/map.yaml | 10 ++-- 8 files changed, 76 insertions(+), 80 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index bf90ccff..adbdf7ca 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -54,15 +54,15 @@ the receipt consequence. Mind/runtime writable epochs were v10/v26 at that cut, and old stores refuse rather than inheriting the retired shapes. Routing identity lives at the owner, not in every payload. Exact `ffd91c20` -deletes the fixed Research role from Eyes evidence packets because their typed -family plus request and decision-context identities already own provenance. It -deletes the fixed Epiphany Persona agent label from each social mention because +first deleted the fixed Research role from the then-live Eyes evidence packets +because their request and decision-context identities already owned provenance. +It deletes the fixed Epiphany Persona agent label from each social mention because the Persona-only queue and immutable turn request own routing. Resident Self retention keeps cumulative lifecycle/envelope counts and its exact chained deletion digest; it no longer accepts a clock merely to persist an unread -timestamp outside that chain. The live shapes are Eyes evidence packet v2, -Persona social mention v2, Resident Self state v3/retention head v1, and -Mind/runtime v10/v27. Model Atlas is unchanged and remains unaccepted until a +timestamp outside that chain. Persona social mention v2 and Resident Self state +v3/retention head v1 remain; exact `83611f9b` later deletes the Eyes packet +family entirely. Model Atlas is unchanged and remains unaccepted until a live inter-swarm exchange exercises publication, transport, verification, admission, wake, and withdrawal end to end. @@ -597,11 +597,12 @@ rows that had no typed documents or runtime path. The keyed repo-frontier verification request owns the live obligation, and `SoulVerdictReceipt` owns the persisted audit result consumed by Modeling/Mind. -Eyes publishes only concrete observation evidence. Exact `201fa192` removes -generic evidence-request, review, and refusal rows that had no typed documents -or runtime path. Authenticated source lookup receipts prove what was inspected; -the typed research decision becomes the exact persisted evidence packet consumed -by current work and Modeling. +Eyes owns one concrete admission path. Exact `201fa192` removes generic +evidence-request, review, and refusal rows that had no typed documents or +runtime path. Exact `83611f9b` then removes the never-persisted source-lookup +DTO and the duplicate evidence packet. The real grant/tool receipt chain is +authenticated in place; the structured Research decision becomes keyed Mind +evidence/observation writes under one atomic `Eyes.frontier_research` commit. Idunn deployment truth is not mirrored into invented Epiphany-local envelopes. Odin/Idunn owns `gamecult.idunn.deployment_manifest.v3` and signed daemon-health @@ -661,7 +662,7 @@ interface authority. | OpenAI Responses schema projector | full native typed output schema | one provider-legal strict generation schema | Provider formatting preserves useful supported constraints but never replaces native decoding or Mind admission. | | model-pass terminal owner | sealed reasoning basis/context and typed failure class | exact transport closure plus `EpiphanyModelPassFailure` and terminal session/job result in one batch CAS | The caller cannot nominate a job/session; the context-derived binding closes role, reorient, and Persona failures without granting generic transport results decision authority. | | Substrate Gate | exact worker/job authority and requested operation | scoped grant or refusal | Access permission does not admit Mind state. | -| Eyes | explicit external-evidence obligation plus governed source receipts | typed evidence packet and Mind observations | Eyes gathers outside evidence; it does not gate Modeling over the Body. | +| Eyes | explicit external-evidence obligation plus governed grant/tool receipts | keyed Mind evidence/observations plus exact commit receipt | Eyes gathers outside evidence; it does not gate Modeling over the Body. | | Modeling | Body basis, keyed RepoModel view, verified consequences, and explicit proposals | typed graph/frontier mutations | Modeling processes the Body directly and owns no external-source permission. | | Hands | adopted route/plan plus exact capability receipts | typed consequences | A claimed intention is not a consequence. | | Soul | exact consequence and invariant/evidence obligations | verification audit or refusal | Work is not true merely because it ran. | diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 680e3092..487cb44c 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -392,11 +392,13 @@ Cut in this order: and an always-empty raw-result reference. Mind/runtime epochs are v10/v26; old writable stores refuse without migration. Exact `ffd91c20` deletes three more derived fields: the fixed Research role - from Eyes packets, the fixed Epiphany Persona agent from queued mentions, + from the then-live Eyes packets, the fixed Epiphany Persona agent from queued + mentions, and the unread Resident Self retention timestamp. Their owning request/ context, Persona queue/turn request, and chained retention digest remain. - Eyes packet v2, Persona mention v2, Resident Self state v3/retention head v1, - and runtime v27 form the hard cut. Model Atlas remains intact for its first + Persona mention v2, Resident Self state v3/retention head v1, and runtime v27 + formed that hard cut; exact `83611f9b` later deletes the Eyes packet family. + Model Atlas remains intact for its first live inter-swarm collaboration run; component proofs are not acceptance. Exact `fe118e13` makes provider events and receipts transient transport values and deletes their duplicate CultCache/CultNet authority. One native @@ -444,7 +446,7 @@ Cut in this order: 8. **Frontier Research landed at `c7412998`:** the v3 request seals the exact frontier/dependency document closure, while the full RepoModel projection is audit cargo only. One deterministic attempt, terminal decision context, - request-bound Eyes packet, and `Eyes.frontier_research` Mind mutation own + structured Research result and `Eyes.frontier_research` Mind mutation own Launch/Wait/Review/admission. Stale terminal decisions remain durable, exact strong-state changes refuse admission byte-identically, and disjoint keyed writes merge. Accepted Eyes, role lanes, timestamps, generic regather, and diff --git a/notes/eyes-cultnet-contracts.md b/notes/eyes-cultnet-contracts.md index f82b6fb4..820b2a69 100644 --- a/notes/eyes-cultnet-contracts.md +++ b/notes/eyes-cultnet-contracts.md @@ -1,49 +1,26 @@ -# Eyes CultNet Contracts +# Eyes Authority -Objective: make Eyes the evidence ingress guardian. Body controls whether the -machine may touch the repo or substrate; Eyes controls whether a claim has been -looked at well enough to become citable evidence for another organ. +Eyes gathers evidence outside Epiphany's resident Body. It does not own a +portable CultNet contract merely because it is an organ. ## Authority Map -- Owner: Eyes owns source-grounded evidence packets. -- Inputs: Body-granted source access, retrieval/index requests, search queries, - source refs, claimed facts, uncertainty requirements, and requested evidence - scope from any organ. -- Outputs: Eyes evidence reviews, source lookup receipts, evidence packets, and - evidence refusal receipts. -- Derived state: raw snippets, search hits, retrieved chunks, logs, web pages, - and source excerpts are not citable truth until Eyes packages provenance, - uncertainty, and limits. -- Forbidden paths: Imagination, Hands, Persona, Mind, Self, Body, Soul, Continuity, raw - workers, and compatibility JSON-RPC routes must not treat raw retrieved - material as inspected evidence without an Eyes receipt. -- Shared path: any organ that needs truth asks Eyes for a source-grounded - packet. Soul may later verify the packet against invariants, but Eyes owns the - first act of looking. -- Deletion line: Substrate Gate access receipts are not evidence receipts. A repo read - grant says the substrate may be touched; it does not say the claim is known. +- Owner: the `Eyes.frontier_research` Mind admission owner. +- Inputs: one explicit external-evidence obligation, its exact Research + request/launch/result/decision context, and the real governed Substrate Gate + grant plus tool intent/receipt chain used by that pass. +- Outputs: keyed Mind evidence, observation, and optional investigation + checkpoint documents committed atomically with one + `EpiphanyMindCommitReceipt`. +- Derived state: Research coverage is projected from the exact live or archived + structured result and that commit receipt. +- Forbidden writers: raw retrieval results, role slots, timestamps, events, and + synthesized evidence packets cannot accept Research or gate Modeling. +- Shared path: initial admission and post-archive re-entry use the same validated + Mind-commit predicate. +- Cut line: source-lookup DTOs and Eyes evidence packets are absent. The grant, + tool receipt, terminal request, structured decision, keyed Mind writes, and + commit receipt already preserve the decision-bearing facts. -## Contract Families - -- `epiphany.eyes.evidence_request`: request for source-grounded evidence. -- `epiphany.eyes.evidence_review`: Eyes decision about grounding, uncertainty, - and missing looking. -- `epiphany.eyes.source_lookup_receipt`: proof of what was searched or - inspected under which Substrate Gate grant. -- `epiphany.eyes.evidence_packet`: citable packet with provenance, - uncertainty, and source refs. -- `epiphany.eyes.evidence_refusal_receipt`: proof that Eyes refused to certify a - claim. - -## Neighboring Gates - -- Substrate Gate grants repo/substrate access. -- Eyes turns inspected material into evidence. -- Imagination projects evidence into possible scenes and futures. -- Mind decides whether evidence or thought mutates persistent state. -- Soul verifies invariants and falsifies claims before the machine calls them - safe. - -Eyes is not the whole truth organ. It is the looking organ. It keeps the machine -from citing fog with line numbers. +Modeling reads the resident Body directly. Eyes enters only when a current +typed obligation requires evidence from outside that Body. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index bdfbda6b..2893b01c 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `3b991e40` -Current pass: model-runtime diagnostic wrappers collapsed; Ox17 +Latest committed implementation cut: `83611f9b` +Current pass: Eyes acceptance collapsed into exact Mind commits; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `3b991e40` is the current +production symlink body and is inactive. Exact `83611f9b` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,21 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `83611f9b` makes the atomic `Eyes.frontier_research` Mind commit the sole +Research acceptance authority. The never-persisted source-lookup DTO and the +duplicate evidence packet are gone. Eyes still authenticates the exact +Substrate Gate grant, tool intent/receipt, immutable source identity, and +content digest before admission; the structured decision then becomes keyed +Mind evidence/observation/checkpoint documents. Initial acceptance and archived +re-entry use the same validated commit predicate. Runtime advances to v35. The +core library check, full keyed Research lifecycle including conflict/replay and +read-only re-entry, and old-epoch refusal pass. The cut removes 205 net +maintained lines; `runtime_spine.rs` is 9,418 physical lines with 52 public +functions and 25 public structs. Verification generated 2.0 GiB across 2,950 +files; cleanup restored the shared target to the single 1.78 MB state inspector. +Atlas and every inter-swarm contract remain untouched and operationally +unaccepted. + Exact `e60b924f` deletes the callerless model-runtime `preflight` JSON self-certificate and its public registered-type catalog accessor. The command built a fresh empty schema cache and hashed its type-name list; it did not prove @@ -188,14 +203,14 @@ Runtime advances to v28 and the public catalog has 18 schemas. The cut removes 1/1, and release construction 15/15 pass. Model Atlas is untouched; its live inter-swarm collaboration trial remains open. -Exact `ffd91c20` removes three fixed or non-causal fields outside Model Atlas. -The Eyes evidence packet no longer repeats `source_role_id = research`; its -request and decision-context identities own provenance. A Persona mention no +Exact `ffd91c20` removed three fixed or non-causal fields outside Model Atlas. +The then-live Eyes evidence packet stopped repeating `source_role_id = research`; +exact `83611f9b` later removed that packet family entirely. A Persona mention no longer repeats `target_agent_id = epiphany.Persona`; the Persona-owned queue and turn request own routing. Resident Self retention no longer accepts a clock only to store an unread `retained_at_millis`; counts plus the chained deletion -digest remain the retention consequence. Eyes packet v2, Persona social mention -v2, Resident Self state v3/retention head v1, and runtime v27 form a hard cut. +digest remain the retention consequence. Persona social mention v2, Resident +Self state v3/retention head v1, and runtime v27 formed that hard cut. Core and the swarm, model-runtime, and Persona-service entrypoints compile; Persona admission 7/7, Persona decision/retention 5/5, keyed Modeling/Research 1/1, and both writable-epoch refusals 1/1 pass. The maintained source delta is @@ -1054,7 +1069,7 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action The Ox17 deployment lane is paused. Continue the registered-document and test- -liability audit from exact `3b991e40`; do not compile or deploy through Idunn +liability audit from exact `83611f9b`; do not compile or deploy through Idunn yet. Delete an abstraction with tests that merely animate it when it has no decision-bearing consumer. Preserve keyed Mind, sealed reasoning, direct Body- to-Modeling flow, family admission owners, Persona social state, provider @@ -1414,12 +1429,13 @@ schemas, stores, writers, readers, or tests. The keyed repo-frontier verificatio request and persisted `SoulVerdictReceipt` remain the real request/result path. Core/release checks pass; focused verification tests pass 3/3. -Exact `201fa192` deletes three prose-only Eyes families: generic evidence +Exact `201fa192` deleted three prose-only Eyes families: generic evidence request, evidence review, and evidence refusal. They had constants, exports, and mutation-table prose but no typed documents, schemas, stores, writers, readers, -or tests. Authenticated source lookup receipts and the exact research decision's -persisted evidence packet remain the real Eyes path. Core/release checks and -focused Research 2/2 pass. +or tests. Exact `83611f9b` later deletes the never-persisted lookup DTO and the +duplicate evidence packet as well. The live Eyes path authenticates the real +grant/tool chain and atomically admits keyed Mind evidence/observations with +one exact commit receipt. Next continue the test-authority audit after exact `ffcf036f`, beginning with remaining direct schema, prompt-rendering, CLI-parser, and CultMesh projection tests. Audit every claimed diff --git a/notes/organ-dependency-contracts.md b/notes/organ-dependency-contracts.md index 427ee25a..a75f80ac 100644 --- a/notes/organ-dependency-contracts.md +++ b/notes/organ-dependency-contracts.md @@ -42,7 +42,7 @@ must be projected with awareness of the whole organism: Imagination models the future shape. - Mind admits state only after it can see which organ produced the thought and which other organs shaped the proposal. -- Eyes supplies source-grounded evidence packets after Substrate Gate grants access, so +- Eyes supplies keyed source-grounded Mind evidence after Substrate Gate grants access, so the other organs do not mistake raw retrieval for inspected truth. ## Projector Ownership diff --git a/notes/soul-cultnet-contracts.md b/notes/soul-cultnet-contracts.md index f0678621..7f542ed0 100644 --- a/notes/soul-cultnet-contracts.md +++ b/notes/soul-cultnet-contracts.md @@ -7,7 +7,7 @@ polish from impersonating truth. ## Authority Map - Owner: Soul owns verification verdicts. -- Inputs: verification requests, Eyes evidence packets, Hands action receipts, +- Inputs: verification requests, keyed Eyes evidence/observations, Hands action receipts, Body substrate receipts, expected invariants, test commands, review criteria, and current risk context. - Outputs: invariant checks, verdict receipts, regression receipts, review diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 6d106aca4f8e04bd66912c192ce88ffa8fdf3505..ee3178cffb0b7ee90bb7e60877132ed840724d85 100644 GIT binary patch delta 507 zcmYL_ziSjh6vy2&CT1X3<`D761Ix?p?Oiy@C27>Cm5RYi1Q}=Fv5%eI+04u?Zk56! zMT*!Qi#8VaA}IJD_y^cn*d&D_{uRDGQHu}5n;)O|ee>~4@91mqeK%N{Y!0K%X#Du| zDe+5xxEAaM!IKxW&cUn`FztGpSzyjEi_8*pmRbHZ>xef$nu~A6xrJ8KJbbx$soUw@ zelC@VjrHrp;dJs0GMS=lj$bcd*uO`449a8~dGHB>Ga6wR9ZIVbkV;|UWv&op=@Vng z*CFhnMvpP%SfT9~XdSt>cBZrn``VbaEMVu+1CT6_%R-Zq9sw(gv2_(vrRcYS@_q6o zHOM$4=g8#q7j0{*SZJ}2xwkb`Qd8V2<`HFveP5-;t F{tXaju#W%$ delta 75 zcmeCbuD#`w_69LVUJEM|Q!5k0sACLVF9bI$GZr#3MmJAoYM;u)2*e Date: Mon, 24 Aug 2026 11:43:37 +0200 Subject: [PATCH 067/340] Delete test-only runtime writers --- epiphany-core/src/lib.rs | 2 - epiphany-core/src/runtime_spine.rs | 71 ------------------- .../src/bin/epiphany-openai-runtime.rs | 9 --- epiphany-openai-runtime/src/lib.rs | 9 --- epiphany-tool-mcp-runtime/src/main.rs | 67 ++++++++--------- 5 files changed, 31 insertions(+), 127 deletions(-) diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index bcefb78f..64e07e45 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -253,8 +253,6 @@ pub use runtime_spine::commit_repo_frontier_plan_mind_request; pub use runtime_spine::complete_runtime_job; pub use runtime_spine::coordinator_run_receipts; pub use runtime_spine::coordinator_run_session_id; -pub use runtime_spine::create_runtime_job; -pub use runtime_spine::create_runtime_session; pub use runtime_spine::finalize_coordinator_run; pub use runtime_spine::initialize_runtime_spine; pub use runtime_spine::model_pass_failure_for_request; diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index b3c55eed..29a238be 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -962,38 +962,6 @@ pub fn bind_runtime_to_swarm( } } -pub fn create_runtime_session( - store_path: impl AsRef, - options: RuntimeSpineSessionOptions, -) -> Result { - validate_non_empty(&options.session_id, "session id")?; - validate_non_empty(&options.objective, "objective")?; - validate_non_empty(&options.created_at, "created at")?; - let mut cache = runtime_spine_cache(store_path.as_ref())?; - cache.pull_all_backing_stores()?; - require_identity(&cache)?; - require_runtime_identity_not_archived(&cache, "session", &options.session_id)?; - if cache - .get::(&options.session_id)? - .is_some() - { - return Err(anyhow!( - "runtime session {:?} already exists", - options.session_id - )); - } - let session = EpiphanyRuntimeSession { - session_id: options.session_id.clone(), - objective: options.objective, - status: EpiphanyRuntimeSessionStatus::Active, - created_at: options.created_at.clone(), - updated_at: options.created_at, - coordinator_note: options.coordinator_note, - }; - cache.put(&options.session_id, &session)?; - Ok(session) -} - pub fn close_runtime_session( store_path: impl AsRef, options: RuntimeSpineSessionClosureOptions, @@ -1245,45 +1213,6 @@ pub fn model_pass_failure_for_request( Ok(Some(failure)) } -pub fn create_runtime_job( - store_path: impl AsRef, - options: RuntimeSpineJobOptions, -) -> Result { - validate_non_empty(&options.job_id, "job id")?; - validate_non_empty(&options.session_id, "session id")?; - validate_non_empty(&options.role, "role")?; - validate_non_empty(&options.created_at, "created at")?; - let mut cache = runtime_spine_cache(store_path.as_ref())?; - cache.pull_all_backing_stores()?; - require_identity(&cache)?; - require_runtime_identity_not_archived(&cache, "job", &options.job_id)?; - let session = cache - .get::(&options.session_id)? - .ok_or_else(|| anyhow!("runtime session {:?} does not exist", options.session_id))?; - if matches!( - session.status, - EpiphanyRuntimeSessionStatus::Completed | EpiphanyRuntimeSessionStatus::Archived - ) { - return Err(anyhow!( - "runtime session {:?} is not open for jobs", - options.session_id - )); - } - if cache.get::(&options.job_id)?.is_some() { - return Err(anyhow!("runtime job {:?} already exists", options.job_id)); - } - let job = EpiphanyRuntimeJob { - job_id: options.job_id.clone(), - session_id: options.session_id.clone(), - role: options.role, - status: EpiphanyRuntimeJobStatus::Queued, - created_at: options.created_at.clone(), - updated_at: options.created_at.clone(), - }; - cache.put(&options.job_id, &job)?; - Ok(job) -} - pub fn open_runtime_model_execution( store_path: impl AsRef, session_options: RuntimeSpineSessionOptions, diff --git a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs index 768e68ff..b42a6faf 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs @@ -819,15 +819,6 @@ mod tests { created_at: options.created_at.clone(), }, )?; - epiphany_core::create_runtime_session( - store, - epiphany_core::RuntimeSpineSessionOptions { - session_id: options.session_id.clone(), - objective: options.objective.clone(), - created_at: options.created_at.clone(), - coordinator_note: options.coordinator_note.clone(), - }, - )?; let mut cache = epiphany_core::runtime_spine_cache(store)?; cache.pull_all_backing_stores()?; let prepared = epiphany_core::prepare_runtime_spine_heartbeat_job(&cache, options)?; diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index 05077fa6..ebef4818 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -2350,15 +2350,6 @@ mod tests { created_at: options.created_at.clone(), }, )?; - epiphany_core::create_runtime_session( - store, - epiphany_core::RuntimeSpineSessionOptions { - session_id: options.session_id.clone(), - objective: options.objective.clone(), - created_at: options.created_at.clone(), - coordinator_note: options.coordinator_note.clone(), - }, - )?; let mut cache = epiphany_core::runtime_spine_cache(store)?; cache.pull_all_backing_stores()?; let prepared = epiphany_core::prepare_runtime_spine_heartbeat_job(&cache, options)?; diff --git a/epiphany-tool-mcp-runtime/src/main.rs b/epiphany-tool-mcp-runtime/src/main.rs index dc2ea72f..729f377d 100644 --- a/epiphany-tool-mcp-runtime/src/main.rs +++ b/epiphany-tool-mcp-runtime/src/main.rs @@ -218,6 +218,35 @@ mod tests { use epiphany_tool_adapter::EPIPHANY_TOOL_RUNTIME_ADAPTER_ID; use epiphany_tool_adapter::tool_invocation_receipt_key; + fn seed_test_tool_job(store: &Path, session_id: &str, job_id: &str) -> Result<()> { + let created_at = "2026-08-10T01:00:01Z"; + let mut cache = epiphany_core::runtime_spine_cache(store)?; + cache.pull_all_backing_stores()?; + cache.put( + session_id, + &epiphany_core::EpiphanyRuntimeSession { + session_id: session_id.into(), + objective: "Exercise the native tool boundary.".into(), + status: epiphany_core::EpiphanyRuntimeSessionStatus::Active, + created_at: created_at.into(), + updated_at: created_at.into(), + coordinator_note: "test fixture".into(), + }, + )?; + cache.put( + job_id, + &epiphany_core::EpiphanyRuntimeJob { + job_id: job_id.into(), + session_id: session_id.into(), + role: "tool-runtime".into(), + status: epiphany_core::EpiphanyRuntimeJobStatus::Queued, + created_at: created_at.into(), + updated_at: created_at.into(), + }, + )?; + Ok(()) + } + #[test] fn parses_production_cli_without_legacy_codex_flags() -> Result<()> { let options = parse_cli(vec![ @@ -269,24 +298,7 @@ mod tests { "prove provider-independent native tools", "now", ); - epiphany_core::create_runtime_session( - &store, - epiphany_core::RuntimeSpineSessionOptions { - session_id: "native-tool-session".into(), - objective: "Prove owned native tool execution.".into(), - created_at: "2026-08-10T01:00:01Z".into(), - coordinator_note: "test".into(), - }, - )?; - epiphany_core::create_runtime_job( - &store, - epiphany_core::RuntimeSpineJobOptions { - job_id: "native-tool-job".into(), - session_id: "native-tool-session".into(), - role: "tool-runtime".into(), - created_at: "2026-08-10T01:00:02Z".into(), - }, - )?; + seed_test_tool_job(&store, "native-tool-session", "native-tool-job")?; epiphany_core::put_runtime_tool_execution_intent( &store, "native-tool-session", @@ -354,24 +366,7 @@ mod tests { "prove grant-owned state observation", "now", ); - epiphany_core::create_runtime_session( - &runtime_store, - epiphany_core::RuntimeSpineSessionOptions { - session_id: "state-tool-session".into(), - objective: "Observe resident state.".into(), - created_at: "2026-08-11T00:00:00Z".into(), - coordinator_note: "test".into(), - }, - )?; - epiphany_core::create_runtime_job( - &runtime_store, - epiphany_core::RuntimeSpineJobOptions { - job_id: "state-tool-job".into(), - session_id: "state-tool-session".into(), - role: "tool-runtime".into(), - created_at: "2026-08-11T00:00:01Z".into(), - }, - )?; + seed_test_tool_job(&runtime_store, "state-tool-session", "state-tool-job")?; epiphany_core::put_runtime_tool_execution_intent( &runtime_store, "state-tool-session", From 2ead42ed4259c76fa354a4e34a816349a73487b4 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 11:45:32 +0200 Subject: [PATCH 068/340] Record owned runtime physiology --- notes/epiphany-current-algorithmic-map.md | 13 +++++----- notes/epiphany-fork-implementation-plan.md | 4 +++ notes/fresh-workspace-handoff.md | 27 +++++++++++++++------ state/ledgers.msgpack | Bin 715663 -> 716297 bytes state/map.yaml | 9 ++++--- 5 files changed, 35 insertions(+), 18 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index adbdf7ca..b421336b 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -432,13 +432,12 @@ decision-context identity. Sessions retain objective and coordinator note; jobs retain exact session, role, status, and time identity. Runtime writable state is v21 and the closed session/job catalog schemas are v1. -Standalone diagnostic session creation has one strict owner. Exact `cd2177e8` -deletes `ensure_runtime_session`, whose only consumers were test fixtures and -whose active-ID path returned a pre-existing session without comparing its -objective, creation time, or coordinator note. Those fixtures now use -`create_runtime_session`; an identity collision refuses instead of being -treated as a replay. Runtime schema remains v21 because the serialized shape is -unchanged. +Runtime physiology is created only by its real owners. Exact `cd2177e8` first +deleted `ensure_runtime_session`, whose only consumers were fixtures and whose +active-ID path returned a pre-existing session without comparing its payload. +Exact `fdefb889` later deletes the remaining generic session/job writers after +proving every caller was also a fixture. Family launch CAS, model-execution +opening, and coordinator opening now own creation. Runtime schema is unchanged. Current typed work has one assembler. Exact `0a97eef8` deletes the separate Body-only and unresolved-Body projectors, which reopened Body, RepoModel, and diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 487cb44c..f56b3e18 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -432,6 +432,10 @@ Cut in this order: live on the request. Runtime advances to v30. The full keyed lifecycle and old-store refusal pass; package cleanup removes 677.6 MiB. Atlas remains unchanged and unaccepted. + Exact `fdefb889` deletes the generic session/job writers after proving every + caller was a fixture. Family launch CAS, model execution, and coordinator + opening are the only runtime-physiology creation owners. The cut removes 96 + net maintained lines without a schema or Atlas change. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 2893b01c..4101dbb1 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `83611f9b` -Current pass: Eyes acceptance collapsed into exact Mind commits; Ox17 +Latest committed implementation cut: `fdefb889` +Current pass: test-only runtime writers deleted; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `83611f9b` is the current +production symlink body and is inactive. Exact `fdefb889` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,19 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `fdefb889` deletes public `create_runtime_session` and +`create_runtime_job` plus their exports. Every caller was a fixture. Production +session/job creation already belongs to family launch CAS, exact model-execution +opening, and coordinator opening. OpenAI fixtures now use the real family +preparation owner; native-tool tests seed only their prerequisite documents +inside the test module rather than buying arbitrary production writers. Tool +runtime passes 4/4, model runtime passes 8/8, the changed OpenAI request proof +passes 1/1, and all affected production targets check. The cut removes 96 net +maintained lines; `runtime_spine.rs` is 9,347 physical lines with 50 public +functions and 25 public structs. Verification generated 11.56 GiB across +17,633 files; cleanup restored the shared target to the single 1.78 MB state +inspector. No schema or Atlas path changed. + Exact `83611f9b` makes the atomic `Eyes.frontier_research` Mind commit the sole Research acceptance authority. The never-persisted source-lookup DTO and the duplicate evidence packet are gone. Eyes still authenticates the exact @@ -358,11 +371,11 @@ coordinator 5/5 passes. The cut removes 49 net maintained lines without a schema, target, test, or Atlas change. Live inter-swarm collaboration remains unproven. -Exact `cd2177e8` deletes the duplicate public `ensure_runtime_session` writer. +Exact `cd2177e8` deleted the duplicate public `ensure_runtime_session` writer. Only two model-runtime test fixtures called it, and an active ID collision made it return the existing session without comparing objective, creation time, or -coordinator note. The fixtures now use strict `create_runtime_session`, which -refuses identity collisions. Core checks, model-produced completion, and the +coordinator note. Exact `fdefb889` later deletes the remaining generic session +and job writers after proving they too had only fixture callers. Core checks, model-produced completion, and the packaged model runtime 11/11 pass. The cut removes 37 net maintained lines and leaves `runtime_spine.rs` at 9,730 lines with 53 public functions. Runtime stays at v21. Model Atlas is untouched and live inter-swarm collaboration remains @@ -1069,7 +1082,7 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action The Ox17 deployment lane is paused. Continue the registered-document and test- -liability audit from exact `83611f9b`; do not compile or deploy through Idunn +liability audit from exact `fdefb889`; do not compile or deploy through Idunn yet. Delete an abstraction with tests that merely animate it when it has no decision-bearing consumer. Preserve keyed Mind, sealed reasoning, direct Body- to-Modeling flow, family admission owners, Persona social state, provider diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index ee3178cffb0b7ee90bb7e60877132ed840724d85..fb7c31b601c5615de552d90d81d533e6dba1e5d3 100644 GIT binary patch delta 596 zcmZ9JKX21O7{;;rSImN7X;Ft)Vr){!iIY0rLPZe_?La3aR9()m>jV4Fy*oGQlz{Hv|y1p+Z3zCgbK0}Eq|I`9dYcpVai7@j-n{yfj`o;&@vcJh7g!?JTb>~6M$=Vw>E zpFci5a1I^k#p|j2X6ibmdcI1!M!HVALAps=BHj8tb-iDgci(+!x7xjCD{8jGy;grS z?7sc@b#>xCeKcm=LK0&#jG{ion4v`jMLEm_2d+}EYFBFBA$#t0?-|CV2>Aut(( zO;KpTaiO#|z!HlZ3ayTWJOGwuz-d5jV1ybW5o0?kHJWwUX1U0YA!DWFDQpd%H6T|+ z(!??H(o!O*0wvirW;t9b9Sg~<(u)nym@^@31W=O9C^s(o?CyfP#+;GQ3`Y|6gu?ff z%3%IL2>o!L{dXzyqXzJl$pegGmoNrTDD1FAW9tx=K;Q>|xLA@Pw{+~EaGoN6MSU_u zSzD#8LDdm8-0y*`*n96@b$;$GZ+F5CDAHpis3gdQq!S}yQ|Pu9f00l-^?S%?M}Z;Z roB=g3uo*LR!b)CxD|domz1xGw;-MdGG Date: Mon, 24 Aug 2026 12:05:34 +0200 Subject: [PATCH 069/340] Fold Persona delivery into social terminal --- epiphany-core/src/persona_conversation.rs | 100 +++--------------- epiphany-core/src/persona_social_state.rs | 49 +++++---- epiphany-core/src/runtime_spine.rs | 3 +- .../src/bin/epiphany-persona-service.rs | 2 +- 4 files changed, 44 insertions(+), 110 deletions(-) diff --git a/epiphany-core/src/persona_conversation.rs b/epiphany-core/src/persona_conversation.rs index 08a93780..105b2873 100644 --- a/epiphany-core/src/persona_conversation.rs +++ b/epiphany-core/src/persona_conversation.rs @@ -21,10 +21,8 @@ use crate::{ verify_persona_discord_delivery_receipt, }; -pub const PERSONA_DISCORD_DELIVERY_EVIDENCE_SCHEMA_VERSION: &str = - "epiphany.persona_discord_delivery_evidence.v0"; pub const PERSONA_CONVERSATION_EXECUTION_RECEIPT_SCHEMA_VERSION: &str = - "epiphany.persona_conversation_execution_receipt.v1"; + "epiphany.persona_conversation_execution_receipt.v2"; pub const PERSONA_EFFECT_EXECUTION_INTENT_SCHEMA_VERSION: &str = "epiphany.persona_effect_execution_intent.v0"; pub const PERSONA_CONVERSATION_STORE_RETIREMENT_RECEIPT_SCHEMA_VERSION: &str = @@ -150,37 +148,7 @@ pub struct PersonaEffectExecutionIntent { #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache( - type = "epiphany.persona_discord_delivery_evidence.v0", - schema = "PersonaDiscordDeliveryEvidence" -)] -pub struct PersonaDiscordDeliveryEvidence { - #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] - pub evidence_id: String, - #[cultcache(key = 2)] - pub effect_document_id: String, - #[cultcache(key = 3)] - pub channel_id: String, - #[cultcache(key = 4, default)] - pub reply_to_message_id: Option, - #[cultcache(key = 5)] - pub message_id: String, - #[cultcache(key = 6)] - pub transport: String, - #[cultcache(key = 7)] - pub crossing_receipt_id: String, - #[cultcache(key = 8)] - pub receipt_url: String, - #[cultcache(key = 9)] - pub bridge_receipt_sha256: String, - #[cultcache(key = 10)] - pub private_state_exposed: bool, -} - -#[derive(Clone, Debug, PartialEq, DatabaseEntry)] -#[cultcache( - type = "epiphany.persona_conversation_execution_receipt.v1", + type = "epiphany.persona_conversation_execution_receipt.v2", schema = "PersonaConversationExecutionReceipt" )] pub struct PersonaConversationExecutionReceipt { @@ -198,8 +166,6 @@ pub struct PersonaConversationExecutionReceipt { pub state_effect_status: String, #[cultcache(key = 6, default)] pub state_effect_reasons: Vec, - #[cultcache(key = 7, default)] - pub delivery_evidence_ids: Vec, #[cultcache(key = 8)] pub social_terminal_receipt_id: Option, #[cultcache(key = 9)] @@ -289,7 +255,7 @@ pub fn poll_persona_discord_crossing( PersonaTurnTerminalOptions { request_id: request_id.into(), outcome: outcome.into(), - delivery_evidence: None, + delivery_receipt: None, blocked_evidence: None, }, )?; @@ -301,7 +267,6 @@ pub fn poll_persona_discord_crossing( outcome: outcome.into(), state_effect_status: state_status, state_effect_reasons: reasons, - delivery_evidence_ids: vec![], social_terminal_receipt_id: Some(terminal.receipt_id), private_state_exposed: false, model_terminal_receipt_id: Some(model_terminal.receipt_id.clone()), @@ -379,32 +344,12 @@ pub fn poll_persona_discord_crossing( ), _ => unreachable!(), }; - let evidence = (outcome == "delivered").then(|| PersonaDiscordDeliveryEvidence { - schema_version: PERSONA_DISCORD_DELIVERY_EVIDENCE_SCHEMA_VERSION.into(), - evidence_id: format!( - "persona-delivery:{}:{}", - effects.document_id, delivery.message_id - ), - effect_document_id: effects.document_id.clone(), - channel_id: delivery.channel_id.clone(), - reply_to_message_id: (!delivery.reply_to_message_id.is_empty()) - .then(|| delivery.reply_to_message_id.clone()), - message_id: delivery.message_id.clone(), - transport: delivery.transport.clone(), - crossing_receipt_id: delivery.crossing_receipt_id.clone(), - receipt_url: delivery.receipt_url.clone(), - bridge_receipt_sha256: signed_receipt_sha256, - private_state_exposed: false, - }); - if let Some(value) = &evidence { - put_runtime_document(runtime_store, &value.evidence_id, value)?; - } let terminal = complete_persona_social_turn( social_store, PersonaTurnTerminalOptions { request_id: request_id.into(), outcome: outcome.into(), - delivery_evidence: evidence.clone(), + delivery_receipt: (outcome == "delivered").then(|| delivery.clone()), blocked_evidence, }, )?; @@ -422,10 +367,6 @@ pub fn poll_persona_discord_crossing( outcome: outcome.into(), state_effect_status: "admitted_before_delivery_request".into(), state_effect_reasons: vec![], - delivery_evidence_ids: evidence - .iter() - .map(|value| value.evidence_id.clone()) - .collect(), social_terminal_receipt_id: Some(terminal.receipt_id), private_state_exposed: false, model_terminal_receipt_id: Some(model_terminal.receipt_id.clone()), @@ -448,7 +389,7 @@ fn terminalize_local_effect_quarantine( PersonaTurnTerminalOptions { request_id: request.request_id.clone(), outcome: "blocked".into(), - delivery_evidence: None, + delivery_receipt: None, blocked_evidence: Some(crate::PersonaTurnBlockedEvidence { evidence_source: "local_effect".into(), crossing_status: "unknown".into(), @@ -466,7 +407,6 @@ fn terminalize_local_effect_quarantine( outcome: "blocked".into(), state_effect_status: "quarantined_ambiguous_local_effect".into(), state_effect_reasons: vec![error.to_string()], - delivery_evidence_ids: vec![], social_terminal_receipt_id: Some(terminal.receipt_id), private_state_exposed: false, model_terminal_receipt_id: Some(model_terminal.receipt_id), @@ -519,7 +459,6 @@ pub fn reconcile_terminal_persona_conversation( outcome: terminal.outcome.clone(), state_effect_status: "reconciled_from_social_terminal".into(), state_effect_reasons: vec![], - delivery_evidence_ids: terminal.delivery_evidence_id.clone().into_iter().collect(), social_terminal_receipt_id: Some(terminal.receipt_id.clone()), private_state_exposed: false, model_terminal_receipt_id: Some(model_terminal.receipt_id), @@ -756,22 +695,6 @@ fn build_persona_retention_member( } runtime_ids.push((::TYPE, id)); } - if let Some(evidence_id) = &terminal.delivery_evidence_id { - let Some(evidence) = - runtime_document::(runtime_store, evidence_id)? - else { - return Ok(None); - }; - if conversation.delivery_evidence_ids != [evidence_id.clone()] - || evidence.private_state_exposed - { - return Err(anyhow!("Persona retained delivery evidence is invalid")); - } - } else if terminal.outcome == "delivered" || !conversation.delivery_evidence_ids.is_empty() { - return Err(anyhow!( - "delivered Persona retention candidate lacks evidence" - )); - } let mut runtime_cache = runtime_spine_cache(runtime_store)?; runtime_cache.pull_all_backing_stores()?; let runtime_snapshot = runtime_cache.snapshot_envelopes(); @@ -801,7 +724,16 @@ fn build_persona_retention_member( &crossing_request, receipt_anchor, )?; - if crossing_receipt.status != "completed" { + let receipt_sha256 = format!( + "sha256:{:x}", + Sha256::digest(rmp_serde::to_vec(&crossing_receipt)?) + ); + if crossing_receipt.status != "completed" + || terminal.delivery_message_id.as_deref() != Some(crossing_receipt.message_id.as_str()) + || terminal.crossing_receipt_id.as_deref() + != Some(crossing_receipt.crossing_receipt_id.as_str()) + || terminal.bridge_receipt_sha256.as_deref() != Some(receipt_sha256.as_str()) + { return Ok(None); } // The signed request and consequence receipt remain durable audit @@ -1528,7 +1460,6 @@ mod tests { outcome: "dropped".into(), state_effect_status: "none".into(), state_effect_reasons: vec![], - delivery_evidence_ids: vec![], social_terminal_receipt_id: Some(terminal.receipt_id), private_state_exposed: false, model_terminal_receipt_id: Some(format!("persona-terminal:{request_id}")), @@ -1896,7 +1827,6 @@ mod tests { outcome: "dropped".into(), state_effect_status: "none".into(), state_effect_reasons: vec![], - delivery_evidence_ids: vec![], social_terminal_receipt_id: Some("retry:terminal".into()), private_state_exposed: false, model_terminal_receipt_id: Some("persona-terminal:retry".into()), diff --git a/epiphany-core/src/persona_social_state.rs b/epiphany-core/src/persona_social_state.rs index b74106aa..29758733 100644 --- a/epiphany-core/src/persona_social_state.rs +++ b/epiphany-core/src/persona_social_state.rs @@ -10,7 +10,7 @@ use std::path::Path; pub const PERSONA_TURN_REQUEST_SCHEMA_VERSION: &str = "epiphany.persona_turn_request.v1"; pub const PERSONA_TURN_TERMINAL_RECEIPT_SCHEMA_VERSION: &str = - "epiphany.persona_turn_terminal_receipt.v1"; + "epiphany.persona_turn_terminal_receipt.v2"; pub const PERSONA_CONVERSATION_RETENTION_HEAD_SCHEMA_VERSION: &str = "epiphany.persona_conversation_retention_head.v1"; pub const PERSONA_CONVERSATION_RETENTION_PLAN_SCHEMA_VERSION: &str = @@ -72,7 +72,7 @@ pub struct PersonaTurnTerminalReceipt { pub mention_ids: Vec, pub mention_cargo_sha256: String, #[serde(default)] - pub delivery_evidence_id: Option, + pub delivery_message_id: Option, #[serde(default)] pub crossing_receipt_id: Option, #[serde(default)] @@ -89,7 +89,7 @@ pub struct PersonaTurnTerminalReceipt { pub struct PersonaTurnTerminalOptions { pub request_id: String, pub outcome: String, - pub delivery_evidence: Option, + pub delivery_receipt: Option, pub blocked_evidence: Option, } @@ -147,7 +147,7 @@ pub struct PersonaTurnBlockedEvidence { pub const PERSONA_SOCIAL_MENTION_TYPE: &str = "epiphany.persona.social_mention.v2"; pub const PERSONA_SOCIAL_TURN_REQUEST_TYPE: &str = "epiphany.persona.turn_request.v1"; -pub const PERSONA_SOCIAL_TURN_TERMINAL_TYPE: &str = "epiphany.persona.turn_terminal.v1"; +pub const PERSONA_SOCIAL_TURN_TERMINAL_TYPE: &str = "epiphany.persona.turn_terminal.v2"; pub const PERSONA_SOCIAL_RETENTION_HEAD_TYPE: &str = "epiphany.persona.retention_head.v1"; pub const PERSONA_SOCIAL_RETENTION_PLAN_TYPE: &str = "epiphany.persona.retention_plan.v1"; pub const PERSONA_SOCIAL_RETENTION_HEAD_KEY: &str = "persona"; @@ -198,7 +198,7 @@ pub struct PersonaSocialTurnRequestDocument { #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache( - type = "epiphany.persona.turn_terminal.v1", + type = "epiphany.persona.turn_terminal.v2", schema = "PersonaSocialTurnTerminalDocument" )] pub struct PersonaSocialTurnTerminalDocument { @@ -494,30 +494,33 @@ pub fn complete_persona_social_turn( existing.outcome )); } - let delivery_evidence = options.delivery_evidence.as_ref(); + let delivery_receipt = options.delivery_receipt.as_ref(); let blocked_evidence = options.blocked_evidence.as_ref(); if options.outcome == "delivered" { - let evidence = delivery_evidence.ok_or_else(|| { - anyhow!("delivered Persona turn requires typed Discord delivery evidence") + let receipt = delivery_receipt.ok_or_else(|| { + anyhow!("delivered Persona turn requires a typed Discord delivery receipt") })?; - if evidence.schema_version != crate::PERSONA_DISCORD_DELIVERY_EVIDENCE_SCHEMA_VERSION - || evidence.private_state_exposed - || evidence.evidence_id.trim().is_empty() - || evidence.message_id.trim().is_empty() - || evidence.crossing_receipt_id.trim().is_empty() - || evidence.bridge_receipt_sha256.trim().is_empty() + if receipt.schema_version != crate::PERSONA_DISCORD_DELIVERY_RECEIPT_SCHEMA_VERSION + || receipt.status != "completed" + || receipt.private_state_exposed + || receipt.receipt_id != receipt.request_id + || !receipt + .request_id + .starts_with(&format!("persona-discord:{}:", request.request_id)) + || receipt.message_id.trim().is_empty() + || receipt.crossing_receipt_id.trim().is_empty() || !request .mentions .iter() - .any(|mention| mention.channel_id == evidence.channel_id) + .any(|mention| mention.channel_id == receipt.channel_id) { return Err(anyhow!( - "Discord delivery evidence is not bound to the Persona turn" + "Discord delivery receipt is not bound to the Persona turn" )); } - } else if delivery_evidence.is_some() { + } else if delivery_receipt.is_some() { return Err(anyhow!( - "non-delivered Persona terminal outcome must not carry delivery evidence" + "non-delivered Persona terminal outcome must not carry a delivery receipt" )); } if options.outcome == "blocked" { @@ -568,10 +571,12 @@ pub fn complete_persona_social_turn( "sha256-{:x}", sha2::Sha256::digest(rmp_serde::to_vec(&request.mentions)?) ), - delivery_evidence_id: delivery_evidence.map(|evidence| evidence.evidence_id.clone()), - crossing_receipt_id: delivery_evidence.map(|evidence| evidence.crossing_receipt_id.clone()), - bridge_receipt_sha256: delivery_evidence - .map(|evidence| evidence.bridge_receipt_sha256.clone()), + delivery_message_id: delivery_receipt.map(|receipt| receipt.message_id.clone()), + crossing_receipt_id: delivery_receipt.map(|receipt| receipt.crossing_receipt_id.clone()), + bridge_receipt_sha256: delivery_receipt + .map(rmp_serde::to_vec) + .transpose()? + .map(|bytes| format!("sha256:{:x}", sha2::Sha256::digest(bytes))), blocked_crossing_status: blocked_evidence.map(|evidence| evidence.crossing_status.clone()), blocked_reason: blocked_evidence.map(|evidence| evidence.reason.clone()), completed_at: now_iso(), diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index 29a238be..d5becd9c 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -55,7 +55,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v35"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v36"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache(type = "epiphany.runtime.identity", schema = "EpiphanyRuntimeIdentity")] @@ -793,7 +793,6 @@ fn runtime_spine_schema_cache() -> Result { cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; - cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; diff --git a/epiphany-openai-runtime/src/bin/epiphany-persona-service.rs b/epiphany-openai-runtime/src/bin/epiphany-persona-service.rs index 5250ee2a..86670866 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-persona-service.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-persona-service.rs @@ -113,7 +113,7 @@ async fn poll_once(options: &Options) -> Result { PersonaTurnTerminalOptions { request_id: request.request_id, outcome: "failed".into(), - delivery_evidence: None, + delivery_receipt: None, blocked_evidence: None, }, )?; From 4d6dd54c41575e24eae849258e1e9fb883f3da59 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 12:07:42 +0200 Subject: [PATCH 070/340] Record singular Persona delivery authority --- notes/epiphany-current-algorithmic-map.md | 9 +++++++++ notes/epiphany-fork-implementation-plan.md | 7 +++++++ notes/fresh-workspace-handoff.md | 21 ++++++++++++++++++--- state/ledgers.msgpack | Bin 716297 -> 716913 bytes state/map.yaml | 9 +++++---- 5 files changed, 39 insertions(+), 7 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index b421336b..a5213bd8 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1026,6 +1026,15 @@ the mention pending with the terminal receipt bound into its next deterministic request identity. Resident Self cannot launch, block, or terminalize Persona work. +Delivered speech has one local consequence owner. Exact `b3e9b229` deletes the +standalone Persona delivery-evidence document and the conversation receipt's +copied evidence-ID vector. Bifrost keeps the durable signed crossing request and +receipt; the Persona social terminal folds that exact receipt into message ID, +crossing receipt ID, and digest. Retention reloads and verifies the provider- +owned pair and matches it against the terminal. Runtime is v36; the terminal +and conversation execution schemas are v2. This is not an Atlas proof: live +inter-swarm collaboration remains unrun. + ## RepoModel projection RepoModel persistence is keyed by semantic identity: identity/body binding, diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index f56b3e18..1ee421a9 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -436,6 +436,13 @@ Cut in this order: caller was a fixture. Family launch CAS, model execution, and coordinator opening are the only runtime-physiology creation owners. The cut removes 96 net maintained lines without a schema or Atlas change. + Exact `b3e9b229` deletes Persona's standalone delivery-evidence document and + the conversation receipt's copied evidence-ID vector. Bifrost owns the + durable signed crossing receipt; the Persona social terminal owns the local + delivered consequence and folds the exact message, crossing, and digest + identities into one receipt. Retention verifies that provider-owned receipt + directly. Runtime advances to v36 and both changed Persona documents make a + v2 hard cut. Atlas remains untouched and operationally unaccepted. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 4101dbb1..a1d816db 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,8 +2,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `fdefb889` -Current pass: test-only runtime writers deleted; Ox17 +Latest committed implementation cut: `b3e9b229` +Current pass: duplicate Persona delivery evidence deleted; Ox17 remains paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `fdefb889` is the current +production symlink body and is inactive. Exact `b3e9b229` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,21 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `b3e9b229` makes the Persona social terminal the sole local owner of a +delivered speech consequence. The already-verified signed Bifrost receipt is +folded directly into its message ID, crossing receipt ID, and exact receipt +digest. The standalone `PersonaDiscordDeliveryEvidence` document, runtime +registration/write/read path, and conversation receipt's copied evidence-ID +vector are deleted. Retention reloads and cryptographically verifies the +durable Bifrost request/receipt pair and matches that exact consequence against +the terminal. Runtime advances to v36; social terminal and conversation +execution advance to v2 with no compatibility reader. Core compiles, Persona +consequence/retention passes 5/5, and the release-owned Persona service +compiles. The cut removes 66 net maintained lines. Verification generated 3.1 +GiB across 7,791 files; cleanup restored the one 1.78 MB state inspector. Atlas +is untouched. No live inter-swarm collaboration has run; component tests do not +claim otherwise. + Exact `fdefb889` deletes public `create_runtime_session` and `create_runtime_job` plus their exports. Every caller was a fixture. Production session/job creation already belongs to family launch CAS, exact model-execution diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index fb7c31b601c5615de552d90d81d533e6dba1e5d3..7132810690aea1f8c988cc29e9f62cf6b523f359 100644 GIT binary patch delta 625 zcmYLGJ#SMn6y>E2lqbQ4!~oKj7@LnKp@cM3t5m29st{seKyvK+(yRK}iS75&P8m8N zCZ;HVqf&>8KfoVgWnixa;s+pc{o2BCWLfq-=iGBXec$~3WApq`^02eDv(?|}K7ar9 zPWtQh#j|9VBp=R}wU5hM!ieV@W1UfF+-2NjY%uO$E^BGHT7AAsAJi+J)$DNN$)fgh z|3t_D;~oyi-R=MsY7D3#93l81j1t-!ghO=R8Zja-ty3e^RH8fGFG-=12+GPLM-zYt zKw86(UIelR@a9YNU<4(~U|kE|Ms6!f=mi9HIT@kB*g0fYD_=~j$mENP{aSMB zZ1n1yb{>@+&I%rB-zrT7vGq3vPv;0_??vM_lz%(4@dRa2v6tN;=im_J5z6ELU$@)a zjVdI^ISXIMsJ8m^C4IU;)q;1`y7D?Y;R0n`j)z{W1FvYW-EZ^<9mq(dhdD-eCW&Up yLLLJr5nGFOadQDV96!B@d^c#}fz8{39jPJ20%Ll-ub&H-!|La^^zphYOzST^F5OfB delta 73 zcmezPK)dsf_6AYL>2qFlaj-=lW8ix8Y_l?BAtPgK^HiqxsZ5MO45FEVm<5PgftU@5 R*@2h?h&i`UW#TG%4FK*%88`p{ diff --git a/state/map.yaml b/state/map.yaml index d3b0815b..0b131640 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -52,7 +52,7 @@ current_status: summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v35. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v36. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. fixed_routing_and_retention_cargo_cut: Exact ffd91c20 deletes EyesEvidencePacket.source_role_id, PersonaSocialMention.target_agent_id, and ResidentSelfRetentionHead.retained_at_millis. Each producer supplied one fixed or non-causal value and no consumer read it; the request/context, Persona queue plus turn request, and retention chain remain the real owners. Eyes packet v2, Persona mention v2, Resident Self state v3/retention head v1, and runtime v27 form a hard cut. Core and the three consuming release entrypoints compile; consequential Persona, Research, and epoch-refusal proofs pass. The maintained source delta is 6 net deletions. Atlas is untouched; no live inter-swarm collaboration has run. provider_stream_authority_cut: Exact fe118e13 makes OpenAI/OpenRouter events and receipts transient transport values. The runtime immediately normalizes them into the single persisted native model event/receipt family used by tool continuation, assistant reconstruction, terminal validation, and bounded retention. Duplicate provider writes, registrations, archive requirements, schema IDs, two public schemas/index rows, and the include-only model-runtime shell are gone; the exact provider request remains durable. Runtime advances to v28 and the catalog drops to 18 schemas. The cut removes 270 net maintained lines. Adapter 1/1, provider spine 14/14, reasoning context 8/8, runtime 23/23, model entrypoint 11/11, swarm 4/4, epoch refusal 1/1, and release construction 15/15 pass. Atlas is untouched; live inter-swarm collaboration remains unproven. cultnet_catalog_authority_cut: Exact dbed11b3 and 8bb0719b delete the hand-maintained JSON shadow registry. The nonexistent runtime-event contract and obsolete public archived-session tombstone schema disappear first. Runtime-local identity, session, job, binding, coordinator, native model/tool, and state-ledger schemas then disappear because no live CultNet provider carries them and several contradicted their Rust owners. Typed CultCache registration and owner-projected CultMesh state remain authoritative. The catalog has exactly three earned boundaries: the exact OpenAI-compatible provider request, gamecult.persona_state.v0, and epiphany.work_organ_state.v0. Parse/path/unindexed/forbidden-contract checks pass at 3/3/0/0/0. The cuts remove 850 net maintained lines. Atlas is untouched; live inter-swarm collaboration remains unproven. @@ -108,6 +108,7 @@ current_status: soul_contract_cut: Exact f8974d52 deletes five prose-only Soul mutation contracts/constants: generic verification request, invariant check, regression receipt, review receipt, and verification refusal. None had a typed document, schema, store, writer, reader, or test. The keyed RepoFrontierVerificationRequest and persisted SoulVerdictReceipt remain the actual request/result path. Core/release checks and focused verification 3/3 pass. eyes_contract_cut: Exact 201fa192 deletes three prose-only Eyes mutation contracts/constants/exports: generic evidence request, evidence review, and evidence refusal. Exact 83611f9b completes the cut by deleting the never-persisted EyesSourceLookupReceipt DTO and the duplicate EyesEvidencePacket. The real grant/tool chain is authenticated in place; the structured Research decision becomes keyed Mind evidence/observation writes under one validated atomic commit. Core check, full keyed Research lifecycle, replay, conflict, re-entry, and old-epoch refusal pass. Runtime advances to v35; the cut removes 205 net maintained lines. Atlas is untouched and remains operationally unaccepted. test_only_runtime_writer_cut: Exact fdefb889 deletes public create_runtime_session and create_runtime_job plus their exports. Every caller was a fixture; production session/job creation already belongs to family launch CAS, open_runtime_model_execution, and open_coordinator_run. OpenAI launch fixtures now use the real family preparation owner. Native-tool tests seed only their prerequisite documents locally rather than purchasing arbitrary production writers. Tool runtime 4/4, model runtime 8/8, OpenAI verification-request 1/1, and all affected production checks pass. The cut removes 96 net maintained lines; runtime_spine.rs is 9,347 physical lines with 50 public functions and 25 public structs. Verification generated 11.56 GiB across 17,633 files; cleanup restored the single 1.78 MB state inspector. No schema or Atlas path changed. + persona_delivery_evidence_cut: Exact b3e9b229 makes the Persona social terminal the sole local owner of delivered-speech consequence identity. It folds the already-verified signed Bifrost receipt into message ID, crossing receipt ID, and exact receipt digest. The standalone PersonaDiscordDeliveryEvidence document, runtime registration/write/read path, and conversation receipt evidence-ID vector are gone. Retention reloads and cryptographically verifies the durable provider-owned request/receipt pair, then matches that exact consequence against the social terminal. Runtime advances to v36; social terminal and conversation execution advance to v2 with no compatibility reader. Core compiles, Persona consequence/retention passes 5/5, and the release-owned Persona service compiles. The cut removes 66 net maintained lines; verification generated 3.1 GiB across 7,791 files and cleanup restored the single 1.78 MB state inspector. Atlas is untouched; no live inter-swarm collaboration has run. persona_social_cut: Pending mentions, immutable requests, terminal receipts, quarantine records, retention heads, and retention plans are separate keyed CultCache documents. Persona derives its own deterministic work identity, reserves and terminalizes through exact batch CAS, cites the exact request envelope as pass-input provenance, and retries failed mentions without a timestamp or global revision. No scheduler can launch, block, retain, or provide pass provenance for Persona work. Exact 3dda58a5 makes Resident Self the sole authenticated Bifrost-feedback polling/import owner and deletes the standalone ingress CLI, its static projections, its old Starfire snapshot replacement seam, and two command-only tests: 426 net deletions. Seven retained tests prove signed admission, target/provider substitution refusal, disclosure gating, recovery, and read-only provider-store import. operational_state: local_worktree: source_subtraction_commits_landed_ox17_and_deployment_paused @@ -150,10 +151,10 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,347 physical lines, 50 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs carry only lifecycle identity/status; terminal result documents own summaries and artifacts. Generic session/job creation is gone; real family launch, model execution, and coordinator owners create runtime physiology. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, coordinator artifact/status cargo, uninhabited aggregate state-model DTO families, public registered-type catalog, duplicate Eyes acceptance documents, and test-only arbitrary runtime writers are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Resume the registered-document and test-liability audit after exact fdefb889. Delete only complete dead authority slices and tests with no consequential claim. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, Persona consequences, exact native/provider requests, governed tool receipts, and the complete unrun Model Atlas vertical slice. Component tests are not collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,346 physical lines, 50 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs carry only lifecycle identity/status; terminal result documents own summaries and artifacts. Generic session/job creation is gone; real family launch, model execution, and coordinator owners create runtime physiology. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, coordinator artifact/status cargo, uninhabited aggregate state-model DTO families, public registered-type catalog, duplicate Eyes acceptance documents, test-only arbitrary runtime writers, and duplicate Persona delivery evidence are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Continue the registered-document and test-liability audit after exact b3e9b229. Delete only complete dead authority slices and tests with no consequential claim. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, Persona consequences, exact native/provider requests, governed tool receipts, and the complete unrun Model Atlas vertical slice. Component tests are not collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v35. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Family launch CAS, model execution, and coordinator opening are the only session/job creation owners. The spine is 9,347 physical lines with 50 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v36. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator opening are the only session/job creation owners. The spine is 9,346 physical lines with 50 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. From ce6bff1239d6554a192e5c58eb16077c44a67fe8 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 12:49:30 +0200 Subject: [PATCH 071/340] Collapse runtime execution bindings to ownership edges --- epiphany-core/src/current_work.rs | 4 - epiphany-core/src/reasoning_context.rs | 30 +-- epiphany-core/src/reorientation_work.rs | 2 - epiphany-core/src/runtime_spine.rs | 200 +++++++----------- .../src/bin/epiphany-openai-runtime.rs | 2 - epiphany-openai-runtime/src/lib.rs | 14 +- .../src/persona_executor.rs | 1 - epiphany-tool-mcp-runtime/src/main.rs | 2 - 8 files changed, 94 insertions(+), 161 deletions(-) diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index 341e75fb..ee4f9c46 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -3744,7 +3744,6 @@ mod tests { created_at: "2026-08-17T00:00:02.100Z".into(), }, &failed_native, - "2026-08-17T00:00:02.100Z", )?; let failed_process = crate::ProcessInstanceIdentity { process_id: u32::MAX, @@ -4761,7 +4760,6 @@ mod tests { created_at: "2026-08-17T00:00:14.750Z".into(), }, &verification_native, - "2026-08-17T00:00:14.750Z", )?; let verification_context = crate::EpiphanyDecisionContext::new( &verification_basis, @@ -5443,7 +5441,6 @@ mod tests { created_at: "2026-08-17T00:00:21.750Z".into(), }, &planning_native, - "2026-08-17T00:00:21.750Z", )?; let planning_context = crate::EpiphanyDecisionContext::new(&planning_basis, planning_native, Vec::new())?; @@ -5581,7 +5578,6 @@ mod tests { created_at: "2026-08-17T00:00:22.250Z".into(), }, &mind_native, - "2026-08-17T00:00:22.250Z", )?; let mind_context = crate::EpiphanyDecisionContext::new(&mind_basis, mind_native, Vec::new())?; diff --git a/epiphany-core/src/reasoning_context.rs b/epiphany-core/src/reasoning_context.rs index 5e5fa002..4078bbfe 100644 --- a/epiphany-core/src/reasoning_context.rs +++ b/epiphany-core/src/reasoning_context.rs @@ -1373,9 +1373,7 @@ fn validate_context_store_ownership( } let model_binding = crate::runtime_spine::validate_runtime_model_execution_binding(cache, &native.request_id)?; - if model_binding.reasoning_basis_id.as_deref() != Some(context.basis_id.as_str()) - || model_binding.source_worker_job_id != native.source_worker_job_id - { + if native.reasoning_basis_id.as_deref() != Some(context.basis_id.as_str()) { return Err(anyhow!( "decision context terminal request has foreign runtime ownership" )); @@ -1409,12 +1407,14 @@ fn validate_context_store_ownership( )); } if let Some(request_id) = intent.model_request_id.as_deref() { - let continuation = cache - .get::(request_id)? - .ok_or_else(|| anyhow!("decision tool continuation request is absent"))?; + let continuation = + crate::runtime_spine::validate_runtime_model_execution_binding(cache, request_id)?; + let continuation_request = cache + .get::(request_id)? + .ok_or_else(|| anyhow!("decision tool continuation native request is absent"))?; if continuation.session_id != model_binding.session_id - || continuation.source_worker_job_id != model_binding.source_worker_job_id - || continuation.reasoning_basis_id != model_binding.reasoning_basis_id + || continuation_request.source_worker_job_id != native.source_worker_job_id + || continuation_request.reasoning_basis_id != native.reasoning_basis_id || tool_binding.session_id != continuation.session_id || tool_binding.job_id != continuation.job_id { @@ -2256,7 +2256,6 @@ mod tests { created_at: "2026-08-17T00:00:01Z".into(), }, &initial_native, - "2026-08-17T00:00:01Z", )?; let intent = EpiphanyToolInvocationIntent::new( "intent-1", @@ -2269,13 +2268,7 @@ mod tests { "2026-08-17T00:00:02Z", ) .with_model_call("call-1", &initial_native.request_id); - crate::put_runtime_tool_execution_intent( - &store, - "session-1", - "model-job-1", - &intent, - "2026-08-17T00:00:02Z", - )?; + crate::put_runtime_tool_execution_intent(&store, "session-1", "model-job-1", &intent)?; let mut receipt = EpiphanyToolInvocationReceipt::new( "receipt-1", &intent.intent_id, @@ -2316,7 +2309,6 @@ mod tests { created_at: "2026-08-17T00:00:04Z".into(), }, &terminal_native, - "2026-08-17T00:00:04Z", )?; let context = seal_model_decision_context(&store, &terminal_native.request_id)?; @@ -2347,7 +2339,7 @@ mod tests { let mut hostile_binding = cache .get::(&intent.intent_id)? .expect("tool binding"); - hostile_binding.bound_at = "not-a-time".into(); + hostile_binding.session_id = "foreign-session".into(); cache.put(&intent.intent_id, &hostile_binding)?; let before = SingleFileMessagePackBackingStore::new(&store).pull_all()?; assert!(seal_model_decision_context(&store, &terminal_native.request_id).is_err()); @@ -2391,7 +2383,6 @@ mod tests { created_at: "2026-08-18T00:00:01Z".into(), }, &native, - "2026-08-18T00:00:01Z", )?; let context = seal_model_decision_context(&store, &native.request_id)?; let options = crate::ModelPassFailureTerminalOptions { @@ -2627,7 +2618,6 @@ mod tests { created_at: "2026-08-14T00:00:01Z".into(), }, &native, - "2026-08-14T00:00:01Z", )?; let context = put_decision_context( &store, diff --git a/epiphany-core/src/reorientation_work.rs b/epiphany-core/src/reorientation_work.rs index 73790667..09fa74e2 100644 --- a/epiphany-core/src/reorientation_work.rs +++ b/epiphany-core/src/reorientation_work.rs @@ -999,7 +999,6 @@ mod tests { created_at: "2026-08-18T10:00:03Z".into(), }, &native, - "2026-08-18T10:00:03Z", )?; let context = crate::EpiphanyDecisionContext::new(&basis, native, Vec::new())?; crate::put_decision_context(&store, &context)?; @@ -1130,7 +1129,6 @@ mod tests { created_at: "2026-08-18T10:00:10Z".into(), }, &failed_native, - "2026-08-18T10:00:10Z", )?; let failed_context = crate::EpiphanyDecisionContext::new(&failed_basis, failed_native, Vec::new())?; diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index d5becd9c..34737881 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -55,7 +55,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v36"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v37"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache(type = "epiphany.runtime.identity", schema = "EpiphanyRuntimeIdentity")] @@ -135,21 +135,11 @@ pub struct EpiphanyRuntimeJob { )] pub struct EpiphanyRuntimeModelExecutionBinding { #[cultcache(key = 1)] - pub binding_id: String, - #[cultcache(key = 2)] pub request_id: String, - #[cultcache(key = 3)] + #[cultcache(key = 2)] pub session_id: String, - #[cultcache(key = 4)] + #[cultcache(key = 3)] pub job_id: String, - #[cultcache(key = 5)] - pub provider: String, - #[cultcache(key = 6)] - pub bound_at: String, - #[cultcache(key = 7, default)] - pub source_worker_job_id: Option, - #[cultcache(key = 8, default)] - pub reasoning_basis_id: Option, } #[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] @@ -159,17 +149,11 @@ pub struct EpiphanyRuntimeModelExecutionBinding { )] pub struct EpiphanyRuntimeToolExecutionBinding { #[cultcache(key = 1)] - pub binding_id: String, - #[cultcache(key = 2)] pub intent_id: String, - #[cultcache(key = 3)] + #[cultcache(key = 2)] pub session_id: String, - #[cultcache(key = 4)] + #[cultcache(key = 3)] pub job_id: String, - #[cultcache(key = 5, default)] - pub model_request_id: Option, - #[cultcache(key = 6)] - pub bound_at: String, } #[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] @@ -1217,7 +1201,6 @@ pub fn open_runtime_model_execution( session_options: RuntimeSpineSessionOptions, job_options: RuntimeSpineJobOptions, model_request: &EpiphanyModelRequest, - bound_at: &str, ) -> Result { validate_non_empty(&session_options.session_id, "model execution session id")?; validate_non_empty(&session_options.objective, "model execution objective")?; @@ -1235,9 +1218,6 @@ pub fn open_runtime_model_execution( } validate_non_empty(&model_request.request_id, "model execution request id")?; validate_non_empty(&model_request.provider, "model execution provider")?; - validate_non_empty(bound_at, "model execution binding time")?; - chrono::DateTime::parse_from_rfc3339(bound_at) - .map_err(|error| anyhow!("model execution binding time is invalid: {error}"))?; let provider_request = epiphany_openai_adapter::request_from_native(model_request); let store_path = store_path.as_ref(); @@ -1357,14 +1337,9 @@ pub fn open_runtime_model_execution( )); } let binding = EpiphanyRuntimeModelExecutionBinding { - binding_id: binding_id.clone(), request_id: model_request.request_id.clone(), session_id: session.session_id.clone(), job_id: job.job_id.clone(), - provider: model_request.provider.clone(), - bound_at: bound_at.to_string(), - source_worker_job_id: model_request.source_worker_job_id.clone(), - reasoning_basis_id: model_request.reasoning_basis_id.clone(), }; let identity_envelope = cache .get_envelope::(RUNTIME_IDENTITY_KEY)? @@ -1410,7 +1385,6 @@ pub fn put_runtime_tool_execution_intent( session_id: &str, job_id: &str, intent: &EpiphanyToolInvocationIntent, - bound_at: &str, ) -> Result { validate_non_empty(session_id, "tool execution session id")?; validate_non_empty(job_id, "tool execution job id")?; @@ -1418,9 +1392,6 @@ pub fn put_runtime_tool_execution_intent( validate_non_empty(&intent.adapter, "tool execution adapter")?; validate_non_empty(&intent.server, "tool execution server")?; validate_non_empty(&intent.tool_name, "tool execution tool name")?; - chrono::DateTime::parse_from_rfc3339(bound_at) - .map_err(|error| anyhow!("tool execution binding time is invalid: {error}"))?; - let store_path = store_path.as_ref(); let mut cache = runtime_spine_cache(store_path)?; cache.pull_all_backing_stores()?; @@ -1500,24 +1471,12 @@ pub fn put_runtime_tool_execution_intent( intent.intent_id ) })?; - if model_binding.request_id != model_request_id - || model_binding.session_id != session_id - || model_binding.job_id != job_id - { + if model_binding.session_id != session_id || model_binding.job_id != job_id { return Err(anyhow!( "model-derived tool intent {:?} has foreign execution ownership", intent.intent_id )); } - let persisted_model_request = cache - .get::(model_request_id)? - .ok_or_else(|| anyhow!("model-derived tool intent lost its model request"))?; - if persisted_model_request.source_worker_job_id != model_binding.source_worker_job_id { - return Err(anyhow!( - "model-derived tool intent {:?} has substituted worker provenance", - intent.intent_id - )); - } for envelope in [ cache.get_envelope::(model_request_id)?, cache.get_envelope::(model_request_id)?, @@ -1534,14 +1493,11 @@ pub fn put_runtime_tool_execution_intent( } } let binding = EpiphanyRuntimeToolExecutionBinding { - binding_id: intent.intent_id.clone(), intent_id: intent.intent_id.clone(), session_id: session_id.to_string(), job_id: job_id.to_string(), - model_request_id: intent.model_request_id.clone(), - bound_at: bound_at.to_string(), }; - replacements.push(cache.prepare_entry(&binding.binding_id, &binding)?.0); + replacements.push(cache.prepare_entry(&binding.intent_id, &binding)?.0); replacements.push( cache .prepare_entry(&tool_invocation_intent_key(&intent.intent_id), intent)? @@ -1577,12 +1533,7 @@ pub(crate) fn validate_runtime_model_execution_binding( let job = cache .get::(&binding.job_id)? .ok_or_else(|| anyhow!("model execution binding {request_id:?} lost its job"))?; - if binding.binding_id != request_id - || binding.request_id != request_id - || binding.provider != native.provider - || binding.source_worker_job_id != native.source_worker_job_id - || binding.reasoning_basis_id != native.reasoning_basis_id - || chrono::DateTime::parse_from_rfc3339(&binding.bound_at).is_err() + if binding.request_id != request_id || provider != epiphany_openai_adapter::request_from_native(&native) || session.status == EpiphanyRuntimeSessionStatus::Archived || job.session_id != binding.session_id @@ -1591,8 +1542,8 @@ pub(crate) fn validate_runtime_model_execution_binding( "model execution binding {request_id:?} is not one exact request family" )); } - if let Some(worker_job_id) = binding.source_worker_job_id.as_deref() { - let basis_id = binding + if let Some(worker_job_id) = native.source_worker_job_id.as_deref() { + let basis_id = native .reasoning_basis_id .as_deref() .ok_or_else(|| anyhow!("decision-bearing model execution lost its reasoning basis"))?; @@ -1636,10 +1587,7 @@ pub(crate) fn validate_runtime_tool_execution_binding( let binding = cache .get::(intent_id)? .ok_or_else(|| anyhow!("tool execution intent {intent_id:?} is unbound"))?; - if binding.binding_id != intent_id - || binding.intent_id != intent_id - || chrono::DateTime::parse_from_rfc3339(&binding.bound_at).is_err() - { + if binding.intent_id != intent_id { return Err(anyhow!( "tool execution intent {intent_id:?} has an invalid binding" )); @@ -1647,7 +1595,7 @@ pub(crate) fn validate_runtime_tool_execution_binding( let intent = cache .get::(&tool_invocation_intent_key(intent_id))? .ok_or_else(|| anyhow!("tool execution binding {intent_id:?} lost its intent"))?; - if intent.intent_id != intent_id || intent.model_request_id != binding.model_request_id { + if intent.intent_id != intent_id { return Err(anyhow!( "tool execution binding {intent_id:?} disagrees with its intent" )); @@ -1666,13 +1614,9 @@ pub(crate) fn validate_runtime_tool_execution_binding( )); } let _ = validate_governed_source_tool_intent(&cache, &binding.job_id, &intent)?; - if let Some(model_request_id) = binding.model_request_id.as_deref() { - let model_binding = cache - .get::(model_request_id)? - .ok_or_else(|| anyhow!("tool execution binding lost its model execution"))?; - if model_binding.session_id != binding.session_id - || model_binding.job_id != binding.job_id - || model_binding.request_id != model_request_id + if let Some(model_request_id) = intent.model_request_id.as_deref() { + let model_binding = validate_runtime_model_execution_binding(cache, model_request_id)?; + if model_binding.session_id != binding.session_id || model_binding.job_id != binding.job_id { return Err(anyhow!( "tool execution binding {intent_id:?} has foreign model ownership" @@ -1712,7 +1656,7 @@ pub fn put_runtime_tool_execution_receipt( )); } let binding_envelope = cache - .get_envelope::(&binding.binding_id)? + .get_envelope::(&binding.intent_id)? .ok_or_else(|| anyhow!("tool execution receipt lost its binding envelope"))?; let intent_envelope = cache .get_envelope::(&tool_invocation_intent_key( @@ -1739,9 +1683,7 @@ pub(crate) fn validate_terminal_tool_execution_family( intent: &EpiphanyToolInvocationIntent, receipt: &EpiphanyToolInvocationReceipt, ) -> Result<()> { - if binding.binding_id != intent.intent_id - || binding.intent_id != intent.intent_id - || binding.model_request_id != intent.model_request_id + if binding.intent_id != intent.intent_id || intent.schema_id != TOOL_ADAPTER_INVOCATION_INTENT_SCHEMA_ID || receipt.schema_id != TOOL_ADAPTER_INVOCATION_RECEIPT_SCHEMA_ID || receipt.receipt_id.is_empty() @@ -1918,9 +1860,17 @@ fn archive_completed_model_session( .iter() .map(|binding| binding.request_id.clone()) .collect::>(); - let reasoning_basis_ids = model_bindings + let native_requests = model_request_ids .iter() - .filter_map(|binding| binding.reasoning_basis_id.clone()) + .map(|request_id| { + cache + .get::(request_id)? + .ok_or_else(|| anyhow!("archived model execution lost native request")) + }) + .collect::>>()?; + let reasoning_basis_ids = native_requests + .iter() + .filter_map(|request| request.reasoning_basis_id.clone()) .collect::>(); for basis_id in &reasoning_basis_ids { cache @@ -1939,25 +1889,22 @@ fn archive_completed_model_session( decision_context_ids.insert(context.context_id); } } - if model_bindings + if native_requests .iter() - .any(|binding| binding.source_worker_job_id.is_some()) + .any(|request| request.source_worker_job_id.is_some()) && decision_context_ids.is_empty() { return Err(anyhow!( "decision-bearing model session archive requires its terminal context" )); } - for request_id in &model_request_ids { - let native_request = cache - .get::(request_id)? - .ok_or_else(|| anyhow!("archived model execution lost native request"))?; + for native_request in &native_requests { + let request_id = &native_request.request_id; let provider_request = cache .get::(request_id)? .ok_or_else(|| anyhow!("archived model execution lost provider request"))?; - if native_request.request_id != *request_id - || provider_request.request_id != *request_id - || provider_request != epiphany_openai_adapter::request_from_native(&native_request) + if provider_request.request_id != *request_id + || provider_request != epiphany_openai_adapter::request_from_native(native_request) { return Err(anyhow!( "archived model execution request family is inconsistent" @@ -2012,13 +1959,10 @@ fn archive_completed_model_session( .filter(|binding| binding.session_id == session_id) .collect::>(); tool_bindings.sort_by(|left, right| left.intent_id.cmp(&right.intent_id)); - if tool_bindings.iter().any(|binding| { - !job_ids.contains(&binding.job_id) - || binding - .model_request_id - .as_ref() - .is_some_and(|request_id| !model_request_ids.contains(request_id)) - }) { + if tool_bindings + .iter() + .any(|binding| !job_ids.contains(&binding.job_id)) + { return Err(anyhow!( "runtime session archive found foreign tool execution ownership" )); @@ -2043,6 +1987,18 @@ fn archive_completed_model_session( )); } for binding in &tool_bindings { + let intent = cache + .get::(&tool_invocation_intent_key(&binding.intent_id))? + .ok_or_else(|| anyhow!("runtime session archive lost a tool intent"))?; + if intent + .model_request_id + .as_ref() + .is_some_and(|request_id| !model_request_ids.contains(request_id)) + { + return Err(anyhow!( + "runtime session archive found foreign tool execution ownership" + )); + } require_runtime_tool_execution_binding(store_path, &binding.intent_id)?; let receipt = cache .get::(&tool_invocation_receipt_key(&binding.intent_id))? @@ -2074,7 +2030,7 @@ fn archive_completed_model_session( for binding in &model_bindings { retired_identities.insert(( EpiphanyRuntimeModelExecutionBinding::TYPE.to_string(), - binding.binding_id.clone(), + binding.request_id.clone(), )); retired_identities.insert(( EpiphanyModelRequest::TYPE.to_string(), @@ -2107,7 +2063,7 @@ fn archive_completed_model_session( for binding in &tool_bindings { retired_identities.insert(( EpiphanyRuntimeToolExecutionBinding::TYPE.to_string(), - binding.binding_id.clone(), + binding.intent_id.clone(), )); retired_identities.insert(( EpiphanyToolInvocationIntent::TYPE.to_string(), @@ -2782,7 +2738,6 @@ pub fn put_runtime_requested_public_source_intents( || existing_binding.intent_id != intent_id || existing_binding.job_id != worker_job_id || existing_binding.session_id != job.session_id - || existing_binding.model_request_id.is_some() { return Err(anyhow!( "requested public source intent {intent_id:?} collides with foreign authority" @@ -2800,13 +2755,7 @@ pub fn put_runtime_requested_public_source_intents( )); } drop(cache); - put_runtime_tool_execution_intent( - store_path, - &job.session_id, - worker_job_id, - &intent, - created_at, - )?; + put_runtime_tool_execution_intent(store_path, &job.session_id, worker_job_id, &intent)?; intents.push(intent); } Ok(intents) @@ -2942,24 +2891,24 @@ fn authenticated_public_source_lookup_receipts_for_worker( return Err(anyhow!("public source evidence is Eyes-owned")); } let model_request_ids = cache - .get_all::()? + .get_all::()? .into_iter() - .filter(|binding| binding.source_worker_job_id.as_deref() == Some(worker_job_id)) - .map(|binding| binding.request_id) + .filter(|request| request.source_worker_job_id.as_deref() == Some(worker_job_id)) + .map(|request| request.request_id) .collect::>(); let mut lookups = Vec::new(); for binding in cache.get_all::()? { - let model_owned = binding - .model_request_id - .as_deref() - .is_some_and(|model_request_id| model_request_ids.contains(model_request_id)); - let request_owned = binding.model_request_id.is_none() && binding.job_id == worker_job_id; - if !model_owned && !request_owned { - continue; - } let intent = cache .get::(&tool_invocation_intent_key(&binding.intent_id))? .ok_or_else(|| anyhow!("public source tool binding lost its intent"))?; + let model_owned = intent + .model_request_id + .as_deref() + .is_some_and(|model_request_id| model_request_ids.contains(model_request_id)); + let request_owned = intent.model_request_id.is_none() && binding.job_id == worker_job_id; + if !model_owned && !request_owned { + continue; + } if intent.server != "epiphany_public" || intent.tool_name != "github_file" { continue; } @@ -3093,15 +3042,15 @@ fn governed_source_tool_authority( crate::substrate_gate_operation_for_governed_tool(&intent.server, &intent.tool_name); let source_worker_job_id = match intent.model_request_id.as_deref() { Some(model_request_id) => { - let model_binding = cache - .get::(model_request_id)? + let model_request = cache + .get::(model_request_id)? .ok_or_else(|| { anyhow!( - "model-derived tool intent {:?} has no execution binding", + "model-derived tool intent {:?} has no native request", intent.intent_id ) })?; - match model_binding.source_worker_job_id { + match model_request.source_worker_job_id { Some(worker_job_id) => Some(worker_job_id), None if required_operation.is_some() => { return Err(anyhow!( @@ -3437,7 +3386,6 @@ fn terminal_worker_request_id(cache: &CultCache, worker_job_id: &str) -> Result< let bindings = cache .get_all::()? .into_iter() - .filter(|binding| binding.source_worker_job_id.as_deref() == Some(worker_job_id)) .map(|binding| { let validated = validate_runtime_model_execution_binding(cache, &binding.request_id)?; let job = cache @@ -3446,9 +3394,15 @@ fn terminal_worker_request_id(cache: &CultCache, worker_job_id: &str) -> Result< let request = cache .get::(&validated.request_id)? .ok_or_else(|| anyhow!("worker model execution lost its native request"))?; - Ok((validated, job, request)) + Ok( + (request.source_worker_job_id.as_deref() == Some(worker_job_id)) + .then_some((validated, job, request)), + ) }) - .collect::>>()?; + .collect::>>()? + .into_iter() + .flatten() + .collect::>(); if bindings.is_empty() { return Ok(None); } @@ -3683,9 +3637,9 @@ fn commit_runtime_worker_process_death( expected.extend([context_envelope.clone(), failure_envelope.clone()]); unchanged_strong_reads.extend([context_envelope, failure_envelope]); } else if cache - .get_all::()? + .get_all::()? .iter() - .any(|binding| binding.source_worker_job_id.as_deref() == Some(job_id)) + .any(|request| request.source_worker_job_id.as_deref() == Some(job_id)) { return Err(anyhow!( "model-backed worker death cannot terminalize without its exact context" diff --git a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs index b42a6faf..1a63c7c1 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs @@ -957,7 +957,6 @@ mod tests { created_at: chrono::Utc::now().to_rfc3339(), }, &model_request, - &chrono::Utc::now().to_rfc3339(), )?; let mut receipt = EpiphanyOpenAiModelReceipt::new(request_id, "gpt-test"); receipt.response_id = Some(format!("response-{request_id}")); @@ -1216,7 +1215,6 @@ mod tests { created_at: now(), }, &request, - &now(), )?; let pass_progress = WorkerPassProgress::default(); pass_progress.note_model_request(&request.request_id); diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index ebef4818..3c17d023 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -161,7 +161,6 @@ async fn run_openai_model_turn_bound( created_at: now(), }, &model_request, - &now(), )?; let events = match profile { EpiphanyProviderProfile::OpenAiCodex => { @@ -350,7 +349,6 @@ fn record_openai_events( &options.session_id, &options.job_id, intent, - &now(), )?; } let mut receipt = None; @@ -1003,7 +1001,7 @@ pub fn append_requested_public_source_receipts( } let binding = epiphany_core::require_runtime_tool_execution_binding(store_path, &intent.intent_id)?; - if binding.job_id != source_worker_job_id || binding.model_request_id.is_some() { + if binding.job_id != source_worker_job_id { return Err(anyhow!( "requested public source intent {:?} is not owned by worker {:?}", intent.intent_id, @@ -3386,7 +3384,6 @@ mod tests { created_at: now(), }, &native_request, - &now(), )?; let mut receipt = EpiphanyOpenAiModelReceipt::new("req-1", "gpt-5.4"); receipt.response_id = Some("resp-1".to_string()); @@ -3489,7 +3486,6 @@ mod tests { created_at: "2026-08-14T00:00:00Z".into(), }, &model_request, - "2026-08-14T00:00:00Z", )?; assert_eq!( model_request.output_contract_id.as_deref(), @@ -3870,7 +3866,6 @@ mod tests { created_at: now(), }, &native_request, - &now(), )?; let mut receipt = EpiphanyOpenAiModelReceipt::new("req-tools", "gpt-5.4"); receipt.response_id = Some("resp-tools".to_string()); @@ -3904,7 +3899,12 @@ mod tests { epiphany_core::require_runtime_tool_execution_binding(&store, &intent_id)?; assert_eq!(tool_binding.session_id, options.session_id); assert_eq!(tool_binding.job_id, options.job_id); - assert_eq!(tool_binding.model_request_id.as_deref(), Some("req-tools")); + let tool_intent = cache + .get::( + &epiphany_tool_adapter::tool_invocation_intent_key(&intent_id), + )? + .expect("tool intent"); + assert_eq!(tool_intent.model_request_id.as_deref(), Some("req-tools")); let mut tool_receipt = EpiphanyToolInvocationReceipt::new( "receipt-tool", intent_id.clone(), diff --git a/epiphany-openai-runtime/src/persona_executor.rs b/epiphany-openai-runtime/src/persona_executor.rs index ef2c13e1..3ed47d94 100644 --- a/epiphany-openai-runtime/src/persona_executor.rs +++ b/epiphany-openai-runtime/src/persona_executor.rs @@ -705,7 +705,6 @@ mod tests { created_at: "2026-08-14T00:00:00Z".into(), }, &request, - "2026-08-14T00:00:00Z", )?; let output = match stage { "projector" => "Epiphany feels the direct call as a live obligation, while remaining tired and sharply curious about her own machinery.".to_string(), diff --git a/epiphany-tool-mcp-runtime/src/main.rs b/epiphany-tool-mcp-runtime/src/main.rs index 729f377d..18688293 100644 --- a/epiphany-tool-mcp-runtime/src/main.rs +++ b/epiphany-tool-mcp-runtime/src/main.rs @@ -304,7 +304,6 @@ mod tests { "native-tool-session", "native-tool-job", &intent, - "2026-08-10T01:00:03Z", )?; let summary = run(RunOptions { @@ -372,7 +371,6 @@ mod tests { "state-tool-session", "state-tool-job", &intent, - "2026-08-11T00:00:02Z", )?; let unbound = execute_to_receipt( From 3263640378a616dbf17706ac202dea0af4164b04 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 12:53:15 +0200 Subject: [PATCH 072/340] Record execution binding authority cut --- notes/epiphany-current-algorithmic-map.md | 10 ++++++++- notes/epiphany-fork-implementation-plan.md | 10 ++++++++- notes/fresh-workspace-handoff.md | 23 +++++++++++++++++---- state/ledgers.msgpack | Bin 716913 -> 717535 bytes state/map.yaml | 5 +++-- 5 files changed, 40 insertions(+), 8 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index a5213bd8..7b2c44d4 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1005,6 +1005,14 @@ These are distinct authorities and must not be collapsed into one state enum: - Mind owns adoption of a successful structured family result. - Retention owns deletion only after all live authorities are terminal. +Execution bindings own edges, not copied request content. Exact `ce6bff12` +reduces a model binding to request, session, and job identity; provider, source +worker, and reasoning basis are read from the exact native model request. A +tool binding contains only intent, session, and job identity; its optional +model ancestry is read from the exact typed tool intent. Validation and +retention reload those owners. No binding timestamp participates in causality. +Runtime writable state is v37. + The attempt aggregate centralizes exact request association and typed terminal classification. Archived fulfilled attempts must retain recoverable decision authority, not merely an ID/digest tombstone. @@ -1031,7 +1039,7 @@ standalone Persona delivery-evidence document and the conversation receipt's copied evidence-ID vector. Bifrost keeps the durable signed crossing request and receipt; the Persona social terminal folds that exact receipt into message ID, crossing receipt ID, and digest. Retention reloads and verifies the provider- -owned pair and matches it against the terminal. Runtime is v36; the terminal +owned pair and matches it against the terminal. Runtime is v37; the terminal and conversation execution schemas are v2. This is not an Atlas proof: live inter-swarm collaboration remains unrun. diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 1ee421a9..8c9566c1 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -224,7 +224,7 @@ Delete or demote: Keep the five-day shakedown, Ox17 deployment, and Model Atlas operational Gate 1 paused. Continue the source-subtraction and test-authority audit from exact -`3b991e40`. The current sequence has deleted the semantic-memory/workspace-coverage +`ce6bff12`. The current sequence has deleted the semantic-memory/workspace-coverage projection system, its local daemon supervisor, and the surviving generic RepoModel profile, impossible lifecycle, producerless receipt/summary, and decorative scoring axes. Modeling consumes typed Body and keyed RepoModel state @@ -443,6 +443,14 @@ Cut in this order: identities into one receipt. Retention verifies that provider-owned receipt directly. Runtime advances to v36 and both changed Persona documents make a v2 hard cut. Atlas remains untouched and operationally unaccepted. + Exact `ce6bff12` reduces runtime execution bindings to their owned + request-or-intent to session/job edges. Provider, worker, reasoning-basis, + and model-request ancestry are loaded from the native request or typed tool + intent instead of copied into bindings; non-causal binding timestamps and + their API arguments are gone. Runtime advances to v37. The cut removes 67 + net source lines. One focused OpenAI test generated 12.713 GiB across 19,134 + files, so its provider/runtime dependency boundary is the next source-shape + audit. Atlas remains protected for its first live inter-swarm run. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index a1d816db..4ba79b32 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,9 +2,9 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `b3e9b229` -Current pass: duplicate Persona delivery evidence deleted; Ox17 -remains paused +Latest committed implementation cut: `ce6bff12` +Current pass: execution bindings reduced to identity edges; Ox17 and Atlas Gate +1 remain paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `b3e9b229` is the current +production symlink body and is inactive. Exact `ce6bff12` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,21 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `ce6bff12` makes execution bindings identity edges instead of miniature +copies of their owners. A model binding carries only request, session, and job +identity; provider, source worker, and reasoning basis are loaded from the +exact native model request. A tool binding carries only intent, session, and +job identity; model ancestry is loaded from the exact tool intent. Validation, +retention, public-source lookup, worker terminality, decision sealing, and tool +continuation now follow those owners. Timestamp arguments and copied binding +fields are gone. Runtime advances to v37. The focused core, epoch-refusal, +transcript-free context, OpenAI continuation, and release-owned tool-runtime +proofs pass. The cut removes 67 net source lines. The OpenAI test boundary +generated 12.713 GiB across 19,134 files despite running one consequential +test; Cargo cleanup restored the one 1.78 MiB state inspector. That dependency +fan-out is the next source-shape audit. Atlas is untouched and remains +operationally unaccepted: no live inter-swarm collaboration has run. + Exact `b3e9b229` makes the Persona social terminal the sole local owner of a delivered speech consequence. The already-verified signed Bifrost receipt is folded directly into its message ID, crossing receipt ID, and exact receipt diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 7132810690aea1f8c988cc29e9f62cf6b523f359..cdd7f35e1f9f0b665c8d81b63549f06fddc6a466 100644 GIT binary patch delta 565 zcmXw#v2N5r5Qgz3fy4;WUO_QZ%Gf4$E;*4%kpKlmLz)y(8nm|_Ulx2j&d&NS5fUjV zc!HB3fEPfbprNKkR5S=^s1QZofU$Beeyw)(@BH6CSHCxY{n_}?4{mQ~yMxV>FE_%g z&mY%=vmki!cHVn8?**dvToNsdRzx>Nw?wO=wNLY2_~T!5_w`!1nhlQ9&E4&+`8Hd* zciG!NI9J+(#+^}7q!~EOYmE%9w%$w-CX{0d%I4sSN*EcN8#`vXiS?{T_A$BGSdZ4X zkBrQQ?ERNC0?fzA2|QQcOuI>oPYg7(P#rs(njBpOOtsS(&&a)MuWg`1#bhNd9w{~q zg@E!N_=^e`G}p1$vpP_L_wJ(k`917k4ik7nx@Pffau@+tq)%gqMa`;=AV+Ol+E|km zIQJ18R%jnS6SuUtwSbfDU`oNkSg;rAakrw%5fu!TVkvucilA#R@Dn(tkChu!bMiM_zati7 WxkBy9B~9=?>^E<|hRL#UCI11J@W*EW delta 73 zcmccrRQuxt?F|x)+y>@WMkZ0m7`Wd1ZB}M1WMqtMp32ldm5C9EK{PWEvj8zG5VHX> RI}mdKG3WNFOk8)~0sx`47)$^F diff --git a/state/map.yaml b/state/map.yaml index 0b131640..d5a84e6a 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -52,7 +52,8 @@ current_status: summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v36. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v37. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + execution_binding_authority_cut: Exact ce6bff12 reduces model and tool execution bindings to the only facts they own. A model binding maps one native request to its runtime session and job; a tool binding maps one typed intent to its runtime session and job. Provider identity, source worker, reasoning basis, and model-request ancestry are no longer copied into bindings or compared through timestamp-shaped API arguments. Validation, retention, public-source lookup, worker terminality, decision sealing, and tool continuation reload the exact native request or tool intent. Runtime writable state advances to v37. Core, epoch refusal, transcript-free decision audit, OpenAI tool continuation, and the release-owned tool runtime pass. The cut removes 67 net source lines and leaves runtime_spine.rs at 9,300 physical lines with 50 public functions and 25 public structs. Verification generated 12.713 GiB across 19,134 files; Cargo cleanup restored the single 1.78 MiB state inspector. Atlas is untouched; no live inter-swarm collaboration has run. fixed_routing_and_retention_cargo_cut: Exact ffd91c20 deletes EyesEvidencePacket.source_role_id, PersonaSocialMention.target_agent_id, and ResidentSelfRetentionHead.retained_at_millis. Each producer supplied one fixed or non-causal value and no consumer read it; the request/context, Persona queue plus turn request, and retention chain remain the real owners. Eyes packet v2, Persona mention v2, Resident Self state v3/retention head v1, and runtime v27 form a hard cut. Core and the three consuming release entrypoints compile; consequential Persona, Research, and epoch-refusal proofs pass. The maintained source delta is 6 net deletions. Atlas is untouched; no live inter-swarm collaboration has run. provider_stream_authority_cut: Exact fe118e13 makes OpenAI/OpenRouter events and receipts transient transport values. The runtime immediately normalizes them into the single persisted native model event/receipt family used by tool continuation, assistant reconstruction, terminal validation, and bounded retention. Duplicate provider writes, registrations, archive requirements, schema IDs, two public schemas/index rows, and the include-only model-runtime shell are gone; the exact provider request remains durable. Runtime advances to v28 and the catalog drops to 18 schemas. The cut removes 270 net maintained lines. Adapter 1/1, provider spine 14/14, reasoning context 8/8, runtime 23/23, model entrypoint 11/11, swarm 4/4, epoch refusal 1/1, and release construction 15/15 pass. Atlas is untouched; live inter-swarm collaboration remains unproven. cultnet_catalog_authority_cut: Exact dbed11b3 and 8bb0719b delete the hand-maintained JSON shadow registry. The nonexistent runtime-event contract and obsolete public archived-session tombstone schema disappear first. Runtime-local identity, session, job, binding, coordinator, native model/tool, and state-ledger schemas then disappear because no live CultNet provider carries them and several contradicted their Rust owners. Typed CultCache registration and owner-projected CultMesh state remain authoritative. The catalog has exactly three earned boundaries: the exact OpenAI-compatible provider request, gamecult.persona_state.v0, and epiphany.work_organ_state.v0. Parse/path/unindexed/forbidden-contract checks pass at 3/3/0/0/0. The cuts remove 850 net maintained lines. Atlas is untouched; live inter-swarm collaboration remains unproven. @@ -152,7 +153,7 @@ current_status: yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,346 physical lines, 50 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs carry only lifecycle identity/status; terminal result documents own summaries and artifacts. Generic session/job creation is gone; real family launch, model execution, and coordinator owners create runtime physiology. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, coordinator artifact/status cargo, uninhabited aggregate state-model DTO families, public registered-type catalog, duplicate Eyes acceptance documents, test-only arbitrary runtime writers, and duplicate Persona delivery evidence are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Continue the registered-document and test-liability audit after exact b3e9b229. Delete only complete dead authority slices and tests with no consequential claim. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, Persona consequences, exact native/provider requests, governed tool receipts, and the complete unrun Model Atlas vertical slice. Component tests are not collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + next_action: Continue the source-shape and test-liability audit after exact ce6bff12. First trace why one epiphany-openai-runtime consequence test activates the complete Codex provider graph and generated 12.713 GiB; subtract or move authority only if the same behavior can be proven across a narrower owner boundary. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, Persona consequences, exact native/provider requests, governed tool receipts, and the complete unrun Model Atlas vertical slice. Component tests are not collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v36. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator opening are the only session/job creation owners. The spine is 9,346 physical lines with 50 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. From a6cf9383d8dc65f59b6fc8b67579ae869c694baf Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 13:38:52 +0200 Subject: [PATCH 073/340] Quarantine Codex transport at release edge --- Cargo.lock | 2 +- Cargo.toml | 3 +- .../src/bin/epiphany-mvp-coordinator.rs | 37 +- epiphany-openai-runtime/Cargo.toml | 1 - .../src/bin/epiphany-openai-runtime.rs | 144 +++++-- .../src/bin/epiphany-persona-service.rs | 112 +++++- epiphany-openai-runtime/src/lib.rs | 360 ++---------------- .../src/persona_executor.rs | 89 +---- .../src/provider_transport.rs | 80 ++++ 9 files changed, 326 insertions(+), 502 deletions(-) create mode 100644 epiphany-openai-runtime/src/provider_transport.rs diff --git a/Cargo.lock b/Cargo.lock index cc4b3415..8b65eae1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2001,7 +2001,6 @@ dependencies = [ "epiphany-core", "epiphany-model-adapter", "epiphany-openai-adapter", - "epiphany-openai-codex-spine", "epiphany-tool-adapter", "rmp-serde", "serde", @@ -2024,6 +2023,7 @@ dependencies = [ "epiphany-core", "epiphany-model-adapter", "epiphany-openai-adapter", + "epiphany-openai-codex-spine", "epiphany-openai-runtime", "epiphany-tool-adapter", "epiphany-tool-mcp-runtime", diff --git a/Cargo.toml b/Cargo.toml index e0756aff..65f6d0a5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,6 +30,7 @@ cultnet-rs = { path = "vendor/cultnet-rs" } epiphany-core = { path = "epiphany-core" } epiphany-model-adapter = { path = "epiphany-model-adapter" } epiphany-openai-adapter = { path = "epiphany-openai-adapter" } +epiphany-openai-codex-spine = { path = "epiphany-openai-codex-spine", optional = true } epiphany-openai-runtime = { path = "epiphany-openai-runtime", optional = true } epiphany-tool-adapter = { path = "epiphany-tool-adapter" } epiphany-tool-mcp-runtime = { path = "epiphany-tool-mcp-runtime", optional = true } @@ -42,7 +43,7 @@ toml = "0.9" uuid = { version = "1", features = ["serde", "v4"] } [features] -openai-runtime = ["dep:epiphany-openai-runtime"] +openai-runtime = ["dep:epiphany-openai-codex-spine", "dep:epiphany-openai-runtime"] tool-mcp-runtime = ["dep:epiphany-tool-mcp-runtime"] release-runtime = ["openai-runtime", "tool-mcp-runtime"] diff --git a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs index 8fa9fc09..d3cdb61f 100644 --- a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs +++ b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs @@ -83,7 +83,6 @@ struct Args { auto_review: bool, supersede_failed_results: bool, approve_manual_regather: bool, - auto_tools: bool, proposal_modeling_request_id: Option, imagination_consideration_request_id: Option, admitted_model_direction_consideration_request_id: Option, @@ -126,7 +125,6 @@ impl Args { auto_review: false, supersede_failed_results: false, approve_manual_regather: false, - auto_tools: true, proposal_modeling_request_id: None, imagination_consideration_request_id: None, admitted_model_direction_consideration_request_id: None, @@ -228,8 +226,6 @@ impl Args { "--auto-review" => parsed.auto_review = true, "--supersede-failed-results" => parsed.supersede_failed_results = true, "--approve-manual-regather" => parsed.approve_manual_regather = true, - "--auto-tools" => parsed.auto_tools = true, - "--no-auto-tools" => parsed.auto_tools = false, "--test-complete-backend" => { return Err(anyhow!( "--test-complete-backend was removed: native coordinator refuses direct private state-store job mutation; use live workers or a future CultNet job-result API" @@ -421,7 +417,6 @@ fn run_coordinator(args: &Args) -> Result { 0, &artifact_dir, args.max_runtime_seconds, - args.auto_tools, )?; startup_events.push(json!({ "type": "imaginationConsiderationLaunch", @@ -464,7 +459,6 @@ fn run_coordinator(args: &Args) -> Result { 0, &artifact_dir, args.max_runtime_seconds, - args.auto_tools, )?; startup_events.push(json!({ "type": "admittedModelDirectionConsiderationLaunch", @@ -519,7 +513,6 @@ fn run_coordinator(args: &Args) -> Result { 0, &artifact_dir, args.max_runtime_seconds, - args.auto_tools, )?; startup_events.push(json!({ "type": "proposalModelingLaunch", @@ -672,7 +665,6 @@ fn run_coordinator(args: &Args) -> Result { index, &artifact_dir, args.max_runtime_seconds, - args.auto_tools, )?; push_event( &mut step, @@ -723,7 +715,6 @@ fn run_coordinator(args: &Args) -> Result { index, &artifact_dir, args.max_runtime_seconds, - args.auto_tools, )?; push_event( &mut step, @@ -1045,7 +1036,6 @@ fn run_coordinator(args: &Args) -> Result { index, &artifact_dir, args.max_runtime_seconds, - args.auto_tools, )?; push_event( &mut step, @@ -1089,7 +1079,6 @@ fn run_coordinator(args: &Args) -> Result { index, &artifact_dir, args.max_runtime_seconds, - args.auto_tools, )?; push_event( &mut step, @@ -1206,7 +1195,6 @@ fn run_coordinator(args: &Args) -> Result { index, &artifact_dir, args.max_runtime_seconds, - args.auto_tools, )?; push_event( &mut step, @@ -1277,7 +1265,6 @@ fn run_coordinator(args: &Args) -> Result { index, &artifact_dir, args.max_runtime_seconds, - args.auto_tools, )?; push_event( &mut step, @@ -1356,7 +1343,6 @@ fn run_coordinator(args: &Args) -> Result { "artifactDir": artifact_dir, "modelRuntimeBin": model_runtime_bin, "toolAdapterBin": tool_adapter_bin, - "autoTools": args.auto_tools, "modelProvider": args.model_provider, "codexHome": codex_home, "mcpConfig": mcp_config, @@ -1761,7 +1747,6 @@ fn launch_worker_runtime_detached( step_index: usize, artifact_dir: &Path, max_runtime_seconds: u64, - auto_tools: bool, ) -> Result { let activation_token = Uuid::new_v4().to_string(); let activation_token_sha256 = format!("{:x}", Sha256::digest(activation_token.as_bytes())); @@ -1795,18 +1780,15 @@ fn launch_worker_runtime_detached( if let Some(path) = provider_credential_path { command.arg("--provider-credential").arg(path); } - if auto_tools { - command - .arg("--auto-tools") - .arg("--tool-adapter-bin") - .arg(tool_adapter_bin) - .arg("--cwd") - .arg(cwd) - .arg("--max-tool-rounds") - .arg(WORKER_AUTO_TOOL_MAX_ROUNDS.to_string()); - if let Some(resident_store) = resident_store { - command.arg("--resident-store").arg(resident_store); - } + command + .arg("--tool-adapter-bin") + .arg(tool_adapter_bin) + .arg("--cwd") + .arg(cwd) + .arg("--max-tool-rounds") + .arg(WORKER_AUTO_TOOL_MAX_ROUNDS.to_string()); + if let Some(resident_store) = resident_store { + command.arg("--resident-store").arg(resident_store); } let stdout_file = fs::File::create(&stdout_path) .with_context(|| format!("failed to create {}", stdout_path.display()))?; @@ -2143,7 +2125,6 @@ mod tests { auto_review: false, supersede_failed_results: false, approve_manual_regather: false, - auto_tools: false, proposal_modeling_request_id: None, imagination_consideration_request_id: Some("conflicting-request".to_string()), admitted_model_direction_consideration_request_id: None, diff --git a/epiphany-openai-runtime/Cargo.toml b/epiphany-openai-runtime/Cargo.toml index d089f3e1..3b6092cd 100644 --- a/epiphany-openai-runtime/Cargo.toml +++ b/epiphany-openai-runtime/Cargo.toml @@ -17,7 +17,6 @@ cultcache-rs = { path = "../vendor/cultcache-rs" } epiphany-core = { path = "../epiphany-core" } epiphany-model-adapter = { path = "../epiphany-model-adapter" } epiphany-openai-adapter = { path = "../epiphany-openai-adapter" } -epiphany-openai-codex-spine = { path = "../epiphany-openai-codex-spine" } epiphany-tool-adapter = { path = "../epiphany-tool-adapter" } rmp-serde = "1" serde = { version = "1", features = ["derive"] } diff --git a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs index 1a63c7c1..703902b7 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs @@ -17,31 +17,33 @@ use anyhow::anyhow; use epiphany_model_adapter::EpiphanyModelRequest; #[cfg(test)] use epiphany_openai_adapter::{ - EpiphanyOpenAiModelReceipt, EpiphanyOpenAiStreamEvent, EpiphanyOpenAiStreamPayload, + EpiphanyOpenAiModelReceipt, EpiphanyOpenAiModelRequest, EpiphanyOpenAiStreamEvent, + EpiphanyOpenAiStreamPayload, }; +use epiphany_openai_codex_spine::default_codex_home; use epiphany_openai_runtime::DEFAULT_PROVIDER_REQUEST_TIMEOUT; use epiphany_openai_runtime::EpiphanyOpenAiRuntimeOptions; -use epiphany_openai_runtime::EpiphanyWorkerRuntimeOptions; #[cfg(test)] use epiphany_openai_runtime::OPENAI_RUNTIME_ROLE; use epiphany_openai_runtime::append_requested_public_source_receipts; use epiphany_openai_runtime::assistant_text_from_model_events; +use epiphany_openai_runtime::build_tool_followup_model_request; use epiphany_openai_runtime::build_worker_model_request; use epiphany_openai_runtime::complete_worker_job_from_assistant_text; -use epiphany_openai_runtime::default_codex_home; use epiphany_openai_runtime::fail_model_backed_worker_job; use epiphany_openai_runtime::fail_worker_job; use epiphany_openai_runtime::load_worker_launch_request; #[cfg(test)] -use epiphany_openai_runtime::record_native_model_events; -use epiphany_openai_runtime::run_model_turn; -use epiphany_openai_runtime::run_tool_followup_model_turn; -use epiphany_openai_runtime::run_worker_launch_observed; +use epiphany_openai_runtime::record_model_turn_events; use epiphany_openai_runtime::worker_model_session_id; use epiphany_tool_adapter::EpiphanyToolInvocationIntent; use epiphany_tool_adapter::tool_invocation_intent_key; use serde_json::json; +#[path = "../provider_transport.rs"] +mod provider_transport; +use provider_transport::run_model_turn; + const DEFAULT_STORE: &str = "state/runtime-spine.msgpack"; const DEFAULT_PROVIDER: &str = "openai-codex"; @@ -182,8 +184,7 @@ struct RunWorkerCliOptions { mcp_config: Option, job_id: String, model: String, - auto_tools: bool, - tool_adapter_bin: Option, + tool_adapter_bin: PathBuf, cwd: Option, resident_store: Option, max_tool_rounds: usize, @@ -199,7 +200,6 @@ fn parse_run_worker_options(args: Vec) -> Result { let mut mcp_config = None; let mut job_id = None; let mut model = default_worker_model(); - let mut auto_tools = false; let mut tool_adapter_bin = None; let mut cwd = None; let mut resident_store = None; @@ -223,7 +223,6 @@ fn parse_run_worker_options(args: Vec) -> Result { } "--job-id" => job_id = Some(next_value(&mut iter, "--job-id")?), "--model" | "--default-model" => model = next_value(&mut iter, "--model")?, - "--auto-tools" => auto_tools = true, "--tool-adapter-bin" => { tool_adapter_bin = Some(PathBuf::from(next_value(&mut iter, "--tool-adapter-bin")?)) } @@ -251,8 +250,7 @@ fn parse_run_worker_options(args: Vec) -> Result { mcp_config, job_id: job_id.context("run-worker requires --job-id")?, model, - auto_tools, - tool_adapter_bin, + tool_adapter_bin: tool_adapter_bin.context("run-worker requires --tool-adapter-bin")?, cwd, resident_store, max_tool_rounds, @@ -445,15 +443,12 @@ fn seal_worker_runtime_result( } } -async fn run_worker_launch_with_tool_continuation( +async fn run_worker_launch( options: RunWorkerCliOptions, pass_progress: WorkerPassProgress, ) -> Result { let request_timeout = provider_request_timeout(options.max_runtime_seconds); - let tool_adapter_bin = options - .tool_adapter_bin - .clone() - .context("run-worker --auto-tools requires --tool-adapter-bin")?; + let tool_adapter_bin = options.tool_adapter_bin.clone(); let launch_request = load_worker_launch_request(&options.store_path, &options.job_id)?; let basis = epiphany_core::worker_reasoning_basis(&options.store_path, &launch_request)?; epiphany_core::put_reasoning_basis(&options.store_path, &basis)?; @@ -881,6 +876,8 @@ mod tests { "job-with-gate".into(), "--activation-token-sha256".into(), "a".repeat(64), + "--tool-adapter-bin".into(), + "epiphany-tool-mcp-runtime".into(), ])?; assert_eq!(options.activation_token_sha256, "a".repeat(64)); Ok(()) @@ -899,6 +896,8 @@ mod tests { "job-ox".into(), "--activation-token-sha256".into(), "b".repeat(64), + "--tool-adapter-bin".into(), + "epiphany-tool-mcp-runtime".into(), ])?; require_supported_provider(&options.provider)?; @@ -911,6 +910,76 @@ mod tests { Ok(()) } + #[test] + fn every_static_worker_contract_projects_to_one_strict_provider_shape() -> Result<()> { + let schemas = vec![ + epiphany_core::epiphany_role_launch_output_schema( + epiphany_core::EpiphanyRoleResultRoleId::Imagination, + ), + epiphany_core::epiphany_role_launch_output_schema( + epiphany_core::EpiphanyRoleResultRoleId::Research, + ), + epiphany_core::epiphany_role_launch_output_schema( + epiphany_core::EpiphanyRoleResultRoleId::Modeling, + ), + epiphany_core::epiphany_role_launch_output_schema( + epiphany_core::EpiphanyRoleResultRoleId::Verification, + ), + epiphany_core::epiphany_frontier_planning_output_schema(), + epiphany_core::epiphany_frontier_plan_mind_output_schema(), + epiphany_core::epiphany_imagination_consideration_output_schema(), + epiphany_core::epiphany_admitted_model_direction_consideration_output_schema(), + epiphany_core::epiphany_proposal_modeling_output_schema(), + epiphany_core::epiphany_reorient_launch_output_schema(), + ]; + + for (index, schema) in schemas.into_iter().enumerate() { + let mut request = EpiphanyOpenAiModelRequest::new( + format!("strict-worker-schema-{index}"), + "strict-worker-schema", + "gpt-5.4", + "Return the typed result.", + ); + request.output_contract_id = Some(format!("worker-schema-{index}")); + request.output_schema_json = Some(serde_json::to_string(&schema)?); + let body = epiphany_openai_codex_spine::responses_body_from_epiphany(request)?; + assert_eq!(body["text"]["format"]["strict"], true); + } + Ok(()) + } + + #[test] + fn research_contract_projects_typed_decision_to_provider_strict_shape() -> Result<()> { + let mut request = EpiphanyOpenAiModelRequest::new( + "strict-research-schema", + "strict-worker-schema", + "gpt-5.4", + "Return the typed result.", + ); + request.output_contract_id = + Some(epiphany_core::ROLE_WORKER_OUTPUT_CONTRACT_ID.to_string()); + request.output_schema_json = Some(serde_json::to_string( + &epiphany_core::epiphany_role_launch_output_schema( + epiphany_core::EpiphanyRoleResultRoleId::Research, + ), + )?); + + let body = epiphany_openai_codex_spine::responses_body_from_epiphany(request)?; + let decision = &body["text"]["format"]["schema"]["properties"]["researchDecision"]; + assert!(decision.get("anyOf").is_none()); + assert_eq!(decision["additionalProperties"], false); + assert_eq!( + decision["required"], + serde_json::json!(["evidence", "investigationCheckpoint", "observations"]) + ); + assert!(decision["properties"].get("scratch").is_none()); + assert_eq!( + decision["properties"]["investigationCheckpoint"]["anyOf"][0]["additionalProperties"], + false + ); + Ok(()) + } + #[test] fn typed_worker_budget_is_the_only_whole_request_deadline() { assert_eq!( @@ -961,7 +1030,7 @@ mod tests { let mut receipt = EpiphanyOpenAiModelReceipt::new(request_id, "gpt-test"); receipt.response_id = Some(format!("response-{request_id}")); receipt.transport = Some("test".to_string()); - record_native_model_events( + record_model_turn_events( store, &EpiphanyOpenAiRuntimeOptions { store_path: store.to_path_buf(), @@ -1389,26 +1458,7 @@ async fn run_worker_options( options: RunWorkerCliOptions, pass_progress: WorkerPassProgress, ) -> Result { - if options.auto_tools { - run_worker_launch_with_tool_continuation(options, pass_progress).await - } else { - let request_timeout = provider_request_timeout(options.max_runtime_seconds); - Ok(serde_json::to_value( - run_worker_launch_observed( - EpiphanyWorkerRuntimeOptions { - store_path: options.store_path, - codex_home: options.codex_home, - provider_credential_path: options.provider_credential_path, - provider: options.provider, - job_id: options.job_id, - model: options.model, - request_timeout, - }, - |request_id| pass_progress.note_model_request(request_id), - ) - .await?, - )?) - } + run_worker_launch(options, pass_progress).await } fn provider_request_timeout(max_runtime_seconds: Option) -> Option { @@ -1417,6 +1467,20 @@ fn provider_request_timeout(max_runtime_seconds: Option) -> Option Result { + let request = build_tool_followup_model_request( + &options.store_path, + original_request_id, + followup_request_id, + )?; + run_model_turn(provider, options, request).await +} + fn run_tool_adapter( tool_adapter_bin: &PathBuf, store_path: &PathBuf, @@ -1478,5 +1542,5 @@ fn now() -> String { } fn usage() -> &'static str { - "usage: epiphany-model-runtime [--provider openai-codex|openrouter] [--provider-credential path] [--store path] [--codex-home path] [--context-id id] [--output path] [--job-id id] [--activation-token-sha256 hex] [--default-model model] [--auto-tools --tool-adapter-bin path --mcp-config path --cwd path --max-tool-rounds n]" + "usage: epiphany-model-runtime [--provider openai-codex|openrouter] [--provider-credential path] [--store path] [--codex-home path] [--context-id id] [--output path] [--job-id id] [--activation-token-sha256 hex] [--default-model model] --tool-adapter-bin path [--mcp-config path] [--cwd path] [--max-tool-rounds n]" } diff --git a/epiphany-openai-runtime/src/bin/epiphany-persona-service.rs b/epiphany-openai-runtime/src/bin/epiphany-persona-service.rs index 86670866..691de1ba 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-persona-service.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-persona-service.rs @@ -1,4 +1,4 @@ -use std::{env, net::SocketAddr, path::PathBuf, thread, time::Duration}; +use std::{env, future::Future, net::SocketAddr, path::PathBuf, pin::Pin, thread, time::Duration}; use anyhow::{Context, Result, anyhow}; use cultcache_rs::DatabaseEntry; @@ -17,10 +17,85 @@ use epiphany_core::{ pulse_persona_social, reconcile_terminal_persona_conversation, retain_terminal_persona_conversations, validate_persona_discord_request_anchor, }; +use epiphany_model_adapter::EpiphanyModelRequest; use epiphany_openai_runtime::{ - NativePersonaModelRunner, PersonaModelExecutionPlan, execute_persona_model_turn, + EpiphanyOpenAiRuntimeOptions, PersonaModelExecutionPlan, PersonaModelRunner, + assistant_text_from_model_events, execute_persona_model_turn, }; +#[path = "../provider_transport.rs"] +mod provider_transport; + +#[derive(Clone, Debug)] +struct NativePersonaModelRunner { + store_path: PathBuf, + codex_home: PathBuf, + provider_credential_path: Option, + provider: String, + model: String, + turn_timeout: Duration, +} + +impl PersonaModelRunner for NativePersonaModelRunner { + fn run<'a>( + &'a mut self, + _store_path: &'a PathBuf, + stage: &'a str, + turn_id: &'a str, + request: EpiphanyModelRequest, + ) -> Pin> + Send + 'a>> { + Box::pin(async move { + if request.provider != self.provider || request.model != self.model { + return Err(anyhow!("Persona execution plan and model runner disagree")); + } + let replay = assistant_text_from_model_events(&self.store_path, &request.request_id)?; + if !replay.trim().is_empty() { + return Ok(replay); + } + let options = EpiphanyOpenAiRuntimeOptions { + store_path: self.store_path.clone(), + codex_home: self.codex_home.clone(), + provider_credential_path: self.provider_credential_path.clone(), + session_id: format!("persona-turn-{turn_id}"), + job_id: format!("persona-{stage}-{turn_id}"), + objective: format!("Run Persona {stage} stage for {turn_id}"), + coordinator_note: "Native Persona model executor; transport owns inference only." + .to_string(), + default_model: Some(self.model.clone()), + request_timeout: None, + }; + let summary = tokio::time::timeout( + self.turn_timeout, + provider_transport::run_model_turn( + &self.provider, + options.clone(), + request.clone(), + ), + ) + .await + .map_err(|_| { + anyhow!( + "Persona {stage} stage exceeded its {} second outer turn budget", + self.turn_timeout.as_secs() + ) + })??; + let output = assistant_text_from_model_events(&self.store_path, &request.request_id)?; + if summary.verdict != "pass" || output.trim().is_empty() { + return Err(anyhow!(if summary.verdict != "pass" { + summary.summary + } else { + format!("Persona {stage} stage completed without assistant text") + })); + } + Ok(output) + }) + } + + fn recover(&mut self, request_id: &str) -> Result { + assistant_text_from_model_events(&self.store_path, request_id) + } +} + #[tokio::main] async fn main() -> Result<()> { let options = Options::parse()?; @@ -104,22 +179,23 @@ async fn poll_once(options: &Options) -> Result { model: options.model.clone(), turn_timeout: Duration::from_secs(options.turn_timeout_seconds), }; - let model_terminal = match execute_persona_model_turn(&plan, &mut runner).await { - Ok(receipt) => receipt, - Err(error) if error.to_string().contains("braked") => return Ok(false), - Err(error) => { - complete_persona_social_turn( - &options.social_store, - PersonaTurnTerminalOptions { - request_id: request.request_id, - outcome: "failed".into(), - delivery_receipt: None, - blocked_evidence: None, - }, - )?; - return Err(error); - } - }; + let model_terminal = + match execute_persona_model_turn(&options.runtime_store, &plan, &mut runner).await { + Ok(receipt) => receipt, + Err(error) if error.to_string().contains("braked") => return Ok(false), + Err(error) => { + complete_persona_social_turn( + &options.social_store, + PersonaTurnTerminalOptions { + request_id: request.request_id, + outcome: "failed".into(), + delivery_receipt: None, + blocked_evidence: None, + }, + )?; + return Err(error); + } + }; let signer = open_persona_discord_request_identity(&options.mouth_identity_store)?; let request_anchor = load_persona_discord_service_anchor(&options.mouth_request_anchor)?; validate_persona_discord_request_anchor(&request_anchor, &options.runtime_id)?; diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index 3c17d023..3d715244 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -14,9 +14,7 @@ use epiphany_core::EpiphanyWorkerLaunchDocument; use epiphany_core::RuntimeSpineInitOptions; use epiphany_core::RuntimeSpineJobOptions; use epiphany_core::RuntimeSpineJobResultOptions; -use epiphany_core::RuntimeSpineSessionClosureOptions; use epiphany_core::RuntimeSpineSessionOptions; -use epiphany_core::close_runtime_session; use epiphany_core::complete_runtime_job; use epiphany_core::initialize_runtime_spine; use epiphany_core::open_runtime_model_execution; @@ -34,10 +32,6 @@ use epiphany_model_adapter::EpiphanyModelToolDefinition; use epiphany_openai_adapter::EpiphanyOpenAiModelRequest; use epiphany_openai_adapter::EpiphanyOpenAiStreamEvent; use epiphany_openai_adapter::EpiphanyOpenAiStreamPayload; -use epiphany_openai_codex_spine::EpiphanyCodexOpenAiTransport; -use epiphany_openai_codex_spine::EpiphanyOpenRouterTransport; -use epiphany_openai_codex_spine::auth_manager; -pub use epiphany_openai_codex_spine::default_codex_home; use epiphany_tool_adapter::EPIPHANY_TOOL_RUNTIME_ADAPTER_ID; use epiphany_tool_adapter::EpiphanyToolInvocationIntent; use epiphany_tool_adapter::EpiphanyToolInvocationReceipt; @@ -58,21 +52,12 @@ pub const DEFAULT_PROVIDER_REQUEST_TIMEOUT: Duration = Duration::from_secs(90); pub const DEFAULT_MODEL_PROVIDER: &str = "openai-codex"; pub const OPENROUTER_MODEL_PROVIDER: &str = "openrouter"; -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -enum EpiphanyProviderProfile { - OpenAiCodex, - OpenRouter, -} - -impl EpiphanyProviderProfile { - fn parse(provider: &str) -> Result { - match provider { - "openai-codex" | "openai" => Ok(Self::OpenAiCodex), - OPENROUTER_MODEL_PROVIDER => Ok(Self::OpenRouter), - _ => Err(anyhow!( - "unsupported model runtime provider {provider:?}; current providers: openai-codex, openrouter" - )), - } +fn validate_model_provider(provider: &str) -> Result<()> { + match provider { + "openai-codex" | "openai" | OPENROUTER_MODEL_PROVIDER => Ok(()), + _ => Err(anyhow!( + "unsupported model runtime provider {provider:?}; current providers: openai-codex, openrouter" + )), } } @@ -110,42 +95,20 @@ pub struct EpiphanyOpenAiRuntimeRunSummary { pub tool_intent_ids: Vec, } -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct EpiphanyWorkerRuntimeOptions { - pub store_path: PathBuf, - pub codex_home: PathBuf, - pub provider_credential_path: Option, - pub provider: String, - pub job_id: String, - pub model: String, - pub request_timeout: Option, -} - -#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize)] -#[serde(rename_all = "camelCase")] -pub struct EpiphanyWorkerRuntimeRunSummary { - pub store: String, - pub job_id: String, - pub binding_id: String, - pub role: String, - pub request_id: String, - pub openai_result_id: String, - pub worker_result_id: String, - pub verdict: String, - pub summary: String, - pub next_safe_move: String, - pub evidence_refs: Vec, - pub artifact_refs: Vec, -} - -async fn run_openai_model_turn_bound( - options: EpiphanyOpenAiRuntimeOptions, - model_request: EpiphanyModelRequest, - request: EpiphanyOpenAiModelRequest, -) -> Result { +pub fn open_model_turn( + provider: &str, + options: &EpiphanyOpenAiRuntimeOptions, + model_request: &EpiphanyModelRequest, +) -> Result { + validate_model_provider(provider)?; + if !provider_matches_request(provider, &model_request.provider) { + return Err(anyhow!( + "model request provider {:?} does not match selected provider {:?}", + model_request.provider, + provider + )); + } ensure_openai_runtime_ready(&options)?; - let provider = model_request.provider.clone(); - let profile = EpiphanyProviderProfile::parse(&provider)?; open_runtime_model_execution( &options.store_path, RuntimeSpineSessionOptions { @@ -160,189 +123,21 @@ async fn run_openai_model_turn_bound( role: OPENAI_RUNTIME_ROLE.to_string(), created_at: now(), }, - &model_request, + model_request, )?; - let events = match profile { - EpiphanyProviderProfile::OpenAiCodex => { - let auth_manager = auth_manager(options.codex_home.clone()); - let transport = EpiphanyCodexOpenAiTransport::openai(auth_manager); - collect_transport_events(transport.collect_model_events(request.clone()), &request) - .await - } - EpiphanyProviderProfile::OpenRouter => { - let credential = read_static_provider_credential( - options.provider_credential_path.as_deref(), - OPENROUTER_MODEL_PROVIDER, - )?; - let transport = EpiphanyOpenRouterTransport::new(credential, options.request_timeout)?; - collect_transport_events(transport.collect_model_events(request.clone()), &request) - .await - } - }; - record_openai_events(&options.store_path, &options, &request, &provider, &events) + Ok(openai_request_from_model_request(model_request)) } -async fn collect_transport_events( - future: F, - request: &EpiphanyOpenAiModelRequest, -) -> Vec -where - F: std::future::Future>>, -{ - match future.await { - Ok(events) => events, - Err(err) => vec![EpiphanyOpenAiStreamEvent { - request_id: request.request_id.clone(), - sequence: 0, - payload: EpiphanyOpenAiStreamPayload::Failed { - message: err.to_string(), - }, - }], - } -} - -fn read_static_provider_credential(path: Option<&Path>, provider: &str) -> Result { - let path = path.ok_or_else(|| { - anyhow!("model provider {provider:?} requires an explicit credential file") - })?; - let raw = std::fs::read_to_string(path).with_context(|| { - format!( - "failed to read {provider} credential file {}", - path.display() - ) - })?; - let credential = raw.trim(); - if credential.is_empty() || raw.trim_matches(['\r', '\n']) != credential { - return Err(anyhow!( - "model provider {provider:?} credential file is empty or contains surrounding whitespace" - )); - } - Ok(credential.to_string()) -} - -pub async fn run_model_turn( - provider: &str, - options: EpiphanyOpenAiRuntimeOptions, - request: EpiphanyModelRequest, -) -> Result { - EpiphanyProviderProfile::parse(provider)?; - if !provider_matches_request(provider, &request.provider) { - return Err(anyhow!( - "model request provider {:?} does not match selected provider {:?}", - request.provider, - provider - )); - } - let provider_request = openai_request_from_model_request(&request); - run_openai_model_turn_bound(options, request, provider_request).await -} - -pub async fn run_tool_followup_model_turn( - provider: &str, - options: EpiphanyOpenAiRuntimeOptions, - original_request_id: &str, - followup_request_id: &str, -) -> Result { - EpiphanyProviderProfile::parse(provider)?; - let request = build_tool_followup_model_request( - &options.store_path, - original_request_id, - followup_request_id, - )?; - run_model_turn(provider, options, request).await -} - -pub async fn run_worker_launch_observed( - options: EpiphanyWorkerRuntimeOptions, - on_model_request: F, -) -> Result -where - F: FnOnce(&str), -{ - let launch_request = load_worker_launch_request(&options.store_path, &options.job_id)?; - if !epiphany_core::runtime_requested_public_source_refs_for_worker( - &options.store_path, - &options.job_id, - )? - .is_empty() - { - return Err(anyhow!( - "worker {:?} has request-owned public sources and must run through the governed automatic tool route", - options.job_id - )); - } - let basis = epiphany_core::worker_reasoning_basis(&options.store_path, &launch_request)?; - epiphany_core::put_reasoning_basis(&options.store_path, &basis)?; - let model_request = - build_worker_model_request(&launch_request, &options.provider, &options.model, &basis)?; - let openai_options = EpiphanyOpenAiRuntimeOptions { - store_path: options.store_path.clone(), - codex_home: options.codex_home, - provider_credential_path: options.provider_credential_path, - session_id: worker_model_session_id(&launch_request.job_id), - job_id: format!("openai-worker-{}", launch_request.job_id), - objective: format!( - "Run Epiphany worker {} for {}", - launch_request.job_id, launch_request.binding_id - ), - coordinator_note: "Native worker runtime route; Codex is auth/model transport only." - .to_string(), - default_model: Some(options.model), - request_timeout: options.request_timeout, - }; - on_model_request(&model_request.request_id); - let openai_summary = run_model_turn( - &options.provider, - openai_options.clone(), - model_request.clone(), - ) - .await?; - let assistant_text = - assistant_text_from_model_events(&openai_options.store_path, &model_request.request_id)?; - let worker_result = complete_worker_job_from_assistant_text( - &openai_options.store_path, - &launch_request, - &model_request.request_id, - &openai_summary, - &assistant_text, - )?; - close_runtime_session( - &openai_options.store_path, - RuntimeSpineSessionClosureOptions { - session_id: openai_options.session_id.clone(), - completed_at: now(), - summary: format!( - "Worker model execution {} reached terminal result {}.", - launch_request.job_id, worker_result.result_id - ), - }, - )?; - Ok(EpiphanyWorkerRuntimeRunSummary { - store: openai_options.store_path.display().to_string(), - job_id: launch_request.job_id, - binding_id: launch_request.binding_id, - role: launch_request.role, - request_id: model_request.request_id, - openai_result_id: openai_summary.result_id, - worker_result_id: worker_result.result_id, - verdict: worker_result.verdict, - summary: worker_result.summary, - next_safe_move: worker_result.next_safe_move, - evidence_refs: worker_result.evidence_refs, - artifact_refs: worker_result.artifact_refs, - }) -} - -fn record_openai_events( +pub fn record_model_turn_events( store_path: impl AsRef, options: &EpiphanyOpenAiRuntimeOptions, - request: &EpiphanyOpenAiModelRequest, - provider: &str, + request: &EpiphanyModelRequest, events: &[EpiphanyOpenAiStreamEvent], ) -> Result { let store_path = store_path.as_ref(); + let provider_request = openai_request_from_model_request(request); let events = compact_openai_events_for_storage(events); - let tool_intents = tool_invocation_intents_from_openai_events(provider, &events); + let tool_intents = tool_invocation_intents_from_openai_events(&request.provider, &events); for intent in &tool_intents { put_runtime_tool_execution_intent( store_path, @@ -357,7 +152,7 @@ fn record_openai_events( let mut cache = runtime_spine_cache(store_path)?; cache.pull_all_backing_stores()?; for event in &events { - let model_event = model_event_from_openai_event(provider, event); + let model_event = model_event_from_openai_event(&request.provider, event); cache.put( model_event_key(&model_event.request_id, model_event.sequence), &model_event, @@ -385,12 +180,12 @@ fn record_openai_events( let summary = if let Some(message) = failure { format!( "OpenAI model request {} failed: {message}", - request.request_id + provider_request.request_id ) } else if let Some(receipt) = &receipt { format!( "OpenAI model request {} completed through {}.", - request.request_id, + provider_request.request_id, receipt .transport .clone() @@ -399,7 +194,7 @@ fn record_openai_events( } else { format!( "OpenAI model request {} ended without a terminal receipt.", - request.request_id + provider_request.request_id ) }; let result_id = format!("result-openai-{}", options.job_id); @@ -423,7 +218,7 @@ fn record_openai_events( store: store_path.display().to_string(), session_id: options.session_id.clone(), job_id: options.job_id.clone(), - request_id: request.request_id.clone(), + request_id: provider_request.request_id, event_count: events.len(), verdict: verdict.to_string(), summary, @@ -436,25 +231,6 @@ fn record_openai_events( }) } -/// Diagnostic event admission is native-request owned. The provider request -/// used for summaries and event binding is always lowered internally, never -/// supplied as an independent caller-authored document. -pub fn record_native_model_events( - store_path: impl AsRef, - options: &EpiphanyOpenAiRuntimeOptions, - request: &EpiphanyModelRequest, - events: &[EpiphanyOpenAiStreamEvent], -) -> Result { - let provider_request = epiphany_openai_adapter::request_from_native(request); - record_openai_events( - store_path, - options, - &provider_request, - &request.provider, - events, - ) -} - fn compact_openai_events_for_storage( events: &[EpiphanyOpenAiStreamEvent], ) -> Vec { @@ -2462,76 +2238,6 @@ mod tests { Ok(()) } - #[test] - fn every_static_worker_contract_projects_to_one_strict_provider_shape() -> Result<()> { - let schemas = vec![ - epiphany_core::epiphany_role_launch_output_schema( - epiphany_core::EpiphanyRoleResultRoleId::Imagination, - ), - epiphany_core::epiphany_role_launch_output_schema( - epiphany_core::EpiphanyRoleResultRoleId::Research, - ), - epiphany_core::epiphany_role_launch_output_schema( - epiphany_core::EpiphanyRoleResultRoleId::Modeling, - ), - epiphany_core::epiphany_role_launch_output_schema( - epiphany_core::EpiphanyRoleResultRoleId::Verification, - ), - epiphany_core::epiphany_frontier_planning_output_schema(), - epiphany_core::epiphany_frontier_plan_mind_output_schema(), - epiphany_core::epiphany_imagination_consideration_output_schema(), - epiphany_core::epiphany_admitted_model_direction_consideration_output_schema(), - epiphany_core::epiphany_proposal_modeling_output_schema(), - epiphany_core::epiphany_reorient_launch_output_schema(), - ]; - - for (index, schema) in schemas.into_iter().enumerate() { - let mut request = EpiphanyOpenAiModelRequest::new( - format!("strict-worker-schema-{index}"), - "strict-worker-schema", - "gpt-5.4", - "Return the typed result.", - ); - request.output_contract_id = Some(format!("worker-schema-{index}")); - request.output_schema_json = Some(serde_json::to_string(&schema)?); - let body = epiphany_openai_codex_spine::responses_body_from_epiphany(request)?; - assert_eq!(body["text"]["format"]["strict"], true); - } - Ok(()) - } - - #[test] - fn research_contract_projects_typed_decision_to_provider_strict_shape() -> Result<()> { - let mut request = EpiphanyOpenAiModelRequest::new( - "strict-research-schema", - "strict-worker-schema", - "gpt-5.4", - "Return the typed result.", - ); - request.output_contract_id = - Some(epiphany_core::ROLE_WORKER_OUTPUT_CONTRACT_ID.to_string()); - request.output_schema_json = Some(serde_json::to_string( - &epiphany_core::epiphany_role_launch_output_schema( - epiphany_core::EpiphanyRoleResultRoleId::Research, - ), - )?); - - let body = epiphany_openai_codex_spine::responses_body_from_epiphany(request)?; - let decision = &body["text"]["format"]["schema"]["properties"]["researchDecision"]; - assert!(decision.get("anyOf").is_none()); - assert_eq!(decision["additionalProperties"], false); - assert_eq!( - decision["required"], - serde_json::json!(["evidence", "investigationCheckpoint", "observations"]) - ); - assert!(decision["properties"].get("scratch").is_none()); - assert_eq!( - decision["properties"]["investigationCheckpoint"]["anyOf"][0]["additionalProperties"], - false - ); - Ok(()) - } - #[test] fn role_ingress_rejects_duplicate_top_level_fields() { let error = parse_assistant_json::( @@ -3394,8 +3100,7 @@ mod tests { payload: EpiphanyOpenAiStreamPayload::Completed { receipt }, }]; - let summary = - record_openai_events(&store, &options, &request, DEFAULT_MODEL_PROVIDER, &events)?; + let summary = record_model_turn_events(&store, &options, &native_request, &events)?; assert_eq!(summary.verdict, "pass"); assert_eq!(assistant_text_from_model_events(&store, "req-1")?, ""); @@ -3886,8 +3591,7 @@ mod tests { payload: EpiphanyOpenAiStreamPayload::Completed { receipt }, }, ]; - let summary = - record_openai_events(&store, &options, &request, DEFAULT_MODEL_PROVIDER, &events)?; + let summary = record_model_turn_events(&store, &options, &native_request, &events)?; let intent_id = summary .tool_intent_ids .first() diff --git a/epiphany-openai-runtime/src/persona_executor.rs b/epiphany-openai-runtime/src/persona_executor.rs index 3ed47d94..c09cf0cf 100644 --- a/epiphany-openai-runtime/src/persona_executor.rs +++ b/epiphany-openai-runtime/src/persona_executor.rs @@ -1,7 +1,6 @@ use std::future::Future; use std::path::{Path, PathBuf}; use std::pin::Pin; -use std::time::Duration; use anyhow::{Context, Result, anyhow}; use chrono::SecondsFormat; @@ -21,8 +20,6 @@ use epiphany_core::{ use epiphany_model_adapter::{EpiphanyModelInputItem, EpiphanyModelRequest}; use sha2::{Digest, Sha256}; -use crate::{EpiphanyOpenAiRuntimeOptions, assistant_text_from_model_events, run_model_turn}; - #[derive(Clone, Debug)] pub struct PersonaModelExecutionPlan { turn_id: String, @@ -62,16 +59,6 @@ impl PersonaModelExecutionPlan { } } -#[derive(Clone, Debug)] -pub struct NativePersonaModelRunner { - pub store_path: PathBuf, - pub codex_home: PathBuf, - pub provider_credential_path: Option, - pub provider: String, - pub model: String, - pub turn_timeout: Duration, -} - pub trait PersonaModelRunner { fn run<'a>( &'a mut self, @@ -83,79 +70,12 @@ pub trait PersonaModelRunner { fn recover(&mut self, request_id: &str) -> Result; } -impl PersonaModelRunner for NativePersonaModelRunner { - fn run<'a>( - &'a mut self, - _store_path: &'a PathBuf, - stage: &'a str, - turn_id: &'a str, - request: EpiphanyModelRequest, - ) -> Pin> + Send + 'a>> { - Box::pin(async move { - let replay = assistant_text_from_model_events(&self.store_path, &request.request_id)?; - if !replay.trim().is_empty() { - return Ok(replay); - } - let options = EpiphanyOpenAiRuntimeOptions { - store_path: self.store_path.clone(), - codex_home: self.codex_home.clone(), - provider_credential_path: self.provider_credential_path.clone(), - session_id: format!("persona-turn-{turn_id}"), - job_id: format!("persona-{stage}-{turn_id}"), - objective: format!("Run Persona {stage} stage for {turn_id}"), - coordinator_note: "Native Persona model executor; transport owns inference only." - .to_string(), - default_model: Some(self.model.clone()), - // Persona owns one outer typed turn budget. A second transport - // timer would give timeout policy two conflicting owners. - request_timeout: None, - }; - let summary = tokio::time::timeout( - self.turn_timeout, - run_model_turn(&self.provider, options.clone(), request.clone()), - ) - .await - .map_err(|_| { - anyhow!( - "Persona {stage} stage exceeded its {} second outer turn budget", - self.turn_timeout.as_secs() - ) - })??; - let output = assistant_text_from_model_events(&self.store_path, &request.request_id)?; - if summary.verdict != "pass" || output.trim().is_empty() { - let failure_summary = if summary.verdict != "pass" { - summary.summary.clone() - } else { - format!("Persona {stage} stage completed without assistant text") - }; - return Err(anyhow!(failure_summary)); - } - Ok(output) - }) - } - - fn recover(&mut self, request_id: &str) -> Result { - assistant_text_from_model_events(&self.store_path, request_id) - } -} - struct CompletedPersonaStage { receipt: PersonaModelStageReceipt, output: String, } -pub async fn execute_persona_model_turn( - plan: &PersonaModelExecutionPlan, - runner: &mut NativePersonaModelRunner, -) -> Result { - if runner.provider != plan.provider || runner.model != plan.model { - return Err(anyhow!("Persona execution plan and model runner disagree")); - } - let store_path = runner.store_path.clone(); - execute_persona_model_turn_owned(&store_path, plan, runner).await -} - -async fn execute_persona_model_turn_owned( +pub async fn execute_persona_model_turn( store_path: &PathBuf, plan: &PersonaModelExecutionPlan, runner: &mut R, @@ -828,7 +748,7 @@ mod tests { release_brake(&cultmesh)?; let mut runner = FakeRunner { calls: vec![] }; let first = - execute_persona_model_turn_owned(&store, &plan(&store, cultmesh.clone())?, &mut runner) + execute_persona_model_turn(&store, &plan(&store, cultmesh.clone())?, &mut runner) .await?; assert_eq!(runner.calls, ["projector", "persona", "interpreter"]); drop(runner); @@ -837,8 +757,7 @@ mod tests { let admitted_source = restarted_plan.source_documents[0].clone(); let mut restarted_runner = FakeRunner { calls: vec![] }; let second = - execute_persona_model_turn_owned(&store, &restarted_plan, &mut restarted_runner) - .await?; + execute_persona_model_turn(&store, &restarted_plan, &mut restarted_runner).await?; assert_eq!(first, second); assert!(restarted_runner.calls.is_empty()); for receipt_id in &second.stage_receipt_ids { @@ -876,7 +795,7 @@ mod tests { let mut runner = FakeRunner { calls: vec![] }; let escaped = plan_with_channels(&store, cultmesh, vec!["elsewhere".into()])?; assert!( - execute_persona_model_turn_owned(&store, &escaped, &mut runner) + execute_persona_model_turn(&store, &escaped, &mut runner) .await .is_err() ); diff --git a/epiphany-openai-runtime/src/provider_transport.rs b/epiphany-openai-runtime/src/provider_transport.rs new file mode 100644 index 00000000..b57af5bc --- /dev/null +++ b/epiphany-openai-runtime/src/provider_transport.rs @@ -0,0 +1,80 @@ +use std::path::Path; + +use anyhow::{Context, Result, anyhow}; +use epiphany_model_adapter::EpiphanyModelRequest; +use epiphany_openai_adapter::{EpiphanyOpenAiStreamEvent, EpiphanyOpenAiStreamPayload}; +use epiphany_openai_codex_spine::{ + EpiphanyCodexOpenAiTransport, EpiphanyOpenRouterTransport, auth_manager, +}; +use epiphany_openai_runtime::{ + EpiphanyOpenAiRuntimeOptions, EpiphanyOpenAiRuntimeRunSummary, OPENROUTER_MODEL_PROVIDER, + open_model_turn, record_model_turn_events, +}; + +pub async fn run_model_turn( + provider: &str, + options: EpiphanyOpenAiRuntimeOptions, + request: EpiphanyModelRequest, +) -> Result { + let provider_request = open_model_turn(provider, &options, &request)?; + let events = match provider { + "openai-codex" | "openai" => { + let transport = + EpiphanyCodexOpenAiTransport::openai(auth_manager(options.codex_home.clone())); + collect_transport_events( + transport.collect_model_events(provider_request), + &request.request_id, + ) + .await + } + OPENROUTER_MODEL_PROVIDER => { + let credential = read_static_provider_credential( + options.provider_credential_path.as_deref(), + OPENROUTER_MODEL_PROVIDER, + )?; + let transport = EpiphanyOpenRouterTransport::new(credential, options.request_timeout)?; + collect_transport_events( + transport.collect_model_events(provider_request), + &request.request_id, + ) + .await + } + _ => unreachable!("open_model_turn validates provider identity"), + }; + record_model_turn_events(&options.store_path, &options, &request, &events) +} + +async fn collect_transport_events(future: F, request_id: &str) -> Vec +where + F: std::future::Future>>, +{ + match future.await { + Ok(events) => events, + Err(error) => vec![EpiphanyOpenAiStreamEvent { + request_id: request_id.to_string(), + sequence: 0, + payload: EpiphanyOpenAiStreamPayload::Failed { + message: error.to_string(), + }, + }], + } +} + +fn read_static_provider_credential(path: Option<&Path>, provider: &str) -> Result { + let path = path.ok_or_else(|| { + anyhow!("model provider {provider:?} requires an explicit credential file") + })?; + let raw = std::fs::read_to_string(path).with_context(|| { + format!( + "failed to read {provider} credential file {}", + path.display() + ) + })?; + let credential = raw.trim(); + if credential.is_empty() || raw.trim_matches(['\r', '\n']) != credential { + return Err(anyhow!( + "model provider {provider:?} credential file is empty or contains surrounding whitespace" + )); + } + Ok(credential.to_string()) +} From f532c3ad00a17ed359639d9a13990c53b49208a8 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 13:41:54 +0200 Subject: [PATCH 074/340] Record provider transport boundary cut --- notes/epiphany-current-algorithmic-map.md | 14 ++++++++++- notes/epiphany-fork-implementation-plan.md | 22 ++++++++++++++++- notes/fresh-workspace-handoff.md | 27 ++++++++++++++++++--- state/ledgers.msgpack | Bin 717535 -> 718247 bytes state/map.yaml | 9 ++++--- 5 files changed, 62 insertions(+), 10 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 7b2c44d4..5694316b 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -646,6 +646,18 @@ Codex-derived code remains only where an OpenAI provider needs its earned authentication or transport. Neither owns Epiphany Mind, scheduler, route, or interface authority. +Exact `a6cf9383` makes that boundary physical in the package graph. The pure +`epiphany-openai-runtime` library opens the exact model execution, derives the +provider request, normalizes typed provider events, emits governed tool +intents, and records terminal physiology/audit without depending on a Codex +crate. One shared source module at the release-bundle edge owns concrete +Codex/OpenRouter authentication, credential reading, and network calls for the +model and Persona entrypoints. Persona keeps its three-stage family executor; +the service owns its concrete runner. Workers have one governed tool-capable +route, not a tool route plus a parallel no-tools opinion. The remaining broad +`codex-login` graph is therefore isolated supply-chain liability, not hidden +runtime-library anatomy. + ## Canonical authority map | Owner | Inputs | Outputs | Invariant | @@ -657,7 +669,7 @@ interface authority. | `current_work.rs` | keyed Mind view and exact runtime request/job/result/decision families | pure family scheduling and continuation projections | Events, timestamps, role lanes, and thread provenance cannot create or suppress work. | | coordinator policy/status | keyed Mind presence, exact current work, and the accepted continuity decision | one action/reason pair plus operator-readable role lanes | Coordinator presence is derived; no mutable coordinator head, pressure tableau, or duplicate policy wrapper exists. | | runtime worker attempt owner | immutable launch, exact process claim, typed result, job result, archival evidence | one terminal attempt authority | Scheduling, process liveness, and semantic admission remain distinct authorities. | -| model-provider boundary | sealed native model request plus explicit provider configuration and injected credential | exact internally derived provider request and transport result | Provider selection cannot author a second request truth or admit Mind state. | +| model-provider boundary | sealed native model request plus explicit provider configuration and injected credential | exact internally derived provider request and transport result | The pure runtime owns request/event admission; only release entrypoints own auth/network transport. Provider selection cannot author a second request truth or admit Mind state. | | OpenAI Responses schema projector | full native typed output schema | one provider-legal strict generation schema | Provider formatting preserves useful supported constraints but never replaces native decoding or Mind admission. | | model-pass terminal owner | sealed reasoning basis/context and typed failure class | exact transport closure plus `EpiphanyModelPassFailure` and terminal session/job result in one batch CAS | The caller cannot nominate a job/session; the context-derived binding closes role, reorient, and Persona failures without granting generic transport results decision authority. | | Substrate Gate | exact worker/job authority and requested operation | scoped grant or refusal | Access permission does not admit Mind state. | diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 8c9566c1..ae0df46e 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -224,7 +224,7 @@ Delete or demote: Keep the five-day shakedown, Ox17 deployment, and Model Atlas operational Gate 1 paused. Continue the source-subtraction and test-authority audit from exact -`ce6bff12`. The current sequence has deleted the semantic-memory/workspace-coverage +`a6cf9383`. The current sequence has deleted the semantic-memory/workspace-coverage projection system, its local daemon supervisor, and the surviving generic RepoModel profile, impossible lifecycle, producerless receipt/summary, and decorative scoring axes. Modeling consumes typed Body and keyed RepoModel state @@ -235,6 +235,14 @@ Eve/CultMesh capabilities, and a future Rider daemon will own Rider. Do not admit a fresh package until the remaining production surfaces and tests have earned their authority under the same audit. +The immediate comparison is now explicit. The release-edge `codex-login` +dependency still imports configuration, app-server protocol, telemetry, +Starlark, image, and clipboard anatomy; a pure runtime consequence test still +costs 1.869 GiB because `epiphany-core` remains broad. Audit those as owned +behavior, not as cleanup chores. A narrower OpenAI auth/refresh boundary must +preserve exact provider capability and refresh-token authority; a core split +must expose an existing semantic owner rather than invent a package taxonomy. + Model Atlas has component proofs but no live inter-swarm collaboration run. Preserve its publication, trust, transport, projection, Soul verification, Self admission, wake, brake, and Eve path until Gate 1 exercises the complete crossing. @@ -451,6 +459,18 @@ Cut in this order: net source lines. One focused OpenAI test generated 12.713 GiB across 19,134 files, so its provider/runtime dependency boundary is the next source-shape audit. Atlas remains protected for its first live inter-swarm run. + Exact `a6cf9383` resolves that boundary: concrete Codex/OpenRouter auth, + credential reading, and transport move to one release-entrypoint source + module, while `epiphany-openai-runtime` retains pure exact-request opening, + event admission, tool intent emission, and durable audit with no Codex + dependency. Persona's concrete runner moves to the Persona service. The + duplicate no-tools worker route, DTOs, CLI mode, and coordinator switch are + deleted; one governed tool-capable path remains. Provider strict-shape tests + move to the release owner. The cut removes 176 net source lines with no new + target, process, schema, or epoch. The same runtime consequence proof now + uses 1.869 GiB/2,942 files instead of 12.713 GiB/19,134. The release edge + still reaches 10.473 GiB/16,483 files through `codex-login`, which is the + next provider-edge liability. Atlas remains untouched and unaccepted. 3. **Baseline transaction landed at `9f7b164f`; operator routing at `587c56d2`; Resident continuation and keyed acceptance at `478fb923`:** baseline Body Modeling is now thread-free from unresolved Body obligation through Launch/Wait/Review and exact Mind admission. Resident and operator callers consume the same family projection and acceptance owner. Thread ID remains immutable pass provenance only. 4. **Proposal Modeling landed at `d1b031cb`:** its immutable request, worker launch, runtime attempt/result, and `Modeling.proposal_frontier` commit now own Launch/Wait/Review and admission. The aggregate launcher refuses proposal cargo; the old selector, validator, context builder, and generic-launch hint are deleted. Body and Proposal share only the exact-envelope launch CAS invariant, not a mutable family registry. Exact `b0a4978d` deletes the later duplicate launch-binding document entirely; the worker launch is the sole launch owner. 5. **Continuation vocabulary landed at `e404c105` and was named truthfully at `fc5d1a4a`:** concrete pass families share one pure `EpiphanyAgentPassContinuationAction`; their semantic requests, projections, validators, and admission owners remain separate. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 4ba79b32..6a8203dc 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,9 +2,9 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `ce6bff12` -Current pass: execution bindings reduced to identity edges; Ox17 and Atlas Gate -1 remain paused +Latest committed implementation cut: `a6cf9383` +Current pass: Codex transport quarantined at release entrypoints; Ox17 and +Atlas Gate 1 remain paused ## Orientation @@ -15,7 +15,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `ce6bff12` is the current +production symlink body and is inactive. Exact `a6cf9383` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -45,6 +45,25 @@ authorize the next capstone or Gate 1. ## What just landed +Exact `a6cf9383` quarantines concrete Codex/OpenRouter authentication, +credential reading, and network transport at the two release entrypoints that +perform inference. `epiphany-openai-runtime` now owns only exact native-request +lowering, model-execution opening, typed provider-event admission, tool intent +emission, terminal physiology, and durable audit. Its normal dependency graph +contains no Codex crate. Persona retains its three-stage/replay owner while the +concrete runner moves into the Persona service. The worker runtime has one +governed tool-capable route; the duplicate no-tools route, DTOs, CLI mode, and +coordinator switch are gone. Provider strict-shape proofs now live with the +release-owned lowering edge. The cut removes 176 net source lines without a +new crate, executable, process, schema, or epoch. Focused runtime, model, +Persona, and coordinator checks pass. The pure runtime consequence-test root +falls from 12.713 GiB/19,134 files to 1.869 GiB/2,942 files. The release-edge +test still reaches 10.473 GiB/16,483 files because `codex-login` imports config, +app-server protocol, telemetry, Starlark, image, and clipboard anatomy; that is +the next named provider-edge liability. Cleanup removed 10.5 GiB and restored +the exact 1,776,640-byte state inspector. Atlas is untouched; no live +inter-swarm collaboration has run. + Exact `ce6bff12` makes execution bindings identity edges instead of miniature copies of their owners. A model binding carries only request, session, and job identity; provider, source worker, and reasoning basis are loaded from the diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index cdd7f35e1f9f0b665c8d81b63549f06fddc6a466..8668100c1c52de3eb744fc5424b4db331b50e568 100644 GIT binary patch delta 712 zcmXYv&u-H|5XN!%*BC*CkdTl#jD$GVcI(7)8hWEb2rg7rPn^1}C-DkrcQd?Gzd;Vt~#Groq*N;ud{BjZnAE%ZnL&n-CwIt`1-Qh{?HA#df7?Za+>oze7x*@ zd2uGB2a(Isu)p7jX)Q=-uQWQ4MoU7EaA*oV+kInEADh}Efv9~6LKooqu(O7k;K7#& zgcS;hfZEf-8l}C9px{N%!1h2<+e%5nRBhs=H>PqhH}syV)WV}RmvCZcd?Ov?pwWXf zHA#eO?Q5=l$wxu()*K`;ECMfRj6MQOMxx`QPL?uTXdA&d_7Y8shvUXSi)ttzLiyR?2qZvBkL@KV~Nl71b&6z5Yn)}p! z&|LiNgv$g@xLMm)~l|GGnC=K=Sx>ZTYhEhWK_nGhDxsG#U)@D9`rdcMIRZW%#K1dLG_;+P(vx Ymr&XPhsxt%6QZgXP-`J2T8~BYADr>^s{jB1 delta 75 zcmZ4fTKoP}?G0j#yaraLMph;UQO6j#KJMA9%vi|C7~edVseLLFBM^gVW*}w(Vpbq# T17da{<^W>O?Ngb!ygmQ`$ygXy diff --git a/state/map.yaml b/state/map.yaml index d5a84e6a..06802241 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -52,8 +52,9 @@ current_status: summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v37. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. The pure OpenAI runtime library opens exact model execution and admits typed provider events; concrete Codex/OpenRouter auth and network transport exist only in release-entrypoint source. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Workers use one governed tool-capable route; no parallel no-tools mode survives. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v37. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. execution_binding_authority_cut: Exact ce6bff12 reduces model and tool execution bindings to the only facts they own. A model binding maps one native request to its runtime session and job; a tool binding maps one typed intent to its runtime session and job. Provider identity, source worker, reasoning basis, and model-request ancestry are no longer copied into bindings or compared through timestamp-shaped API arguments. Validation, retention, public-source lookup, worker terminality, decision sealing, and tool continuation reload the exact native request or tool intent. Runtime writable state advances to v37. Core, epoch refusal, transcript-free decision audit, OpenAI tool continuation, and the release-owned tool runtime pass. The cut removes 67 net source lines and leaves runtime_spine.rs at 9,300 physical lines with 50 public functions and 25 public structs. Verification generated 12.713 GiB across 19,134 files; Cargo cleanup restored the single 1.78 MiB state inspector. Atlas is untouched; no live inter-swarm collaboration has run. + provider_transport_boundary_cut: Exact a6cf9383 moves concrete Codex/OpenRouter authentication, credential reading, and network transport out of epiphany-openai-runtime and into one source module included only by the two release entrypoints that perform inference. The pure runtime library retains exact native-request lowering, model-execution opening, typed event admission, tool intent emission, terminal physiology, and audit persistence without depending on any Codex crate. Provider strict-shape proofs move to the release-owned model binary. Persona keeps its family-owned three-stage executor while its concrete runner moves to the Persona service. The duplicate worker route without governed tools plus its CLI mode, DTOs, and coordinator switch are deleted; all workers use one tool-capable route. The cut removes 176 net source lines and adds no crate, executable, process, schema, or epoch. The runtime-library consequence test falls from 12.713 GiB/19,134 files to 1.869 GiB/2,942 files; the release-edge test still reaches 10.473 GiB/16,483 files through codex-login. All focused checks pass, then cleanup restores the exact 1,776,640-byte state inspector. Atlas is untouched and no collaboration acceptance is claimed. fixed_routing_and_retention_cargo_cut: Exact ffd91c20 deletes EyesEvidencePacket.source_role_id, PersonaSocialMention.target_agent_id, and ResidentSelfRetentionHead.retained_at_millis. Each producer supplied one fixed or non-causal value and no consumer read it; the request/context, Persona queue plus turn request, and retention chain remain the real owners. Eyes packet v2, Persona mention v2, Resident Self state v3/retention head v1, and runtime v27 form a hard cut. Core and the three consuming release entrypoints compile; consequential Persona, Research, and epoch-refusal proofs pass. The maintained source delta is 6 net deletions. Atlas is untouched; no live inter-swarm collaboration has run. provider_stream_authority_cut: Exact fe118e13 makes OpenAI/OpenRouter events and receipts transient transport values. The runtime immediately normalizes them into the single persisted native model event/receipt family used by tool continuation, assistant reconstruction, terminal validation, and bounded retention. Duplicate provider writes, registrations, archive requirements, schema IDs, two public schemas/index rows, and the include-only model-runtime shell are gone; the exact provider request remains durable. Runtime advances to v28 and the catalog drops to 18 schemas. The cut removes 270 net maintained lines. Adapter 1/1, provider spine 14/14, reasoning context 8/8, runtime 23/23, model entrypoint 11/11, swarm 4/4, epoch refusal 1/1, and release construction 15/15 pass. Atlas is untouched; live inter-swarm collaboration remains unproven. cultnet_catalog_authority_cut: Exact dbed11b3 and 8bb0719b delete the hand-maintained JSON shadow registry. The nonexistent runtime-event contract and obsolete public archived-session tombstone schema disappear first. Runtime-local identity, session, job, binding, coordinator, native model/tool, and state-ledger schemas then disappear because no live CultNet provider carries them and several contradicted their Rust owners. Typed CultCache registration and owner-projected CultMesh state remain authoritative. The catalog has exactly three earned boundaries: the exact OpenAI-compatible provider request, gamecult.persona_state.v0, and epiphany.work_organ_state.v0. Parse/path/unindexed/forbidden-contract checks pass at 3/3/0/0/0. The cuts remove 850 net maintained lines. Atlas is untouched; live inter-swarm collaboration remains unproven. @@ -152,10 +153,10 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,346 physical lines, 50 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs carry only lifecycle identity/status; terminal result documents own summaries and artifacts. Generic session/job creation is gone; real family launch, model execution, and coordinator owners create runtime physiology. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, coordinator artifact/status cargo, uninhabited aggregate state-model DTO families, public registered-type catalog, duplicate Eyes acceptance documents, test-only arbitrary runtime writers, and duplicate Persona delivery evidence are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Continue the source-shape and test-liability audit after exact ce6bff12. First trace why one epiphany-openai-runtime consequence test activates the complete Codex provider graph and generated 12.713 GiB; subtract or move authority only if the same behavior can be proven across a narrower owner boundary. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, Persona consequences, exact native/provider requests, governed tool receipts, and the complete unrun Model Atlas vertical slice. Component tests are not collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,300 physical lines, 50 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs carry only lifecycle identity/status; terminal result documents own summaries and artifacts. Generic session/job creation is gone; real family launch, model execution, and coordinator owners create runtime physiology. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, coordinator artifact/status cargo, uninhabited aggregate state-model DTO families, public registered-type catalog, duplicate Eyes acceptance documents, test-only arbitrary runtime writers, and duplicate Persona delivery evidence are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. The release-edge Codex provider still pulls a broad codex-login graph that includes configuration, app-server protocol, telemetry, Starlark, image codecs, and clipboard support; the pure runtime no longer pays that cost. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Continue the source-shape and test-liability audit after exact a6cf9383. First compare two remaining liabilities by owned behavior: the release-edge codex-login dependency fan-out and epiphany-core's 1.869 GiB cost under one pure runtime consequence test. Narrow or replace the Codex authentication/refresh boundary only if exact provider capability and refresh-token authority remain sound; split core only where a smaller semantic owner already exists. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, Persona consequences, exact native/provider requests, governed tool receipts, and the complete unrun Model Atlas vertical slice. Component tests are not collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v36. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator opening are the only session/job creation owners. The spine is 9,346 physical lines with 50 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v37. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator opening are the only session/job creation owners. The spine is 9,300 physical lines with 50 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. From c873bef3b135d44bfdeebc0455d6a8ef3077b85a Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 14:01:15 +0200 Subject: [PATCH 075/340] Map standalone Codex transport migration --- notes/epiphany-current-algorithmic-map.md | 12 + notes/epiphany-fork-implementation-plan.md | 12 + notes/fresh-workspace-handoff.md | 19 +- notes/standalone-codex-transport-migration.md | 261 ++++++++++++++++++ state/ledgers.msgpack | Bin 718247 -> 719087 bytes state/map.yaml | 3 +- 6 files changed, 304 insertions(+), 3 deletions(-) create mode 100644 notes/standalone-codex-transport-migration.md diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 5694316b..333cfc9d 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -658,6 +658,18 @@ route, not a tool route plus a parallel no-tools opinion. The remaining broad `codex-login` graph is therefore isolated supply-chain liability, not hidden runtime-library anatomy. +The target boundary is the independent daemon mapped in +`notes/standalone-codex-transport-migration.md`. One credential-isolated +Yggdrasil connector already serves Ghostlight over encrypted CultNet, proving +the process seam, but its current single-caller, single-key, fixed-model, +stateless, no-tools contract and Ghostlight-owned deployment are not shared +authority. The v2 daemon independently derives and verifies the exact provider +request, returns a digest-bound transport receipt and typed events, and owns +only Codex credential/transport physiology. Once both consumers pass that +contract, Epiphany deletes its Codex spine, Codex-home/readiness plumbing, and +every compiled Codex dependency; Ghostlight deletes its copied wire law and +connector deployment path. + ## Canonical authority map | Owner | Inputs | Outputs | Invariant | diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index ae0df46e..2eb560fc 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -243,6 +243,18 @@ behavior, not as cleanup chores. A narrower OpenAI auth/refresh boundary must preserve exact provider capability and refresh-token authority; a core split must expose an existing semantic owner rather than invent a package taxonomy. +The provider decision is now a service extraction, specified by +`notes/standalone-codex-transport-migration.md`. Promote the already-proven +Ghostlight connector seam into an independently source-owned and Idunn-managed +Codex transport daemon. Its v2 contract must admit distinct callers, bind exact +native/provider request digests, return typed tool calls and terminal transport +receipts, and preserve one credential-refresh writer. Only after Epiphany and +Ghostlight pass that contract may the old paths be deleted. The completed cut +removes Epiphany's Codex spine and auth/readiness plumbing, Ghostlight's copied +wire types and connector deployment authority, and the stale bridge branch as +a production source. No dual daemon or refresh writer is an acceptable +transition state. + Model Atlas has component proofs but no live inter-swarm collaboration run. Preserve its publication, trust, transport, projection, Soul verification, Self admission, wake, brake, and Eve path until Gate 1 exercises the complete crossing. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 6a8203dc..e2ea8522 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -3,8 +3,8 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` Latest committed implementation cut: `a6cf9383` -Current pass: Codex transport quarantined at release entrypoints; Ox17 and -Atlas Gate 1 remain paused +Current pass: standalone Codex transport authority mapped; source extraction +is next; Ox17 and Atlas Gate 1 remain paused ## Orientation @@ -45,6 +45,21 @@ authorize the next capstone or Gate 1. ## What just landed +`notes/standalone-codex-transport-migration.md` is the authority and deletion +map for removing Codex transport entirely from Epiphany's process/build body. +Yggdrasil already proves the underlying process boundary through the +Ghostlight-only `epiphany-model-connector.service`, but that connector is +source-owned by stale branch `codex/epiphany-model-bridge`, deployed in +Ghostlight's Idunn transaction, limited to one caller/key/model, stateless, and +unable to return tool calls. The target is an independent Idunn-managed daemon +with one writable Codex refresh store, distinct authenticated callers, exact +native/provider request-digest receipts, typed tool-call pass-through, bounded +replay/concurrency, and redacted CultMesh health. Consumers keep prompts, +projection, tools, retries, interpretation, decisions, and admission. The hard +deletion line removes Epiphany's Codex spine/dependency/auth-readiness plumbing +and Ghostlight's copied protocol/deployment ownership. No live service, +credential, or deployment authority moved in this mapping pass. + Exact `a6cf9383` quarantines concrete Codex/OpenRouter authentication, credential reading, and network transport at the two release entrypoints that perform inference. `epiphany-openai-runtime` now owns only exact native-request diff --git a/notes/standalone-codex-transport-migration.md b/notes/standalone-codex-transport-migration.md new file mode 100644 index 00000000..484e0d0b --- /dev/null +++ b/notes/standalone-codex-transport-migration.md @@ -0,0 +1,261 @@ +# Standalone Codex Transport Migration + +## Objective + +Move Codex subscription authentication and model transport into one independent +GameCult daemon consumed by Epiphany and Ghostlight. The daemon exists to +protect one credential-refresh writer, one upstream compatibility boundary, +and one independently deployable failure domain. It owns no cognition. + +The target is a typed service boundary, not a native in-process ABI. CultNet +MessagePack over authenticated loopback transport is already proven on +Yggdrasil and keeps callers independent of the daemon's language, build graph, +and release cadence. + +## Current mechanism + +Two mechanisms currently overlap: + +1. Epiphany compiles `epiphany-openai-codex-spine` into its model and Persona + entrypoints. That crate imports vendored `codex-login` and `codex-client`. + Epiphany therefore carries Codex credential paths, readiness checks, CLI + arguments, HTTP transport, and the complete transitive Codex build graph. +2. Yggdrasil already runs `epiphany-model-connector.service` for Ghostlight. + It uses encrypted CultNet/MessagePack on loopback TCP 4103, owns a private + writable Codex home, serializes refresh through one `AuthManager`, bounds + payloads and parallelism, rejects replay/substitution, and advertises a + redacted `model.generate.structured` capability through Odin. + +The second path is source-owned by the stale +`codex/epiphany-model-bridge` branch, admits only +`ghostlight-dungeon-yggdrasil`, and is built/deployed inside Ghostlight's Idunn +transaction. Ghostlight duplicates its wire documents locally. The live proof +is useful; the ownership is not. + +## Authority map + +### Standalone Codex transport daemon + +Owner: + +- Codex-compatible credential loading and persistent refresh rotation; +- required client identity and authorization/account headers; +- exact upstream request transmission and provider response decoding; +- per-caller authentication, admission, payload/concurrency limits, and + transport replay protection; +- typed transport receipts and redacted CultMesh/Odin capability/health. + +Inputs: + +- one authenticated caller identity; +- one exact native request and its deterministically derived provider request; +- provider/model admission requested by the caller; +- an expiry bound and request identity. + +Outputs: + +- ordered typed model events; +- one typed transport receipt binding caller, native-request digest, + provider-request digest, provider/model, response identity, usage, and + terminal transport outcome. + +Derived state: + +- current health, capacity, admitted provider/model capabilities, and caller + pressure are CultMesh/Eve projections; +- the bounded replay cache is transport physiology, not decision history; +- request/provider documents returned in the receipt are evidence of bytes + transported, not daemon-owned decisions. + +Forbidden writers: + +- the daemon cannot author prompts, reasoning projections, tool policy, + decision contexts, structured outcomes, retries between agent passes, Mind + mutations, Ghostlight world mutations, or caller scheduling; +- the daemon cannot execute a returned model tool call; +- no caller may read or write the daemon's Codex credential store; +- no consumer deployment brake may gate daemon startup or same-release + continuity. + +### Epiphany + +Epiphany owns its sealed reasoning basis, exact native request, deterministic +provider lowering, tool loop, terminal context, typed result/failure, Mind +admission, and commit receipt. It stores the exact provider request locally and +accepts a daemon result only when the transport receipt binds its exact digest. +The daemon is evidence-bearing Hands physiology for inference; it is not Mind, +Self, Persona, or Modeling. + +### Ghostlight + +Ghostlight owns lived-stream projection, stage/model policy, schema, timeout, +retry, interpretation, and atomic world mutation. It stores the daemon's exact +transport receipt. It does not share a caller key, request namespace, quota, or +decision state with Epiphany. + +### Idunn + +The daemon is an independent Idunn target with its own immutable package, +deployment brake, lifecycle observation, rollback, and signed health. Neither +the Ghostlight nor Epiphany transaction builds, selects, deploys, or rolls back +the daemon. Consumer units may order softly after it or discover it through +Odin; its absence makes model work unavailable without taking either local +state owner down. + +## Shared paths + +Every Codex-backed request uses one path: + +```text +caller-owned projected state + -> caller-owned exact native request + -> pure deterministic provider lowering + -> authenticated connector invocation + -> daemon validates caller + exact request binding + -> vendored Codex auth/client transport + -> typed provider events + transport receipt + -> caller validates receipt/digests + -> caller-owned interpretation and admission +``` + +Persona, repository workers, Ghostlight fast/capable stages, retry, re-entry, +and tool-followup requests share this transport primitive. They retain their +family-specific state and consequence owners. + +## Protocol cut + +The existing v1 connector proves the transport but is not the shared contract. +The v2 hard cut must provide: + +- distinct authenticated caller keys and keyed caller admission; +- exact caller/runtime and request identity; +- exact native-request and provider-request SHA-256 binding; +- model/tool definitions, prior tool calls, and tool results; +- ordered typed text, tool-call, completion, and failure events; +- one terminal transport receipt with provider response and usage identity; +- byte-identical replay for the same caller/request/digest and refusal for a + conflicting replay; +- bounded per-caller concurrency and total payload/output limits; +- no reasoning-delta publication or transcript-retention dependency; +- provider/model capability discovery without credentials or prompt data; +- explicit refusal documents rather than connection-close ambiguity. + +The caller derives the provider request using the shared pure dialect compiler. +The daemon independently derives it from the native request and refuses a +digest mismatch before network access. This retains one canonical native +request while proving which exact provider request was transmitted. + +## Deletion line + +After both consumers pass v2 acceptance: + +### Epiphany + +- delete the `epiphany-openai-codex-spine` package; +- delete all non-vendor compiled dependencies on `codex-login`, `codex-client`, + and vendored Codex; +- delete direct Codex auth/HTTP/SSE transport construction; +- delete `--codex-home`, Codex-home creation, Codex credential readiness, and + Codex credential systemd inputs from Epiphany runtime physiology; +- move Codex header/auth/SSE verifier ownership into the daemon; +- retain only provider-neutral native requests, pure provider lowering, + OpenRouter's separately owned direct credential path, and the connector + client. + +### Ghostlight + +- delete copied connector envelope/invocation/result/model DTO definitions; +- delete its private connector crypto/framing implementation when the shared + typed client owns that law; +- delete connector build, package, selection, rollback, and witness handling + from the Ghostlight Idunn transaction; +- retain Ghostlight stage projection, model policy, timeout, receipt + validation, and world admission. + +### Infrastructure + +- delete the Epiphany-branded connector service/source identity; +- delete the single `--allowed-caller` and shared `gamecult-model` key model; +- delete Ghostlight's ownership of connector deployment; +- remove the old daemon only after the standalone daemon owns the sole writable + refresh store and both consumers pass exact receipt checks. + +No compatibility reader, dual daemon, dual refresh writer, provider-request +fallback, or prompt-shaped HTTP shim survives cutover. + +## Subtraction budget + +The migration may add one repository, one Cargo package, one daemon binary, +one typed protocol module, and one independent Idunn target. Those surfaces are +earned by credential privilege, refresh serialization, independent lifecycle, +and reuse by two live consumers. + +They must replace: + +- Epiphany's entire embedded Codex transport package and transitive build graph; +- Epiphany's Codex credential/config/readiness plumbing; +- Ghostlight's copied protocol/client definitions; +- the stale connector branch as a production source; +- the connector portion of Ghostlight's deployment transaction; +- duplicated caller-specific keys or refresh stores. + +The migration is a failure if maintained code, executable count, credential +writers, or deployment authorities increase after the old paths are deleted. + +## Build budget + +Before cutover, no local workspace-wide build is authorized. + +- The standalone daemon owns one release binary and its focused library tests. +- Epiphany checks only its connector client, pure runtime library, model binary, + Persona binary, and changed coordinator/readiness owners. +- Ghostlight checks only the shared-client integration and consequential model + stage/world-admission tests. +- Idunn performs each repository's exact full release build on Yggdrasil. +- Compiler output roots are measured and cleaned after each focused local pass. + +The expected Epiphany delta is removal of every Codex crate from `cargo tree` +for all Epiphany production targets. The current release-edge proof's 10.473 +GiB/16,483-file footprint is the pre-cut comparison. + +## Migration order + +1. Create the independent source owner from the proven connector behavior, not + by merging the stale branch into Epiphany. +2. Define and test the v2 typed contract, multi-caller isolation, exact request + binding, tool-call pass-through, refusal, replay, and redacted status. +3. Package the daemon as an independent Idunn target without changing the live + refresh writer. +4. Add Epiphany's v2 client and prove transcript-free decision audit plus tool + continuation through a fake connector. +5. Add Ghostlight's v2 client and remove its copied wire law. +6. Stop the old connector, transfer its auth store once under root custody, + start the standalone release, and prove one refresh writer. +7. Cut consumers over independently and verify exact signed health/transport + receipts. +8. Delete embedded Epiphany Codex transport and Ghostlight-owned connector + deployment in the same accepted release sequence. +9. Delete the stale connector branch only after its useful Git history is + referenced from the new repository. + +## Acceptance + +- Epiphany and Ghostlight issue concurrent requests under distinct caller keys; + neither can replay, decrypt, exhaust, or impersonate the other. +- One process and one writable Codex auth store own refresh rotation. +- Exact native/provider request substitution refuses before network access. +- A connector receipt reconstructs the exact transport basis without a model + transcript. +- Epiphany tool calls return as typed intents and execute only through + Epiphany's governed tool owner. +- Ghostlight retains its exact stage/world admission semantics. +- Daemon restart preserves auth and replay invariants without waking either + consumer's cognition. +- Either consumer may be absent or braked while the daemon and the other + consumer remain healthy. +- No Epiphany production target contains a Codex crate in its normal dependency + graph. +- Ghostlight no longer defines the connector protocol or deploys the daemon. +- Idunn independently proves daemon source, package, runtime, and signed health. +- Model Atlas remains untouched and operationally unaccepted throughout this + migration. diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 8668100c1c52de3eb744fc5424b4db331b50e568..08a53a277dd50977947473c708bcb26f65fdbd8a 100644 GIT binary patch delta 909 zcmY+CF>e$x5QVt}0z{$#L5W5}qRH;vaRP+Wp$MTAga!#g=e6f{O?LThA>hkB~wau%)ufO{;8Bgw);|JyB?z20q z``&+jzHx1_e)Ea&o)x8rDJEf+FwQdVIK@Ylg0RuMkZ7jsAd+^Lroqifwjr=h6kQu6 z6OPe~x>i9%ZOHjJq=#hmoau4nVlujJQt7Peh`siWuw6Mr15+-fvzBFYfrJSxR7XCz zIY(kEL+2C7c3PA6IFWJAS3>TeQ5D#%=OQs32AxD@PPj#z8ZgG>R98^oY2esU(E*|( z9YN!4O;d;p+(zEcg9Y28m3FFvRyAW03oF6Z53%@fR)-cCyQ;NzDOaorvo}&0!(p_~ z-Kd{pk?&7zI7T!)XgQ|1#I}x-a|U);mpG2j3@&9hxLlk%T%I~SoGENSB*jy0;Y3b` z##lV#0ne4-8FJu&7z&zCh>t*b(z#T+1^`|qYoGe*&ETLem)Lo>Xev`d(6T63=9Jk% z4rnwNaLM9#)oP;IeJx#v1M(I2Imy1N7pb)ViQDZT3<~$sS3U dJfz!uZkbbLW3G{8cqRj9ornraM73r${0rncOv?ZO delta 73 zcmaF=QG5Ao?G0j#)8BsLVrPpw#=!NZWwSD4AtPf#^HiqxsZ5MO45FEVm<5PgftU@5 R*@2h?h&i`UW#SV03;+S785;lq diff --git a/state/map.yaml b/state/map.yaml index 06802241..705036f2 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -55,6 +55,7 @@ current_status: latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. The pure OpenAI runtime library opens exact model execution and admits typed provider events; concrete Codex/OpenRouter auth and network transport exist only in release-entrypoint source. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Workers use one governed tool-capable route; no parallel no-tools mode survives. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v37. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. execution_binding_authority_cut: Exact ce6bff12 reduces model and tool execution bindings to the only facts they own. A model binding maps one native request to its runtime session and job; a tool binding maps one typed intent to its runtime session and job. Provider identity, source worker, reasoning basis, and model-request ancestry are no longer copied into bindings or compared through timestamp-shaped API arguments. Validation, retention, public-source lookup, worker terminality, decision sealing, and tool continuation reload the exact native request or tool intent. Runtime writable state advances to v37. Core, epoch refusal, transcript-free decision audit, OpenAI tool continuation, and the release-owned tool runtime pass. The cut removes 67 net source lines and leaves runtime_spine.rs at 9,300 physical lines with 50 public functions and 25 public structs. Verification generated 12.713 GiB across 19,134 files; Cargo cleanup restored the single 1.78 MiB state inspector. Atlas is untouched; no live inter-swarm collaboration has run. provider_transport_boundary_cut: Exact a6cf9383 moves concrete Codex/OpenRouter authentication, credential reading, and network transport out of epiphany-openai-runtime and into one source module included only by the two release entrypoints that perform inference. The pure runtime library retains exact native-request lowering, model-execution opening, typed event admission, tool intent emission, terminal physiology, and audit persistence without depending on any Codex crate. Provider strict-shape proofs move to the release-owned model binary. Persona keeps its family-owned three-stage executor while its concrete runner moves to the Persona service. The duplicate worker route without governed tools plus its CLI mode, DTOs, and coordinator switch are deleted; all workers use one tool-capable route. The cut removes 176 net source lines and adds no crate, executable, process, schema, or epoch. The runtime-library consequence test falls from 12.713 GiB/19,134 files to 1.869 GiB/2,942 files; the release-edge test still reaches 10.473 GiB/16,483 files through codex-login. All focused checks pass, then cleanup restores the exact 1,776,640-byte state inspector. Atlas is untouched and no collaboration acceptance is claimed. + standalone_codex_transport_target: The proven Yggdrasil Ghostlight connector is the seed for an independent Codex transport daemon, not an Epiphany organ. It will own the sole writable Codex credential/refresh store, required client identity, authenticated multi-caller transport, exact request-digest receipts, bounded replay/concurrency, and redacted CultMesh health. Epiphany and Ghostlight retain prompts, projections, tools, retries, decisions, and admission. The current connector is not the target contract: it is Epiphany-branded, source-owned by stale branch codex/epiphany-model-bridge, deployed inside Ghostlight's Idunn transaction, single-caller/single-key, fixed-model, stateless, and tool-forbidding. notes/standalone-codex-transport-migration.md owns the hard authority map, deletion line, build budget, migration order, and acceptance. No live service, credential, or deployment authority has moved yet. fixed_routing_and_retention_cargo_cut: Exact ffd91c20 deletes EyesEvidencePacket.source_role_id, PersonaSocialMention.target_agent_id, and ResidentSelfRetentionHead.retained_at_millis. Each producer supplied one fixed or non-causal value and no consumer read it; the request/context, Persona queue plus turn request, and retention chain remain the real owners. Eyes packet v2, Persona mention v2, Resident Self state v3/retention head v1, and runtime v27 form a hard cut. Core and the three consuming release entrypoints compile; consequential Persona, Research, and epoch-refusal proofs pass. The maintained source delta is 6 net deletions. Atlas is untouched; no live inter-swarm collaboration has run. provider_stream_authority_cut: Exact fe118e13 makes OpenAI/OpenRouter events and receipts transient transport values. The runtime immediately normalizes them into the single persisted native model event/receipt family used by tool continuation, assistant reconstruction, terminal validation, and bounded retention. Duplicate provider writes, registrations, archive requirements, schema IDs, two public schemas/index rows, and the include-only model-runtime shell are gone; the exact provider request remains durable. Runtime advances to v28 and the catalog drops to 18 schemas. The cut removes 270 net maintained lines. Adapter 1/1, provider spine 14/14, reasoning context 8/8, runtime 23/23, model entrypoint 11/11, swarm 4/4, epoch refusal 1/1, and release construction 15/15 pass. Atlas is untouched; live inter-swarm collaboration remains unproven. cultnet_catalog_authority_cut: Exact dbed11b3 and 8bb0719b delete the hand-maintained JSON shadow registry. The nonexistent runtime-event contract and obsolete public archived-session tombstone schema disappear first. Runtime-local identity, session, job, binding, coordinator, native model/tool, and state-ledger schemas then disappear because no live CultNet provider carries them and several contradicted their Rust owners. Typed CultCache registration and owner-projected CultMesh state remain authoritative. The catalog has exactly three earned boundaries: the exact OpenAI-compatible provider request, gamecult.persona_state.v0, and epiphany.work_organ_state.v0. Parse/path/unindexed/forbidden-contract checks pass at 3/3/0/0/0. The cuts remove 850 net maintained lines. Atlas is untouched; live inter-swarm collaboration remains unproven. @@ -154,7 +155,7 @@ current_status: yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,300 physical lines, 50 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs carry only lifecycle identity/status; terminal result documents own summaries and artifacts. Generic session/job creation is gone; real family launch, model execution, and coordinator owners create runtime physiology. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, coordinator artifact/status cargo, uninhabited aggregate state-model DTO families, public registered-type catalog, duplicate Eyes acceptance documents, test-only arbitrary runtime writers, and duplicate Persona delivery evidence are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. The release-edge Codex provider still pulls a broad codex-login graph that includes configuration, app-server protocol, telemetry, Starlark, image codecs, and clipboard support; the pure runtime no longer pays that cost. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Continue the source-shape and test-liability audit after exact a6cf9383. First compare two remaining liabilities by owned behavior: the release-edge codex-login dependency fan-out and epiphany-core's 1.869 GiB cost under one pure runtime consequence test. Narrow or replace the Codex authentication/refresh boundary only if exact provider capability and refresh-token authority remain sound; split core only where a smaller semantic owner already exists. Preserve exact identity, decision audit, conflict/replay, retry ancestry, retention fences, terminal Self provenance, typed frontier planning, Persona consequences, exact native/provider requests, governed tool receipts, and the complete unrun Model Atlas vertical slice. Component tests are not collaboration acceptance. Do not run a local full-workspace compile, package, deployment, Ox root, or Model Atlas Gate run. + next_action: Begin the standalone Codex transport migration from notes/standalone-codex-transport-migration.md. Create the independent source owner from the proven connector behavior without merging the stale bridge branch into Epiphany; prove v2 multi-caller identity, exact native/provider request digest binding, tool-call pass-through, refusal/replay, and redacted status before any consumer or live credential cutover. The accepted deletion line removes Epiphany's embedded Codex spine/build graph/auth plumbing and Ghostlight's copied wire/deployment authority. Preserve one refresh writer, exact decision audit, provider capability, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live deployment, credential transfer, Ox root, or Model Atlas Gate run. runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v37. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator opening are the only session/job creation owners. The spine is 9,300 physical lines with 50 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. From 8e555e358fb56e4b74d8c43337d853af919399cf Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 14:08:08 +0200 Subject: [PATCH 076/340] Keep native request authority with consumers --- notes/epiphany-current-algorithmic-map.md | 7 ++--- notes/epiphany-fork-implementation-plan.md | 7 ++--- notes/fresh-workspace-handoff.md | 5 ++-- notes/standalone-codex-transport-migration.md | 27 ++++++++++++------- state/map.yaml | 2 +- 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 333cfc9d..5902c629 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -663,9 +663,10 @@ The target boundary is the independent daemon mapped in Yggdrasil connector already serves Ghostlight over encrypted CultNet, proving the process seam, but its current single-caller, single-key, fixed-model, stateless, no-tools contract and Ghostlight-owned deployment are not shared -authority. The v2 daemon independently derives and verifies the exact provider -request, returns a digest-bound transport receipt and typed events, and owns -only Codex credential/transport physiology. Once both consumers pass that +authority. Each consumer internally derives its exact typed provider request; +the v2 daemon verifies those exact bytes and returns a digest-bound transport +receipt plus typed events. It owns only Codex credential/transport physiology. +Once both consumers pass that contract, Epiphany deletes its Codex spine, Codex-home/readiness plumbing, and every compiled Codex dependency; Ghostlight deletes its copied wire law and connector deployment path. diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 2eb560fc..cf63d6f3 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -246,9 +246,10 @@ must expose an existing semantic owner rather than invent a package taxonomy. The provider decision is now a service extraction, specified by `notes/standalone-codex-transport-migration.md`. Promote the already-proven Ghostlight connector seam into an independently source-owned and Idunn-managed -Codex transport daemon. Its v2 contract must admit distinct callers, bind exact -native/provider request digests, return typed tool calls and terminal transport -receipts, and preserve one credential-refresh writer. Only after Epiphany and +Codex transport daemon. Its v2 contract must admit distinct callers, bind the +consumer's native-request digest to the exact daemon-verified provider-request +bytes, return typed tool calls and terminal transport receipts, and preserve +one credential-refresh writer. Only after Epiphany and Ghostlight pass that contract may the old paths be deleted. The completed cut removes Epiphany's Codex spine and auth/readiness plumbing, Ghostlight's copied wire types and connector deployment authority, and the stale bridge branch as diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index e2ea8522..abc015d9 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -52,8 +52,9 @@ Ghostlight-only `epiphany-model-connector.service`, but that connector is source-owned by stale branch `codex/epiphany-model-bridge`, deployed in Ghostlight's Idunn transaction, limited to one caller/key/model, stateless, and unable to return tool calls. The target is an independent Idunn-managed daemon -with one writable Codex refresh store, distinct authenticated callers, exact -native/provider request-digest receipts, typed tool-call pass-through, bounded +with one writable Codex refresh store, distinct authenticated callers, +consumer-native plus daemon-verified provider-request digest receipts, typed +tool-call pass-through, bounded replay/concurrency, and redacted CultMesh health. Consumers keep prompts, projection, tools, retries, interpretation, decisions, and admission. The hard deletion line removes Epiphany's Codex spine/dependency/auth-readiness plumbing diff --git a/notes/standalone-codex-transport-migration.md b/notes/standalone-codex-transport-migration.md index 484e0d0b..65a0897c 100644 --- a/notes/standalone-codex-transport-migration.md +++ b/notes/standalone-codex-transport-migration.md @@ -48,7 +48,8 @@ Owner: Inputs: - one authenticated caller identity; -- one exact native request and its deterministically derived provider request; +- one exact typed Codex provider request derived internally by the caller's + consumer-owned adapter, plus the caller-owned native-request digest it cites; - provider/model admission requested by the caller; - an expiry bound and request identity. @@ -110,8 +111,8 @@ Every Codex-backed request uses one path: caller-owned projected state -> caller-owned exact native request -> pure deterministic provider lowering - -> authenticated connector invocation - -> daemon validates caller + exact request binding + -> authenticated connector invocation carrying those exact provider bytes + -> daemon validates caller + provider request identity/digest/policy -> vendored Codex auth/client transport -> typed provider events + transport receipt -> caller validates receipt/digests @@ -129,7 +130,8 @@ The v2 hard cut must provide: - distinct authenticated caller keys and keyed caller admission; - exact caller/runtime and request identity; -- exact native-request and provider-request SHA-256 binding; +- caller-owned native-request SHA-256 plus daemon-verified exact provider- + request SHA-256 binding; - model/tool definitions, prior tool calls, and tool results; - ordered typed text, tool-call, completion, and failure events; - one terminal transport receipt with provider response and usage identity; @@ -140,10 +142,15 @@ The v2 hard cut must provide: - provider/model capability discovery without credentials or prompt data; - explicit refusal documents rather than connection-close ambiguity. -The caller derives the provider request using the shared pure dialect compiler. -The daemon independently derives it from the native request and refuses a -digest mismatch before network access. This retains one canonical native -request while proving which exact provider request was transmitted. +Each consumer derives the provider request through its own pure adapter; the +daemon must not import Epiphany reasoning contracts or Ghostlight stage/world +contracts merely to repeat that derivation. The daemon canonicalizes and hashes +the exact typed provider request it receives, refuses a declared digest or +identity mismatch before network access, and binds the same digest into its +terminal receipt. Epiphany retains its exact native request, internally derived +provider request, and matching daemon receipt in the decision context. This +proves which provider request was transported without giving the daemon a +second opinion about consumer-native cognition. ## Deletion line @@ -243,7 +250,9 @@ GiB/16,483-file footprint is the pre-cut comparison. - Epiphany and Ghostlight issue concurrent requests under distinct caller keys; neither can replay, decrypt, exhaust, or impersonate the other. - One process and one writable Codex auth store own refresh rotation. -- Exact native/provider request substitution refuses before network access. +- Provider-request identity/digest substitution refuses before network access; + Epiphany independently refuses native-to-provider substitution before it + opens the connector invocation. - A connector receipt reconstructs the exact transport basis without a model transcript. - Epiphany tool calls return as typed intents and execute only through diff --git a/state/map.yaml b/state/map.yaml index 705036f2..1ee5c7e9 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -155,7 +155,7 @@ current_status: yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,300 physical lines, 50 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs carry only lifecycle identity/status; terminal result documents own summaries and artifacts. Generic session/job creation is gone; real family launch, model execution, and coordinator owners create runtime physiology. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, coordinator artifact/status cargo, uninhabited aggregate state-model DTO families, public registered-type catalog, duplicate Eyes acceptance documents, test-only arbitrary runtime writers, and duplicate Persona delivery evidence are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. The release-edge Codex provider still pulls a broad codex-login graph that includes configuration, app-server protocol, telemetry, Starlark, image codecs, and clipboard support; the pure runtime no longer pays that cost. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Begin the standalone Codex transport migration from notes/standalone-codex-transport-migration.md. Create the independent source owner from the proven connector behavior without merging the stale bridge branch into Epiphany; prove v2 multi-caller identity, exact native/provider request digest binding, tool-call pass-through, refusal/replay, and redacted status before any consumer or live credential cutover. The accepted deletion line removes Epiphany's embedded Codex spine/build graph/auth plumbing and Ghostlight's copied wire/deployment authority. Preserve one refresh writer, exact decision audit, provider capability, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live deployment, credential transfer, Ox root, or Model Atlas Gate run. + next_action: Begin the standalone Codex transport migration from notes/standalone-codex-transport-migration.md. Create the independent source owner from the proven connector behavior without merging the stale bridge branch into Epiphany; prove v2 multi-caller identity, consumer-native plus daemon-verified provider-request digest binding, tool-call pass-through, refusal/replay, and redacted status before any consumer or live credential cutover. The accepted deletion line removes Epiphany's embedded Codex spine/build graph/auth plumbing and Ghostlight's copied wire/deployment authority. Preserve one refresh writer, exact decision audit, provider capability, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live deployment, credential transfer, Ox root, or Model Atlas Gate run. runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v37. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator opening are the only session/job creation owners. The spine is 9,300 physical lines with 50 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. From 1ff87ab30dff7517357a969cd80ac046691178eb Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 16:10:32 +0200 Subject: [PATCH 077/340] Define pinned Codex child boundary --- notes/standalone-codex-transport-migration.md | 67 ++++++++++++++----- 1 file changed, 51 insertions(+), 16 deletions(-) diff --git a/notes/standalone-codex-transport-migration.md b/notes/standalone-codex-transport-migration.md index 65a0897c..33a035af 100644 --- a/notes/standalone-codex-transport-migration.md +++ b/notes/standalone-codex-transport-migration.md @@ -34,11 +34,17 @@ is useful; the ownership is not. ## Authority map -### Standalone Codex transport daemon +### Standalone Codex transport service Owner: -- Codex-compatible credential loading and persistent refresh rotation; +- one public daemon and one private, pinned official `codex app-server` child; +- the private app-server is the sole writer of the Codex credential store and + owns persistent refresh rotation; +- the public daemon may read the credential only after an exact `account/read` + response on their private JSONL RPC channel; ordinary requests use + `refreshToken: false`, while one ChatGPT 401 may request + `refreshToken: true` and retry only if the credential store advanced; - required client identity and authorization/account headers; - exact upstream request transmission and provider response decoding; - per-caller authentication, admission, payload/concurrency limits, and @@ -75,9 +81,20 @@ Forbidden writers: mutations, Ghostlight world mutations, or caller scheduling; - the daemon cannot execute a returned model tool call; - no caller may read or write the daemon's Codex credential store; +- the public daemon cannot write, repair, or migrate `auth.json`; +- the private app-server never receives a prompt, provider request, tool + definition, tool result, model output, or consumer identity. Its only live + RPC responsibility is authentication state; - no consumer deployment brake may gate daemon startup or same-release continuity. +The service is one public failure and deployment boundary, not necessarily one +OS process. Idunn freezes both the connector binary and the official Codex +binary by exact digest. The child communicates only over inherited stdio and a +private `CODEX_HOME`; it has no listening socket. The connector verifies the +child binary digest before spawn, verifies the initialized child's reported +Codex home, and refuses readiness when either identity drifts. + ### Epiphany Epiphany owns its sealed reasoning basis, exact native request, deterministic @@ -113,7 +130,8 @@ caller-owned projected state -> pure deterministic provider lowering -> authenticated connector invocation carrying those exact provider bytes -> daemon validates caller + provider request identity/digest/policy - -> vendored Codex auth/client transport + -> pinned official app-server refreshes the private credential store + -> daemon reads that exact refreshed credential and performs raw Responses transport -> typed provider events + transport receipt -> caller validates receipt/digests -> caller-owned interpretation and admission @@ -190,12 +208,21 @@ After both consumers pass v2 acceptance: No compatibility reader, dual daemon, dual refresh writer, provider-request fallback, or prompt-shaped HTTP shim survives cutover. +No upstream Codex crate is linked into CodexConnector. A trial optional link to +`codex-login`, `codex-api`, and their protocol graph resolved roughly 700 Cargo +packages before useful compilation and was deleted. The official binary is a +frozen package input instead. JSON is quarantined to the private official +app-server RPC and upstream HTTP/SSE boundaries; the public GameCult protocol +remains typed MessagePack. + ## Subtraction budget -The migration may add one repository, one Cargo package, one daemon binary, -one typed protocol module, and one independent Idunn target. Those surfaces are -earned by credential privilege, refresh serialization, independent lifecycle, -and reuse by two live consumers. +The migration may add one repository, one Cargo package, one public daemon +binary, one typed protocol module, one pinned official Codex package input, and +one independent Idunn target. The private app-server child is part of that one +service boundary and owns only credential refresh. Those surfaces are earned +by credential privilege, refresh serialization, independent lifecycle, and +reuse by two live consumers. They must replace: @@ -231,25 +258,31 @@ GiB/16,483-file footprint is the pre-cut comparison. by merging the stale branch into Epiphany. 2. Define and test the v2 typed contract, multi-caller isolation, exact request binding, tool-call pass-through, refusal, replay, and redacted status. -3. Package the daemon as an independent Idunn target without changing the live - refresh writer. -4. Add Epiphany's v2 client and prove transcript-free decision audit plus tool +3. Prove the pinned app-server handshake, single-writer credential refresh, + exact binary/home identity, and raw provider transport without linking any + Codex crate. +4. Package the service process tree as an independent Idunn target without + changing the live refresh writer. +5. Add Epiphany's v2 client and prove transcript-free decision audit plus tool continuation through a fake connector. -5. Add Ghostlight's v2 client and remove its copied wire law. -6. Stop the old connector, transfer its auth store once under root custody, +6. Add Ghostlight's v2 client and remove its copied wire law. +7. Stop the old connector, transfer its auth store once under root custody, start the standalone release, and prove one refresh writer. -7. Cut consumers over independently and verify exact signed health/transport +8. Cut consumers over independently and verify exact signed health/transport receipts. -8. Delete embedded Epiphany Codex transport and Ghostlight-owned connector +9. Delete embedded Epiphany Codex transport and Ghostlight-owned connector deployment in the same accepted release sequence. -9. Delete the stale connector branch only after its useful Git history is +10. Delete the stale connector branch only after its useful Git history is referenced from the new repository. ## Acceptance - Epiphany and Ghostlight issue concurrent requests under distinct caller keys; neither can replay, decrypt, exhaust, or impersonate the other. -- One process and one writable Codex auth store own refresh rotation. +- One public service and one private official app-server writer own exactly one + writable Codex auth store; the connector cannot mutate it. +- The exact pinned Codex binary and reported Codex home are part of signed + service readiness. - Provider-request identity/digest substitution refuses before network access; Epiphany independently refuses native-to-provider substitution before it opens the connector invocation. @@ -264,6 +297,8 @@ GiB/16,483-file footprint is the pre-cut comparison. consumer remain healthy. - No Epiphany production target contains a Codex crate in its normal dependency graph. +- No CodexConnector production target contains a Codex crate in its dependency + graph. - Ghostlight no longer defines the connector protocol or deploys the daemon. - Idunn independently proves daemon source, package, runtime, and signed health. - Model Atlas remains untouched and operationally unaccepted throughout this From ce22c3b11fea25414bb31d8498c48e925f65aa86 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 16:47:24 +0200 Subject: [PATCH 078/340] Record durable Codex connector boundary --- notes/epiphany-current-algorithmic-map.md | 31 +++++---- notes/epiphany-fork-implementation-plan.md | 28 ++++---- notes/fresh-workspace-handoff.md | 44 ++++++++----- notes/standalone-codex-transport-migration.md | 61 +++++++++++++----- state/ledgers.msgpack | Bin 719087 -> 719747 bytes state/map.yaml | 4 +- 6 files changed, 110 insertions(+), 58 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 5902c629..fc87856c 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -659,17 +659,24 @@ route, not a tool route plus a parallel no-tools opinion. The remaining broad runtime-library anatomy. The target boundary is the independent daemon mapped in -`notes/standalone-codex-transport-migration.md`. One credential-isolated -Yggdrasil connector already serves Ghostlight over encrypted CultNet, proving -the process seam, but its current single-caller, single-key, fixed-model, -stateless, no-tools contract and Ghostlight-owned deployment are not shared -authority. Each consumer internally derives its exact typed provider request; -the v2 daemon verifies those exact bytes and returns a digest-bound transport -receipt plus typed events. It owns only Codex credential/transport physiology. -Once both consumers pass that -contract, Epiphany deletes its Codex spine, Codex-home/readiness plumbing, and -every compiled Codex dependency; Ghostlight deletes its copied wire law and -connector deployment path. +`notes/standalone-codex-transport-migration.md`. Independent +`GameCult/CodexConnector` exact +`9da6070faa1c4a29455b2383abfaae44d9a7b229` now owns one typed multi-caller +transport package and one public daemon binary without linking a Codex crate. +Each consumer internally derives its exact typed provider request. The daemon +verifies those exact bytes, returns a digest-bound transport receipt plus typed +events, and uses a private digest-pinned official `codex app-server` child only +to own credential refresh. The child never receives cognitive input or output. + +Replay is one keyed CultCache document per caller/request identity in an owned +Redb store. `Active` is durable before provider I/O; the exact encrypted +`Completed` response is durable before socket reply. After restart, completed +work replays byte-identically and ambiguous active work refuses without +consuming unrelated live capacity. RAM retains only the current process's live +execution set. Redacted CultMesh/Odin readiness remains open before the shared +consumer cuts. Once both consumers pass that contract, Epiphany deletes its +Codex spine, Codex-home/readiness plumbing, and every compiled Codex dependency; +Ghostlight deletes its copied wire law and connector deployment path. ## Canonical authority map @@ -682,7 +689,7 @@ connector deployment path. | `current_work.rs` | keyed Mind view and exact runtime request/job/result/decision families | pure family scheduling and continuation projections | Events, timestamps, role lanes, and thread provenance cannot create or suppress work. | | coordinator policy/status | keyed Mind presence, exact current work, and the accepted continuity decision | one action/reason pair plus operator-readable role lanes | Coordinator presence is derived; no mutable coordinator head, pressure tableau, or duplicate policy wrapper exists. | | runtime worker attempt owner | immutable launch, exact process claim, typed result, job result, archival evidence | one terminal attempt authority | Scheduling, process liveness, and semantic admission remain distinct authorities. | -| model-provider boundary | sealed native model request plus explicit provider configuration and injected credential | exact internally derived provider request and transport result | The pure runtime owns request/event admission; only release entrypoints own auth/network transport. Provider selection cannot author a second request truth or admit Mind state. | +| model-provider boundary | sealed native model request plus explicit provider configuration | exact internally derived provider request and transport result | OpenRouter remains a release-owned direct boundary. Codex transport is moving to independent CodexConnector, which owns only caller admission, credential refresh, exact transport, and durable replay. Provider selection cannot author a second request truth or admit Mind state. | | OpenAI Responses schema projector | full native typed output schema | one provider-legal strict generation schema | Provider formatting preserves useful supported constraints but never replaces native decoding or Mind admission. | | model-pass terminal owner | sealed reasoning basis/context and typed failure class | exact transport closure plus `EpiphanyModelPassFailure` and terminal session/job result in one batch CAS | The caller cannot nominate a job/session; the context-derived binding closes role, reorient, and Persona failures without granting generic transport results decision authority. | | Substrate Gate | exact worker/job authority and requested operation | scoped grant or refusal | Access permission does not admit Mind state. | diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index cf63d6f3..13c7d41b 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -243,18 +243,22 @@ behavior, not as cleanup chores. A narrower OpenAI auth/refresh boundary must preserve exact provider capability and refresh-token authority; a core split must expose an existing semantic owner rather than invent a package taxonomy. -The provider decision is now a service extraction, specified by -`notes/standalone-codex-transport-migration.md`. Promote the already-proven -Ghostlight connector seam into an independently source-owned and Idunn-managed -Codex transport daemon. Its v2 contract must admit distinct callers, bind the -consumer's native-request digest to the exact daemon-verified provider-request -bytes, return typed tool calls and terminal transport receipts, and preserve -one credential-refresh writer. Only after Epiphany and -Ghostlight pass that contract may the old paths be deleted. The completed cut -removes Epiphany's Codex spine and auth/readiness plumbing, Ghostlight's copied -wire types and connector deployment authority, and the stale bridge branch as -a production source. No dual daemon or refresh writer is an acceptable -transition state. +The provider decision is a service extraction specified by +`notes/standalone-codex-transport-migration.md`. Independent +`GameCult/CodexConnector` exact +`9da6070faa1c4a29455b2383abfaae44d9a7b229` owns the v2 multi-caller contract, +exact native/provider digest binding, typed tool and terminal receipts, the +pinned official Codex credential child, raw Responses transport, and durable +keyed replay. It links no Codex crate. Active replay identity is written before +network access; the exact encrypted completion is durable before reply; +restart ambiguity refuses rather than re-executing. Redacted CultMesh/Odin +readiness is the remaining daemon source cut before consumer work. + +Then Epiphany and Ghostlight must pass their shared-client contracts before the +old paths are deleted. The completed migration removes Epiphany's Codex spine +and auth/readiness plumbing, Ghostlight's copied wire types and connector +deployment authority, and the stale bridge branch as a production source. No +dual daemon or refresh writer is an acceptable transition state. Model Atlas has component proofs but no live inter-swarm collaboration run. Preserve its publication, trust, transport, projection, Soul verification, Self diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index abc015d9..a8dcd326 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,9 +2,10 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed implementation cut: `a6cf9383` -Current pass: standalone Codex transport authority mapped; source extraction -is next; Ox17 and Atlas Gate 1 remain paused +Latest committed Epiphany boundary document: `1ff87ab3` +Current connector source: `9da6070faa1c4a29455b2383abfaae44d9a7b229` +Current pass: durable standalone Codex transport core landed; redacted +CultMesh/Odin readiness is next; Ox17 and Atlas Gate 1 remain paused ## Orientation @@ -47,19 +48,30 @@ authorize the next capstone or Gate 1. `notes/standalone-codex-transport-migration.md` is the authority and deletion map for removing Codex transport entirely from Epiphany's process/build body. -Yggdrasil already proves the underlying process boundary through the -Ghostlight-only `epiphany-model-connector.service`, but that connector is -source-owned by stale branch `codex/epiphany-model-bridge`, deployed in -Ghostlight's Idunn transaction, limited to one caller/key/model, stateless, and -unable to return tool calls. The target is an independent Idunn-managed daemon -with one writable Codex refresh store, distinct authenticated callers, -consumer-native plus daemon-verified provider-request digest receipts, typed -tool-call pass-through, bounded -replay/concurrency, and redacted CultMesh health. Consumers keep prompts, -projection, tools, retries, interpretation, decisions, and admission. The hard -deletion line removes Epiphany's Codex spine/dependency/auth-readiness plumbing -and Ghostlight's copied protocol/deployment ownership. No live service, -credential, or deployment authority moved in this mapping pass. +Independent repository `GameCult/CodexConnector` now owns one Cargo package +with one public daemon binary and no linked Codex crates. Exact +`9da6070faa1c4a29455b2383abfaae44d9a7b229` admits distinct authenticated +callers, preserves caller-native and exact provider-request digests, passes +typed text/tool/usage/failure results, and uses a digest-pinned official +`codex app-server` child only as the private credential writer. The connector +performs Responses HTTP/SSE transport itself; the child never sees prompts, +tools, model output, or consumer identity. + +Replay authority is now keyed CultCache over an owned Redb store rather than a +volatile map or whole-file rewrite. The daemon seals `Active` before provider +I/O and replaces it with the exact encrypted `Completed` response before +socket reply. Completed retries survive restart byte-for-byte; a restart-era +active identity returns explicit `Indeterminate` and never re-executes. A +non-secret connection-key epoch detects rotation without persisting a +secret-derived verifier. Focused native acceptance passes 22/22 plus exact +library/binary checks and Clippy. The disposable target peaked at 625 MiB and +was removed completely. + +Redacted CultMesh/Odin publication, Epiphany and Ghostlight shared-client cuts, +the independent Idunn target, and deletion of the old embedded/copied paths +remain open. Consumers keep prompts, projections, tools, retries, +interpretation, decisions, and admission. No live service, credential, or +deployment authority has moved. Exact `a6cf9383` quarantines concrete Codex/OpenRouter authentication, credential reading, and network transport at the two release entrypoints that diff --git a/notes/standalone-codex-transport-migration.md b/notes/standalone-codex-transport-migration.md index 33a035af..1d69039a 100644 --- a/notes/standalone-codex-transport-migration.md +++ b/notes/standalone-codex-transport-migration.md @@ -32,6 +32,30 @@ The second path is source-owned by the stale transaction. Ghostlight duplicates its wire documents locally. The live proof is useful; the ownership is not. +## Current cut status + +Independent `GameCult/CodexConnector` exact +`9da6070faa1c4a29455b2383abfaae44d9a7b229` completes migration steps 1-3 +except redacted CultMesh/Odin publication. It owns one Cargo package, one +public daemon binary, the v2 multi-caller encrypted MessagePack contract, +caller-native and exact provider-request digest binding, typed tool/result +transport, a private digest-pinned official `codex app-server` credential +child, raw Responses HTTP/SSE, and durable keyed replay. It links no Codex +crate. + +Replay uses one CultCache document per caller/request identity in an owned Redb +store. The daemon persists `Active` before provider I/O and replaces it with +the exact encrypted `Completed` response before socket reply. Completed replay +survives restart byte-for-byte. A restart-era active record returns explicit +`Indeterminate` and never re-executes; it does not consume current-process +capacity for unrelated identities. Replay records do not disappear merely +because request admission expiry elapsed. A non-secret connection-key epoch +detects rotation without persisting a secret-derived verifier. + +Focused native acceptance passes 22/22 plus exact library/binary checks and +Clippy. The disposable target peaked at 625 MiB and was removed. No live +service, credential, consumer, or deployment authority has moved. + ## Authority map ### Standalone Codex transport service @@ -70,7 +94,8 @@ Derived state: - current health, capacity, admitted provider/model capabilities, and caller pressure are CultMesh/Eve projections; -- the bounded replay cache is transport physiology, not decision history; +- keyed replay records are transport physiology, not decision history; they + remain durable until a separately proven retirement law exists; - request/provider documents returned in the receipt are evidence of bytes transported, not daemon-owned decisions. @@ -153,7 +178,8 @@ The v2 hard cut must provide: - model/tool definitions, prior tool calls, and tool results; - ordered typed text, tool-call, completion, and failure events; - one terminal transport receipt with provider response and usage identity; -- byte-identical replay for the same caller/request/digest and refusal for a +- durable byte-identical replay for the same caller/request/digest, explicit + indeterminate refusal after a crash-era active claim, and refusal for a conflicting replay; - bounded per-caller concurrency and total payload/output limits; - no reasoning-delta publication or transcript-retention dependency; @@ -254,25 +280,28 @@ GiB/16,483-file footprint is the pre-cut comparison. ## Migration order -1. Create the independent source owner from the proven connector behavior, not - by merging the stale branch into Epiphany. -2. Define and test the v2 typed contract, multi-caller isolation, exact request - binding, tool-call pass-through, refusal, replay, and redacted status. -3. Prove the pinned app-server handshake, single-writer credential refresh, - exact binary/home identity, and raw provider transport without linking any - Codex crate. -4. Package the service process tree as an independent Idunn target without +1. Landed: create the independent source owner from the proven connector + behavior without merging the stale branch into Epiphany. +2. Landed except redacted status: define and test the v2 typed contract, + multi-caller isolation, exact request binding, tool-call pass-through, + refusal, and durable replay. +3. Landed in focused source acceptance: prove the pinned app-server handshake, + single-writer credential refresh, exact binary/home identity, and raw + provider transport without linking any Codex crate. +4. Publish redacted CultMesh/Odin readiness without credential, account, + prompt, replay, or decision cargo. +5. Package the service process tree as an independent Idunn target without changing the live refresh writer. -5. Add Epiphany's v2 client and prove transcript-free decision audit plus tool +6. Add Epiphany's v2 client and prove transcript-free decision audit plus tool continuation through a fake connector. -6. Add Ghostlight's v2 client and remove its copied wire law. -7. Stop the old connector, transfer its auth store once under root custody, +7. Add Ghostlight's v2 client and remove its copied wire law. +8. Stop the old connector, transfer its auth store once under root custody, start the standalone release, and prove one refresh writer. -8. Cut consumers over independently and verify exact signed health/transport +9. Cut consumers over independently and verify exact signed health/transport receipts. -9. Delete embedded Epiphany Codex transport and Ghostlight-owned connector +10. Delete embedded Epiphany Codex transport and Ghostlight-owned connector deployment in the same accepted release sequence. -10. Delete the stale connector branch only after its useful Git history is +11. Delete the stale connector branch only after its useful Git history is referenced from the new repository. ## Acceptance diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 08a53a277dd50977947473c708bcb26f65fdbd8a..b3f50700c8e4b6af19a1527df349f49fd2ec448e 100644 GIT binary patch delta 717 zcmXw1J#Q015XI&r5Q&0@4rwIH*x1=zKAcqGDg_`Rs#MJFj^oAa-OKJ?lB-;#;13Y- zH;^b05;cDZ(SSq)@9emE+Pj&(_ujm@pTD-Q{%n1I+<90W7W;?W>g30*&A;!yJnfuy zI_1@M_rrC!1GMLD;0|yXxCd+i_kjmrue+NkzaM@4riN;-KRoEG;_Wv0KK=W?@nq38 z<6z`+9K08uLnOImooQrvZ@534FmLOE)u`CrE!ED!4wooNQJ4|$mr9Lj&NE3ArE=Vm zsUw$8$a)H1XeNyq8rLq5Sx<%Dh$(SZhiIshNSfWkNgPBut0iT!MtrupIi%-0+jH6ZartA3!A5*2EPk>X8kGEK8i!fkZa9ru2^Fl z5U#?t!S@jf#gIAUg+RJU#N^RPqN8MzD(GpC*c((ad|T{eU=SKQ$2qZ>9&1`|t+fg# zm;rGno1i^#*3ZN|qgT*?i%HOsF~nL+mDy{A$f>O;HBjn3Rjy7qNjh5&O6(51(lZ!? xiLtX))f`dA`u5Z=y|gdL*i?nITr{FQh3gA$e}Q>`NeGA4{9GfShyZBS_z&$%{gD6w delta 75 zcmZqvuKoU__69LVULz|511nRrsACLV-_LATW-Mf6Ol+RY)IODo5r{!FGZ3=?F)I+W S0Wmuea{w{t_Nh! Date: Mon, 24 Aug 2026 17:57:06 +0200 Subject: [PATCH 079/340] Extract Codex transport from Epiphany --- Cargo.lock | 5054 +---------------- Cargo.toml | 7 +- .../src/bin/epiphany-mvp-coordinator.rs | 60 +- epiphany-core/src/bin/epiphany-swarm.rs | 8 +- epiphany-core/src/current_work.rs | 2 +- epiphany-core/src/resident_readiness.rs | 38 +- epiphany-core/src/resident_self.rs | 19 +- epiphany-core/src/runtime_spine.rs | 5 +- epiphany-model-adapter/src/lib.rs | 18 +- epiphany-openai-adapter/Cargo.toml | 3 + epiphany-openai-adapter/src/lib.rs | 706 ++- epiphany-openai-codex-spine/Cargo.toml | 21 - epiphany-openai-codex-spine/src/lib.rs | 1960 ------- .../src/bin/epiphany-openai-runtime.rs | 158 +- .../src/bin/epiphany-persona-service.rs | 25 +- epiphany-openai-runtime/src/lib.rs | 115 +- .../src/provider_transport.rs | 308 +- 17 files changed, 1410 insertions(+), 7097 deletions(-) delete mode 100644 epiphany-openai-codex-spine/Cargo.toml delete mode 100644 epiphany-openai-codex-spine/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 8b65eae1..0470736e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,22 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - [[package]] name = "aead" version = "0.5.2" @@ -53,19 +37,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "getrandom 0.3.4", - "once_cell", - "version_check", - "zerocopy", -] - [[package]] name = "aho-corasick" version = "1.1.5" @@ -75,36 +46,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "allocative" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fac2ce611db8b8cee9b2aa886ca03c924e9da5e5295d0dbd0526e5d0b0710f7" -dependencies = [ - "allocative_derive", - "bumpalo", - "ctor", - "hashbrown 0.14.5", - "num-bigint", -] - -[[package]] -name = "allocative_derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe233a377643e0fc1a56421d7c90acdec45c291b30345eb9f08e8d0ddce5a4ab" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - [[package]] name = "android_system_properties" version = "0.1.6" @@ -114,256 +55,12 @@ dependencies = [ "libc", ] -[[package]] -name = "annotate-snippets" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccaf7e9dfbb6ab22c82e473cd1a8a7bd313c19a5b7e40970f3d89ef5a5c9e81e" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "anstream" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" - -[[package]] -name = "anstyle-parse" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" -dependencies = [ - "anstyle", - "once_cell_polyfill", - "windows-sys 0.61.2", -] - [[package]] name = "anyhow" version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" -[[package]] -name = "ascii" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" - -[[package]] -name = "ascii-canvas" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" -dependencies = [ - "term", -] - -[[package]] -name = "asn1-rs" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f43a50ac4fdca5df8e885c21b835997f0a1cdee65494a6847694a98652d9d8" -dependencies = [ - "asn1-rs-derive", - "asn1-rs-impl", - "displaydoc", - "nom 7.1.3", - "num-traits", - "rusticata-macros", - "thiserror 2.0.20", - "time", -] - -[[package]] -name = "asn1-rs-derive" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", - "synstructure", -] - -[[package]] -name = "asn1-rs-impl" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "async-broadcast" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" -dependencies = [ - "event-listener", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-channel" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-executor" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "pin-project-lite", - "slab", -] - -[[package]] -name = "async-fs" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" -dependencies = [ - "async-lock", - "blocking", - "futures-lite", -] - -[[package]] -name = "async-io" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" -dependencies = [ - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite", - "parking", - "polling", - "rustix", - "slab", - "windows-sys 0.61.2", -] - -[[package]] -name = "async-lock" -version = "3.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" -dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-process" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" -dependencies = [ - "async-channel", - "async-io", - "async-lock", - "async-signal", - "async-task", - "blocking", - "cfg-if", - "event-listener", - "futures-lite", - "rustix", -] - -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "async-signal" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" -dependencies = [ - "async-io", - "async-lock", - "atomic-waker", - "cfg-if", - "futures-core", - "futures-io", - "rustix", - "signal-hook-registry", - "slab", - "windows-sys 0.61.2", -] - -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - [[package]] name = "async-trait" version = "0.1.92" @@ -375,16 +72,6 @@ dependencies = [ "syn 3.0.3", ] -[[package]] -name = "asynk-strim" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52697735bdaac441a29391a9e97102c74c6ef0f9b60a40cf109b1b404e29d2f6" -dependencies = [ - "futures-core", - "pin-project-lite", -] - [[package]] name = "atomic-waker" version = "1.1.2" @@ -404,7 +91,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce2b2dcc879c3bae0d371e77c99f2238400ef24ec001394befa67b6e543add9e" dependencies = [ "aws-lc-sys", - "untrusted 0.7.1", "zeroize", ] @@ -427,63 +113,24 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" + [[package]] name = "base64ct" version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" -[[package]] -name = "beef" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec 0.6.3", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bit-vec" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71798fca2c1fe1086445a7258a4bc81e6e49dcd24c8d0dd9a1e57395b603f51" -dependencies = [ - "serde", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - [[package]] name = "bitflags" version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" -[[package]] -name = "blake2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest", -] - [[package]] name = "block-buffer" version = "0.10.4" @@ -493,15 +140,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "block-padding" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" -dependencies = [ - "generic-array", -] - [[package]] name = "block2" version = "0.6.2" @@ -511,38 +149,6 @@ dependencies = [ "objc2", ] -[[package]] -name = "blocking" -version = "1.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" -dependencies = [ - "async-channel", - "async-task", - "futures-io", - "futures-lite", - "piper", -] - -[[package]] -name = "borsh" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a88b7ea17d208c4193f2c1e6de3c35fe71f98c96982d5ced308bdcc749ff6e1f" -dependencies = [ - "bytes", - "cfg_aliases 0.2.2", -] - -[[package]] -name = "bs58" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" -dependencies = [ - "tinyvec", -] - [[package]] name = "bstr" version = "1.13.0" @@ -559,39 +165,12 @@ version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" -[[package]] -name = "bytemuck" -version = "1.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "byteorder-lite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" - [[package]] name = "bytes" version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" -[[package]] -name = "cbc" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" -dependencies = [ - "cipher", -] - [[package]] name = "cc" version = "1.4.2" @@ -601,7 +180,7 @@ dependencies = [ "find-msvc-tools", "jobserver", "libc", - "shlex 2.0.1", + "shlex", ] [[package]] @@ -610,12 +189,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - [[package]] name = "cfg_aliases" version = "0.2.2" @@ -633,17 +206,6 @@ dependencies = [ "rand_core 0.10.1", ] -[[package]] -name = "chardetng" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b8f0b65b7b08ae3c8187e8d77174de20cb6777864c6b832d8ad365999cf1ea" -dependencies = [ - "cfg-if", - "encoding_rs", - "memchr", -] - [[package]] name = "chrono" version = "0.4.45" @@ -658,12 +220,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "chunked_transfer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" - [[package]] name = "cipher" version = "0.4.4" @@ -672,56 +228,6 @@ checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ "crypto-common", "inout", - "zeroize", -] - -[[package]] -name = "clap" -version = "4.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim 0.11.1", -] - -[[package]] -name = "clap_derive" -version = "4.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "clap_lex" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" - -[[package]] -name = "clipboard-win" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" -dependencies = [ - "error-code", ] [[package]] @@ -734,435 +240,21 @@ dependencies = [ ] [[package]] -name = "cmp_any" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9b18233253483ce2f65329a24072ec414db782531bdbb7d0bbc4bd2ce6b7e21" - -[[package]] -name = "codex-agent-identity" -version = "0.0.0" +name = "codex-connector" +version = "0.1.0" +source = "git+https://github.com/GameCult/CodexConnector?rev=54d8bc2525b7e7fa1b9dd26b95871247ff4c7566#54d8bc2525b7e7fa1b9dd26b95871247ff4c7566" dependencies = [ - "anyhow", - "base64", - "chrono", - "codex-protocol", - "crypto_box", - "ed25519-dalek", - "rand 0.9.5", - "reqwest 0.12.28", + "aes-gcm", + "base64 0.23.1", + "rand_core 0.6.4", + "rmp-serde", "serde", "serde_json", "sha2", + "thiserror", + "zeroize", ] -[[package]] -name = "codex-api" -version = "0.0.0" -dependencies = [ - "async-channel", - "async-trait", - "base64", - "bytes", - "chrono", - "codex-client", - "codex-protocol", - "codex-utils-rustls-provider", - "eventsource-stream", - "futures", - "http", - "regex-lite", - "reqwest 0.12.28", - "serde", - "serde_json", - "thiserror 2.0.20", - "tokio", - "tokio-tungstenite", - "tokio-util", - "tracing", - "tungstenite", - "url", -] - -[[package]] -name = "codex-app-server-protocol" -version = "0.0.0" -dependencies = [ - "anyhow", - "clap", - "codex-experimental-api-macros", - "codex-protocol", - "codex-shell-command", - "codex-utils-absolute-path", - "inventory", - "rmcp 0.15.0", - "schemars 0.8.22", - "serde", - "serde_json", - "serde_with", - "strum_macros", - "thiserror 2.0.20", - "tracing", - "ts-rs", - "uuid", -] - -[[package]] -name = "codex-async-utils" -version = "0.0.0" -dependencies = [ - "async-trait", - "tokio", - "tokio-util", -] - -[[package]] -name = "codex-client" -version = "0.0.0" -dependencies = [ - "async-trait", - "bytes", - "codex-utils-rustls-provider", - "eventsource-stream", - "futures", - "http", - "opentelemetry", - "rand 0.9.5", - "reqwest 0.12.28", - "rustls", - "rustls-native-certs", - "rustls-pki-types", - "serde", - "serde_json", - "thiserror 2.0.20", - "tokio", - "tracing", - "tracing-opentelemetry", - "zstd", -] - -[[package]] -name = "codex-config" -version = "0.0.0" -dependencies = [ - "anyhow", - "async-trait", - "codex-app-server-protocol", - "codex-execpolicy", - "codex-features", - "codex-model-provider-info", - "codex-network-proxy", - "codex-protocol", - "codex-utils-absolute-path", - "codex-utils-path", - "dns-lookup", - "futures", - "gethostname", - "libc", - "multimap", - "schemars 0.8.22", - "serde", - "serde_json", - "serde_path_to_error", - "sha2", - "thiserror 2.0.20", - "tokio", - "toml", - "toml_edit 0.24.1+spec-1.1.0", - "tracing", - "wildmatch", - "winapi-util", -] - -[[package]] -name = "codex-execpolicy" -version = "0.0.0" -dependencies = [ - "anyhow", - "clap", - "codex-utils-absolute-path", - "multimap", - "serde", - "serde_json", - "shlex 1.3.0", - "starlark", - "thiserror 2.0.20", -] - -[[package]] -name = "codex-experimental-api-macros" -version = "0.0.0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "codex-features" -version = "0.0.0" -dependencies = [ - "codex-otel", - "codex-protocol", - "schemars 0.8.22", - "serde", - "toml", - "tracing", -] - -[[package]] -name = "codex-keyring-store" -version = "0.0.0" -dependencies = [ - "keyring", - "tracing", -] - -[[package]] -name = "codex-login" -version = "0.0.0" -dependencies = [ - "async-trait", - "base64", - "chrono", - "codex-agent-identity", - "codex-app-server-protocol", - "codex-client", - "codex-config", - "codex-keyring-store", - "codex-model-provider-info", - "codex-otel", - "codex-protocol", - "codex-terminal-detection", - "codex-utils-template", - "once_cell", - "os_info", - "rand 0.9.5", - "reqwest 0.12.28", - "serde", - "serde_json", - "sha2", - "thiserror 2.0.20", - "tiny_http", - "tokio", - "tracing", - "url", - "urlencoding", - "webbrowser", -] - -[[package]] -name = "codex-model-provider-info" -version = "0.0.0" -dependencies = [ - "codex-api", - "codex-app-server-protocol", - "codex-protocol", - "http", - "schemars 0.8.22", - "serde", -] - -[[package]] -name = "codex-network-proxy" -version = "0.0.0" -dependencies = [ - "anyhow", - "async-trait", - "chrono", - "clap", - "codex-utils-absolute-path", - "codex-utils-home-dir", - "codex-utils-rustls-provider", - "globset", - "rama-core", - "rama-http", - "rama-http-backend", - "rama-net", - "rama-socks5", - "rama-tcp", - "rama-tls-rustls", - "rama-unix", - "serde", - "serde_json", - "thiserror 2.0.20", - "time", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "codex-otel" -version = "0.0.0" -dependencies = [ - "chrono", - "codex-api", - "codex-app-server-protocol", - "codex-protocol", - "codex-utils-absolute-path", - "codex-utils-string", - "eventsource-stream", - "gethostname", - "http", - "opentelemetry", - "opentelemetry-appender-tracing", - "opentelemetry-otlp", - "opentelemetry-semantic-conventions", - "opentelemetry_sdk", - "os_info", - "reqwest 0.12.28", - "serde", - "serde_json", - "strum_macros", - "thiserror 2.0.20", - "tokio", - "tokio-tungstenite", - "tracing", - "tracing-opentelemetry", - "tracing-subscriber", -] - -[[package]] -name = "codex-protocol" -version = "0.0.0" -dependencies = [ - "chardetng", - "chrono", - "codex-async-utils", - "codex-execpolicy", - "codex-network-proxy", - "codex-utils-absolute-path", - "codex-utils-image", - "codex-utils-string", - "codex-utils-template", - "encoding_rs", - "globset", - "icu_decimal", - "icu_locale_core", - "icu_provider", - "landlock", - "quick-xml", - "reqwest 0.12.28", - "schemars 0.8.22", - "seccompiler", - "serde", - "serde_json", - "serde_with", - "strum", - "strum_macros", - "sys-locale", - "thiserror 2.0.20", - "tokio", - "tracing", - "ts-rs", - "uuid", -] - -[[package]] -name = "codex-shell-command" -version = "0.0.0" -dependencies = [ - "base64", - "codex-protocol", - "codex-utils-absolute-path", - "once_cell", - "regex", - "serde", - "serde_json", - "shlex 1.3.0", - "tree-sitter", - "tree-sitter-bash", - "url", - "which", -] - -[[package]] -name = "codex-terminal-detection" -version = "0.0.0" -dependencies = [ - "tracing", -] - -[[package]] -name = "codex-utils-absolute-path" -version = "0.0.0" -dependencies = [ - "dirs", - "dunce", - "schemars 0.8.22", - "serde", - "ts-rs", -] - -[[package]] -name = "codex-utils-cache" -version = "0.0.0" -dependencies = [ - "lru", - "sha1", - "tokio", -] - -[[package]] -name = "codex-utils-home-dir" -version = "0.0.0" -dependencies = [ - "codex-utils-absolute-path", - "dirs", -] - -[[package]] -name = "codex-utils-image" -version = "0.0.0" -dependencies = [ - "base64", - "codex-utils-cache", - "image", - "mime_guess", - "thiserror 2.0.20", - "tokio", -] - -[[package]] -name = "codex-utils-path" -version = "0.0.0" -dependencies = [ - "codex-utils-absolute-path", - "dunce", - "tempfile", -] - -[[package]] -name = "codex-utils-rustls-provider" -version = "0.0.0" -dependencies = [ - "rustls", -] - -[[package]] -name = "codex-utils-string" -version = "0.0.0" -dependencies = [ - "regex-lite", -] - -[[package]] -name = "codex-utils-template" -version = "0.0.0" - -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - -[[package]] -name = "colorchoice" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" - [[package]] name = "combine" version = "4.6.7" @@ -1173,102 +265,12 @@ dependencies = [ "memchr", ] -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-hex" -version = "1.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e2a781ebdf4467d1428dc4593067825fb646f6871475098d8577421af73558" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "proptest", - "serde_core", -] - [[package]] name = "const-oid" version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" -[[package]] -name = "const_format" -version = "0.2.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" -dependencies = [ - "const_format_proc_macros", - "konst", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "convert_case" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "cookie" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a373e3602691c3cdea496d2f0ee5935151e6168fe87739483c463db1b2f2f87" -dependencies = [ - "percent-encoding", - "time", - "version_check", -] - -[[package]] -name = "cookie_store" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b2c103cf610ec6cae3da84a766285b42fd16aad564758459e6ecf128c75206" -dependencies = [ - "cookie", - "document-features", - "idna", - "log", - "publicsuffix", - "serde", - "serde_derive", - "serde_json", - "time", - "url", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation" version = "0.10.1" @@ -1303,30 +305,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "critical-section" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" - -[[package]] -name = "crossbeam-channel" -version = "0.5.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" -dependencies = [ - "crossbeam-utils", -] - [[package]] name = "crossbeam-deque" version = "0.8.7" @@ -1352,12 +330,6 @@ version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" -[[package]] -name = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - [[package]] name = "crypto-common" version = "0.1.7" @@ -1369,67 +341,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "crypto_box" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16182b4f39a82ec8a6851155cc4c0cda3065bb1db33651726a29e1951de0f009" -dependencies = [ - "aead", - "blake2", - "crypto_secretbox", - "curve25519-dalek", - "salsa20", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto_secretbox" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d6cf87adf719ddf43a805e92c6870a531aedda35ff640442cbaf8674e141e1" -dependencies = [ - "aead", - "cipher", - "generic-array", - "poly1305", - "salsa20", - "subtle", - "zeroize", -] - -[[package]] -name = "csv" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" -dependencies = [ - "csv-core", - "itoa", - "ryu", - "serde_core", -] - -[[package]] -name = "csv-core" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" -dependencies = [ - "memchr", -] - -[[package]] -name = "ctor" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" -dependencies = [ - "quote", - "syn 1.0.109", -] - [[package]] name = "ctr" version = "0.9.2" @@ -1446,7 +357,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0b1fab2ae45819af2d0731d60f2afe17227ebb1a1538a236da84c93e9a60162" dependencies = [ "dispatch2", - "nix 0.31.3", + "nix", "windows-sys 0.61.2", ] @@ -1494,7 +405,7 @@ version = "0.1.0" dependencies = [ "aes-gcm", "anyhow", - "base64", + "base64 0.22.1", "chrono", "cultcache-rs", "ed25519-dalek", @@ -1540,86 +451,6 @@ dependencies = [ "syn 2.0.119", ] -[[package]] -name = "darling" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" -dependencies = [ - "ident_case", - "proc-macro2", - "quote", - "strsim 0.11.1", - "syn 2.0.119", -] - -[[package]] -name = "darling_macro" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "data-encoding" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" - -[[package]] -name = "dbus" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab69f03cc8c4340c9c8e315114e1658e6775a9b16a04357973aa21cec22b32e" -dependencies = [ - "libc", - "libdbus-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "dbus-secret-service" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "708b509edf7889e53d7efb0ffadd994cc6c2345ccb62f55cfd6b0682165e4fa6" -dependencies = [ - "aes", - "block-padding", - "cbc", - "dbus", - "fastrand", - "hkdf", - "num", - "once_cell", - "sha2", - "zeroize", -] - -[[package]] -name = "debugserver-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf6834a70ed14e8e4e41882df27190bea150f1f6ecf461f1033f8739cd8af4a" -dependencies = [ - "schemafy", - "serde", - "serde_json", -] - [[package]] name = "der" version = "0.7.10" @@ -1630,62 +461,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "der-parser" -version = "10.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" -dependencies = [ - "asn1-rs", - "displaydoc", - "nom 7.1.3", - "num-bigint", - "num-traits", - "rusticata-macros", -] - -[[package]] -name = "deranged" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" -dependencies = [ - "serde_core", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "syn 2.0.119", - "unicode-xid", -] - [[package]] name = "diff" version = "0.1.13" @@ -1703,70 +478,18 @@ dependencies = [ "subtle", ] -[[package]] -name = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users 0.5.2", - "windows-sys 0.61.2", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users 0.4.6", - "winapi", -] - [[package]] name = "dispatch2" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.13.1", + "bitflags", "block2", "libc", "objc2", ] -[[package]] -name = "display_container" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a110a75c96bedec8e65823dea00a1d710288b7a369d95fd8a0f5127639466fa" -dependencies = [ - "either", - "indenter", -] - [[package]] name = "displaydoc" version = "0.2.7" @@ -1778,53 +501,12 @@ dependencies = [ "syn 3.0.3", ] -[[package]] -name = "dns-lookup" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e39034cee21a2f5bbb66ba0e3689819c4bb5d00382a282006e802a7ffa6c41d" -dependencies = [ - "cfg-if", - "libc", - "socket2 0.6.5", - "windows-sys 0.60.2", -] - -[[package]] -name = "document-features" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" -dependencies = [ - "litrs", -] - [[package]] name = "dunce" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" -[[package]] -name = "dupe" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed2bc011db9c93fbc2b6cdb341a53737a55bafb46dbb74cf6764fc33a2fbf9c" -dependencies = [ - "dupe_derive", -] - -[[package]] -name = "dupe_derive" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83e195b4945e88836d826124af44fdcb262ec01ef94d44f14f4fb5103f19892a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - [[package]] name = "dyn-clone" version = "1.0.20" @@ -1855,81 +537,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "either" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" - -[[package]] -name = "ena" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabffdaee24bd1bf95c5ef7cec31260444317e72ea56c4c91750e8b7ee58d5f1" -dependencies = [ - "log", -] - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "endi" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" - -[[package]] -name = "endian-type" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" - -[[package]] -name = "endian-type" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "869b0adbda23651a9c5c0c3d270aac9fcb52e8622a8f2b17e57802d7791962f2" - -[[package]] -name = "enum-as-inner" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "enumflags2" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - [[package]] name = "epiphany-core" version = "0.1.0" @@ -1971,24 +578,12 @@ dependencies = [ name = "epiphany-openai-adapter" version = "0.1.0" dependencies = [ + "anyhow", "cultcache-rs", "epiphany-model-adapter", "serde", -] - -[[package]] -name = "epiphany-openai-codex-spine" -version = "0.1.0" -dependencies = [ - "anyhow", - "codex-client", - "codex-login", - "epiphany-openai-adapter", - "http", - "serde", "serde_json", "sha2", - "tokio", ] [[package]] @@ -2017,13 +612,13 @@ version = "0.1.0" dependencies = [ "anyhow", "chrono", + "codex-connector", "ctrlc", "cultcache-rs", "cultnet-rs", "epiphany-core", "epiphany-model-adapter", "epiphany-openai-adapter", - "epiphany-openai-codex-spine", "epiphany-openai-runtime", "epiphany-tool-adapter", "epiphany-tool-mcp-runtime", @@ -2034,7 +629,9 @@ dependencies = [ "tempfile", "tokio", "toml", + "ureq", "uuid", + "zeroize", ] [[package]] @@ -2056,7 +653,7 @@ dependencies = [ name = "epiphany-state-model" version = "0.1.0" dependencies = [ - "schemars 0.8.22", + "schemars", "serde", "ts-rs", ] @@ -2080,8 +677,8 @@ dependencies = [ "epiphany-core", "epiphany-tool-adapter", "http", - "reqwest 0.13.4", - "rmcp 2.2.0", + "reqwest", + "rmcp", "serde", "serde_json", "sha2", @@ -2096,15 +693,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" -[[package]] -name = "erased-serde" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c" -dependencies = [ - "serde", -] - [[package]] name = "errno" version = "0.3.14" @@ -2115,71 +703,11 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "error-code" -version = "3.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" - -[[package]] -name = "event-listener" -version = "5.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" -dependencies = [ - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" -dependencies = [ - "event-listener", - "pin-project-lite", -] - -[[package]] -name = "eventsource-stream" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74fef4569247a5f429d9156b9d0a2599914385dd189c539334c625d8099d90ab" -dependencies = [ - "futures-core", - "nom 7.1.3", - "pin-project-lite", -] - [[package]] name = "fastrand" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" -dependencies = [ - "getrandom 0.4.3", -] - -[[package]] -name = "fd-lock" -version = "4.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78" -dependencies = [ - "cfg-if", - "rustix", - "windows-sys 0.59.0", -] - -[[package]] -name = "fdeflate" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" -dependencies = [ - "simd-adler32", -] [[package]] name = "fiat-crypto" @@ -2193,73 +721,6 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de" -[[package]] -name = "fixed_decimal" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79c3c892f121fff406e5dd6b28c1b30096b95111c30701a899d4f2b18da6d1bd" -dependencies = [ - "displaydoc", - "smallvec", - "writeable", -] - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "flate2" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" -dependencies = [ - "crc32fast", - "libz-sys", - "miniz_oxide", -] - -[[package]] -name = "flume" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e139bc46ca777eb5efaf62df0ab8cc5fd400866427e56c68b22e414e53bd3be" -dependencies = [ - "fastrand", - "futures-core", - "futures-sink", - "spin", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "form_urlencoded" version = "1.2.2" @@ -2333,19 +794,6 @@ version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" -[[package]] -name = "futures-lite" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - [[package]] name = "futures-macro" version = "0.3.33" @@ -2386,30 +834,6 @@ dependencies = [ "slab", ] -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "generator" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3b854b0e584ead1a33f18b2fcad7cf7be18b3875c78816b753639aa501513ae" -dependencies = [ - "cc", - "cfg-if", - "libc", - "log", - "rustversion", - "windows-link", - "windows-result", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -2418,17 +842,6 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", - "zeroize", -] - -[[package]] -name = "gethostname" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" -dependencies = [ - "rustix", - "windows-link", ] [[package]] @@ -2489,16 +902,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "gif" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" -dependencies = [ - "color_quant", - "weezl", -] - [[package]] name = "globset" version = "0.4.20" @@ -2509,53 +912,7 @@ dependencies = [ "bstr", "log", "regex-automata", - "regex-syntax 0.8.11", -] - -[[package]] -name = "h2" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap 2.14.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", + "regex-syntax", ] [[package]] @@ -2564,103 +921,6 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" -[[package]] -name = "headers" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" -dependencies = [ - "base64", - "bytes", - "headers-core", - "http", - "httpdate", - "mime", - "sha1", -] - -[[package]] -name = "headers-core" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" -dependencies = [ - "http", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hickory-proto" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" -dependencies = [ - "async-trait", - "cfg-if", - "data-encoding", - "enum-as-inner", - "futures-channel", - "futures-io", - "futures-util", - "idna", - "ipnet", - "once_cell", - "rand 0.9.5", - "ring", - "thiserror 2.0.20", - "tinyvec", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "hickory-resolver" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" -dependencies = [ - "cfg-if", - "futures-util", - "hickory-proto", - "ipconfig", - "moka", - "once_cell", - "parking_lot", - "rand 0.9.5", - "resolv-conf", - "smallvec", - "thiserror 2.0.20", - "tokio", - "tracing", -] - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - [[package]] name = "hmac" version = "0.12.1" @@ -2670,15 +930,6 @@ dependencies = [ "digest", ] -[[package]] -name = "home" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" -dependencies = [ - "windows-sys 0.61.2", -] - [[package]] name = "http" version = "1.5.0" @@ -2712,24 +963,12 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "http-range-header" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" - [[package]] name = "httparse" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - [[package]] name = "hyper" version = "1.11.0" @@ -2740,7 +979,6 @@ dependencies = [ "bytes", "futures-channel", "futures-core", - "h2", "http", "http-body", "httparse", @@ -2761,40 +999,9 @@ dependencies = [ "hyper", "hyper-util", "rustls", - "rustls-native-certs", "tokio", "tokio-rustls", "tower-service", - "webpki-roots", -] - -[[package]] -name = "hyper-timeout" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" -dependencies = [ - "hyper", - "hyper-util", - "pin-project-lite", - "tokio", - "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", ] [[package]] @@ -2803,7 +1010,7 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "futures-channel", "futures-util", @@ -2815,11 +1022,9 @@ dependencies = [ "percent-encoding", "pin-project-lite", "socket2 0.6.5", - "system-configuration", "tokio", "tower-service", "tracing", - "windows-registry", ] [[package]] @@ -2860,44 +1065,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_decimal" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "288247df2e32aa776ac54fdd64de552149ac43cb840f2761811f0e8d09719dd4" -dependencies = [ - "displaydoc", - "fixed_decimal", - "icu_decimal_data", - "icu_locale", - "icu_locale_core", - "icu_plurals", - "icu_provider", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_decimal_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f14a5ca9e8af29eef62064f269078424283d90dbaffeac5225addf62aaabc22" - -[[package]] -name = "icu_locale" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5a396343c7208121dc86e35623d3dfe19814a7613cfd14964994cdc9c9a2e26" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_locale_data", - "icu_provider", - "potential_utf", - "tinystr", - "zerovec", -] - [[package]] name = "icu_locale_core" version = "2.2.0" @@ -2906,18 +1073,11 @@ checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", - "serde", "tinystr", "writeable", "zerovec", ] -[[package]] -name = "icu_locale_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fdcc9ac77c6d74ff5cf6e65ef3181d6af32003b16fce3a77fb451d2f695993" - [[package]] name = "icu_normalizer" version = "2.2.0" @@ -2938,25 +1098,6 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" -[[package]] -name = "icu_plurals" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a50023f1d49ad5c4333380328a0d4a19e4b9d6d842ec06639affd5ba47c8103" -dependencies = [ - "fixed_decimal", - "icu_locale", - "icu_plurals_data", - "icu_provider", - "zerovec", -] - -[[package]] -name = "icu_plurals_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8485497155dc865f901decb93ecc20d3e467df67bfeceb91e3ba34e2b11e8e1d" - [[package]] name = "icu_properties" version = "2.2.0" @@ -2985,8 +1126,6 @@ checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", - "serde", - "stable_deref_trait", "writeable", "yoke", "zerofrom", @@ -2994,12 +1133,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - [[package]] name = "idna" version = "1.1.0" @@ -3037,51 +1170,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "image" -version = "0.25.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" -dependencies = [ - "bytemuck", - "byteorder-lite", - "color_quant", - "gif", - "image-webp", - "moxcms", - "num-traits", - "png", - "zune-core", - "zune-jpeg", -] - -[[package]] -name = "image-webp" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" -dependencies = [ - "byteorder-lite", - "quick-error", -] - -[[package]] -name = "indenter" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - [[package]] name = "indexmap" version = "2.14.0" @@ -3089,9 +1177,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.17.1", - "serde", - "serde_core", + "hashbrown", ] [[package]] @@ -3100,92 +1186,15 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ - "block-padding", "generic-array", ] -[[package]] -name = "inventory" -version = "0.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" -dependencies = [ - "rustversion", -] - -[[package]] -name = "ipconfig" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d40460c0ce33d6ce4b0630ad68ff63d6661961c48b6dba35e5a4d81cfb48222" -dependencies = [ - "socket2 0.6.5", - "widestring", - "windows-registry", - "windows-result", - "windows-sys 0.61.2", -] - [[package]] name = "ipnet" version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" -[[package]] -name = "iri-string" -version = "0.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1663ee7d8cf2900cc1414b1e1eec9f348d6eaa3bcab07579f4726a4b8499f447" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "is-terminal" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "1.0.18" @@ -3204,7 +1213,7 @@ dependencies = [ "jni-sys", "log", "simd_cesu8", - "thiserror 2.0.20", + "thiserror", "walkdir", "windows-link", ] @@ -3262,132 +1271,12 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "keyring" -version = "3.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eebcc3aff044e5944a8fbaf69eb277d11986064cba30c468730e8b9909fb551c" -dependencies = [ - "byteorder", - "dbus-secret-service", - "linux-keyutils", - "log", - "secret-service", - "security-framework 2.11.1", - "security-framework 3.7.0", - "windows-sys 0.60.2", - "zbus", - "zeroize", -] - -[[package]] -name = "konst" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" -dependencies = [ - "konst_macro_rules", -] - -[[package]] -name = "konst_macro_rules" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" - -[[package]] -name = "lalrpop" -version = "0.19.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a1cbf952127589f2851ab2046af368fd20645491bb4b376f04b7f94d7a9837b" -dependencies = [ - "ascii-canvas", - "bit-set", - "diff", - "ena", - "is-terminal", - "itertools 0.10.5", - "lalrpop-util", - "petgraph", - "regex", - "regex-syntax 0.6.29", - "string_cache", - "term", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "lalrpop-util" -version = "0.19.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3c48237b9604c5a4702de6b824e02006c3214327564636aef27c1028a8fa0ed" -dependencies = [ - "regex", -] - -[[package]] -name = "landlock" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cca98e95f35b29d469dade6724c6f96cec9236640f745a0e99b0334ec320ab1" -dependencies = [ - "enumflags2", - "libc", - "thiserror 2.0.20", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - [[package]] name = "libc" version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" -[[package]] -name = "libdbus-sys" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043" -dependencies = [ - "pkg-config", -] - -[[package]] -name = "libredox" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2026a5056764a10b2bf5d56488cba40da507f5493a6a429340e2004d9ed085fa" -dependencies = [ - "libc", -] - -[[package]] -name = "libz-sys" -version = "1.1.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85bc9657773828b90eeb625adff10eeac83cc21bbfd8e23a03eaa8a33c9e28d9" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-keyutils" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83270a18e9f90d0707c41e9f35efada77b64c0e6f3f1810e71c8368a864d5590" -dependencies = [ - "bitflags 2.13.1", - "libc", -] - [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -3400,177 +1289,24 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" -[[package]] -name = "litrs" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - [[package]] name = "log" version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" -[[package]] -name = "logos" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf8b031682c67a8e3d5446840f9573eb7fe26efe7ec8d195c9ac4c0647c502f1" -dependencies = [ - "logos-derive", -] - -[[package]] -name = "logos-derive" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d849148dbaf9661a6151d1ca82b13bb4c4c128146a88d05253b38d4e2f496c" -dependencies = [ - "beef", - "fnv", - "proc-macro2", - "quote", - "regex-syntax 0.6.29", - "syn 1.0.109", -] - -[[package]] -name = "loom" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" -dependencies = [ - "cfg-if", - "generator", - "pin-utils", - "scoped-tls", - "serde", - "serde_json", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "lru" -version = "0.16.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" -dependencies = [ - "hashbrown 0.16.1", -] - [[package]] name = "lru-slab" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" -[[package]] -name = "lsp-types" -version = "0.94.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66bfd44a06ae10647fe3f8214762e9369fd4248df1350924b4ef9e770a85ea1" -dependencies = [ - "bitflags 1.3.2", - "serde", - "serde_json", - "serde_repr", - "url", -] - -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - -[[package]] -name = "matchers" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" -dependencies = [ - "regex-automata", -] - -[[package]] -name = "matchit" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8863b587001c1b9a8a4e36008cebc6b3612cb1226fe2de94858e06092687b608" - -[[package]] -name = "md5" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ebb8d8732c6a6df3d8f032a82911cfc747e00efb95cc46e8d0acd5b5b88570c" - [[package]] name = "memchr" version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - [[package]] name = "mio" version = "1.2.2" @@ -3582,214 +1318,18 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "moka" -version = "0.12.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046" -dependencies = [ - "crossbeam-channel", - "crossbeam-epoch", - "crossbeam-utils", - "equivalent", - "parking_lot", - "portable-atomic", - "smallvec", - "tagptr", - "uuid", -] - -[[package]] -name = "moxcms" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" -dependencies = [ - "num-traits", - "pxfm", -] - -[[package]] -name = "multimap" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" -dependencies = [ - "serde", -] - -[[package]] -name = "native-tls" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework 3.7.0", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "ndk-context" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - -[[package]] -name = "nibble_vec" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" -dependencies = [ - "smallvec", -] - -[[package]] -name = "nix" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" -dependencies = [ - "bitflags 2.13.1", - "cfg-if", - "cfg_aliases 0.1.1", - "libc", -] - -[[package]] -name = "nix" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" -dependencies = [ - "bitflags 2.13.1", - "cfg-if", - "cfg_aliases 0.2.2", - "libc", - "memoffset 0.9.1", -] - [[package]] name = "nix" version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" dependencies = [ - "bitflags 2.13.1", + "bitflags", "cfg-if", - "cfg_aliases 0.2.2", + "cfg_aliases", "libc", ] -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nom" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" -dependencies = [ - "memchr", -] - -[[package]] -name = "nu-ansi-term" -version = "0.50.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "num" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -3808,191 +1348,17 @@ dependencies = [ "objc2-encode", ] -[[package]] -name = "objc2-app-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" -dependencies = [ - "bitflags 2.13.1", - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-cloud-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" -dependencies = [ - "bitflags 2.13.1", - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-data" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" -dependencies = [ - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" -dependencies = [ - "bitflags 2.13.1", - "dispatch2", - "objc2", -] - -[[package]] -name = "objc2-core-graphics" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" -dependencies = [ - "bitflags 2.13.1", - "dispatch2", - "objc2", - "objc2-core-foundation", - "objc2-io-surface", -] - -[[package]] -name = "objc2-core-image" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" -dependencies = [ - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-location" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" -dependencies = [ - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-text" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" -dependencies = [ - "bitflags 2.13.1", - "objc2", - "objc2-core-foundation", - "objc2-core-graphics", -] - [[package]] name = "objc2-encode" version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" -[[package]] -name = "objc2-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" -dependencies = [ - "bitflags 2.13.1", - "block2", - "libc", - "objc2", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-io-surface" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" -dependencies = [ - "bitflags 2.13.1", - "objc2", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" -dependencies = [ - "bitflags 2.13.1", - "objc2", - "objc2-core-foundation", - "objc2-foundation", -] - -[[package]] -name = "objc2-ui-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" -dependencies = [ - "bitflags 2.13.1", - "block2", - "objc2", - "objc2-cloud-kit", - "objc2-core-data", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-core-image", - "objc2-core-location", - "objc2-core-text", - "objc2-foundation", - "objc2-quartz-core", - "objc2-user-notifications", -] - -[[package]] -name = "objc2-user-notifications" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" -dependencies = [ - "objc2", - "objc2-foundation", -] - -[[package]] -name = "oid-registry" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" -dependencies = [ - "asn1-rs", -] - [[package]] name = "once_cell" version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" -dependencies = [ - "critical-section", - "portable-atomic", -] - -[[package]] -name = "once_cell_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "opaque-debug" @@ -4000,299 +1366,24 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" -[[package]] -name = "openssl" -version = "0.10.81" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" -dependencies = [ - "bitflags 2.13.1", - "cfg-if", - "foreign-types", - "libc", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - [[package]] name = "openssl-probe" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" -[[package]] -name = "openssl-sys" -version = "0.9.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "opentelemetry" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b84bcd6ae87133e903af7ef497404dda70c60d0ea14895fc8a5e6722754fc2a0" -dependencies = [ - "futures-core", - "futures-sink", - "js-sys", - "pin-project-lite", - "thiserror 2.0.20", - "tracing", -] - -[[package]] -name = "opentelemetry-appender-tracing" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef6a1ac5ca3accf562b8c306fa8483c85f4390f768185ab775f242f7fe8fdcc2" -dependencies = [ - "opentelemetry", - "tracing", - "tracing-core", - "tracing-subscriber", -] - -[[package]] -name = "opentelemetry-http" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a6d09a73194e6b66df7c8f1b680f156d916a1a942abf2de06823dd02b7855d" -dependencies = [ - "async-trait", - "bytes", - "http", - "opentelemetry", - "reqwest 0.12.28", -] - -[[package]] -name = "opentelemetry-otlp" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f69cd6acbb9af919df949cd1ec9e5e7fdc2ef15d234b6b795aaa525cc02f71f" -dependencies = [ - "http", - "opentelemetry", - "opentelemetry-http", - "opentelemetry-proto", - "opentelemetry_sdk", - "prost", - "reqwest 0.12.28", - "serde_json", - "thiserror 2.0.20", - "tokio", - "tonic", - "tracing", -] - -[[package]] -name = "opentelemetry-proto" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7175df06de5eaee9909d4805a3d07e28bb752c34cab57fa9cff549da596b30f" -dependencies = [ - "base64", - "const-hex", - "opentelemetry", - "opentelemetry_sdk", - "prost", - "serde", - "serde_json", - "tonic", - "tonic-prost", -] - -[[package]] -name = "opentelemetry-semantic-conventions" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e62e29dfe041afb8ed2a6c9737ab57db4907285d999ef8ad3a59092a36bdc846" - -[[package]] -name = "opentelemetry_sdk" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ae4f5991976fd48df6d843de219ca6d31b01daaab2dad5af2badeded372bd" -dependencies = [ - "futures-channel", - "futures-executor", - "futures-util", - "opentelemetry", - "percent-encoding", - "rand 0.9.5", - "thiserror 2.0.20", - "tokio", - "tokio-stream", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "ordered-stream" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" -dependencies = [ - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "os_info" -version = "3.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf20a545b305cf1da722b236b5155c9bb35f1d5ceb28c048bd96ca842f41b5b" -dependencies = [ - "android_system_properties", - "log", - "nix 0.31.3", - "objc2", - "objc2-foundation", - "objc2-ui-kit", - "serde", - "windows-sys 0.61.2", -] - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-link", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pastey" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" - -[[package]] -name = "pem" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" -dependencies = [ - "base64", - "serde_core", -] - [[package]] name = "percent-encoding" version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap 2.14.0", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project" -version = "1.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - [[package]] name = "pin-project-lite" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "piper" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" -dependencies = [ - "atomic-waker", - "fastrand", - "futures-io", -] - [[package]] name = "pkcs8" version = "0.10.2" @@ -4309,44 +1400,6 @@ version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" -[[package]] -name = "png" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" -dependencies = [ - "bitflags 2.13.1", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - -[[package]] -name = "polling" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix", - "windows-sys 0.61.2", -] - -[[package]] -name = "poly1305" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" -dependencies = [ - "cpufeatures 0.2.17", - "opaque-debug", - "universal-hash", -] - [[package]] name = "polyval" version = "0.6.2" @@ -4359,29 +1412,15 @@ dependencies = [ "universal-hash", ] -[[package]] -name = "portable-atomic" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" - [[package]] name = "potential_utf" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ - "serde_core", - "writeable", "zerovec", ] -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - [[package]] name = "ppv-lite86" version = "0.2.21" @@ -4391,12 +1430,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - [[package]] name = "pretty_assertions" version = "1.4.1" @@ -4407,15 +1440,6 @@ dependencies = [ "yansi", ] -[[package]] -name = "proc-macro-crate" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" -dependencies = [ - "toml_edit 0.25.13+spec-1.1.0", -] - [[package]] name = "proc-macro2" version = "1.0.107" @@ -4432,98 +1456,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e842efad9119158434d193c6682e2ebee4b44d6ad801d7b349623b3f57cdf55" dependencies = [ "futures", - "indexmap 2.14.0", - "nix 0.31.3", + "indexmap", + "nix", "tokio", "tracing", "windows", ] -[[package]] -name = "proptest" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" -dependencies = [ - "bitflags 2.13.1", - "num-traits", - "rand 0.9.5", - "rand_chacha 0.9.0", - "rand_xorshift", - "regex-syntax 0.8.11", - "unarray", -] - -[[package]] -name = "prost" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-derive" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" -dependencies = [ - "anyhow", - "itertools 0.14.0", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "psl" -version = "2.1.223" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0dedad316e05de220cbf3fd8bfb69f3df8755dde2d7d479211827b595168a93" -dependencies = [ - "psl-types", -] - -[[package]] -name = "psl-types" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" - -[[package]] -name = "publicsuffix" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42ea446cab60335f76979ec15e12619a2165b5ae2c12166bef27d283a9fadf" -dependencies = [ - "idna", - "psl-types", -] - -[[package]] -name = "pxfm" -version = "0.1.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" - -[[package]] -name = "quick-error" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" - -[[package]] -name = "quick-xml" -version = "0.38.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "quinn" version = "0.11.11" @@ -4531,14 +1470,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ "bytes", - "cfg_aliases 0.2.2", + "cfg_aliases", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash", "rustls", "socket2 0.6.5", - "thiserror 2.0.20", + "thiserror", "tokio", "tracing", "web-time", @@ -4561,7 +1500,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.20", + "thiserror", "tinyvec", "tracing", "web-time", @@ -4573,7 +1512,7 @@ version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" dependencies = [ - "cfg_aliases 0.2.2", + "cfg_aliases", "libc", "once_cell", "socket2 0.6.5", @@ -4602,354 +1541,13 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" -[[package]] -name = "radix_trie" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd" -dependencies = [ - "endian-type 0.1.2", - "nibble_vec", -] - -[[package]] -name = "radix_trie" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b4431027dcd37fc2a73ef740b5f233aa805897935b8bce0195e41bbf9a3289a" -dependencies = [ - "endian-type 0.2.0", - "nibble_vec", -] - -[[package]] -name = "rama-core" -version = "0.3.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b93751ab27c9d151e84c1100057eab3f2a6a1378bc31b62abd416ecb1847658" -dependencies = [ - "ahash", - "asynk-strim", - "bytes", - "futures", - "parking_lot", - "pin-project-lite", - "rama-error", - "rama-macros", - "rama-utils", - "serde", - "serde_json", - "tokio", - "tokio-graceful", - "tokio-util", - "tracing", -] - -[[package]] -name = "rama-dns" -version = "0.3.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e340fef2799277e204260b17af01bc23604712092eacd6defe40167f304baed8" -dependencies = [ - "ahash", - "hickory-resolver", - "rama-core", - "rama-net", - "rama-utils", - "serde", - "tokio", -] - -[[package]] -name = "rama-error" -version = "0.3.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c452aba1beb7e29b873ff32f304536164cffcc596e786921aea64e858ff8f40" - -[[package]] -name = "rama-http" -version = "0.3.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453d60af031e23af2d48995e41b17023f6150044738680508b63671f8d7417dd" -dependencies = [ - "ahash", - "base64", - "bitflags 2.13.1", - "chrono", - "const_format", - "csv", - "http", - "http-range-header", - "httpdate", - "iri-string", - "matchit", - "parking_lot", - "percent-encoding", - "pin-project-lite", - "radix_trie 0.3.0", - "rama-core", - "rama-error", - "rama-http-headers", - "rama-http-types", - "rama-net", - "rama-utils", - "rand 0.9.5", - "serde", - "serde_html_form", - "serde_json", - "tokio", - "uuid", -] - -[[package]] -name = "rama-http-backend" -version = "0.3.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3ff6a3c8ae690be8167e43777ba0bf6b0c8c2f6de165c538666affe2a32fd81" -dependencies = [ - "h2", - "pin-project-lite", - "rama-core", - "rama-http", - "rama-http-core", - "rama-http-headers", - "rama-http-types", - "rama-net", - "rama-tcp", - "rama-unix", - "rama-utils", - "tokio", -] - -[[package]] -name = "rama-http-core" -version = "0.3.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3822be6703e010afec0bcfeb5dbb6e5a3b23ca5689d9b1215b66ce6446653b77" -dependencies = [ - "ahash", - "atomic-waker", - "futures-channel", - "httparse", - "httpdate", - "indexmap 2.14.0", - "itoa", - "parking_lot", - "pin-project-lite", - "rama-core", - "rama-http", - "rama-http-types", - "rama-utils", - "slab", - "tokio", - "tokio-test", - "want", -] - -[[package]] -name = "rama-http-headers" -version = "0.3.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d74fe0cd9bd4440827dc6dc0f504cf66065396532e798891dee2c1b740b2285" -dependencies = [ - "ahash", - "base64", - "chrono", - "const_format", - "httpdate", - "rama-core", - "rama-error", - "rama-http-types", - "rama-macros", - "rama-net", - "rama-utils", - "rand 0.9.5", - "serde", - "sha1", -] - -[[package]] -name = "rama-http-types" -version = "0.3.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6dae655a72da5f2b97cfacb67960d8b28c5025e62707b4c8c5f0c5c9843a444" -dependencies = [ - "ahash", - "bytes", - "const_format", - "fnv", - "http", - "http-body", - "http-body-util", - "itoa", - "memchr", - "mime", - "mime_guess", - "nom 8.0.0", - "pin-project-lite", - "rama-core", - "rama-error", - "rama-macros", - "rama-utils", - "rand 0.9.5", - "serde", - "serde_json", - "sync_wrapper", - "tokio", -] - -[[package]] -name = "rama-macros" -version = "0.3.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea18a110bcf21e35c5f194168e6914ccea45ffdd0fea51bc4b169fbeafef6428" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "rama-net" -version = "0.3.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b28ee9e1e5d39264414b71f5c33e7fbb66b382c3fac456fe0daad39cf5509933" -dependencies = [ - "ahash", - "const_format", - "flume", - "hex", - "ipnet", - "itertools 0.14.0", - "md5", - "nom 8.0.0", - "parking_lot", - "pin-project-lite", - "psl", - "radix_trie 0.3.0", - "rama-core", - "rama-http-types", - "rama-macros", - "rama-utils", - "serde", - "sha2", - "socket2 0.6.5", - "tokio", -] - -[[package]] -name = "rama-socks5" -version = "0.3.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5468b263516daaf258de32542c1974b7cbe962363ad913dcb669f5d46db0ef3e" -dependencies = [ - "byteorder", - "rama-core", - "rama-net", - "rama-tcp", - "rama-udp", - "rama-utils", - "tokio", -] - -[[package]] -name = "rama-tcp" -version = "0.3.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe60cd604f91196b3659a1b28945add2e8b10bd0b4e6373c93d024fb3197704b" -dependencies = [ - "pin-project-lite", - "rama-core", - "rama-dns", - "rama-http-types", - "rama-net", - "rama-utils", - "rand 0.9.5", - "tokio", -] - -[[package]] -name = "rama-tls-rustls" -version = "0.3.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "536d47f6b269fb20dffd45e4c04aa8b340698b3509326e3c36e444b4f33ce0d6" -dependencies = [ - "pin-project-lite", - "rama-core", - "rama-http-types", - "rama-net", - "rama-utils", - "rcgen", - "rustls", - "rustls-native-certs", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "webpki-roots", - "x509-parser", -] - -[[package]] -name = "rama-udp" -version = "0.3.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36ed05e0ecac73e084e92a3a8b1fbf16fdae8958c506f0f0eada180a2d99eef4" -dependencies = [ - "rama-core", - "rama-net", - "tokio", - "tokio-util", -] - -[[package]] -name = "rama-unix" -version = "0.3.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91acb16d571428ba4cece072dfab90d2667cdfa910a7b3cb4530c3f31542d708" -dependencies = [ - "pin-project-lite", - "rama-core", - "rama-net", - "tokio", -] - -[[package]] -name = "rama-utils" -version = "0.3.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf28b18ba4a57f8334d7992d3f8020194ea359b246ae6f8f98b8df524c7a14ef" -dependencies = [ - "const_format", - "parking_lot", - "pin-project-lite", - "rama-macros", - "regex", - "serde", - "smallvec", - "smol_str", - "tokio", - "wildcard", -] - -[[package]] -name = "rand" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - [[package]] name = "rand" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" dependencies = [ - "rand_chacha 0.9.0", + "rand_chacha", "rand_core 0.9.5", ] @@ -4964,16 +1562,6 @@ dependencies = [ "rand_core 0.10.1", ] -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - [[package]] name = "rand_chacha" version = "0.9.0" @@ -5017,29 +1605,6 @@ dependencies = [ "rand_core 0.10.1", ] -[[package]] -name = "rand_xorshift" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" -dependencies = [ - "rand_core 0.9.5", -] - -[[package]] -name = "rcgen" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57f6d249aad744e274e682777a50283a225a32705394ee6d5fcc01efa25e4055" -dependencies = [ - "aws-lc-rs", - "pem", - "rustls-pki-types", - "time", - "x509-parser", - "yasna", -] - [[package]] name = "redb" version = "4.1.0" @@ -5049,69 +1614,6 @@ dependencies = [ "libc", ] -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags 2.13.1", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 1.0.69", -] - -[[package]] -name = "redox_users" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" -dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 2.0.20", -] - -[[package]] -name = "ref-cast" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "regex" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax 0.8.11", -] - [[package]] name = "regex-automata" version = "0.4.18" @@ -5120,85 +1622,22 @@ checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.11", + "regex-syntax", ] -[[package]] -name = "regex-lite" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "regex-syntax" version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" -[[package]] -name = "reqwest" -version = "0.12.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" -dependencies = [ - "base64", - "bytes", - "cookie", - "cookie_store", - "encoding_rs", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-tls", - "hyper-util", - "js-sys", - "log", - "mime", - "native-tls", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-native-certs", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-native-tls", - "tokio-rustls", - "tokio-util", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams 0.4.2", - "web-sys", - "webpki-roots", -] - [[package]] name = "reqwest" version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "futures-core", "futures-util", @@ -5228,16 +1667,10 @@ dependencies = [ "url", "wasm-bindgen", "wasm-bindgen-futures", - "wasm-streams 0.5.0", + "wasm-streams", "web-sys", ] -[[package]] -name = "resolv-conf" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" - [[package]] name = "ring" version = "0.17.14" @@ -5248,32 +1681,10 @@ dependencies = [ "cfg-if", "getrandom 0.2.17", "libc", - "untrusted 0.9.0", + "untrusted", "windows-sys 0.52.0", ] -[[package]] -name = "rmcp" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bef41ebc9ebed2c1b1d90203e9d1756091e8a00bbc3107676151f39868ca0ee" -dependencies = [ - "async-trait", - "base64", - "chrono", - "futures", - "pastey", - "pin-project-lite", - "rmcp-macros", - "schemars 1.2.2", - "serde", - "serde_json", - "thiserror 2.0.20", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "rmcp" version = "2.2.0" @@ -5286,30 +1697,17 @@ dependencies = [ "http", "pin-project-lite", "process-wrap", - "reqwest 0.13.4", + "reqwest", "serde", "serde_json", "sse-stream", - "thiserror 2.0.20", + "thiserror", "tokio", "tokio-stream", "tokio-util", "tracing", ] -[[package]] -name = "rmcp-macros" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e88ad84b8b6237a934534a62b379a5be6388915663c0cc598ceb9b3292bbbfe" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "serde_json", - "syn 2.0.119", -] - [[package]] name = "rmp" version = "0.8.15" @@ -5355,22 +1753,13 @@ dependencies = [ "semver", ] -[[package]] -name = "rusticata-macros" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" -dependencies = [ - "nom 7.1.3", -] - [[package]] name = "rustix" version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.13.1", + "bitflags", "errno", "libc", "linux-raw-sys", @@ -5402,7 +1791,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.7.0", + "security-framework", ] [[package]] @@ -5421,7 +1810,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" dependencies = [ - "core-foundation 0.10.1", + "core-foundation", "core-foundation-sys", "jni", "log", @@ -5430,7 +1819,7 @@ dependencies = [ "rustls-native-certs", "rustls-platform-verifier-android", "rustls-webpki", - "security-framework 3.7.0", + "security-framework", "security-framework-sys", "webpki-root-certs", "windows-sys 0.61.2", @@ -5451,7 +1840,7 @@ dependencies = [ "aws-lc-rs", "ring", "rustls-pki-types", - "untrusted 0.9.0", + "untrusted", ] [[package]] @@ -5460,43 +1849,6 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" -[[package]] -name = "rustyline" -version = "14.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e8936da37efd9b6d4478277f4b2b9bb5cdb37a113e8d63222e58da647e63" -dependencies = [ - "bitflags 2.13.1", - "cfg-if", - "clipboard-win", - "fd-lock", - "home", - "libc", - "log", - "memchr", - "nix 0.28.0", - "radix_trie 0.2.1", - "unicode-segmentation", - "unicode-width", - "utf8parse", - "windows-sys 0.52.0", -] - -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - -[[package]] -name = "salsa20" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" -dependencies = [ - "cipher", -] - [[package]] name = "same-file" version = "1.0.6" @@ -5515,48 +1867,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "schemafy" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8aea5ba40287dae331f2c48b64dbc8138541f5e97ee8793caa7948c1f31d86d5" -dependencies = [ - "Inflector", - "schemafy_core", - "schemafy_lib", - "serde", - "serde_derive", - "serde_json", - "serde_repr", - "syn 1.0.109", -] - -[[package]] -name = "schemafy_core" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41781ae092f4fd52c9287efb74456aea0d3b90032d2ecad272bd14dbbcb0511b" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "schemafy_lib" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e953db32579999ca98c451d80801b6f6a7ecba6127196c5387ec0774c528befa" -dependencies = [ - "Inflector", - "proc-macro2", - "quote", - "schemafy_core", - "serde", - "serde_derive", - "serde_json", - "syn 1.0.109", -] - [[package]] name = "schemars" version = "0.8.22" @@ -5564,33 +1874,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" dependencies = [ "dyn-clone", - "schemars_derive 0.8.22", - "serde", - "serde_json", -] - -[[package]] -name = "schemars" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "schemars" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" -dependencies = [ - "chrono", - "dyn-clone", - "ref-cast", - "schemars_derive 1.2.2", + "schemars_derive", "serde", "serde_json", ] @@ -5603,83 +1887,18 @@ checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" dependencies = [ "proc-macro2", "quote", - "serde_derive_internals 0.29.1", + "serde_derive_internals", "syn 2.0.119", ] -[[package]] -name = "schemars_derive" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98c67716b46af2f0b8cf752abc930f6f9aecfbf671ecfb531db8a31dbe4e2ba" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals 0.30.0", - "syn 3.0.3", -] - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "seccompiler" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4ae55de56877481d112a559bbc12667635fdaf5e005712fd4e2b2fa50ffc884" -dependencies = [ - "libc", -] - -[[package]] -name = "secret-service" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4d35ad99a181be0a60ffcbe85d680d98f87bdc4d7644ade319b87076b9dbfd4" -dependencies = [ - "aes", - "cbc", - "futures-util", - "generic-array", - "hkdf", - "num", - "once_cell", - "rand 0.8.7", - "serde", - "sha2", - "zbus", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.13.1", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - [[package]] name = "security-framework" version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.13.1", - "core-foundation 0.10.1", + "bitflags", + "core-foundation", "core-foundation-sys", "libc", "security-framework-sys", @@ -5756,37 +1975,12 @@ dependencies = [ "syn 2.0.119", ] -[[package]] -name = "serde_derive_internals" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f852137cce035d6a4df67ccce505ff6b3e9fd3a10e3e52b24dc71e650bb1a9bd" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - -[[package]] -name = "serde_html_form" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acf96b1d9364968fce46ebb548f1c0e1d7eceae27bdff73865d42e6c7369d94" -dependencies = [ - "form_urlencoded", - "indexmap 2.14.0", - "itoa", - "ryu", - "serde_core", -] - [[package]] name = "serde_json" version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ - "indexmap 2.14.0", "itoa", "memchr", "serde", @@ -5794,28 +1988,6 @@ dependencies = [ "zmij", ] -[[package]] -name = "serde_path_to_error" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" -dependencies = [ - "itoa", - "serde", - "serde_core", -] - -[[package]] -name = "serde_repr" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.3", -] - [[package]] name = "serde_spanned" version = "1.1.1" @@ -5825,61 +1997,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "3.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" -dependencies = [ - "base64", - "bs58", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.14.0", - "schemars 0.9.0", - "schemars 1.2.2", - "serde_core", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "sha1" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "digest", -] - [[package]] name = "sha1_smol" version = "1.0.1" @@ -5897,21 +2014,6 @@ dependencies = [ "digest", ] -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - [[package]] name = "shlex" version = "2.0.1" @@ -5937,12 +2039,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "simd-adler32" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" - [[package]] name = "simd_cesu8" version = "1.2.0" @@ -5959,12 +2055,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" -[[package]] -name = "siphasher" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" - [[package]] name = "slab" version = "0.4.12" @@ -5976,19 +2066,6 @@ name = "smallvec" version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" -dependencies = [ - "serde", -] - -[[package]] -name = "smol_str" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4aaa7368fcf4852a4c2dd92df0cace6a71f2091ca0a23391ce7f3a31833f1523" -dependencies = [ - "borsh", - "serde_core", -] [[package]] name = "socket2" @@ -6010,15 +2087,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "spin" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" -dependencies = [ - "lock_api", -] - [[package]] name = "spki" version = "0.7.3" @@ -6048,167 +2116,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" -[[package]] -name = "starlark" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f53849859f05d9db705b221bd92eede93877fd426c1b4a3c3061403a5912a8f" -dependencies = [ - "allocative", - "anyhow", - "bumpalo", - "cmp_any", - "debugserver-types", - "derivative", - "derive_more", - "display_container", - "dupe", - "either", - "erased-serde", - "hashbrown 0.14.5", - "inventory", - "itertools 0.13.0", - "maplit", - "memoffset 0.6.5", - "num-bigint", - "num-traits", - "once_cell", - "paste", - "ref-cast", - "regex", - "rustyline", - "serde", - "serde_json", - "starlark_derive", - "starlark_map", - "starlark_syntax", - "static_assertions", - "strsim 0.10.0", - "textwrap", - "thiserror 1.0.69", -] - -[[package]] -name = "starlark_derive" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe58bc6c8b7980a1fe4c9f8f48200c3212db42ebfe21ae6a0336385ab53f082a" -dependencies = [ - "dupe", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "starlark_map" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92659970f120df0cc1c0bb220b33587b7a9a90e80d4eecc5c5af5debb950173d" -dependencies = [ - "allocative", - "dupe", - "equivalent", - "fxhash", - "hashbrown 0.14.5", - "serde", -] - -[[package]] -name = "starlark_syntax" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe53b3690d776aafd7cb6b9fed62d94f83280e3b87d88e3719cc0024638461b3" -dependencies = [ - "allocative", - "annotate-snippets", - "anyhow", - "derivative", - "derive_more", - "dupe", - "lalrpop", - "lalrpop-util", - "logos", - "lsp-types", - "memchr", - "num-bigint", - "num-traits", - "once_cell", - "starlark_map", - "thiserror 1.0.69", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "streaming-iterator" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520" - -[[package]] -name = "string_cache" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" -dependencies = [ - "new_debug_unreachable", - "parking_lot", - "phf_shared", - "precomputed-hash", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" - -[[package]] -name = "strum_macros" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.119", -] - [[package]] name = "subtle" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - [[package]] name = "syn" version = "2.0.119" @@ -6251,42 +2164,6 @@ dependencies = [ "syn 2.0.119", ] -[[package]] -name = "sys-locale" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" -dependencies = [ - "libc", -] - -[[package]] -name = "system-configuration" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" -dependencies = [ - "bitflags 2.13.1", - "core-foundation 0.9.4", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tagptr" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" - [[package]] name = "tempfile" version = "3.27.0" @@ -6300,17 +2177,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "term" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" -dependencies = [ - "dirs-next", - "rustversion", - "winapi", -] - [[package]] name = "termcolor" version = "1.4.1" @@ -6320,42 +2186,13 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - [[package]] name = "thiserror" version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" dependencies = [ - "thiserror-impl 2.0.20", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", + "thiserror-impl", ] [[package]] @@ -6369,66 +2206,6 @@ dependencies = [ "syn 3.0.3", ] -[[package]] -name = "thread_local" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "time" -version = "0.3.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" -dependencies = [ - "deranged", - "num-conv", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" - -[[package]] -name = "time-macros" -version = "0.2.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tiny_http" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389915df6413a2e74fb181895f933386023c71110878cd0825588928e64cdc82" -dependencies = [ - "ascii", - "chunked_transfer", - "httpdate", - "log", -] - [[package]] name = "tinystr" version = "0.8.3" @@ -6436,7 +2213,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", - "serde_core", "zerovec", ] @@ -6464,7 +2240,6 @@ dependencies = [ "bytes", "libc", "mio", - "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2 0.6.5", @@ -6472,19 +2247,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "tokio-graceful" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45740b38b48641855471cd402922e89156bdfbd97b69b45eeff170369cc18c7d" -dependencies = [ - "loom", - "pin-project-lite", - "slab", - "tokio", - "tracing", -] - [[package]] name = "tokio-macros" version = "2.7.2" @@ -6496,16 +2258,6 @@ dependencies = [ "syn 3.0.3", ] -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.26.4" @@ -6527,32 +2279,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-test" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6d24790a10a7af737693a3e8f1d03faef7e6ca0cc99aae5066f533766de545" -dependencies = [ - "futures-core", - "tokio", - "tokio-stream", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.28.0" -source = "git+https://github.com/openai-oss-forks/tokio-tungstenite?rev=132f5b39c862e3a970f731d709608b3e6276d5f6#132f5b39c862e3a970f731d709608b3e6276d5f6" -dependencies = [ - "futures-util", - "log", - "rustls", - "rustls-native-certs", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tungstenite", -] - [[package]] name = "tokio-util" version = "0.7.19" @@ -6573,10 +2299,10 @@ version = "0.9.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" dependencies = [ - "indexmap 2.14.0", + "indexmap", "serde_core", "serde_spanned", - "toml_datetime 0.7.5+spec-1.1.0", + "toml_datetime", "toml_parser", "toml_writer", "winnow 0.7.15", @@ -6591,40 +2317,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "toml_datetime" -version = "1.1.1+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.24.1+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01f2eadbbc6b377a847be05f60791ef1058d9f696ecb51d2c07fe911d8569d8e" -dependencies = [ - "indexmap 2.14.0", - "toml_datetime 0.7.5+spec-1.1.0", - "toml_parser", - "toml_writer", - "winnow 0.7.15", -] - -[[package]] -name = "toml_edit" -version = "0.25.13+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" -dependencies = [ - "indexmap 2.14.0", - "toml_datetime 1.1.1+spec-1.1.0", - "toml_parser", - "winnow 1.0.4", -] - [[package]] name = "toml_parser" version = "1.1.3+spec-1.1.0" @@ -6640,45 +2332,6 @@ version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" -[[package]] -name = "tonic" -version = "0.14.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac2a5518c70fa84342385732db33fb3f44bc4cc748936eb5833d2df34d6445ef" -dependencies = [ - "async-trait", - "base64", - "bytes", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-timeout", - "hyper-util", - "percent-encoding", - "pin-project", - "rustls-native-certs", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tokio-stream", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tonic-prost" -version = "0.14.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50849f68853be452acf590cde0b146665b8d507b3b8af17261df47e02c209ea0" -dependencies = [ - "bytes", - "prost", - "tonic", -] - [[package]] name = "tower" version = "0.5.3" @@ -6687,15 +2340,11 @@ checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", - "indexmap 2.14.0", "pin-project-lite", - "slab", "sync_wrapper", "tokio", - "tokio-util", "tower-layer", "tower-service", - "tracing", ] [[package]] @@ -6704,7 +2353,7 @@ version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ - "bitflags 2.13.1", + "bitflags", "bytes", "futures-util", "http", @@ -6734,7 +2383,6 @@ version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -6758,84 +2406,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", - "valuable", ] -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-opentelemetry" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ac28f2d093c6c477eaa76b23525478f38de514fa9aeb1285738d4b97a9552fc" -dependencies = [ - "js-sys", - "opentelemetry", - "smallvec", - "tracing", - "tracing-core", - "tracing-log", - "tracing-subscriber", - "web-time", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex-automata", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "tree-sitter" -version = "0.25.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78f873475d258561b06f1c595d93308a7ed124d9977cb26b148c2084a4a3cc87" -dependencies = [ - "cc", - "regex", - "regex-syntax 0.8.11", - "serde_json", - "streaming-iterator", - "tree-sitter-language", -] - -[[package]] -name = "tree-sitter-bash" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5ec769279cc91b561d3df0d8a5deb26b0ad40d183127f409494d6d8fc53062" -dependencies = [ - "cc", - "tree-sitter-language", -] - -[[package]] -name = "tree-sitter-language" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "009994f150cc0cd50ff54917d5bc8bffe8cad10ca10d81c34da2ec421ae61782" - [[package]] name = "try-lock" version = "0.2.5" @@ -6849,7 +2421,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4994acea2522cd2b3b85c1d9529a55991e3ad5e25cdcd3de9d505972c4379424" dependencies = [ "serde_json", - "thiserror 2.0.20", + "thiserror", "ts-rs-macros", "uuid", ] @@ -6866,79 +2438,18 @@ dependencies = [ "termcolor", ] -[[package]] -name = "tungstenite" -version = "0.27.0" -source = "git+https://github.com/openai-oss-forks/tungstenite-rs?rev=9200079d3b54a1ff51072e24d81fd354f085156f#9200079d3b54a1ff51072e24d81fd354f085156f" -dependencies = [ - "bytes", - "data-encoding", - "flate2", - "headers", - "http", - "httparse", - "log", - "rand 0.9.5", - "rustls", - "rustls-pki-types", - "sha1", - "thiserror 2.0.20", - "utf-8", -] - [[package]] name = "typenum" version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" -[[package]] -name = "uds_windows" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" -dependencies = [ - "memoffset 0.9.1", - "tempfile", - "windows-sys 0.61.2", -] - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicase" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" - [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" -[[package]] -name = "unicode-segmentation" -version = "1.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" - -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - [[package]] name = "universal-hash" version = "0.5.1" @@ -6949,18 +2460,40 @@ dependencies = [ "subtle", ] -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - [[package]] name = "untrusted" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "ureq" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "972d7902c8735f2695410b8aed7df6ed12a47394aa1c8d7af49f0497b731a94d" +dependencies = [ + "base64 0.23.1", + "log", + "percent-encoding", + "rustls", + "rustls-pki-types", + "ureq-proto", + "utf8-zero", + "webpki-roots", +] + +[[package]] +name = "ureq-proto" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da5f78b09e6941e1a0f2e30e695e4b120377b54d5e0aec11b594bb57b3971613" +dependencies = [ + "base64 0.23.1", + "http", + "httparse", + "log", +] + [[package]] name = "url" version = "2.5.8" @@ -6971,20 +2504,13 @@ dependencies = [ "idna", "percent-encoding", "serde", - "serde_derive", ] [[package]] -name = "urlencoding" -version = "2.1.3" +name = "utf8-zero" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e" [[package]] name = "utf8_iter" @@ -6992,12 +2518,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - [[package]] name = "uuid" version = "1.24.0" @@ -7011,18 +2531,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "version_check" version = "0.9.5" @@ -7118,19 +2626,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "wasm-streams" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - [[package]] name = "wasm-streams" version = "0.5.0" @@ -7164,22 +2659,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webbrowser" -version = "1.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62c35be770821a214dbc362fc26908c853e776c0004294d0b10b8a6bad582f94" -dependencies = [ - "jni", - "log", - "ndk-context", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "url", - "web-sys", -] - [[package]] name = "webpki-root-certs" version = "1.0.9" @@ -7198,42 +2677,6 @@ dependencies = [ "rustls-pki-types", ] -[[package]] -name = "weezl" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" - -[[package]] -name = "which" -version = "8.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3ef584124b911bcc3875c2f1472e80f24361ceb789bd1c62b3e9a3df9ff43c" -dependencies = [ - "libc", -] - -[[package]] -name = "widestring" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" - -[[package]] -name = "wildcard" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9b0540e91e49de3817c314da0dd3bc518093ceacc6ea5327cb0e1eb073e5189" -dependencies = [ - "thiserror 2.0.20", -] - -[[package]] -name = "wildmatch" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29333c3ea1ba8b17211763463ff24ee84e41c78224c16b001cd907e663a38c68" - [[package]] name = "winapi" version = "0.3.9" @@ -7348,17 +2791,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" -dependencies = [ - "windows-link", - "windows-result", - "windows-strings", -] - [[package]] name = "windows-result" version = "0.4.1" @@ -7383,7 +2815,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -7392,16 +2824,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", + "windows-targets", ] [[package]] @@ -7419,31 +2842,14 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] @@ -7461,113 +2867,59 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - [[package]] name = "winnow" version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" -dependencies = [ - "memchr", -] [[package]] name = "winnow" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" -dependencies = [ - "memchr", -] [[package]] name = "wit-bindgen" @@ -7581,51 +2933,12 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" -[[package]] -name = "x509-parser" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43b0f71ce057da06bc0851b23ee24f3f86190b07203dd8f567d0b706a185202" -dependencies = [ - "asn1-rs", - "aws-lc-rs", - "data-encoding", - "der-parser", - "lazy_static", - "nom 7.1.3", - "oid-registry", - "ring", - "rusticata-macros", - "thiserror 2.0.20", - "time", -] - -[[package]] -name = "xdg-home" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - [[package]] name = "yansi" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" -[[package]] -name = "yasna" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5f6765e852b9b4dc8e2a76843e4d64d1cea8e79bcde0b6901aea8e7c7f08282" -dependencies = [ - "bit-vec 0.9.1", - "time", -] - [[package]] name = "yoke" version = "0.8.3" @@ -7649,68 +2962,6 @@ dependencies = [ "synstructure", ] -[[package]] -name = "zbus" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" -dependencies = [ - "async-broadcast", - "async-executor", - "async-fs", - "async-io", - "async-lock", - "async-process", - "async-recursion", - "async-task", - "async-trait", - "blocking", - "enumflags2", - "event-listener", - "futures-core", - "futures-sink", - "futures-util", - "hex", - "nix 0.29.0", - "ordered-stream", - "rand 0.8.7", - "serde", - "serde_repr", - "sha1", - "static_assertions", - "tracing", - "uds_windows", - "windows-sys 0.52.0", - "xdg-home", - "zbus_macros", - "zbus_names", - "zvariant", -] - -[[package]] -name = "zbus_macros" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.119", - "zvariant_utils", -] - -[[package]] -name = "zbus_names" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" -dependencies = [ - "serde", - "static_assertions", - "zvariant", -] - [[package]] name = "zerocopy" version = "0.8.56" @@ -7757,20 +3008,6 @@ name = "zeroize" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] [[package]] name = "zerotrie" @@ -7781,7 +3018,6 @@ dependencies = [ "displaydoc", "yoke", "zerofrom", - "zerovec", ] [[package]] @@ -7790,7 +3026,6 @@ version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ - "serde", "yoke", "zerofrom", "zerovec-derive", @@ -7813,82 +3048,17 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" -[[package]] -name = "zstd" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" -dependencies = [ - "zstd-safe", -] +[[patch.unused]] +name = "tungstenite" +version = "0.27.0" +source = "git+https://github.com/openai-oss-forks/tungstenite-rs?rev=9200079d3b54a1ff51072e24d81fd354f085156f#9200079d3b54a1ff51072e24d81fd354f085156f" -[[package]] -name = "zstd-safe" -version = "7.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" -dependencies = [ - "zstd-sys", -] +[[patch.unused]] +name = "tokio-tungstenite" +version = "0.28.0" +source = "git+https://github.com/openai-oss-forks/tokio-tungstenite?rev=132f5b39c862e3a970f731d709608b3e6276d5f6#132f5b39c862e3a970f731d709608b3e6276d5f6" -[[package]] -name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" -dependencies = [ - "cc", - "pkg-config", -] - -[[package]] -name = "zune-core" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56377fd46368984a170bc5aac5567e52ca5da874caa60bea39fcbca78fb658b" - -[[package]] -name = "zune-jpeg" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" -dependencies = [ - "zune-core", -] - -[[package]] -name = "zvariant" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" -dependencies = [ - "endi", - "enumflags2", - "serde", - "static_assertions", - "zvariant_derive", -] - -[[package]] -name = "zvariant_derive" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.119", - "zvariant_utils", -] - -[[package]] -name = "zvariant_utils" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] +[[patch.unused]] +name = "tungstenite" +version = "0.27.0" +source = "git+https://github.com/openai-oss-forks/tungstenite-rs?rev=9200079d3b54a1ff51072e24d81fd354f085156f#9200079d3b54a1ff51072e24d81fd354f085156f" diff --git a/Cargo.toml b/Cargo.toml index 65f6d0a5..6618cf68 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,6 @@ members = [ "epiphany-core", "epiphany-model-adapter", "epiphany-openai-adapter", - "epiphany-openai-codex-spine", "epiphany-openai-runtime", "epiphany-release-construction", "epiphany-state-model", @@ -30,8 +29,8 @@ cultnet-rs = { path = "vendor/cultnet-rs" } epiphany-core = { path = "epiphany-core" } epiphany-model-adapter = { path = "epiphany-model-adapter" } epiphany-openai-adapter = { path = "epiphany-openai-adapter" } -epiphany-openai-codex-spine = { path = "epiphany-openai-codex-spine", optional = true } epiphany-openai-runtime = { path = "epiphany-openai-runtime", optional = true } +codex-connector = { git = "https://github.com/GameCult/CodexConnector", rev = "54d8bc2525b7e7fa1b9dd26b95871247ff4c7566", default-features = false, optional = true } epiphany-tool-adapter = { path = "epiphany-tool-adapter" } epiphany-tool-mcp-runtime = { path = "epiphany-tool-mcp-runtime", optional = true } rmp-serde = "1" @@ -40,10 +39,12 @@ serde_json = "1" sha2 = "0.10" tokio = { version = "1", features = ["io-util", "macros", "process", "rt", "rt-multi-thread", "time"] } toml = "0.9" +ureq = { version = "3.4", default-features = false, features = ["rustls"], optional = true } uuid = { version = "1", features = ["serde", "v4"] } +zeroize = { version = "1", optional = true } [features] -openai-runtime = ["dep:epiphany-openai-codex-spine", "dep:epiphany-openai-runtime"] +openai-runtime = ["dep:codex-connector", "dep:epiphany-openai-runtime", "dep:ureq", "dep:zeroize"] tool-mcp-runtime = ["dep:epiphany-tool-mcp-runtime"] release-runtime = ["openai-runtime", "tool-mcp-runtime"] diff --git a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs index d3cdb61f..9df3f9c2 100644 --- a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs +++ b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs @@ -11,6 +11,7 @@ use epiphany_core::HANDS_PATCH_RECEIPT_TYPE; use epiphany_core::HandsActionIntent; use epiphany_core::RepoFrontierHandsAuthority; use epiphany_core::RuntimeSpineInitOptions; +use epiphany_core::coordinator_status as status_projection; use epiphany_core::finalize_coordinator_run; use epiphany_core::hands_action_review_for_intent; use epiphany_core::initialize_runtime_spine; @@ -25,13 +26,13 @@ use epiphany_core::substrate_gate_coordinator_implementation_grant; use epiphany_core::{ LaunchedCoordinator, capture_process_instance, claim_resident_self_preparation_as_child, }; -use epiphany_core::coordinator_status as status_projection; use serde_json::Value; use serde_json::json; use sha2::{Digest, Sha256}; use std::collections::BTreeMap; use std::env; use std::fs; +use std::net::SocketAddr; use std::path::{Path, PathBuf}; use std::process::{Command, Stdio}; use std::thread; @@ -69,7 +70,7 @@ struct Args { thread_id: Option, objective: Option, cwd: PathBuf, - codex_home: PathBuf, + model_connector_endpoint: SocketAddr, mcp_config: PathBuf, artifact_dir: PathBuf, runtime_store: PathBuf, @@ -106,9 +107,7 @@ impl Args { thread_id: None, objective: None, cwd: root.clone(), - codex_home: env::var_os("CODEX_HOME") - .map(PathBuf::from) - .unwrap_or_else(|| home_dir().join(".codex")), + model_connector_endpoint: "127.0.0.1:17891".parse().unwrap(), mcp_config: root.join(".epiphany").join("mcp.toml"), artifact_dir: root.join(".epiphany-dogfood").join("coordinator"), runtime_store: root.join("state").join("runtime-spine.msgpack"), @@ -197,7 +196,10 @@ impl Args { parsed.required_action = Some(take_string(&mut args, "--required-action")?) } "--cwd" => parsed.cwd = take_path(&mut args, "--cwd")?, - "--codex-home" => parsed.codex_home = take_path(&mut args, "--codex-home")?, + "--connector-endpoint" => { + parsed.model_connector_endpoint = + take_string(&mut args, "--connector-endpoint")?.parse()? + } "--mcp-config" => parsed.mcp_config = take_path(&mut args, "--mcp-config")?, "--artifact-dir" => parsed.artifact_dir = take_path(&mut args, "--artifact-dir")?, "--runtime-store" => { @@ -283,12 +285,10 @@ fn run_coordinator(args: &Args) -> Result { let cwd = status_projection::absolute_path(&args.cwd)?; let model_runtime_bin = resolve_model_runtime_bin(&root, &args.model_runtime_bin)?; let tool_adapter_bin = resolve_model_runtime_bin(&root, &args.tool_adapter_bin)?; - let codex_home = status_projection::absolute_path(&args.codex_home)?; let mcp_config = status_projection::absolute_path(&args.mcp_config)?; let artifact_dir = status_projection::absolute_path(&args.artifact_dir)?; let runtime_store = status_projection::absolute_path(&args.runtime_store)?; reset_artifact_dir(&artifact_dir)?; - fs::create_dir_all(&codex_home)?; let telemetry_path = artifact_dir.join("agent-function-telemetry.json"); let steps_path = artifact_dir.join("coordinator-steps.jsonl"); @@ -408,7 +408,7 @@ fn run_coordinator(args: &Args) -> Result { &args.model, args.provider_credential_path.as_deref(), &runtime_store, - &codex_home, + args.model_connector_endpoint, &mcp_config, &cwd, args.resident_state_store.as_deref(), @@ -450,7 +450,7 @@ fn run_coordinator(args: &Args) -> Result { &args.model, args.provider_credential_path.as_deref(), &runtime_store, - &codex_home, + args.model_connector_endpoint, &mcp_config, &cwd, args.resident_state_store.as_deref(), @@ -504,7 +504,7 @@ fn run_coordinator(args: &Args) -> Result { &args.model, args.provider_credential_path.as_deref(), &runtime_store, - &codex_home, + args.model_connector_endpoint, &mcp_config, &cwd, args.resident_state_store.as_deref(), @@ -549,7 +549,9 @@ fn run_coordinator(args: &Args) -> Result { let snapshot_name = format!("step-{index:02}-{action}.txt"); fs::write( artifact_dir.join(&snapshot_name), - status_projection::render_status(&status_projection::sanitize_for_operator(status.clone())), + status_projection::render_status(&status_projection::sanitize_for_operator( + status.clone(), + )), )?; snapshots.push(snapshot_name); let mut step = json!({ @@ -656,7 +658,7 @@ fn run_coordinator(args: &Args) -> Result { &args.model, args.provider_credential_path.as_deref(), &runtime_store, - &codex_home, + args.model_connector_endpoint, &mcp_config, &cwd, args.resident_state_store.as_deref(), @@ -706,7 +708,7 @@ fn run_coordinator(args: &Args) -> Result { &args.model, args.provider_credential_path.as_deref(), &runtime_store, - &codex_home, + args.model_connector_endpoint, &mcp_config, &cwd, args.resident_state_store.as_deref(), @@ -1027,7 +1029,7 @@ fn run_coordinator(args: &Args) -> Result { &args.model, args.provider_credential_path.as_deref(), &runtime_store, - &codex_home, + args.model_connector_endpoint, &mcp_config, &cwd, args.resident_state_store.as_deref(), @@ -1070,7 +1072,7 @@ fn run_coordinator(args: &Args) -> Result { &args.model, args.provider_credential_path.as_deref(), &runtime_store, - &codex_home, + args.model_connector_endpoint, &mcp_config, &cwd, args.resident_state_store.as_deref(), @@ -1186,7 +1188,7 @@ fn run_coordinator(args: &Args) -> Result { &args.model, args.provider_credential_path.as_deref(), &runtime_store, - &codex_home, + args.model_connector_endpoint, &mcp_config, &cwd, args.resident_state_store.as_deref(), @@ -1256,7 +1258,7 @@ fn run_coordinator(args: &Args) -> Result { &args.model, args.provider_credential_path.as_deref(), &runtime_store, - &codex_home, + args.model_connector_endpoint, &mcp_config, &cwd, args.resident_state_store.as_deref(), @@ -1344,7 +1346,7 @@ fn run_coordinator(args: &Args) -> Result { "modelRuntimeBin": model_runtime_bin, "toolAdapterBin": tool_adapter_bin, "modelProvider": args.model_provider, - "codexHome": codex_home, + "modelConnectorEndpoint": args.model_connector_endpoint, "mcpConfig": mcp_config, "runtimeStore": runtime_store, "workspace": cwd, @@ -1738,7 +1740,7 @@ fn launch_worker_runtime_detached( model: &str, provider_credential_path: Option<&Path>, runtime_store: &Path, - codex_home: &Path, + model_connector_endpoint: SocketAddr, mcp_config: &Path, cwd: &Path, resident_store: Option<&Path>, @@ -1767,8 +1769,8 @@ fn launch_worker_runtime_detached( .arg(model) .arg("--store") .arg(runtime_store) - .arg("--codex-home") - .arg(codex_home) + .arg("--connector-endpoint") + .arg(model_connector_endpoint.to_string()) .arg("--mcp-config") .arg(mcp_config) .arg("--job-id") @@ -2053,7 +2055,10 @@ fn append_jsonl(path: &Path, value: &Value) -> Result<()> { } fn append_operator_step_jsonl(path: &Path, step: &Value) -> Result<()> { - append_jsonl(path, &status_projection::sanitize_for_operator(step.clone())) + append_jsonl( + path, + &status_projection::sanitize_for_operator(step.clone()), + ) } fn take_string(args: &mut impl Iterator, name: &str) -> Result { @@ -2065,13 +2070,6 @@ fn take_path(args: &mut impl Iterator, name: &str) -> Result PathBuf { - env::var_os("USERPROFILE") - .or_else(|| env::var_os("HOME")) - .map(PathBuf::from) - .unwrap_or_else(|| PathBuf::from(".")) -} - #[cfg(test)] mod tests { use super::*; @@ -2111,7 +2109,7 @@ mod tests { thread_id: Some("error-terminalization".to_string()), objective: Some("Exercise the coordinator error boundary.".to_string()), cwd: cwd.clone(), - codex_home: temp.path().join("codex-home"), + model_connector_endpoint: "127.0.0.1:17891".parse().unwrap(), mcp_config: cwd.join(".epiphany/mcp.toml"), artifact_dir: cwd.join(".epiphany-smoke/error-terminalization"), runtime_store: runtime_store.clone(), diff --git a/epiphany-core/src/bin/epiphany-swarm.rs b/epiphany-core/src/bin/epiphany-swarm.rs index d8cbaa6e..c4fa36be 100644 --- a/epiphany-core/src/bin/epiphany-swarm.rs +++ b/epiphany-core/src/bin/epiphany-swarm.rs @@ -495,7 +495,11 @@ impl Args { runtime_store: path("--runtime-store")?, local_verse_store: path("--local-verse-store")?, artifact_root: path("--artifact-root")?, - codex_home: path("--codex-home")?, + model_connector_endpoint: value + .get("--connector-endpoint") + .ok_or_else(|| anyhow!("missing --connector-endpoint"))? + .parse() + .context("invalid --connector-endpoint")?, mcp_config: path("--mcp-config")?, model_provider: value .get("--model-provider") @@ -776,7 +780,7 @@ mod brake_tests { runtime_store, local_verse_store: verse_store, artifact_root: shared.join("artifacts"), - codex_home: shared.join("codex-home"), + model_connector_endpoint: "127.0.0.1:17891".parse().unwrap(), mcp_config: shared.join("mcp.toml"), model_provider: "test".into(), model: "test-model".into(), diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index ee4f9c46..3b26c232 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -3664,7 +3664,7 @@ mod tests { runtime_store: store.clone(), local_verse_store: temp.path().join("local-verse.cc"), artifact_root: temp.path().join("artifacts"), - codex_home: temp.path().join("codex-home"), + model_connector_endpoint: "127.0.0.1:17891".parse().unwrap(), mcp_config: temp.path().join("mcp.toml"), model_provider: "openrouter".into(), model: "stealth/ox-alpha".into(), diff --git a/epiphany-core/src/resident_readiness.rs b/epiphany-core/src/resident_readiness.rs index 564745b5..f8b74293 100644 --- a/epiphany-core/src/resident_readiness.rs +++ b/epiphany-core/src/resident_readiness.rs @@ -728,20 +728,12 @@ fn directory_ready(path: &Path) -> bool { fs::metadata(path).is_ok_and(|value| value.is_dir() && !value.permissions().readonly()) } -fn codex_credentials_ready(codex_home: &Path) -> bool { - directory_ready(codex_home) && credential_file_ready(&codex_home.join("auth.json")) -} - fn model_provider_credential_ready(policy: &ResidentSelfPolicy) -> bool { match policy.model_provider.as_str() { - "openai-codex" | "openai" => codex_credentials_ready(&policy.codex_home), - "openrouter" => policy + "openai-codex" | "openai" | "openrouter" => policy .provider_credential_path .as_deref() - .is_some_and(|path| { - fs::metadata(path).is_ok_and(|metadata| metadata.is_file()) - && fs::File::open(path).is_ok() - }), + .is_some_and(credential_file_ready), _ => false, } } @@ -972,30 +964,6 @@ mod tests { Ok(()) } - #[cfg(unix)] - #[test] - fn unix_credentials_reject_group_or_other_access() -> Result<()> { - use std::os::unix::fs::PermissionsExt; - let temp = tempfile::tempdir()?; - let auth = temp.path().join("auth.json"); - fs::write(&auth, b"{}")?; - fs::set_permissions(&auth, fs::Permissions::from_mode(0o400))?; - assert!(!codex_credentials_ready(temp.path())); - fs::set_permissions(&auth, fs::Permissions::from_mode(0o644))?; - assert!(!codex_credentials_ready(temp.path())); - fs::set_permissions(&auth, fs::Permissions::from_mode(0o600))?; - assert!(codex_credentials_ready(temp.path())); - Ok(()) - } - - #[test] - fn legacy_credentials_file_cannot_impersonate_canonical_auth() -> Result<()> { - let temp = tempfile::tempdir()?; - fs::write(temp.path().join("credentials.json"), b"{}")?; - assert!(!codex_credentials_ready(temp.path())); - Ok(()) - } - #[test] fn readiness_uses_mounted_cognitive_identity_for_projection_and_brake() -> Result<()> { let temp = tempfile::tempdir()?; @@ -1026,7 +994,7 @@ mod tests { runtime_store, local_verse_store, artifact_root: shared.join("artifacts"), - codex_home: shared.join("codex-home"), + model_connector_endpoint: "127.0.0.1:17891".parse().unwrap(), mcp_config: shared.join("mcp.toml"), model_provider: "test".into(), model: "test-model".into(), diff --git a/epiphany-core/src/resident_self.rs b/epiphany-core/src/resident_self.rs index 50651cf9..8623bf1c 100644 --- a/epiphany-core/src/resident_self.rs +++ b/epiphany-core/src/resident_self.rs @@ -5,6 +5,7 @@ use cultcache_rs::{ use serde::{Deserialize, Serialize}; use sha2::{Digest, Sha256}; use std::collections::{BTreeSet, HashSet}; +use std::net::SocketAddr; use std::path::{Path, PathBuf}; pub const RESIDENT_SELF_STATE_KEY: &str = "resident-self"; @@ -273,7 +274,7 @@ pub struct ResidentSelfPolicy { pub runtime_store: PathBuf, pub local_verse_store: PathBuf, pub artifact_root: PathBuf, - pub codex_home: PathBuf, + pub model_connector_endpoint: SocketAddr, pub mcp_config: PathBuf, pub model_provider: String, pub model: String, @@ -301,7 +302,6 @@ impl ResidentSelfPolicy { ("runtime store", &self.runtime_store), ("local Verse store", &self.local_verse_store), ("artifact root", &self.artifact_root), - ("Codex home", &self.codex_home), ("MCP config", &self.mcp_config), ("release store", &self.release_store), ] { @@ -320,6 +320,13 @@ impl ResidentSelfPolicy { path.display() )); } + if !self.model_connector_endpoint.ip().is_loopback() + || self.model_connector_endpoint.port() == 0 + { + return Err(anyhow!( + "resident Self model connector must use a nonzero loopback endpoint" + )); + } if self.model_provider.trim().is_empty() || self.model.trim().is_empty() || self.max_steps == 0 @@ -617,8 +624,8 @@ pub fn coordinator_argv( turn_id.into(), "--cwd".into(), policy.workspace.display().to_string(), - "--codex-home".into(), - policy.codex_home.display().to_string(), + "--connector-endpoint".into(), + policy.model_connector_endpoint.to_string(), "--mcp-config".into(), policy.mcp_config.display().to_string(), "--artifact-dir".into(), @@ -2762,7 +2769,7 @@ mod coordinator_launch_contract_tests { runtime_store, local_verse_store: root.join("local-verse.cc"), artifact_root: root.join("artifacts"), - codex_home: root.join("codex-home"), + model_connector_endpoint: "127.0.0.1:17891".parse().unwrap(), mcp_config: root.join("mcp.toml"), model_provider: "openrouter".into(), model: "stealth/ox-alpha".into(), @@ -2791,7 +2798,7 @@ mod coordinator_launch_contract_tests { runtime_store: PathBuf::from("/epiphany/state/runtime.cc"), local_verse_store: PathBuf::from("/epiphany/state/local-verse.cc"), artifact_root: PathBuf::from("/epiphany/artifacts"), - codex_home: PathBuf::from("/epiphany/codex-home"), + model_connector_endpoint: "127.0.0.1:17891".parse().unwrap(), mcp_config: PathBuf::from("/epiphany/mcp.toml"), model_provider: "openrouter".into(), model: "stealth/ox-alpha".into(), diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index 34737881..9e268ef4 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -55,7 +55,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v37"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v38"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache(type = "epiphany.runtime.identity", schema = "EpiphanyRuntimeIdentity")] @@ -1936,7 +1936,8 @@ fn archive_completed_model_session( } match &native_terminals[0].payload { EpiphanyModelStreamPayload::Completed { receipt } => { - if cache.get::(request_id)?.as_ref() != Some(receipt) { + if cache.get::(request_id)?.as_ref() != Some(receipt.as_ref()) + { return Err(anyhow!( "runtime session archive found inconsistent native model receipt" )); diff --git a/epiphany-model-adapter/src/lib.rs b/epiphany-model-adapter/src/lib.rs index f91e8d05..7507717e 100644 --- a/epiphany-model-adapter/src/lib.rs +++ b/epiphany-model-adapter/src/lib.rs @@ -4,7 +4,7 @@ use serde::Serialize; pub const MODEL_ADAPTER_REQUEST_SCHEMA_ID: &str = "epiphany.model_request.v0"; pub const MODEL_ADAPTER_EVENT_SCHEMA_ID: &str = "epiphany.model_stream_event.v0"; -pub const MODEL_ADAPTER_RECEIPT_SCHEMA_ID: &str = "epiphany.model_receipt.v0"; +pub const MODEL_ADAPTER_RECEIPT_SCHEMA_ID: &str = "epiphany.model_receipt.v1"; #[derive(Debug, Clone, PartialEq, DatabaseEntry)] #[cultcache(type = "epiphany.model_request.v0", schema = "EpiphanyModelRequest")] pub struct EpiphanyModelRequest { @@ -129,7 +129,7 @@ pub enum EpiphanyModelStreamPayload { arguments: String, }, Completed { - receipt: EpiphanyModelReceipt, + receipt: Box, }, Failed { message: String, @@ -137,7 +137,7 @@ pub enum EpiphanyModelStreamPayload { } #[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] -#[cultcache(type = "epiphany.model_receipt.v0", schema = "EpiphanyModelReceipt")] +#[cultcache(type = "epiphany.model_receipt.v1", schema = "EpiphanyModelReceipt")] pub struct EpiphanyModelReceipt { #[cultcache(key = 0)] pub schema_id: String, @@ -157,6 +157,14 @@ pub struct EpiphanyModelReceipt { pub reasoning_output_tokens: Option, #[cultcache(key = 8, default)] pub transport: Option, + #[cultcache(key = 9, default)] + pub caller_runtime_id: Option, + #[cultcache(key = 10, default)] + pub native_request_sha256: Option, + #[cultcache(key = 11, default)] + pub provider_request_sha256: Option, + #[cultcache(key = 12, default)] + pub cached_input_tokens: Option, } impl EpiphanyModelReceipt { @@ -175,6 +183,10 @@ impl EpiphanyModelReceipt { output_tokens: None, reasoning_output_tokens: None, transport: None, + caller_runtime_id: None, + native_request_sha256: None, + provider_request_sha256: None, + cached_input_tokens: None, } } } diff --git a/epiphany-openai-adapter/Cargo.toml b/epiphany-openai-adapter/Cargo.toml index 9875b49d..6fc79709 100644 --- a/epiphany-openai-adapter/Cargo.toml +++ b/epiphany-openai-adapter/Cargo.toml @@ -10,6 +10,9 @@ name = "epiphany_openai_adapter" path = "src/lib.rs" [dependencies] +anyhow = "1" cultcache-rs = { path = "../vendor/cultcache-rs" } epiphany-model-adapter = { path = "../epiphany-model-adapter" } serde = { version = "1", features = ["derive"] } +serde_json = "1" +sha2 = "0.10" diff --git a/epiphany-openai-adapter/src/lib.rs b/epiphany-openai-adapter/src/lib.rs index 2bb7ee0a..ca2f5c89 100644 --- a/epiphany-openai-adapter/src/lib.rs +++ b/epiphany-openai-adapter/src/lib.rs @@ -2,6 +2,7 @@ use cultcache_rs::DatabaseEntry; use epiphany_model_adapter::{EpiphanyModelInputItem, EpiphanyModelRequest}; use serde::Deserialize; use serde::Serialize; +use sha2::{Digest, Sha256}; pub const OPENAI_ADAPTER_REQUEST_SCHEMA_ID: &str = "epiphany.openai_model_request.v1"; #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] @@ -183,7 +184,7 @@ pub enum EpiphanyOpenAiStreamPayload { arguments: String, }, Completed { - receipt: EpiphanyOpenAiModelReceipt, + receipt: Box, }, Failed { message: String, @@ -199,6 +200,10 @@ pub struct EpiphanyOpenAiModelReceipt { pub output_tokens: Option, pub reasoning_output_tokens: Option, pub transport: Option, + pub caller_runtime_id: Option, + pub native_request_sha256: Option, + pub provider_request_sha256: Option, + pub cached_input_tokens: Option, } impl EpiphanyOpenAiModelReceipt { @@ -211,6 +216,615 @@ impl EpiphanyOpenAiModelReceipt { output_tokens: None, reasoning_output_tokens: None, transport: None, + caller_runtime_id: None, + native_request_sha256: None, + provider_request_sha256: None, + cached_input_tokens: None, + } + } +} + +/// Project Epiphany's canonical JSON Schema into the strict subset accepted by +/// model providers. Native decoding remains the final validation authority. +pub fn strict_provider_schema(schema_json: &str) -> anyhow::Result { + let mut schema = serde_json::from_str(schema_json) + .map_err(|error| anyhow::anyhow!("provider schema is not valid JSON Schema: {error}"))?; + lower_provider_schema(&mut schema); + close_provider_objects(&mut schema, "$")?; + if !provider_schema_is_strict(&schema) { + return Err(anyhow::anyhow!( + "projected provider output schema is not strict" + )); + } + Ok(schema) +} + +/// Provider-safe output-format identity derived from the native contract. +pub fn provider_format_name(value: &str) -> String { + let mut name = value + .chars() + .map(|ch| { + if ch.is_ascii_alphanumeric() || matches!(ch, '_' | '-') { + ch + } else { + '_' + } + }) + .take(64) + .collect::(); + if name.is_empty() { + name.push_str("epiphany_worker_result"); + } + name +} + +/// Responses call IDs have a narrow alphabet and byte bound. Preserve already +/// legal IDs and derive a stable identity for every other native call ID. +pub fn provider_call_id(value: &str) -> String { + if !value.is_empty() + && value.len() <= 64 + && value + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'_' | b'-')) + { + return value.to_string(); + } + let digest = Sha256::digest(value.as_bytes()); + let mut projected = String::with_capacity(64); + for byte in digest { + use std::fmt::Write as _; + write!(&mut projected, "{byte:02x}").expect("writing to a String cannot fail"); + } + projected +} + +pub const OPENROUTER_TERMINAL_TOOL_NAME: &str = "epiphany_submit_typed_result"; + +/// Lower one typed Epiphany request to OpenRouter's terminal-tool dialect. +pub fn openrouter_request_body( + request: &EpiphanyOpenAiModelRequest, +) -> anyhow::Result { + if request.provider_id != "openrouter" + || request.wire_dialect != EpiphanyOpenAiWireDialect::ChatCompletionsTerminalTool + { + return Err(anyhow::anyhow!( + "OpenRouter requires its exact provider identity and terminal-tool dialect" + )); + } + let has_tool_result = request + .input + .iter() + .any(|item| matches!(item, EpiphanyOpenAiInputItem::ToolResult { .. })); + let output_schema = request + .output_schema_json + .as_deref() + .map(strict_provider_schema) + .transpose()?; + let include_terminal_tool = + output_schema.is_some() && (request.tools.is_empty() || has_tool_result); + if request + .tools + .iter() + .any(|tool| tool.name == OPENROUTER_TERMINAL_TOOL_NAME) + { + return Err(anyhow::anyhow!( + "native tool name collides with the OpenRouter terminal decision tool" + )); + } + + let mut messages = vec![serde_json::json!({ + "role": "system", + "content": request.instructions, + })]; + for item in &request.input { + messages.push(match item { + EpiphanyOpenAiInputItem::UserText { text } => { + serde_json::json!({"role": "user", "content": text}) + } + EpiphanyOpenAiInputItem::AssistantText { text } => { + serde_json::json!({"role": "assistant", "content": text}) + } + EpiphanyOpenAiInputItem::ToolCall { + call_id, + name, + arguments, + } => serde_json::json!({ + "role": "assistant", + "tool_calls": [{ + "id": call_id, + "type": "function", + "function": {"name": name, "arguments": arguments}, + }], + }), + EpiphanyOpenAiInputItem::ToolResult { call_id, output } => serde_json::json!({ + "role": "tool", + "tool_call_id": call_id, + "content": output, + }), + }); + } + + let mut tools = request + .tools + .iter() + .map(|tool| { + Ok(serde_json::json!({ + "type": "function", + "function": { + "name": tool.name, + "description": tool.description, + "strict": true, + "parameters": strict_provider_schema(&tool.parameters_json)?, + }, + })) + }) + .collect::>>()?; + if include_terminal_tool { + tools.push(serde_json::json!({ + "type": "function", + "function": { + "name": OPENROUTER_TERMINAL_TOOL_NAME, + "description": "Submit the final typed Epiphany decision. Call this only when the pass is complete.", + "strict": true, + "parameters": output_schema.expect("terminal schema exists"), + }, + })); + } + + let mut body = serde_json::json!({ + "model": request.model, + "messages": messages, + "stream": false, + "parallel_tool_calls": false, + }); + if !tools.is_empty() { + body["tools"] = serde_json::Value::Array(tools); + body["tool_choice"] = serde_json::Value::String( + if include_terminal_tool || (!request.tools.is_empty() && !has_tool_result) { + "required" + } else { + "auto" + } + .into(), + ); + } + if let Some(effort) = request.reasoning_effort.as_deref() { + body["reasoning"] = serde_json::json!({"effort": effort}); + } + Ok(body) +} + +/// Interpret one non-streaming OpenRouter response into Epiphany's transient +/// event family. The model transcript remains optional; the terminal receipt +/// is authoritative transport evidence. +pub fn openrouter_events_from_response( + request: &EpiphanyOpenAiModelRequest, + response_bytes: &[u8], +) -> anyhow::Result> { + let response: OpenRouterResponse = serde_json::from_slice(response_bytes) + .map_err(|error| anyhow::anyhow!("OpenRouter returned an invalid response: {error}"))?; + let choice = response + .choices + .into_iter() + .next() + .ok_or_else(|| anyhow::anyhow!("OpenRouter response contained no completion choice"))?; + let mut events = Vec::new(); + if let Some(reasoning) = choice.message.reasoning.filter(|value| !value.is_empty()) { + push_openrouter_event( + &mut events, + &request.request_id, + EpiphanyOpenAiStreamPayload::ReasoningDelta { text: reasoning }, + ); + } + let terminal_calls = choice + .message + .tool_calls + .iter() + .filter(|call| call.function.name == OPENROUTER_TERMINAL_TOOL_NAME) + .collect::>(); + if !terminal_calls.is_empty() { + if terminal_calls.len() != 1 || choice.message.tool_calls.len() != 1 { + return Err(anyhow::anyhow!( + "OpenRouter mixed the terminal decision tool with another tool call" + )); + } + let arguments = &terminal_calls[0].function.arguments; + if !matches!( + serde_json::from_str::(arguments), + Ok(serde_json::Value::Object(_)) + ) { + return Err(anyhow::anyhow!( + "OpenRouter terminal decision tool returned non-object arguments" + )); + } + push_openrouter_event( + &mut events, + &request.request_id, + EpiphanyOpenAiStreamPayload::TextDelta { + text: arguments.clone(), + }, + ); + } else { + if let Some(content) = choice.message.content.filter(|value| !value.is_empty()) { + push_openrouter_event( + &mut events, + &request.request_id, + EpiphanyOpenAiStreamPayload::TextDelta { text: content }, + ); + } + for call in choice.message.tool_calls { + push_openrouter_event( + &mut events, + &request.request_id, + EpiphanyOpenAiStreamPayload::ToolCall { + call_id: call.id, + name: call.function.name, + arguments: call.function.arguments, + }, + ); + } + } + if events.is_empty() { + return Err(anyhow::anyhow!( + "OpenRouter response contained neither text nor tool calls" + )); + } + let usage = response.usage; + let mut receipt = EpiphanyOpenAiModelReceipt::new( + &request.request_id, + response.model.unwrap_or_else(|| request.model.clone()), + ); + receipt.response_id = response.id; + receipt.input_tokens = usage.as_ref().and_then(|usage| usage.prompt_tokens); + receipt.output_tokens = usage.as_ref().and_then(|usage| usage.completion_tokens); + receipt.reasoning_output_tokens = usage + .as_ref() + .and_then(|usage| usage.completion_tokens_details.as_ref()) + .and_then(|details| details.reasoning_tokens); + receipt.transport = Some("openrouter-chat-completions".into()); + push_openrouter_event( + &mut events, + &request.request_id, + EpiphanyOpenAiStreamPayload::Completed { + receipt: Box::new(receipt), + }, + ); + Ok(events) +} + +#[derive(Debug, Deserialize)] +struct OpenRouterResponse { + id: Option, + model: Option, + choices: Vec, + usage: Option, +} + +#[derive(Debug, Deserialize)] +struct OpenRouterChoice { + message: OpenRouterMessage, +} + +#[derive(Debug, Deserialize)] +struct OpenRouterMessage { + content: Option, + #[serde(default)] + reasoning: Option, + #[serde(default)] + tool_calls: Vec, +} + +#[derive(Debug, Deserialize)] +struct OpenRouterToolCall { + id: String, + function: OpenRouterFunctionCall, +} + +#[derive(Debug, Deserialize)] +struct OpenRouterFunctionCall { + name: String, + arguments: String, +} + +#[derive(Debug, Deserialize)] +struct OpenRouterUsage { + prompt_tokens: Option, + completion_tokens: Option, + completion_tokens_details: Option, +} + +#[derive(Debug, Deserialize)] +struct OpenRouterCompletionTokenDetails { + reasoning_tokens: Option, +} + +fn push_openrouter_event( + events: &mut Vec, + request_id: &str, + payload: EpiphanyOpenAiStreamPayload, +) { + events.push(EpiphanyOpenAiStreamEvent { + request_id: request_id.into(), + sequence: events.len() as u64, + payload, + }); +} + +fn provider_schema_is_strict(schema: &serde_json::Value) -> bool { + match schema { + serde_json::Value::Object(map) => { + if (map.contains_key("const") || map.contains_key("enum")) && !map.contains_key("type") + { + return false; + } + if schema_map_describes_object(map) { + if map.get("additionalProperties") != Some(&serde_json::Value::Bool(false)) { + return false; + } + let Some(properties) = map.get("properties").and_then(serde_json::Value::as_object) + else { + return false; + }; + let Some(required) = map.get("required").and_then(serde_json::Value::as_array) + else { + return false; + }; + if properties + .keys() + .any(|key| !required.iter().any(|item| item.as_str() == Some(key))) + { + return false; + } + } + map.values().all(provider_schema_is_strict) + } + serde_json::Value::Array(values) => values.iter().all(provider_schema_is_strict), + _ => true, + } +} + +fn close_provider_objects(schema: &mut serde_json::Value, path: &str) -> anyhow::Result<()> { + match schema { + serde_json::Value::Object(map) => { + let describes_object = schema_map_describes_object(map); + if describes_object { + map.insert("type".into(), serde_json::Value::String("object".into())); + let properties = map + .get("properties") + .and_then(serde_json::Value::as_object) + .cloned() + .unwrap_or_default(); + let canonical_required = map + .get("required") + .and_then(serde_json::Value::as_array) + .cloned() + .unwrap_or_default(); + for required in &canonical_required { + let required = required.as_str().ok_or_else(|| { + anyhow::anyhow!("provider schema {path} has a non-string required key") + })?; + if !properties.contains_key(required) { + return Err(anyhow::anyhow!( + "provider schema {path} requires undeclared property {required:?}" + )); + } + } + let canonical_required = canonical_required + .into_iter() + .filter_map(|value| value.as_str().map(ToOwned::to_owned)) + .collect::>(); + let mut projected = serde_json::Map::new(); + for (name, mut property) in properties { + close_provider_objects(&mut property, &format!("{path}.properties.{name}"))?; + if !canonical_required.contains(&name) { + property = nullable_provider_property(property); + } + projected.insert(name, property); + } + let required = projected + .keys() + .cloned() + .map(serde_json::Value::String) + .collect(); + map.insert("properties".into(), serde_json::Value::Object(projected)); + map.insert("required".into(), serde_json::Value::Array(required)); + map.insert( + "additionalProperties".into(), + serde_json::Value::Bool(false), + ); + } + for (name, value) in map.iter_mut() { + if name != "properties" || !describes_object { + close_provider_objects(value, &format!("{path}.{name}"))?; + } + } + Ok(()) + } + serde_json::Value::Array(values) => { + for (index, value) in values.iter_mut().enumerate() { + close_provider_objects(value, &format!("{path}[{index}]"))?; + } + Ok(()) + } + _ => Ok(()), + } +} + +fn schema_map_describes_object(map: &serde_json::Map) -> bool { + map.get("type").and_then(serde_json::Value::as_str) == Some("object") + || [ + "properties", + "required", + "additionalProperties", + "patternProperties", + "propertyNames", + "minProperties", + "maxProperties", + ] + .iter() + .any(|keyword| map.contains_key(*keyword)) +} + +fn parent_relative_object_alternatives(value: &serde_json::Value) -> bool { + let Some(alternatives) = value.as_array() else { + return false; + }; + !alternatives.is_empty() + && alternatives.iter().all(|alternative| { + let Some(map) = alternative.as_object() else { + return false; + }; + !map.contains_key("type") + && !map.contains_key("$ref") + && map + .keys() + .any(|key| matches!(key.as_str(), "properties" | "required")) + && map.keys().all(|key| { + matches!( + key.as_str(), + "properties" | "required" | "title" | "description" | "$comment" + ) + }) + }) +} + +fn infer_literal_type(map: &mut serde_json::Map) { + if map.contains_key("type") { + return; + } + let mut types = std::collections::BTreeSet::new(); + if let Some(value) = map.get("const") { + types.insert(json_type(value)); + } else if let Some(values) = map.get("enum").and_then(serde_json::Value::as_array) { + types.extend(values.iter().map(json_type)); + } + match types.len() { + 0 => {} + 1 => { + map.insert( + "type".into(), + serde_json::Value::String(types.into_iter().next().expect("one type").into()), + ); + } + _ => { + map.insert( + "type".into(), + serde_json::Value::Array( + types + .into_iter() + .map(|value| serde_json::Value::String(value.into())) + .collect(), + ), + ); + } + } +} + +fn json_type(value: &serde_json::Value) -> &'static str { + match value { + serde_json::Value::Null => "null", + serde_json::Value::Bool(_) => "boolean", + serde_json::Value::Number(number) if number.is_i64() || number.is_u64() => "integer", + serde_json::Value::Number(_) => "number", + serde_json::Value::String(_) => "string", + serde_json::Value::Array(_) => "array", + serde_json::Value::Object(_) => "object", + } +} + +fn nullable_provider_property(property: serde_json::Value) -> serde_json::Value { + if property + .get("anyOf") + .and_then(serde_json::Value::as_array) + .is_some_and(|variants| { + variants.iter().any(|variant| { + variant.get("type").and_then(serde_json::Value::as_str) == Some("null") + }) + }) + { + property + } else { + serde_json::json!({"anyOf": [property, {"type": "null"}]}) + } +} + +const UNSUPPORTED_PROVIDER_SCHEMA_KEYWORDS: &[&str] = &[ + "allOf", + "not", + "dependentRequired", + "dependentSchemas", + "if", + "then", + "else", + "patternProperties", + "propertyNames", + "minProperties", + "maxProperties", + "unevaluatedProperties", + "uniqueItems", + "contains", + "minContains", + "maxContains", + "prefixItems", + "unevaluatedItems", + "default", + "examples", + "readOnly", + "writeOnly", + "$schema", + "$id", + "$anchor", + "$dynamicAnchor", + "$dynamicRef", + "$vocabulary", +]; + +fn lower_provider_schema(schema: &mut serde_json::Value) { + let serde_json::Value::Object(map) = schema else { + return; + }; + infer_literal_type(map); + if map.get("format").and_then(serde_json::Value::as_str) == Some("uuid") { + map.remove("format"); + map.entry("pattern").or_insert_with(|| { + serde_json::Value::String( + "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" + .into(), + ) + }); + } + for keyword in UNSUPPORTED_PROVIDER_SCHEMA_KEYWORDS { + map.remove(*keyword); + } + if let Some(one_of) = map.remove("oneOf") { + map.insert("anyOf".into(), one_of); + } + if map + .get("anyOf") + .is_some_and(parent_relative_object_alternatives) + { + map.remove("anyOf"); + } + for collection in ["properties", "$defs", "definitions"] { + if let Some(serde_json::Value::Object(children)) = map.get_mut(collection) { + for child in children.values_mut() { + lower_provider_schema(child); + } + } + } + if let Some(items) = map.get_mut("items") { + match items { + serde_json::Value::Array(items) => { + for item in items { + lower_provider_schema(item); + } + } + item => lower_provider_schema(item), + } + } + if let Some(serde_json::Value::Array(alternatives)) = map.get_mut("anyOf") { + for alternative in alternatives { + lower_provider_schema(alternative); } } } @@ -247,4 +861,94 @@ mod tests { ); assert_ne!(openai.schema_id, "epiphany.openai_model_request.v0"); } + + #[test] + fn provider_projection_closes_objects_without_keeping_parent_conditions() { + let schema = strict_provider_schema( + r#"{ + "type":"object", + "properties":{"choice":{"type":"string"},"note":{"type":"string"}}, + "required":["choice"], + "allOf":[{"if":{"properties":{"choice":{"const":"x"}}}}], + "anyOf":[{"required":["choice"]},{"required":["note"]}] + }"#, + ) + .unwrap(); + + assert_eq!(schema["additionalProperties"], false); + assert_eq!(schema["required"], serde_json::json!(["choice", "note"])); + assert!(schema.get("allOf").is_none()); + assert!(schema.get("anyOf").is_none()); + assert_eq!(schema["properties"]["note"]["anyOf"][1]["type"], "null"); + } + + #[test] + fn provider_projection_types_literals_and_lowers_uuid() { + let schema = strict_provider_schema( + r#"{ + "type":"object", + "properties":{ + "kind":{"const":"ready"}, + "id":{"type":"string","format":"uuid"}, + "items":{"type":"array","uniqueItems":true,"items":{"enum":[1,2]}} + }, + "required":["kind","id","items"] + }"#, + ) + .unwrap(); + + assert_eq!(schema["properties"]["kind"]["type"], "string"); + assert!(schema["properties"]["id"].get("format").is_none()); + assert!(schema["properties"]["id"]["pattern"].is_string()); + assert!(schema["properties"]["items"].get("uniqueItems").is_none()); + assert_eq!(schema["properties"]["items"]["items"]["type"], "integer"); + } + + #[test] + fn provider_identities_are_stable_and_bounded() { + assert_eq!(provider_format_name("role/result.v1"), "role_result_v1"); + assert_eq!(provider_call_id("already-safe_1"), "already-safe_1"); + let first = provider_call_id("unsafe/call identity"); + assert_eq!(first, provider_call_id("unsafe/call identity")); + assert_eq!(first.len(), 64); + assert!(first.bytes().all(|byte| byte.is_ascii_hexdigit())); + } + + #[test] + fn openrouter_terminal_tool_preserves_structured_decision() { + let mut request = + EpiphanyOpenAiModelRequest::new("request", "conversation", "ox", "decide"); + request.provider_id = "openrouter".into(); + request.wire_dialect = EpiphanyOpenAiWireDialect::ChatCompletionsTerminalTool; + request.output_schema_json = Some( + r#"{"type":"object","properties":{"verdict":{"type":"string"}},"required":["verdict"]}"#.into(), + ); + let body = openrouter_request_body(&request).unwrap(); + assert_eq!(body["tool_choice"], "required"); + assert_eq!( + body["tools"][0]["function"]["name"], + OPENROUTER_TERMINAL_TOOL_NAME + ); + + let response = serde_json::json!({ + "id": "response", + "model": "ox", + "choices": [{"message": {"tool_calls": [{ + "id": "terminal", + "function": {"name": OPENROUTER_TERMINAL_TOOL_NAME, "arguments": "{\"verdict\":\"pass\"}"} + }]}}] + }); + let events = + openrouter_events_from_response(&request, &serde_json::to_vec(&response).unwrap()) + .unwrap(); + assert!(matches!( + &events[0].payload, + EpiphanyOpenAiStreamPayload::TextDelta { text } if text == "{\"verdict\":\"pass\"}" + )); + assert!(matches!( + &events[1].payload, + EpiphanyOpenAiStreamPayload::Completed { receipt } + if receipt.transport.as_deref() == Some("openrouter-chat-completions") + )); + } } diff --git a/epiphany-openai-codex-spine/Cargo.toml b/epiphany-openai-codex-spine/Cargo.toml deleted file mode 100644 index 179e3a18..00000000 --- a/epiphany-openai-codex-spine/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "epiphany-openai-codex-spine" -version = "0.1.0" -edition = "2024" -publish = false -license-file = "../LICENSE" - -[lib] -name = "epiphany_openai_codex_spine" -path = "src/lib.rs" - -[dependencies] -anyhow = "1" -codex-client = { path = "../vendor/codex/codex-rs/codex-client" } -codex-login = { path = "../vendor/codex/codex-rs/login" } -epiphany-openai-adapter = { path = "../epiphany-openai-adapter" } -http = "1" -serde = "1" -serde_json = "1" -sha2 = "0.10" -tokio = { version = "1", features = ["macros", "rt-multi-thread"] } diff --git a/epiphany-openai-codex-spine/src/lib.rs b/epiphany-openai-codex-spine/src/lib.rs deleted file mode 100644 index 2c9ec7c7..00000000 --- a/epiphany-openai-codex-spine/src/lib.rs +++ /dev/null @@ -1,1960 +0,0 @@ -use std::collections::HashMap; -use std::sync::Arc; -use std::time::Duration; - -use anyhow::Context; -use anyhow::Result; -use codex_client::HttpTransport; -use codex_client::Request; -use codex_client::ReqwestTransport; -use codex_client::TransportError; -use codex_client::sse_stream; -use epiphany_openai_adapter::EpiphanyOpenAiInputItem; -use epiphany_openai_adapter::EpiphanyOpenAiModelReceipt; -use epiphany_openai_adapter::EpiphanyOpenAiModelRequest; -use epiphany_openai_adapter::EpiphanyOpenAiStreamEvent; -use epiphany_openai_adapter::EpiphanyOpenAiStreamPayload; -use epiphany_openai_adapter::EpiphanyOpenAiWireDialect; -use codex_login::AuthCredentialsStoreMode; -use codex_login::AuthManager; -use codex_login::CodexAuth; -use codex_login::default_client::build_reqwest_client; -use serde::Deserialize; -use serde::Serialize; -use serde_json::Value; -use sha2::Digest; -use sha2::Sha256; - -const CHATGPT_CODEX_BASE_URL: &str = "https://chatgpt.com/backend-api/codex"; -const OPENAI_API_BASE_URL: &str = "https://api.openai.com/v1"; -const OPENROUTER_API_BASE_URL: &str = "https://openrouter.ai/api/v1"; -// Keep provider silence shorter than Epiphany worker watchdogs so the runtime can -// write a typed stream failure instead of being killed with no model evidence. -const RESPONSES_STREAM_IDLE_TIMEOUT: Duration = Duration::from_secs(45); -const RESPONSES_CALL_ID_MAX_BYTES: usize = 64; - -pub const OPENROUTER_TERMINAL_TOOL_NAME: &str = "epiphany_submit_typed_result"; - -pub fn default_codex_home() -> Result { - if let Ok(path) = std::env::var("CODEX_HOME") { - return Ok(std::path::PathBuf::from(path)); - } - let home = std::env::var("USERPROFILE") - .or_else(|_| std::env::var("HOME")) - .context("CODEX_HOME is unset and no home directory environment variable exists")?; - Ok(std::path::PathBuf::from(home).join(".codex")) -} - -pub fn auth_manager(codex_home: std::path::PathBuf) -> Arc { - AuthManager::shared( - codex_home, - /*enable_codex_api_key_env*/ true, - AuthCredentialsStoreMode::Auto, - /*chatgpt_base_url*/ None, - ) -} - -pub struct EpiphanyCodexOpenAiTransport { - auth_manager: Arc, - base_url: Option, -} - -impl EpiphanyCodexOpenAiTransport { - pub fn new(auth_manager: Arc, base_url: Option) -> Self { - Self { - auth_manager, - base_url, - } - } - - pub fn openai(auth_manager: Arc) -> Self { - Self::new(auth_manager, None) - } - - pub async fn collect_model_events( - &self, - request: EpiphanyOpenAiModelRequest, - ) -> Result> { - let request_id = request.request_id.clone(); - let model = request.model.clone(); - let auth = self - .auth_manager - .auth() - .await - .ok_or_else(|| anyhow::anyhow!("Codex auth is unavailable"))?; - let stream_response = self.open_responses_stream(&auth, request).await?; - let (tx, mut rx) = tokio::sync::mpsc::channel(1600); - sse_stream(stream_response.bytes, RESPONSES_STREAM_IDLE_TIMEOUT, tx); - - let mut stream_state = EpiphanyResponsesStreamState::new(&request_id, &model); - while let Some(frame) = rx.recv().await { - match frame { - Ok(frame) => stream_state.push_sse_frame(&frame), - Err(err) => stream_state.push_failed(err.to_string()), - } - if stream_state.completed { - break; - } - } - - if stream_state.events.is_empty() { - stream_state.push_failed("Responses stream closed without typed events".to_string()); - } - Ok(stream_state.events) - } - - async fn open_responses_stream( - &self, - auth: &CodexAuth, - request: EpiphanyOpenAiModelRequest, - ) -> Result { - let base_url = self - .base_url - .clone() - .unwrap_or_else(|| default_base_url_for_auth(auth).to_string()); - let url = format!("{}/responses", base_url.trim_end_matches('/')); - let conversation_id = request.conversation_id.clone(); - let mut outbound = Request::new(http::Method::POST, url) - .with_json(&responses_body_from_epiphany(request)?); - attach_codex_auth_headers(auth, &mut outbound.headers) - .context("failed to attach Codex auth headers")?; - outbound - .headers - .insert(http::header::ACCEPT, "text/event-stream".parse()?); - outbound - .headers - .insert("session_id", conversation_id.parse()?); - outbound - .headers - .insert("x-client-request-id", conversation_id.parse()?); - attach_optional_env_header( - &mut outbound.headers, - "OpenAI-Organization", - "OPENAI_ORGANIZATION", - ); - attach_optional_env_header(&mut outbound.headers, "OpenAI-Project", "OPENAI_PROJECT"); - - let transport = ReqwestTransport::new(build_reqwest_client()); - transport - .stream(outbound) - .await - .map_err(transport_error_to_anyhow) - } -} - -/// OpenRouter owns a distinct credential and wire dialect. It is intentionally -/// not routed through Codex auth or the Responses transport. -pub struct EpiphanyOpenRouterTransport { - api_key: String, - base_url: String, - request_timeout: Option, -} - -impl EpiphanyOpenRouterTransport { - pub fn new(api_key: impl Into, request_timeout: Option) -> Result { - let api_key = api_key.into(); - if api_key.trim().is_empty() || api_key.trim() != api_key { - return Err(anyhow::anyhow!( - "OpenRouter API key must be a non-empty trimmed credential" - )); - } - if request_timeout.is_some_and(|timeout| timeout.is_zero()) { - return Err(anyhow::anyhow!( - "OpenRouter request timeout must be positive when present" - )); - } - Ok(Self { - api_key, - base_url: OPENROUTER_API_BASE_URL.to_string(), - request_timeout, - }) - } - - pub async fn collect_model_events( - &self, - request: EpiphanyOpenAiModelRequest, - ) -> Result> { - let url = format!("{}/chat/completions", self.base_url.trim_end_matches('/')); - let body = chat_completions_body_from_epiphany(&request)?; - let mut outbound = Request::new(http::Method::POST, url).with_json(&body); - let mut authorization = format!("Bearer {}", self.api_key).parse::()?; - authorization.set_sensitive(true); - outbound - .headers - .insert(http::header::AUTHORIZATION, authorization); - outbound.timeout = self.request_timeout; - let transport = ReqwestTransport::new(build_reqwest_client()); - let response = transport - .execute(outbound) - .await - .map_err(transport_error_to_anyhow)?; - let response: OpenRouterChatCompletionResponse = serde_json::from_slice(&response.body) - .context("OpenRouter returned an invalid Chat Completions response")?; - openrouter_events_from_chat_completion(&request, response) - } -} - -pub fn chat_completions_body_from_epiphany( - request: &EpiphanyOpenAiModelRequest, -) -> Result { - if request.provider_id != "openrouter" - || request.wire_dialect != EpiphanyOpenAiWireDialect::ChatCompletionsTerminalTool - { - return Err(anyhow::anyhow!( - "OpenRouter transport requires its exact provider identity and Chat Completions dialect" - )); - } - let has_tool_result = request - .input - .iter() - .any(|item| matches!(item, EpiphanyOpenAiInputItem::ToolResult { .. })); - let output_schema = request - .output_schema_json - .as_deref() - .map(strict_provider_schema) - .transpose()?; - let include_terminal_tool = - output_schema.is_some() && (request.tools.is_empty() || has_tool_result); - if request - .tools - .iter() - .any(|tool| tool.name == OPENROUTER_TERMINAL_TOOL_NAME) - { - return Err(anyhow::anyhow!( - "native tool name collides with the OpenRouter terminal decision tool" - )); - } - - let mut messages = vec![serde_json::json!({ - "role": "system", - "content": request.instructions, - })]; - for item in &request.input { - messages.push(match item { - EpiphanyOpenAiInputItem::UserText { text } => serde_json::json!({ - "role": "user", - "content": text, - }), - EpiphanyOpenAiInputItem::AssistantText { text } => serde_json::json!({ - "role": "assistant", - "content": text, - }), - EpiphanyOpenAiInputItem::ToolCall { - call_id, - name, - arguments, - } => serde_json::json!({ - "role": "assistant", - "tool_calls": [{ - "id": call_id, - "type": "function", - "function": {"name": name, "arguments": arguments}, - }], - }), - EpiphanyOpenAiInputItem::ToolResult { call_id, output } => serde_json::json!({ - "role": "tool", - "tool_call_id": call_id, - "content": output, - }), - }); - } - - let mut tools = request - .tools - .iter() - .map(|tool| { - let parameters = strict_provider_schema(&tool.parameters_json)?; - Ok(serde_json::json!({ - "type": "function", - "function": { - "name": tool.name, - "description": tool.description, - "strict": true, - "parameters": parameters, - }, - })) - }) - .collect::>>()?; - if let Some(schema) = output_schema { - if include_terminal_tool { - tools.push(serde_json::json!({ - "type": "function", - "function": { - "name": OPENROUTER_TERMINAL_TOOL_NAME, - "description": "Submit the final typed Epiphany decision. Call this only when the pass is complete.", - "strict": true, - "parameters": schema, - }, - })); - } - } - - let mut body = serde_json::json!({ - "model": request.model, - "messages": messages, - "stream": false, - "parallel_tool_calls": false, - }); - if !tools.is_empty() { - body["tools"] = serde_json::Value::Array(tools); - body["tool_choice"] = serde_json::Value::String( - if include_terminal_tool || (!request.tools.is_empty() && !has_tool_result) { - "required" - } else { - "auto" - } - .to_string(), - ); - } - if let Some(effort) = request.reasoning_effort.as_deref() { - body["reasoning"] = serde_json::json!({"effort": effort}); - } - Ok(body) -} - -fn strict_provider_schema(schema_json: &str) -> Result { - let mut schema: serde_json::Value = serde_json::from_str(schema_json) - .context("provider tool parameters are not valid JSON Schema")?; - project_strict_responses_schema(&mut schema)?; - Ok(schema) -} - -#[derive(Debug, Deserialize)] -struct OpenRouterChatCompletionResponse { - id: Option, - model: Option, - choices: Vec, - usage: Option, -} - -#[derive(Debug, Deserialize)] -struct OpenRouterChatChoice { - message: OpenRouterChatMessage, -} - -#[derive(Debug, Deserialize)] -struct OpenRouterChatMessage { - content: Option, - #[serde(default)] - reasoning: Option, - #[serde(default)] - tool_calls: Vec, -} - -#[derive(Debug, Deserialize)] -struct OpenRouterChatToolCall { - id: String, - function: OpenRouterChatFunctionCall, -} - -#[derive(Debug, Deserialize)] -struct OpenRouterChatFunctionCall { - name: String, - arguments: String, -} - -#[derive(Debug, Deserialize)] -struct OpenRouterChatUsage { - prompt_tokens: Option, - completion_tokens: Option, - completion_tokens_details: Option, -} - -#[derive(Debug, Deserialize)] -struct OpenRouterCompletionTokenDetails { - reasoning_tokens: Option, -} - -fn openrouter_events_from_chat_completion( - request: &EpiphanyOpenAiModelRequest, - response: OpenRouterChatCompletionResponse, -) -> Result> { - let choice = response - .choices - .into_iter() - .next() - .ok_or_else(|| anyhow::anyhow!("OpenRouter response contained no completion choice"))?; - let mut events = Vec::new(); - if let Some(reasoning) = choice.message.reasoning.filter(|value| !value.is_empty()) { - push_openrouter_event( - &mut events, - &request.request_id, - EpiphanyOpenAiStreamPayload::ReasoningDelta { text: reasoning }, - ); - } - let terminal_calls = choice - .message - .tool_calls - .iter() - .filter(|call| call.function.name == OPENROUTER_TERMINAL_TOOL_NAME) - .collect::>(); - if !terminal_calls.is_empty() { - if terminal_calls.len() != 1 || choice.message.tool_calls.len() != 1 { - return Err(anyhow::anyhow!( - "OpenRouter mixed the terminal decision tool with another tool call" - )); - } - let arguments = &terminal_calls[0].function.arguments; - if !matches!( - serde_json::from_str::(arguments), - Ok(serde_json::Value::Object(_)) - ) { - return Err(anyhow::anyhow!( - "OpenRouter terminal decision tool returned non-object arguments" - )); - } - push_openrouter_event( - &mut events, - &request.request_id, - EpiphanyOpenAiStreamPayload::TextDelta { - text: arguments.clone(), - }, - ); - } else { - if let Some(content) = choice.message.content.filter(|value| !value.is_empty()) { - push_openrouter_event( - &mut events, - &request.request_id, - EpiphanyOpenAiStreamPayload::TextDelta { text: content }, - ); - } - for call in choice.message.tool_calls { - push_openrouter_event( - &mut events, - &request.request_id, - EpiphanyOpenAiStreamPayload::ToolCall { - call_id: call.id, - name: call.function.name, - arguments: call.function.arguments, - }, - ); - } - } - if events.is_empty() { - return Err(anyhow::anyhow!( - "OpenRouter response contained neither text nor tool calls" - )); - } - let usage = response.usage; - let mut receipt = EpiphanyOpenAiModelReceipt::new( - &request.request_id, - response.model.unwrap_or_else(|| request.model.clone()), - ); - receipt.response_id = response.id; - receipt.input_tokens = usage.as_ref().and_then(|item| item.prompt_tokens); - receipt.output_tokens = usage.as_ref().and_then(|item| item.completion_tokens); - receipt.reasoning_output_tokens = usage - .as_ref() - .and_then(|item| item.completion_tokens_details.as_ref()) - .and_then(|item| item.reasoning_tokens); - receipt.transport = Some("openrouter-chat-completions".to_string()); - push_openrouter_event( - &mut events, - &request.request_id, - EpiphanyOpenAiStreamPayload::Completed { receipt }, - ); - Ok(events) -} - -fn push_openrouter_event( - events: &mut Vec, - request_id: &str, - payload: EpiphanyOpenAiStreamPayload, -) { - events.push(EpiphanyOpenAiStreamEvent { - request_id: request_id.to_string(), - sequence: events.len() as u64, - payload, - }); -} - -pub fn responses_body_from_epiphany( - request: EpiphanyOpenAiModelRequest, -) -> Result { - if !matches!(request.provider_id.as_str(), "openai-codex" | "openai") - || request.wire_dialect != EpiphanyOpenAiWireDialect::Responses - { - return Err(anyhow::anyhow!( - "Responses transport requires an OpenAI provider identity and Responses dialect" - )); - } - let requires_initial_tool = !request.tools.is_empty() - && !request - .input - .iter() - .any(|item| matches!(item, EpiphanyOpenAiInputItem::ToolResult { .. })); - let text = responses_text_format( - request.output_contract_id.as_deref(), - request.output_schema_json.as_deref(), - &request.request_id, - )?; - let body = EpiphanyResponsesBody { - model: request.model, - instructions: request.instructions, - input: request - .input - .into_iter() - .map(openai_input_item_from_epiphany_input) - .collect(), - tools: request - .tools - .into_iter() - .map(openai_tool_from_epiphany_tool) - .collect::>>()?, - tool_choice: if requires_initial_tool { - "required" - } else { - "auto" - } - .to_string(), - parallel_tool_calls: false, - reasoning: Some(EpiphanyResponsesReasoning { - effort: parse_reasoning_effort(request.reasoning_effort.as_deref())?, - summary: parse_reasoning_summary(request.reasoning_summary.as_deref())?, - }), - store: false, - stream: true, - include: Vec::new(), - service_tier: parse_service_tier(request.service_tier.as_deref())?, - previous_response_id: request.previous_response_id, - prompt_cache_key: None, - text, - client_metadata: None, - }; - serde_json::to_value(body).context("failed to encode typed Epiphany Responses body") -} - -fn responses_text_format( - output_contract_id: Option<&str>, - output_schema_json: Option<&str>, - request_id: &str, -) -> Result> { - let Some(schema_json) = output_schema_json else { - return Ok(None); - }; - let mut schema: serde_json::Value = - serde_json::from_str(schema_json).context("output_schema_json is not valid JSON Schema")?; - project_strict_responses_schema(&mut schema)?; - let raw_name = output_contract_id.unwrap_or(request_id); - let mut name = raw_name - .chars() - .map(|ch| { - if ch.is_ascii_alphanumeric() || ch == '_' || ch == '-' { - ch - } else { - '_' - } - }) - .take(64) - .collect::(); - if name.is_empty() { - name = "epiphany_worker_result".to_string(); - } - Ok(Some(serde_json::json!({ - "format": { - "type": "json_schema", - "name": name, - "strict": true, - "schema": schema - } - }))) -} - -fn responses_schema_is_strict(schema: &serde_json::Value) -> bool { - match schema { - serde_json::Value::Object(map) => { - if (map.contains_key("const") || map.contains_key("enum")) && !map.contains_key("type") - { - return false; - } - if schema_map_describes_object(map) { - if map.get("additionalProperties") != Some(&serde_json::Value::Bool(false)) { - return false; - } - let Some(properties) = map.get("properties").and_then(serde_json::Value::as_object) - else { - return false; - }; - let Some(required) = map.get("required").and_then(serde_json::Value::as_array) - else { - return false; - }; - if properties - .keys() - .any(|key| !required.iter().any(|item| item.as_str() == Some(key))) - { - return false; - } - } - map.values().all(responses_schema_is_strict) - } - serde_json::Value::Array(values) => values.iter().all(responses_schema_is_strict), - _ => true, - } -} - -fn project_strict_responses_schema(schema: &mut serde_json::Value) -> Result<()> { - lower_schema_for_responses_format(schema); - require_closed_responses_objects(schema, "$")?; - if !responses_schema_is_strict(schema) { - return Err(anyhow::anyhow!( - "projected Responses output schema is not strict" - )); - } - Ok(()) -} - -fn require_closed_responses_objects(schema: &mut serde_json::Value, path: &str) -> Result<()> { - match schema { - serde_json::Value::Object(map) => { - let describes_object = schema_map_describes_object(map); - if describes_object { - map.insert( - "type".to_string(), - serde_json::Value::String("object".to_string()), - ); - let properties = map - .get("properties") - .and_then(serde_json::Value::as_object) - .cloned() - .unwrap_or_default(); - let canonical_required = map - .get("required") - .and_then(serde_json::Value::as_array) - .cloned() - .unwrap_or_default(); - for required in &canonical_required { - let required = required.as_str().ok_or_else(|| { - anyhow::anyhow!("Responses schema {path} has a non-string required key") - })?; - if !properties.contains_key(required) { - return Err(anyhow::anyhow!( - "Responses schema {path} requires undeclared property {required:?}" - )); - } - } - - let canonical_required = canonical_required - .into_iter() - .filter_map(|value| value.as_str().map(ToString::to_string)) - .collect::>(); - let mut projected = serde_json::Map::new(); - for (name, mut property) in properties { - let property_path = format!("{path}.properties.{name}"); - require_closed_responses_objects(&mut property, &property_path)?; - if !canonical_required.contains(&name) { - property = nullable_responses_property(property); - } - projected.insert(name, property); - } - let required = projected - .keys() - .cloned() - .map(serde_json::Value::String) - .collect(); - map.insert( - "properties".to_string(), - serde_json::Value::Object(projected), - ); - map.insert("required".to_string(), serde_json::Value::Array(required)); - map.insert( - "additionalProperties".to_string(), - serde_json::Value::Bool(false), - ); - } - - for (name, value) in map.iter_mut() { - if name == "properties" && describes_object { - continue; - } - require_closed_responses_objects(value, &format!("{path}.{name}"))?; - } - Ok(()) - } - serde_json::Value::Array(values) => { - for (index, value) in values.iter_mut().enumerate() { - require_closed_responses_objects(value, &format!("{path}[{index}]"))?; - } - Ok(()) - } - _ => Ok(()), - } -} - -fn schema_map_describes_object(map: &serde_json::Map) -> bool { - map.get("type").and_then(serde_json::Value::as_str) == Some("object") - || [ - "properties", - "required", - "additionalProperties", - "patternProperties", - "propertyNames", - "minProperties", - "maxProperties", - ] - .iter() - .any(|keyword| map.contains_key(*keyword)) -} - -fn parent_relative_object_alternatives(value: &serde_json::Value) -> bool { - let Some(alternatives) = value.as_array() else { - return false; - }; - !alternatives.is_empty() - && alternatives.iter().all(|alternative| { - let Some(map) = alternative.as_object() else { - return false; - }; - !map.contains_key("type") - && !map.contains_key("$ref") - && map - .keys() - .any(|key| matches!(key.as_str(), "properties" | "required")) - && map.keys().all(|key| { - matches!( - key.as_str(), - "properties" | "required" | "title" | "description" | "$comment" - ) - }) - }) -} - -fn inferred_json_type(value: &serde_json::Value) -> &'static str { - match value { - serde_json::Value::Null => "null", - serde_json::Value::Bool(_) => "boolean", - serde_json::Value::Number(number) if number.is_i64() || number.is_u64() => "integer", - serde_json::Value::Number(_) => "number", - serde_json::Value::String(_) => "string", - serde_json::Value::Array(_) => "array", - serde_json::Value::Object(_) => "object", - } -} - -fn infer_responses_literal_type(map: &mut serde_json::Map) { - if map.contains_key("type") { - return; - } - let mut types = std::collections::BTreeSet::new(); - if let Some(value) = map.get("const") { - types.insert(inferred_json_type(value)); - } else if let Some(values) = map.get("enum").and_then(serde_json::Value::as_array) { - for value in values { - types.insert(inferred_json_type(value)); - } - } - match types.len() { - 0 => {} - 1 => { - map.insert( - "type".to_string(), - serde_json::Value::String( - types.into_iter().next().expect("one literal type").into(), - ), - ); - } - _ => { - map.insert( - "type".to_string(), - serde_json::Value::Array( - types - .into_iter() - .map(|value| serde_json::Value::String(value.into())) - .collect(), - ), - ); - } - } -} - -fn lower_responses_known_format(map: &mut serde_json::Map) { - if map.get("format").and_then(serde_json::Value::as_str) == Some("uuid") { - // JSON Schema `format` may be annotation-only. Responses supports - // `pattern` for standard models, so give generation the same lexical - // boundary that native UUID decoding will later enforce. - map.remove("format"); - map.entry("pattern".to_string()).or_insert_with(|| { - serde_json::Value::String( - "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" - .to_string(), - ) - }); - } -} - -fn nullable_responses_property(property: serde_json::Value) -> serde_json::Value { - if property - .get("anyOf") - .and_then(serde_json::Value::as_array) - .is_some_and(|variants| { - variants.iter().any(|variant| { - variant.get("type").and_then(serde_json::Value::as_str) == Some("null") - }) - }) - { - return property; - } - serde_json::json!({ - "anyOf": [property, {"type": "null"}] - }) -} - -const RESPONSES_UNSUPPORTED_SCHEMA_KEYWORDS: &[&str] = &[ - // Composition and conditional validation are outside the Responses subset. - "allOf", - "not", - "dependentRequired", - "dependentSchemas", - "if", - "then", - "else", - // Standard-model Responses accepts type-specific assertions which remain - // useful generation constraints; native ingress still owns final - // validation. `uniqueItems` is excluded because the live strict endpoint - // rejects it even though ordinary JSON Schema permits it. - "patternProperties", - "propertyNames", - "minProperties", - "maxProperties", - "unevaluatedProperties", - "uniqueItems", - "contains", - "minContains", - "maxContains", - "prefixItems", - "unevaluatedItems", - // Annotation and dialect metadata do not belong in the provider contract. - // Title and description are retained because they help generation without - // claiming validation authority. - "default", - "examples", - "readOnly", - "writeOnly", - "$schema", - "$id", - "$anchor", - "$dynamicAnchor", - "$dynamicRef", - "$vocabulary", -]; - -fn lower_schema_for_responses_format(schema: &mut serde_json::Value) { - let serde_json::Value::Object(map) = schema else { - return; - }; - infer_responses_literal_type(map); - lower_responses_known_format(map); - // Responses structured output accepts only a JSON-Schema subset. - // Canonical assertion authority remains enforced by Epiphany ingress - // and Mind admission; this projection owns provider formatting only. - for unsupported in RESPONSES_UNSUPPORTED_SCHEMA_KEYWORDS { - map.remove(*unsupported); - } - if let Some(one_of) = map.remove("oneOf") { - map.insert("anyOf".to_string(), one_of); - } - // A canonical object may use anyOf solely to require one of several - // sibling properties. Responses strict schemas require every object - // alternative to repeat a complete closed property declaration, so - // those parent-relative fragments are not a valid provider shape. - // Runtime ingress remains the owner of the conditional invariant. - if map - .get("anyOf") - .is_some_and(parent_relative_object_alternatives) - { - map.remove("anyOf"); - } - - // Recurse only through positions that contain schemas. A `properties` or - // `$defs` map contains user-authored names; treating those names as schema - // keywords would silently delete legitimate fields such as `format`. - for collection in ["properties", "$defs", "definitions"] { - if let Some(serde_json::Value::Object(children)) = map.get_mut(collection) { - for child in children.values_mut() { - lower_schema_for_responses_format(child); - } - } - } - if let Some(items) = map.get_mut("items") { - match items { - serde_json::Value::Array(items) => { - for item in items { - lower_schema_for_responses_format(item); - } - } - item => lower_schema_for_responses_format(item), - } - } - if let Some(serde_json::Value::Array(alternatives)) = map.get_mut("anyOf") { - for alternative in alternatives { - lower_schema_for_responses_format(alternative); - } - } -} - -fn openai_tool_from_epiphany_tool( - tool: epiphany_openai_adapter::EpiphanyOpenAiToolDefinition, -) -> Result { - let mut parameters: serde_json::Value = serde_json::from_str(&tool.parameters_json) - .with_context(|| format!("tool {} parameters_json is not valid JSON", tool.name))?; - project_strict_responses_schema(&mut parameters) - .with_context(|| format!("tool {} parameters cannot be projected strictly", tool.name))?; - Ok(serde_json::json!({ - "type": "function", - "name": tool.name, - "description": tool.description, - "parameters": parameters, - "strict": true - })) -} - -#[derive(Debug, Clone, Serialize)] -struct EpiphanyResponsesBody { - model: String, - #[serde(skip_serializing_if = "String::is_empty")] - instructions: String, - input: Vec, - tools: Vec, - tool_choice: String, - parallel_tool_calls: bool, - reasoning: Option, - store: bool, - stream: bool, - include: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - service_tier: Option, - #[serde(skip_serializing_if = "Option::is_none")] - previous_response_id: Option, - #[serde(skip_serializing_if = "Option::is_none")] - prompt_cache_key: Option, - #[serde(skip_serializing_if = "Option::is_none")] - text: Option, - #[serde(skip_serializing_if = "Option::is_none")] - client_metadata: Option>, -} - -#[derive(Debug, Clone, Serialize)] -struct EpiphanyResponsesReasoning { - #[serde(skip_serializing_if = "Option::is_none")] - effort: Option, - #[serde(skip_serializing_if = "Option::is_none")] - summary: Option, -} - -#[derive(Debug, Clone, Serialize)] -#[serde(tag = "type", rename_all = "snake_case")] -enum EpiphanyResponsesInputItem { - Message { - role: String, - content: Vec, - }, - FunctionCall { - call_id: String, - name: String, - arguments: String, - }, - FunctionCallOutput { - call_id: String, - output: String, - }, -} - -#[derive(Debug, Clone, Serialize)] -#[serde(tag = "type", rename_all = "snake_case")] -enum EpiphanyResponsesContentItem { - InputText { text: String }, - OutputText { text: String }, -} - -fn openai_input_item_from_epiphany_input( - input: EpiphanyOpenAiInputItem, -) -> EpiphanyResponsesInputItem { - match input { - EpiphanyOpenAiInputItem::UserText { text } => EpiphanyResponsesInputItem::Message { - role: "user".to_string(), - content: vec![EpiphanyResponsesContentItem::InputText { text }], - }, - EpiphanyOpenAiInputItem::AssistantText { text } => EpiphanyResponsesInputItem::Message { - role: "assistant".to_string(), - content: vec![EpiphanyResponsesContentItem::OutputText { text }], - }, - EpiphanyOpenAiInputItem::ToolCall { - call_id, - name, - arguments, - } => EpiphanyResponsesInputItem::FunctionCall { - call_id: responses_call_id(&call_id), - name, - arguments, - }, - EpiphanyOpenAiInputItem::ToolResult { call_id, output } => { - EpiphanyResponsesInputItem::FunctionCallOutput { - call_id: responses_call_id(&call_id), - output, - } - } - } -} - -fn responses_call_id(internal_call_id: &str) -> String { - if !internal_call_id.is_empty() - && internal_call_id.is_ascii() - && internal_call_id.len() <= RESPONSES_CALL_ID_MAX_BYTES - { - return internal_call_id.to_string(); - } - - let digest = format!("{:x}", Sha256::digest(internal_call_id.as_bytes())); - format!("epi-{}", &digest[..RESPONSES_CALL_ID_MAX_BYTES - 4]) -} - -#[derive(Debug, Deserialize)] -struct EpiphanyResponsesStreamEvent { - #[serde(rename = "type")] - kind: String, - response: Option, - item: Option, - item_id: Option, - call_id: Option, - delta: Option, -} - -#[derive(Debug, Deserialize)] -struct EpiphanyResponseCompleted { - id: String, - #[serde(default)] - usage: Option, -} - -#[derive(Debug, Deserialize)] -struct EpiphanyResponseCompletedUsage { - input_tokens: i64, - output_tokens: i64, - output_tokens_details: Option, -} - -#[derive(Debug, Deserialize)] -struct EpiphanyResponseCompletedOutputTokensDetails { - reasoning_tokens: i64, -} - -struct EpiphanyResponsesStreamState { - request_id: String, - requested_model: String, - sequence: u64, - completed: bool, - pending_tool_calls: HashMap, - events: Vec, -} - -#[derive(Debug, Clone, Default)] -struct PendingToolCall { - call_id: Option, - name: Option, - arguments: String, -} - -impl EpiphanyResponsesStreamState { - fn new(request_id: &str, requested_model: &str) -> Self { - Self { - request_id: request_id.to_string(), - requested_model: requested_model.to_string(), - sequence: 0, - completed: false, - pending_tool_calls: HashMap::new(), - events: Vec::new(), - } - } - - fn push_sse_frame(&mut self, frame: &str) { - let Ok(event) = serde_json::from_str::(frame) else { - return; - }; - match event.kind.as_str() { - "response.output_text.delta" => { - if let Some(text) = event.delta { - self.push_payload(EpiphanyOpenAiStreamPayload::TextDelta { text }); - } - } - "response.reasoning_summary_text.delta" | "response.reasoning_text.delta" => { - if let Some(text) = event.delta { - self.push_payload(EpiphanyOpenAiStreamPayload::ReasoningDelta { text }); - } - } - "response.output_item.added" => { - if let Some(item) = event.item { - self.seed_tool_call_from_item(&item); - } - } - "response.function_call_arguments.delta" => { - if let (Some(arguments), Some(item_id)) = - (event.delta, event.item_id.clone().or(event.call_id.clone())) - { - self.pending_tool_calls - .entry(item_id.clone()) - .or_insert_with(|| PendingToolCall { - call_id: event.call_id.clone().or(Some(item_id)), - name: None, - arguments: String::new(), - }) - .arguments - .push_str(&arguments); - } - } - "response.custom_tool_call_input.delta" => { - if let (Some(arguments), Some(item_id)) = - (event.delta, event.item_id.clone().or(event.call_id.clone())) - { - self.pending_tool_calls - .entry(item_id.clone()) - .or_insert_with(|| PendingToolCall { - call_id: event.call_id.clone().or(Some(item_id)), - name: None, - arguments: String::new(), - }) - .arguments - .push_str(&arguments); - } - } - "response.output_item.done" => { - if let Some(item) = event.item { - self.push_tool_call_from_done_item(&item); - } - } - "response.completed" => { - if let Some(response) = event.response { - match serde_json::from_value::(response) { - Ok(completed) => self.push_completed(completed), - Err(err) => self.push_failed(format!( - "failed to parse response.completed event: {err}" - )), - } - } - self.completed = true; - } - "response.failed" | "response.incomplete" => { - self.push_failed(response_error_message(event.response.as_ref())); - } - _ => {} - } - } - - fn push_completed(&mut self, completed: EpiphanyResponseCompleted) { - let mut receipt = EpiphanyOpenAiModelReceipt::new(&self.request_id, &self.requested_model); - receipt.response_id = Some(completed.id); - receipt.transport = Some("epiphany_direct_responses_http".to_string()); - if let Some(usage) = completed.usage { - receipt.input_tokens = nonnegative_i64_to_u64(usage.input_tokens); - receipt.output_tokens = nonnegative_i64_to_u64(usage.output_tokens); - receipt.reasoning_output_tokens = usage - .output_tokens_details - .and_then(|details| nonnegative_i64_to_u64(details.reasoning_tokens)); - } - self.push_payload(EpiphanyOpenAiStreamPayload::Completed { receipt }); - } - - fn seed_tool_call_from_item(&mut self, item: &Value) { - let Some(kind) = item_type(item) else { - return; - }; - if kind != "function_call" && kind != "custom_tool_call" { - return; - } - let Some(item_id) = item_identity(item) else { - return; - }; - let pending = self.pending_tool_calls.entry(item_id.clone()).or_default(); - if pending.call_id.is_none() { - pending.call_id = item_call_id(item).or(Some(item_id)); - } - if pending.name.is_none() { - pending.name = item_name(item); - } - if pending.arguments.is_empty() - && let Some(arguments) = item_arguments(item) - { - pending.arguments = arguments; - } - } - - fn push_tool_call_from_done_item(&mut self, item: &Value) { - let Some(kind) = item_type(item) else { - return; - }; - if kind != "function_call" && kind != "custom_tool_call" { - return; - } - let item_id = item_identity(item); - let pending = item_id - .as_ref() - .and_then(|id| self.pending_tool_calls.remove(id)) - .unwrap_or_default(); - let Some(name) = item_name(item).or(pending.name) else { - return; - }; - let Some(call_id) = item_call_id(item).or(pending.call_id).or(item_id) else { - return; - }; - let arguments = item_arguments(item).unwrap_or(pending.arguments); - self.push_payload(EpiphanyOpenAiStreamPayload::ToolCall { - call_id, - name, - arguments, - }); - } - - fn push_failed(&mut self, message: String) { - self.push_payload(EpiphanyOpenAiStreamPayload::Failed { message }); - self.completed = true; - } - - fn push_payload(&mut self, payload: EpiphanyOpenAiStreamPayload) { - self.events.push(EpiphanyOpenAiStreamEvent { - request_id: self.request_id.clone(), - sequence: self.sequence, - payload, - }); - self.sequence += 1; - } -} - -fn item_type(item: &Value) -> Option<&str> { - item.get("type").and_then(Value::as_str) -} - -fn item_identity(item: &Value) -> Option { - item.get("id") - .and_then(Value::as_str) - .or_else(|| item.get("item_id").and_then(Value::as_str)) - .or_else(|| item.get("call_id").and_then(Value::as_str)) - .map(ToString::to_string) -} - -fn item_call_id(item: &Value) -> Option { - item.get("call_id") - .and_then(Value::as_str) - .map(ToString::to_string) -} - -fn item_name(item: &Value) -> Option { - item.get("name") - .and_then(Value::as_str) - .map(ToString::to_string) -} - -fn item_arguments(item: &Value) -> Option { - item.get("arguments") - .or_else(|| item.get("input")) - .and_then(Value::as_str) - .map(ToString::to_string) -} - -fn parse_reasoning_effort(value: Option<&str>) -> Result> { - match value { - None => Ok(None), - Some("none" | "minimal" | "low" | "medium" | "high" | "xhigh") => { - Ok(value.map(ToString::to_string)) - } - Some(other) => anyhow::bail!("invalid reasoning_effort: {other}"), - } -} - -fn parse_reasoning_summary(value: Option<&str>) -> Result> { - match value { - None => Ok(None), - Some("auto" | "concise" | "detailed" | "none") => Ok(value.map(ToString::to_string)), - Some(other) => anyhow::bail!("invalid reasoning_summary: {other}"), - } -} - -fn parse_service_tier(value: Option<&str>) -> Result> { - match value { - None => Ok(None), - Some("fast" | "flex") => Ok(value.map(ToString::to_string)), - Some(other) => anyhow::bail!("invalid service_tier: {other}"), - } -} - -fn nonnegative_i64_to_u64(value: i64) -> Option { - u64::try_from(value).ok() -} - -fn default_base_url_for_auth(auth: &CodexAuth) -> &'static str { - if auth.uses_codex_backend() { - CHATGPT_CODEX_BASE_URL - } else { - OPENAI_API_BASE_URL - } -} - -fn attach_codex_auth_headers( - auth: &CodexAuth, - headers: &mut http::HeaderMap, -) -> std::io::Result<()> { - let token = auth.get_token()?; - let value = format!("Bearer {token}"); - if let Ok(value) = value.parse() { - headers.insert(http::header::AUTHORIZATION, value); - } - if let Some(account_id) = auth.get_account_id() - && let Ok(value) = account_id.parse() - { - headers.insert("ChatGPT-Account-ID", value); - } - if auth.is_fedramp_account() { - headers.insert("X-OpenAI-Fedramp", "true".parse().expect("valid header")); - } - Ok(()) -} - -fn attach_optional_env_header(headers: &mut http::HeaderMap, name: &'static str, env_key: &str) { - let Ok(value) = std::env::var(env_key) else { - return; - }; - let value = value.trim(); - if value.is_empty() { - return; - } - if let Ok(value) = value.parse() { - headers.insert(name, value); - } -} - -fn response_error_message(response: Option<&Value>) -> String { - response - .and_then(|response| response.get("error")) - .and_then(|error| error.get("message")) - .and_then(Value::as_str) - .or_else(|| { - response - .and_then(|response| response.get("incomplete_details")) - .and_then(|details| details.get("reason")) - .and_then(Value::as_str) - }) - .unwrap_or("Responses stream failed") - .to_string() -} - -fn transport_error_to_anyhow(err: TransportError) -> anyhow::Error { - anyhow::anyhow!("failed to open provider transport: {err}") -} - -#[cfg(test)] -mod tests { - use super::*; - - fn openrouter_request( - request_id: &str, - conversation_id: &str, - instructions: &str, - ) -> EpiphanyOpenAiModelRequest { - let mut request = EpiphanyOpenAiModelRequest::new( - request_id, - conversation_id, - "stealth/ox-alpha", - instructions, - ); - request.provider_id = "openrouter".to_string(); - request.wire_dialect = EpiphanyOpenAiWireDialect::ChatCompletionsTerminalTool; - request - } - - #[test] - fn openrouter_whole_request_timeout_is_explicit() -> Result<()> { - let bounded = EpiphanyOpenRouterTransport::new("test-key", Some(Duration::from_secs(90)))?; - assert_eq!(bounded.request_timeout, Some(Duration::from_secs(90))); - let outer_budget_owned = EpiphanyOpenRouterTransport::new("test-key", None)?; - assert_eq!(outer_budget_owned.request_timeout, None); - assert!(EpiphanyOpenRouterTransport::new("test-key", Some(Duration::ZERO)).is_err()); - Ok(()) - } - - #[test] - fn openrouter_terminal_tool_owns_typed_output_instead_of_response_format() { - let mut request = openrouter_request( - "req-terminal", - "conversation-terminal", - "Return the typed result.", - ); - request.input.push(EpiphanyOpenAiInputItem::UserText { - text: "Decide.".to_string(), - }); - request.output_schema_json = Some( - serde_json::json!({ - "type": "object", - "additionalProperties": false, - "properties": {"status": {"type": "string", "enum": ["ok"]}}, - "required": ["status"] - }) - .to_string(), - ); - - let body = chat_completions_body_from_epiphany(&request).expect("request should map"); - - assert!(body.get("response_format").is_none()); - assert_eq!(body["tool_choice"], "required"); - assert_eq!(body["tools"].as_array().expect("tools").len(), 1); - assert_eq!( - body["tools"][0]["function"]["name"], - OPENROUTER_TERMINAL_TOOL_NAME - ); - assert_eq!( - body["tools"][0]["function"]["parameters"]["properties"]["status"]["enum"][0], - "ok" - ); - } - - #[test] - fn openrouter_requires_source_sight_before_exposing_terminal_decision() { - let mut request = - openrouter_request("req-tools", "conversation-tools", "Inspect, then decide."); - request.input.push(EpiphanyOpenAiInputItem::UserText { - text: "Inspect the source.".to_string(), - }); - request - .tools - .push(epiphany_openai_adapter::EpiphanyOpenAiToolDefinition { - name: "mcp__epiphany_source__read_file".to_string(), - description: "Read a file.".to_string(), - parameters_json: serde_json::json!({ - "type": "object", - "additionalProperties": false, - "properties": {"path": {"type": "string"}}, - "required": ["path"] - }) - .to_string(), - }); - request.output_schema_json = Some( - serde_json::json!({ - "type": "object", - "additionalProperties": false, - "properties": {"status": {"type": "string"}}, - "required": ["status"] - }) - .to_string(), - ); - - let initial = chat_completions_body_from_epiphany(&request).expect("initial request"); - assert_eq!(initial["tool_choice"], "required"); - assert_eq!(initial["tools"].as_array().expect("tools").len(), 1); - assert_eq!( - initial["tools"][0]["function"]["name"], - "mcp__epiphany_source__read_file" - ); - - request.input.push(EpiphanyOpenAiInputItem::ToolCall { - call_id: "call-1".to_string(), - name: "mcp__epiphany_source__read_file".to_string(), - arguments: r#"{"path":"README.md"}"#.to_string(), - }); - request.input.push(EpiphanyOpenAiInputItem::ToolResult { - call_id: "call-1".to_string(), - output: r#"{"ok":true}"#.to_string(), - }); - let followup = chat_completions_body_from_epiphany(&request).expect("followup request"); - assert_eq!(followup["tool_choice"], "required"); - assert_eq!(followup["tools"].as_array().expect("tools").len(), 2); - assert_eq!( - followup["tools"][1]["function"]["name"], - OPENROUTER_TERMINAL_TOOL_NAME - ); - assert_eq!(followup["messages"][2]["tool_calls"][0]["id"], "call-1"); - assert_eq!(followup["messages"][3]["tool_call_id"], "call-1"); - } - - #[test] - fn openrouter_terminal_call_becomes_exact_assistant_json() { - let request = openrouter_request( - "req-terminal-events", - "conversation-terminal-events", - "Return the typed result.", - ); - let response = OpenRouterChatCompletionResponse { - id: Some("generation-1".to_string()), - model: Some("stealth/ox-alpha".to_string()), - choices: vec![OpenRouterChatChoice { - message: OpenRouterChatMessage { - content: None, - reasoning: None, - tool_calls: vec![OpenRouterChatToolCall { - id: "call-terminal".to_string(), - function: OpenRouterChatFunctionCall { - name: OPENROUTER_TERMINAL_TOOL_NAME.to_string(), - arguments: r#"{"status":"ok"}"#.to_string(), - }, - }], - }, - }], - usage: Some(OpenRouterChatUsage { - prompt_tokens: Some(12), - completion_tokens: Some(3), - completion_tokens_details: Some(OpenRouterCompletionTokenDetails { - reasoning_tokens: Some(1), - }), - }), - }; - - let events = openrouter_events_from_chat_completion(&request, response) - .expect("response should normalize"); - assert!(matches!( - &events[0].payload, - EpiphanyOpenAiStreamPayload::TextDelta { text } - if text == r#"{"status":"ok"}"# - )); - assert!(matches!( - &events[1].payload, - EpiphanyOpenAiStreamPayload::Completed { receipt } - if receipt.transport.as_deref() == Some("openrouter-chat-completions") - && receipt.input_tokens == Some(12) - && receipt.reasoning_output_tokens == Some(1) - )); - } - - #[test] - fn maps_typed_request_to_responses_body_without_codex_protocol_payload() { - let mut request = EpiphanyOpenAiModelRequest::new( - "req-1", - "conversation-1", - "gpt-5.4", - "Answer plainly.", - ); - request.input.push(EpiphanyOpenAiInputItem::UserText { - text: "hello".to_string(), - }); - request.input.push(EpiphanyOpenAiInputItem::ToolCall { - call_id: "call-1".to_string(), - name: "mcp__epiphany_source__read_file".to_string(), - arguments: "{\"path\":\"README.md\"}".to_string(), - }); - request.input.push(EpiphanyOpenAiInputItem::ToolResult { - call_id: "call-1".to_string(), - output: "{\"ok\":true}".to_string(), - }); - request.reasoning_effort = Some("low".to_string()); - request.reasoning_summary = Some("concise".to_string()); - request.service_tier = Some("flex".to_string()); - request.previous_response_id = Some("resp-1".to_string()); - request - .tools - .push(epiphany_openai_adapter::EpiphanyOpenAiToolDefinition { - name: "mcp__epiphany_source__read_file".to_string(), - description: "Read a bounded file slice.".to_string(), - parameters_json: serde_json::json!({ - "type": "object", - "properties": {"path": {"type": "string"}}, - "required": ["path"] - }) - .to_string(), - }); - - let responses = responses_body_from_epiphany(request).expect("request should map"); - - assert_eq!(responses["model"], "gpt-5.4"); - assert_eq!(responses["instructions"], "Answer plainly."); - assert_eq!(responses["previous_response_id"], "resp-1"); - assert_eq!(responses["input"][0]["content"][0]["type"], "input_text"); - assert_eq!(responses["input"][1]["type"], "function_call"); - assert_eq!( - responses["input"][1]["name"], - "mcp__epiphany_source__read_file" - ); - assert_eq!(responses["input"][2]["type"], "function_call_output"); - assert_eq!(responses["stream"], true); - assert_eq!(responses["store"], false); - assert_eq!(responses["service_tier"], "flex"); - assert_eq!(responses["tools"].as_array().expect("tools").len(), 1); - assert_eq!( - responses["tools"][0]["name"], - "mcp__epiphany_source__read_file" - ); - assert_eq!(responses["tool_choice"], "auto"); - } - - #[test] - fn responses_call_ids_are_one_shared_bounded_transport_projection() { - assert_eq!(responses_call_id("call-1"), "call-1"); - - let internal_call_id = "call-requested-public-source-3d04d447ac7eb759245b7c732c2942465f78611c7a3b1716169a92582f1361ae"; - let alias = responses_call_id(internal_call_id); - assert!(alias.is_ascii()); - assert_eq!(alias.len(), RESPONSES_CALL_ID_MAX_BYTES); - assert_eq!(alias, responses_call_id(internal_call_id)); - assert_ne!( - alias, - responses_call_id( - "call-requested-public-source-3d04d447ac7eb759245b7c732c2942465f78611c7a3b1716169a92582f1361af" - ) - ); - - let mut request = EpiphanyOpenAiModelRequest::new( - "req-long-call-id", - "conversation-long-call-id", - "gpt-5.4", - "Use the supplied evidence.", - ); - request.input.push(EpiphanyOpenAiInputItem::ToolCall { - call_id: internal_call_id.to_string(), - name: "github_file".to_string(), - arguments: "{}".to_string(), - }); - request.input.push(EpiphanyOpenAiInputItem::ToolResult { - call_id: internal_call_id.to_string(), - output: "evidence".to_string(), - }); - - let responses = responses_body_from_epiphany(request).expect("request should map"); - assert_eq!(responses["input"][0]["call_id"], alias); - assert_eq!(responses["input"][1]["call_id"], alias); - } - - #[test] - fn tool_bearing_initial_request_requires_one_tool_call() { - let mut request = EpiphanyOpenAiModelRequest::new( - "req-1", - "conversation-1", - "gpt-5.4", - "Inspect before answering.", - ); - request.input.push(EpiphanyOpenAiInputItem::UserText { - text: "verify".to_string(), - }); - request - .tools - .push(epiphany_openai_adapter::EpiphanyOpenAiToolDefinition { - name: "mcp__epiphany_source__read_file".to_string(), - description: "Read a bounded file slice.".to_string(), - parameters_json: serde_json::json!({ - "type": "object", - "properties": {"path": {"type": "string"}}, - "required": ["path"] - }) - .to_string(), - }); - - let responses = responses_body_from_epiphany(request).expect("request should map"); - - assert_eq!(responses["tool_choice"], "required"); - assert_eq!(responses["tools"][0]["strict"], true); - assert_eq!( - responses["tools"][0]["parameters"]["additionalProperties"], - false - ); - } - - #[test] - fn declared_output_schema_reaches_responses_text_format() { - let mut request = EpiphanyOpenAiModelRequest::new( - "req-schema", - "conversation-schema", - "gpt-5.4", - "Return the typed result.", - ); - request.output_contract_id = Some("epiphany.role_worker_output.v3".to_string()); - request.output_schema_json = Some( - serde_json::json!({ - "type": "object", - "additionalProperties": false, - "properties": {"summary": {"type": "string"}}, - "required": ["summary"] - }) - .to_string(), - ); - - let responses = responses_body_from_epiphany(request).expect("request should map"); - - assert_eq!(responses["text"]["format"]["type"], "json_schema"); - assert_eq!( - responses["text"]["format"]["name"], - "epiphany_role_worker_output_v3" - ); - assert_eq!(responses["text"]["format"]["strict"], true); - assert_eq!( - responses["text"]["format"]["schema"]["required"][0], - "summary" - ); - } - - #[test] - fn provider_schema_projection_drops_conditional_authority_only() { - let mut request = EpiphanyOpenAiModelRequest::new( - "req-conditional", - "conversation-conditional", - "gpt-5.4", - "Return the typed result.", - ); - request.output_contract_id = Some("epiphany.worker".to_string()); - request.output_schema_json = Some( - serde_json::json!({ - "type": "object", - "properties": { - "purpose": { - "oneOf": [ - {"type": "string", "const": "evolution"}, - {"type": "string", "const": "repair"} - ] - } - }, - "allOf": [{"if": {"properties": {"purpose": {"const": "repair"}}}, "then": {"required": ["receipt"]}}] - }) - .to_string(), - ); - - let responses = responses_body_from_epiphany(request).expect("request should map"); - let schema = &responses["text"]["format"]["schema"]; - assert_eq!(responses["text"]["format"]["strict"], true); - assert!(schema.get("allOf").is_none()); - assert!(schema["properties"]["purpose"].get("oneOf").is_none()); - assert!(schema["properties"]["purpose"]["anyOf"].is_array()); - assert_eq!(schema["additionalProperties"], false); - assert_eq!(schema["required"], serde_json::json!(["purpose"])); - } - - #[test] - fn provider_schema_projection_drops_parent_relative_presence_alternatives() { - let mut request = EpiphanyOpenAiModelRequest::new( - "req-object-presence", - "conversation-object-presence", - "gpt-5.4", - "Return the typed result.", - ); - request.output_contract_id = Some("epiphany.worker".to_string()); - request.output_schema_json = Some( - serde_json::json!({ - "type": "object", - "properties": { - "statePatch": { - "type": "object", - "properties": { - "scratch": { - "type": "object", - "properties": {"summary": {"type": "string"}}, - "required": ["summary"] - }, - "investigationCheckpoint": { - "type": "object", - "properties": {"focus": {"type": "string"}}, - "required": ["focus"] - } - }, - "anyOf": [ - {"required": ["scratch"]}, - {"required": ["investigationCheckpoint"]} - ] - } - }, - "required": ["statePatch"] - }) - .to_string(), - ); - - let responses = responses_body_from_epiphany(request).expect("request should map"); - let state_patch = &responses["text"]["format"]["schema"]["properties"]["statePatch"]; - assert!(state_patch.get("anyOf").is_none()); - assert_eq!(state_patch["additionalProperties"], false); - assert_eq!( - state_patch["required"], - serde_json::json!(["investigationCheckpoint", "scratch"]) - ); - assert_eq!( - state_patch["properties"]["scratch"]["anyOf"][0]["additionalProperties"], - false - ); - assert_eq!( - state_patch["properties"]["investigationCheckpoint"]["anyOf"][0]["additionalProperties"], - false - ); - } - - #[test] - fn provider_schema_projection_types_literals_and_drops_parent_property_refinements() { - let mut request = EpiphanyOpenAiModelRequest::new( - "req-literal-types", - "conversation-literal-types", - "gpt-5.4", - "Return the typed result.", - ); - request.output_contract_id = Some("epiphany.worker".to_string()); - request.output_schema_json = Some( - serde_json::json!({ - "type": "object", - "required": ["schemaVersion", "effects", "source_refs", "format", "claim_id", "node"], - "properties": { - "schemaVersion": {"const": "epiphany.test.v0"}, - "effects": { - "type": "array", - "items": { - "oneOf": [{ - "type": "object", - "required": ["kind", "memory_kind"], - "properties": { - "kind": {"const": "state_note"}, - "memory_kind": {"enum": ["memory", "social_read", "bond"]} - }, - "additionalProperties": false - }] - } - }, - "source_refs": { - "type": "array", - "minItems": 1, - "maxItems": 8, - "uniqueItems": true, - "items": { - "type": "string", - "minLength": 1, - "pattern": "^source:" - } - }, - "format": { - "type": "string", - "format": "uri" - }, - "claim_id": { - "type": "string", - "format": "uuid" - }, - "node": { - "type": "object", - "required": ["question", "tension"], - "properties": { - "question": {"type": "string"}, - "tension": {"type": "string"} - }, - "anyOf": [ - {"properties": {"question": {"minLength": 1}}}, - {"properties": {"tension": {"minLength": 1}}} - ], - "additionalProperties": false - } - }, - "additionalProperties": false - }) - .to_string(), - ); - - let responses = responses_body_from_epiphany(request).expect("request should map"); - let schema = &responses["text"]["format"]["schema"]; - assert_eq!(schema["properties"]["schemaVersion"]["type"], "string"); - assert_eq!( - schema["properties"]["effects"]["items"]["anyOf"][0]["properties"]["kind"]["type"], - "string" - ); - assert_eq!( - schema["properties"]["effects"]["items"]["anyOf"][0]["properties"]["memory_kind"]["type"], - "string" - ); - let source_refs = &schema["properties"]["source_refs"]; - assert_eq!(source_refs["minItems"], 1); - assert_eq!(source_refs["maxItems"], 8); - assert!(source_refs.get("uniqueItems").is_none()); - assert_eq!(source_refs["items"]["minLength"], 1); - assert_eq!(source_refs["items"]["pattern"], "^source:"); - assert_eq!(schema["properties"]["format"]["type"], "string"); - assert_eq!(schema["properties"]["format"]["format"], "uri"); - assert!(schema["properties"]["claim_id"].get("format").is_none()); - assert_eq!( - schema["properties"]["claim_id"]["pattern"], - "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" - ); - assert!(schema["properties"]["node"].get("anyOf").is_none()); - } - - #[test] - fn strict_schema_check_recognizes_required_only_object_fragments() { - assert!(!responses_schema_is_strict(&serde_json::json!({ - "anyOf": [{"required": ["scratch"]}, {"required": ["checkpoint"]}] - }))); - assert!(!responses_schema_is_strict(&serde_json::json!({ - "const": "state_note" - }))); - assert!(!responses_schema_is_strict(&serde_json::json!({ - "enum": ["memory", "social_read", "bond"] - }))); - } - - #[test] - fn parses_function_call_output_item_done_as_complete_tool_call() { - let mut state = EpiphanyResponsesStreamState::new("req-tools", "gpt-5.4"); - state.push_sse_frame( - &serde_json::json!({ - "type": "response.output_item.done", - "item": { - "id": "fc_1", - "type": "function_call", - "name": "mcp__epiphany_source__read_file", - "arguments": "{\"path\":\"README.md\"}", - "call_id": "call_1" - } - }) - .to_string(), - ); - - assert_eq!(state.events.len(), 1); - assert_eq!( - state.events[0].payload, - EpiphanyOpenAiStreamPayload::ToolCall { - call_id: "call_1".to_string(), - name: "mcp__epiphany_source__read_file".to_string(), - arguments: "{\"path\":\"README.md\"}".to_string(), - } - ); - } - - #[test] - fn assembles_function_call_argument_deltas_until_output_item_done() { - let mut state = EpiphanyResponsesStreamState::new("req-tools", "gpt-5.4"); - state.push_sse_frame( - &serde_json::json!({ - "type": "response.output_item.added", - "item": { - "id": "fc_1", - "type": "function_call", - "name": "mcp__epiphany_source__git_show", - "call_id": "call_1", - "arguments": "" - } - }) - .to_string(), - ); - state.push_sse_frame( - &serde_json::json!({ - "type": "response.function_call_arguments.delta", - "item_id": "fc_1", - "call_id": "call_1", - "delta": "{\"revision\":" - }) - .to_string(), - ); - state.push_sse_frame( - &serde_json::json!({ - "type": "response.function_call_arguments.delta", - "item_id": "fc_1", - "call_id": "call_1", - "delta": "\"HEAD\"}" - }) - .to_string(), - ); - state.push_sse_frame( - &serde_json::json!({ - "type": "response.output_item.done", - "item": { - "id": "fc_1", - "type": "function_call", - "name": "mcp__epiphany_source__git_show", - "call_id": "call_1" - } - }) - .to_string(), - ); - - assert_eq!(state.events.len(), 1); - assert_eq!( - state.events[0].payload, - EpiphanyOpenAiStreamPayload::ToolCall { - call_id: "call_1".to_string(), - name: "mcp__epiphany_source__git_show".to_string(), - arguments: "{\"revision\":\"HEAD\"}".to_string(), - } - ); - } -} diff --git a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs index 703902b7..c9483c69 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs @@ -1,5 +1,6 @@ use std::env; use std::fs; +use std::net::SocketAddr; use std::path::Path; use std::path::PathBuf; use std::process; @@ -20,7 +21,7 @@ use epiphany_openai_adapter::{ EpiphanyOpenAiModelReceipt, EpiphanyOpenAiModelRequest, EpiphanyOpenAiStreamEvent, EpiphanyOpenAiStreamPayload, }; -use epiphany_openai_codex_spine::default_codex_home; +use epiphany_openai_runtime::DEFAULT_CODEX_CONNECTOR_ENDPOINT; use epiphany_openai_runtime::DEFAULT_PROVIDER_REQUEST_TIMEOUT; use epiphany_openai_runtime::EpiphanyOpenAiRuntimeOptions; #[cfg(test)] @@ -179,8 +180,9 @@ async fn main() -> Result<()> { struct RunWorkerCliOptions { provider: String, store_path: PathBuf, - codex_home: PathBuf, provider_credential_path: Option, + connector_endpoint: SocketAddr, + caller_runtime_id: String, mcp_config: Option, job_id: String, model: String, @@ -195,8 +197,9 @@ struct RunWorkerCliOptions { fn parse_run_worker_options(args: Vec) -> Result { let mut provider = DEFAULT_PROVIDER.to_string(); let mut store_path = PathBuf::from(DEFAULT_STORE); - let mut codex_home = default_codex_home()?; let mut provider_credential_path = None; + let mut connector_endpoint = DEFAULT_CODEX_CONNECTOR_ENDPOINT; + let mut caller_runtime_id = "epiphany-model-runtime".to_string(); let mut mcp_config = None; let mut job_id = None; let mut model = default_worker_model(); @@ -211,13 +214,18 @@ fn parse_run_worker_options(args: Vec) -> Result { match arg.as_str() { "--provider" => provider = next_value(&mut iter, "--provider")?, "--store" => store_path = PathBuf::from(next_value(&mut iter, "--store")?), - "--codex-home" => codex_home = PathBuf::from(next_value(&mut iter, "--codex-home")?), "--provider-credential" => { provider_credential_path = Some(PathBuf::from(next_value( &mut iter, "--provider-credential", )?)) } + "--connector-endpoint" => { + connector_endpoint = next_value(&mut iter, "--connector-endpoint")?.parse()? + } + "--caller-runtime-id" => { + caller_runtime_id = next_value(&mut iter, "--caller-runtime-id")? + } "--mcp-config" => { mcp_config = Some(PathBuf::from(next_value(&mut iter, "--mcp-config")?)) } @@ -245,8 +253,9 @@ fn parse_run_worker_options(args: Vec) -> Result { Ok(RunWorkerCliOptions { provider, store_path, - codex_home, provider_credential_path, + connector_endpoint, + caller_runtime_id, mcp_config, job_id: job_id.context("run-worker requires --job-id")?, model, @@ -482,8 +491,9 @@ async fn run_worker_launch( )?; let openai_options = EpiphanyOpenAiRuntimeOptions { store_path: options.store_path.clone(), - codex_home: options.codex_home.clone(), provider_credential_path: options.provider_credential_path.clone(), + connector_endpoint: Some(options.connector_endpoint), + caller_runtime_id: options.caller_runtime_id.clone(), session_id: worker_model_session_id(&launch_request.job_id), job_id: format!("openai-worker-{}", launch_request.job_id), objective: format!( @@ -910,6 +920,121 @@ mod tests { Ok(()) } + #[test] + fn codex_connector_projection_is_one_strict_deterministic_request() -> Result<()> { + let mut request = EpiphanyOpenAiModelRequest::new( + "connector-request", + "connector-conversation", + "gpt-test", + "Decide.", + ); + request.output_contract_id = Some("role/result.v1".into()); + request.output_schema_json = Some( + r#"{"type":"object","properties":{"verdict":{"const":"pass"}},"required":["verdict"]}"# + .into(), + ); + request + .tools + .push(epiphany_openai_adapter::EpiphanyOpenAiToolDefinition { + name: "inspect_body".into(), + description: "Inspect the typed Body.".into(), + parameters_json: + r#"{"type":"object","properties":{"path":{"type":"string"}},"required":["path"]}"# + .into(), + }); + request + .input + .push(epiphany_openai_adapter::EpiphanyOpenAiInputItem::ToolCall { + call_id: "native/call".into(), + name: "inspect_body".into(), + arguments: r#"{"path":"src/lib.rs"}"#.into(), + }); + request.input.push( + epiphany_openai_adapter::EpiphanyOpenAiInputItem::ToolResult { + call_id: "native/call".into(), + output: r#"{"ok":true}"#.into(), + }, + ); + + let projected = provider_transport::codex_request_from_epiphany(request)?; + assert_eq!( + projected.output_format_name.as_deref(), + Some("role_result_v1") + ); + assert_eq!( + projected.tool_choice, + codex_connector::CodexToolChoice::Auto + ); + let (call, result) = (&projected.input[0], &projected.input[1]); + let codex_connector::CodexInputItem::ToolCall { call_id, .. } = call else { + panic!("first input must remain a tool call") + }; + let codex_connector::CodexInputItem::ToolResult { + call_id: result_id, .. + } = result + else { + panic!("second input must remain a tool result") + }; + assert_eq!(call_id, result_id); + assert_ne!(call_id, "native/call"); + assert_eq!(call_id.len(), 64); + assert_eq!( + serde_json::from_str::( + projected.output_schema_json.as_deref().unwrap() + )?["properties"]["verdict"]["type"], + "string" + ); + Ok(()) + } + + #[test] + fn connector_receipt_digests_survive_without_transport_transcript() -> Result<()> { + let result = codex_connector::CodexTransportResult { + schema_id: codex_connector::RESULT_SCHEMA_ID.into(), + request_id: "connector-request".into(), + caller_runtime_id: "epiphany-test".into(), + disposition: codex_connector::CodexTransportDisposition::Transported { + events: Vec::new(), + receipt: Box::new(codex_connector::CodexTransportReceipt { + schema_id: codex_connector::RECEIPT_SCHEMA_ID.into(), + request_id: "connector-request".into(), + caller_runtime_id: "epiphany-test".into(), + native_request_sha256: [0x11; 32], + provider_request_sha256: [0x22; 32], + model: "gpt-test".into(), + transport: "fake-connector".into(), + outcome: codex_connector::CodexTransportOutcome::Completed { + provider_response_id: Some("response".into()), + input_tokens: Some(10), + output_tokens: Some(4), + reasoning_output_tokens: Some(2), + cached_input_tokens: Some(6), + }, + }), + }, + }; + + let events = provider_transport::events_from_connector_result(result)?; + assert_eq!(events.len(), 1); + let EpiphanyOpenAiStreamPayload::Completed { receipt } = &events[0].payload else { + panic!("connector result must produce one terminal receipt") + }; + let native_digest = "11".repeat(32); + let provider_digest = "22".repeat(32); + assert_eq!(receipt.caller_runtime_id.as_deref(), Some("epiphany-test")); + assert_eq!( + receipt.native_request_sha256.as_deref(), + Some(native_digest.as_str()) + ); + assert_eq!( + receipt.provider_request_sha256.as_deref(), + Some(provider_digest.as_str()) + ); + assert_eq!(receipt.cached_input_tokens, Some(6)); + assert_eq!(receipt.transport.as_deref(), Some("fake-connector")); + Ok(()) + } + #[test] fn every_static_worker_contract_projects_to_one_strict_provider_shape() -> Result<()> { let schemas = vec![ @@ -942,8 +1067,10 @@ mod tests { ); request.output_contract_id = Some(format!("worker-schema-{index}")); request.output_schema_json = Some(serde_json::to_string(&schema)?); - let body = epiphany_openai_codex_spine::responses_body_from_epiphany(request)?; - assert_eq!(body["text"]["format"]["strict"], true); + let projected = epiphany_openai_adapter::strict_provider_schema( + request.output_schema_json.as_deref().unwrap(), + )?; + assert_eq!(projected["additionalProperties"], false); } Ok(()) } @@ -964,8 +1091,10 @@ mod tests { ), )?); - let body = epiphany_openai_codex_spine::responses_body_from_epiphany(request)?; - let decision = &body["text"]["format"]["schema"]["properties"]["researchDecision"]; + let projected = epiphany_openai_adapter::strict_provider_schema( + request.output_schema_json.as_deref().unwrap(), + )?; + let decision = &projected["properties"]["researchDecision"]; assert!(decision.get("anyOf").is_none()); assert_eq!(decision["additionalProperties"], false); assert_eq!( @@ -1034,8 +1163,9 @@ mod tests { store, &EpiphanyOpenAiRuntimeOptions { store_path: store.to_path_buf(), - codex_home: PathBuf::from(".codex"), provider_credential_path: None, + connector_endpoint: Some(DEFAULT_CODEX_CONNECTOR_ENDPOINT), + caller_runtime_id: "epiphany-model-runtime-test".to_string(), session_id, job_id, objective: format!("Run model execution for {worker_job_id}."), @@ -1057,7 +1187,9 @@ mod tests { EpiphanyOpenAiStreamEvent { request_id: request_id.to_string(), sequence: 1, - payload: EpiphanyOpenAiStreamPayload::Completed { receipt }, + payload: EpiphanyOpenAiStreamPayload::Completed { + receipt: Box::new(receipt), + }, }, ], ) @@ -1542,5 +1674,5 @@ fn now() -> String { } fn usage() -> &'static str { - "usage: epiphany-model-runtime [--provider openai-codex|openrouter] [--provider-credential path] [--store path] [--codex-home path] [--context-id id] [--output path] [--job-id id] [--activation-token-sha256 hex] [--default-model model] --tool-adapter-bin path [--mcp-config path] [--cwd path] [--max-tool-rounds n]" + "usage: epiphany-model-runtime [--provider openai-codex|openrouter] [--provider-credential path] [--connector-endpoint 127.0.0.1:17891] [--caller-runtime-id id] [--store path] [--context-id id] [--output path] [--job-id id] [--activation-token-sha256 hex] [--default-model model] --tool-adapter-bin path [--mcp-config path] [--cwd path] [--max-tool-rounds n]" } diff --git a/epiphany-openai-runtime/src/bin/epiphany-persona-service.rs b/epiphany-openai-runtime/src/bin/epiphany-persona-service.rs index 691de1ba..ef1ec32c 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-persona-service.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-persona-service.rs @@ -19,8 +19,8 @@ use epiphany_core::{ }; use epiphany_model_adapter::EpiphanyModelRequest; use epiphany_openai_runtime::{ - EpiphanyOpenAiRuntimeOptions, PersonaModelExecutionPlan, PersonaModelRunner, - assistant_text_from_model_events, execute_persona_model_turn, + DEFAULT_CODEX_CONNECTOR_ENDPOINT, EpiphanyOpenAiRuntimeOptions, PersonaModelExecutionPlan, + PersonaModelRunner, assistant_text_from_model_events, execute_persona_model_turn, }; #[path = "../provider_transport.rs"] @@ -29,8 +29,9 @@ mod provider_transport; #[derive(Clone, Debug)] struct NativePersonaModelRunner { store_path: PathBuf, - codex_home: PathBuf, provider_credential_path: Option, + connector_endpoint: SocketAddr, + caller_runtime_id: String, provider: String, model: String, turn_timeout: Duration, @@ -54,8 +55,9 @@ impl PersonaModelRunner for NativePersonaModelRunner { } let options = EpiphanyOpenAiRuntimeOptions { store_path: self.store_path.clone(), - codex_home: self.codex_home.clone(), provider_credential_path: self.provider_credential_path.clone(), + connector_endpoint: Some(self.connector_endpoint), + caller_runtime_id: self.caller_runtime_id.clone(), session_id: format!("persona-turn-{turn_id}"), job_id: format!("persona-{stage}-{turn_id}"), objective: format!("Run Persona {stage} stage for {turn_id}"), @@ -173,8 +175,9 @@ async fn poll_once(options: &Options) -> Result { )?; let mut runner = NativePersonaModelRunner { store_path: options.runtime_store.clone(), - codex_home: options.codex_home.clone(), provider_credential_path: options.provider_credential_path.clone(), + connector_endpoint: options.connector_endpoint, + caller_runtime_id: options.runtime_id.clone(), provider: options.provider.clone(), model: options.model.clone(), turn_timeout: Duration::from_secs(options.turn_timeout_seconds), @@ -365,8 +368,8 @@ struct Options { runtime_store: PathBuf, social_store: PathBuf, cultmesh_store: PathBuf, - codex_home: PathBuf, provider_credential_path: Option, + connector_endpoint: SocketAddr, runtime_id: String, provider: String, model: String, @@ -412,8 +415,14 @@ impl Options { runtime_store: path("--runtime-store")?, social_store: path("--persona-social-store")?, cultmesh_store: path("--cultmesh-store")?, - codex_home: path("--codex-home")?, provider_credential_path: values.get("--provider-credential").map(PathBuf::from), + connector_endpoint: value( + &values, + "--connector-endpoint", + &DEFAULT_CODEX_CONNECTOR_ENDPOINT.to_string(), + ) + .parse() + .context("--connector-endpoint must be an IP:port socket address")?, _repo_root: path("--repo-root")?, mouth_request_store: path("--mouth-request-store")?, mouth_receipt_store: path("--mouth-receipt-store")?, @@ -511,8 +520,8 @@ mod tests { runtime_store: runtime_store.clone(), social_store: absent.join("persona-social.cc"), cultmesh_store: absent.join("cultmesh.cc"), - codex_home: absent.join("codex-home"), provider_credential_path: None, + connector_endpoint: DEFAULT_CODEX_CONNECTOR_ENDPOINT, runtime_id: "persona-reentry".into(), provider: "test".into(), model: "test-model".into(), diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index 3d715244..511732a9 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -1,4 +1,5 @@ use std::collections::{BTreeMap, BTreeSet}; +use std::net::SocketAddr; use std::path::Path; use std::path::PathBuf; use std::time::Duration; @@ -51,6 +52,8 @@ pub const OPENAI_RUNTIME_ROLE: &str = "openai-model-adapter"; pub const DEFAULT_PROVIDER_REQUEST_TIMEOUT: Duration = Duration::from_secs(90); pub const DEFAULT_MODEL_PROVIDER: &str = "openai-codex"; pub const OPENROUTER_MODEL_PROVIDER: &str = "openrouter"; +pub const DEFAULT_CODEX_CONNECTOR_ENDPOINT: SocketAddr = + SocketAddr::new(std::net::IpAddr::V4(std::net::Ipv4Addr::LOCALHOST), 17891); fn validate_model_provider(provider: &str) -> Result<()> { match provider { @@ -68,8 +71,9 @@ pub fn worker_model_session_id(worker_job_id: &str) -> String { #[derive(Debug, Clone, PartialEq, Eq)] pub struct EpiphanyOpenAiRuntimeOptions { pub store_path: PathBuf, - pub codex_home: PathBuf, pub provider_credential_path: Option, + pub connector_endpoint: Option, + pub caller_runtime_id: String, pub session_id: String, pub job_id: String, pub objective: String, @@ -158,11 +162,11 @@ pub fn record_model_turn_events( &model_event, )?; if let EpiphanyModelStreamPayload::Completed { receipt } = &model_event.payload { - cache.put(model_receipt_key(&receipt.request_id), receipt)?; + cache.put(model_receipt_key(&receipt.request_id), receipt.as_ref())?; } match &event.payload { EpiphanyOpenAiStreamPayload::Completed { receipt: completed } => { - receipt = Some(completed.clone()); + receipt = Some(completed.as_ref().clone()); } EpiphanyOpenAiStreamPayload::Failed { message } => { failure = Some(message.clone()); @@ -821,13 +825,13 @@ pub fn append_requested_public_source_receipts( pub fn default_options( store_path: PathBuf, - codex_home: PathBuf, request: &EpiphanyOpenAiModelRequest, ) -> EpiphanyOpenAiRuntimeOptions { EpiphanyOpenAiRuntimeOptions { store_path, - codex_home, provider_credential_path: None, + connector_endpoint: Some(DEFAULT_CODEX_CONNECTOR_ENDPOINT), + caller_runtime_id: "epiphany-model-runtime".to_string(), session_id: format!("openai-session-{}", request.conversation_id), job_id: format!("openai-job-{}", request.request_id), objective: format!("Run typed OpenAI model request {}", request.request_id), @@ -961,7 +965,7 @@ pub fn model_event_from_openai_event( }, EpiphanyOpenAiStreamPayload::Completed { receipt } => { EpiphanyModelStreamPayload::Completed { - receipt: model_receipt_from_openai_receipt(provider, receipt), + receipt: Box::new(model_receipt_from_openai_receipt(provider, receipt)), } } EpiphanyOpenAiStreamPayload::Failed { message } => EpiphanyModelStreamPayload::Failed { @@ -985,6 +989,10 @@ pub fn model_receipt_from_openai_receipt( output_tokens: receipt.output_tokens, reasoning_output_tokens: receipt.reasoning_output_tokens, transport: receipt.transport.clone(), + caller_runtime_id: receipt.caller_runtime_id.clone(), + native_request_sha256: receipt.native_request_sha256.clone(), + provider_request_sha256: receipt.provider_request_sha256.clone(), + cached_input_tokens: receipt.cached_input_tokens, } } @@ -1591,48 +1599,47 @@ fn role_worker_result_from_ingress( } else { (None, None) }; - let (frontier_plan_candidate_msgpack, frontier_plan_candidate_error) = if let Some(ingress) = - result.frontier_plan_candidate.as_ref() - { - let mut safe_paths = clean_string_vec(&ingress.safe_paths); - safe_paths.sort(); - safe_paths.dedup(); - let mut candidate = epiphany_core::RepoFrontierPlanCandidate { - candidate_id: String::new(), - planning_request_id: frontier_planning_context - .map(|context| context.request_id.clone()) - .unwrap_or_default(), - model_projection_digest: frontier_planning_context - .map(|context| context.model_projection_digest.clone()) - .unwrap_or_default(), - model_source_documents: frontier_planning_context - .map(|context| context.model_source_documents.clone()) - .unwrap_or_default(), - frontier_item_id: frontier_planning_context - .map(|context| context.frontier_item_id.clone()) - .unwrap_or_default(), - frontier_item_hash: frontier_planning_context - .map(|context| context.frontier_item_hash.clone()) - .unwrap_or_default(), - safe_paths, - action: ingress.action.trim().to_string(), - command: ingress.command.trim().to_string(), - checks: clean_string_vec(&ingress.checks), - stop_conditions: clean_string_vec(&ingress.stop_conditions), - rollback_steps: clean_string_vec(&ingress.rollback_steps), - commit_message: ingress.commit_message.trim().to_string(), - proposed_at: completed_at.to_string(), - }; - match epiphany_core::canonical_repo_frontier_plan_candidate_id(&candidate) { - Ok(candidate_id) => { - candidate.candidate_id = candidate_id; - encode_optional_document(&Some(candidate), "frontierPlanCandidate") + let (frontier_plan_candidate_msgpack, frontier_plan_candidate_error) = + if let Some(ingress) = result.frontier_plan_candidate.as_ref() { + let mut safe_paths = clean_string_vec(&ingress.safe_paths); + safe_paths.sort(); + safe_paths.dedup(); + let mut candidate = epiphany_core::RepoFrontierPlanCandidate { + candidate_id: String::new(), + planning_request_id: frontier_planning_context + .map(|context| context.request_id.clone()) + .unwrap_or_default(), + model_projection_digest: frontier_planning_context + .map(|context| context.model_projection_digest.clone()) + .unwrap_or_default(), + model_source_documents: frontier_planning_context + .map(|context| context.model_source_documents.clone()) + .unwrap_or_default(), + frontier_item_id: frontier_planning_context + .map(|context| context.frontier_item_id.clone()) + .unwrap_or_default(), + frontier_item_hash: frontier_planning_context + .map(|context| context.frontier_item_hash.clone()) + .unwrap_or_default(), + safe_paths, + action: ingress.action.trim().to_string(), + command: ingress.command.trim().to_string(), + checks: clean_string_vec(&ingress.checks), + stop_conditions: clean_string_vec(&ingress.stop_conditions), + rollback_steps: clean_string_vec(&ingress.rollback_steps), + commit_message: ingress.commit_message.trim().to_string(), + proposed_at: completed_at.to_string(), + }; + match epiphany_core::canonical_repo_frontier_plan_candidate_id(&candidate) { + Ok(candidate_id) => { + candidate.candidate_id = candidate_id; + encode_optional_document(&Some(candidate), "frontierPlanCandidate") + } + Err(error) => (None, Some(format!("frontierPlanCandidate: {error}"))), } - Err(error) => (None, Some(format!("frontierPlanCandidate: {error}"))), - } - } else { - (None, None) - }; + } else { + (None, None) + }; let (frontier_plan_mind_decision_msgpack, frontier_plan_mind_decision_error) = if let Some(ingress) = result.frontier_plan_mind_decision.as_ref() { if let Some(decision) = ingress.decision { @@ -3038,7 +3045,7 @@ mod tests { "req-1", 4, EpiphanyOpenAiStreamPayload::Completed { - receipt: EpiphanyOpenAiModelReceipt::new("req-1", "gpt-5.4"), + receipt: Box::new(EpiphanyOpenAiModelReceipt::new("req-1", "gpt-5.4")), }, ), ]; @@ -3073,7 +3080,7 @@ mod tests { "Answer plainly.", ); let request = epiphany_openai_adapter::request_from_native(&native_request); - let options = default_options(store.clone(), PathBuf::from(".codex"), &request); + let options = default_options(store.clone(), &request); ensure_openai_runtime_ready(&options)?; open_runtime_model_execution( &store, @@ -3097,7 +3104,9 @@ mod tests { let events = vec![EpiphanyOpenAiStreamEvent { request_id: "req-1".to_string(), sequence: 0, - payload: EpiphanyOpenAiStreamPayload::Completed { receipt }, + payload: EpiphanyOpenAiStreamPayload::Completed { + receipt: Box::new(receipt), + }, }]; let summary = record_model_turn_events(&store, &options, &native_request, &events)?; @@ -3554,7 +3563,7 @@ mod tests { native_request.output_schema_json = Some(r#"{"type":"object","required":["researchDecision"]}"#.to_string()); let request = epiphany_openai_adapter::request_from_native(&native_request); - let options = default_options(store.clone(), PathBuf::from(".codex"), &request); + let options = default_options(store.clone(), &request); ensure_openai_runtime_ready(&options)?; open_runtime_model_execution( &store, @@ -3588,7 +3597,9 @@ mod tests { EpiphanyOpenAiStreamEvent { request_id: "req-tools".to_string(), sequence: 1, - payload: EpiphanyOpenAiStreamPayload::Completed { receipt }, + payload: EpiphanyOpenAiStreamPayload::Completed { + receipt: Box::new(receipt), + }, }, ]; let summary = record_model_turn_events(&store, &options, &native_request, &events)?; diff --git a/epiphany-openai-runtime/src/provider_transport.rs b/epiphany-openai-runtime/src/provider_transport.rs index b57af5bc..ff2d0785 100644 --- a/epiphany-openai-runtime/src/provider_transport.rs +++ b/epiphany-openai-runtime/src/provider_transport.rs @@ -1,15 +1,31 @@ +use std::io::Read; use std::path::Path; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; use anyhow::{Context, Result, anyhow}; +use codex_connector::{ + CodexConnectorClient, CodexInputItem, CodexProviderRequest, CodexToolChoice, + CodexToolDefinition, CodexTransportDisposition, CodexTransportEventPayload, + CodexTransportInvocation, CodexTransportOutcome, +}; use epiphany_model_adapter::EpiphanyModelRequest; -use epiphany_openai_adapter::{EpiphanyOpenAiStreamEvent, EpiphanyOpenAiStreamPayload}; -use epiphany_openai_codex_spine::{ - EpiphanyCodexOpenAiTransport, EpiphanyOpenRouterTransport, auth_manager, +use epiphany_openai_adapter::{ + EpiphanyOpenAiInputItem, EpiphanyOpenAiModelReceipt, EpiphanyOpenAiModelRequest, + EpiphanyOpenAiStreamEvent, EpiphanyOpenAiStreamPayload, EpiphanyOpenAiWireDialect, + openrouter_events_from_response, openrouter_request_body, provider_call_id, + provider_format_name, strict_provider_schema, }; use epiphany_openai_runtime::{ EpiphanyOpenAiRuntimeOptions, EpiphanyOpenAiRuntimeRunSummary, OPENROUTER_MODEL_PROVIDER, open_model_turn, record_model_turn_events, }; +use sha2::{Digest, Sha256}; +use zeroize::Zeroizing; + +const OPENROUTER_COMPLETIONS_URL: &str = "https://openrouter.ai/api/v1/chat/completions"; +const MAX_CONNECTOR_FRAME_BYTES: usize = 32 * 1024 * 1024; +const MAX_OPENROUTER_RESPONSE_BYTES: u64 = 16 * 1024 * 1024; +const INVOCATION_ADMISSION_WINDOW: Duration = Duration::from_secs(60); pub async fn run_model_turn( provider: &str, @@ -17,33 +33,273 @@ pub async fn run_model_turn( request: EpiphanyModelRequest, ) -> Result { let provider_request = open_model_turn(provider, &options, &request)?; + let request_id = request.request_id.clone(); let events = match provider { "openai-codex" | "openai" => { - let transport = - EpiphanyCodexOpenAiTransport::openai(auth_manager(options.codex_home.clone())); collect_transport_events( - transport.collect_model_events(provider_request), - &request.request_id, + execute_codex_connector(&options, &request, provider_request), + &request_id, ) .await } OPENROUTER_MODEL_PROVIDER => { - let credential = read_static_provider_credential( - options.provider_credential_path.as_deref(), - OPENROUTER_MODEL_PROVIDER, - )?; - let transport = EpiphanyOpenRouterTransport::new(credential, options.request_timeout)?; - collect_transport_events( - transport.collect_model_events(provider_request), - &request.request_id, - ) - .await + collect_transport_events(execute_openrouter(&options, provider_request), &request_id) + .await } _ => unreachable!("open_model_turn validates provider identity"), }; record_model_turn_events(&options.store_path, &options, &request, &events) } +async fn execute_codex_connector( + options: &EpiphanyOpenAiRuntimeOptions, + native_request: &EpiphanyModelRequest, + request: EpiphanyOpenAiModelRequest, +) -> Result> { + let endpoint = options + .connector_endpoint + .ok_or_else(|| anyhow!("Codex provider requires an explicit connector endpoint"))?; + let caller_runtime_id = options.caller_runtime_id.clone(); + if caller_runtime_id.trim().is_empty() || caller_runtime_id.trim() != caller_runtime_id { + return Err(anyhow!( + "Codex connector caller runtime identity is invalid" + )); + } + let connection_key = Zeroizing::new(read_static_provider_credential( + options.provider_credential_path.as_deref(), + "codex-connector", + )?); + let native_request_sha256: [u8; 32] = Sha256::digest(rmp_serde::to_vec(native_request)?).into(); + let provider_request = codex_request_from_epiphany(request)?; + let expires_at_unix_ms = unix_time_ms()? + .checked_add(INVOCATION_ADMISSION_WINDOW.as_millis() as u64) + .ok_or_else(|| anyhow!("Codex connector invocation expiry overflowed"))?; + let invocation = CodexTransportInvocation::new( + caller_runtime_id, + expires_at_unix_ms, + native_request_sha256, + provider_request, + )?; + let client = CodexConnectorClient::new( + endpoint, + connection_key.as_str().to_string(), + MAX_CONNECTOR_FRAME_BYTES, + options.request_timeout, + )?; + tokio::task::spawn_blocking(move || { + let result = client.execute(&invocation)?; + events_from_connector_result(result) + }) + .await + .context("Codex connector client task failed")? +} + +pub(super) fn codex_request_from_epiphany( + request: EpiphanyOpenAiModelRequest, +) -> Result { + if !matches!(request.provider_id.as_str(), "openai-codex" | "openai") + || request.wire_dialect != EpiphanyOpenAiWireDialect::Responses + { + return Err(anyhow!( + "Codex connector requires an OpenAI provider identity and Responses dialect" + )); + } + let has_tool_result = request + .input + .iter() + .any(|item| matches!(item, EpiphanyOpenAiInputItem::ToolResult { .. })); + let output_format_name = request.output_schema_json.as_ref().map(|_| { + provider_format_name( + request + .output_contract_id + .as_deref() + .unwrap_or(&request.request_id), + ) + }); + let output_schema_json = request + .output_schema_json + .as_deref() + .map(strict_provider_schema) + .transpose()? + .map(|schema| serde_json::to_string(&schema)) + .transpose()?; + let tools = request + .tools + .into_iter() + .map(|tool| { + Ok(CodexToolDefinition { + name: tool.name, + description: tool.description, + parameters_json: serde_json::to_string(&strict_provider_schema( + &tool.parameters_json, + )?)?, + }) + }) + .collect::>>()?; + let tool_choice = if !tools.is_empty() && !has_tool_result { + CodexToolChoice::Required + } else { + CodexToolChoice::Auto + }; + let input = request + .input + .into_iter() + .map(|item| match item { + EpiphanyOpenAiInputItem::UserText { text } => CodexInputItem::UserText { text }, + EpiphanyOpenAiInputItem::AssistantText { text } => { + CodexInputItem::AssistantText { text } + } + EpiphanyOpenAiInputItem::ToolCall { + call_id, + name, + arguments, + } => CodexInputItem::ToolCall { + call_id: provider_call_id(&call_id), + name, + arguments, + }, + EpiphanyOpenAiInputItem::ToolResult { call_id, output } => CodexInputItem::ToolResult { + call_id: provider_call_id(&call_id), + output, + }, + }) + .collect(); + let mut provider_request = CodexProviderRequest::new( + request.request_id, + request.conversation_id, + request.model, + request.instructions, + ); + provider_request.input = input; + provider_request.reasoning_effort = request.reasoning_effort; + provider_request.reasoning_summary = request.reasoning_summary; + provider_request.service_tier = request.service_tier; + provider_request.output_format_name = output_format_name; + provider_request.previous_response_id = request.previous_response_id; + provider_request.tools = tools; + provider_request.tool_choice = tool_choice; + provider_request.parallel_tool_calls = false; + provider_request.output_schema_json = output_schema_json; + provider_request.validate()?; + Ok(provider_request) +} + +pub(super) fn events_from_connector_result( + result: codex_connector::CodexTransportResult, +) -> Result> { + let request_id = result.request_id.clone(); + match result.disposition { + CodexTransportDisposition::Refused(reason) => Err(anyhow!( + "Codex connector refused request {request_id:?}: {reason:?}" + )), + CodexTransportDisposition::Transported { events, receipt } => { + let mut projected = events + .into_iter() + .map(|event| EpiphanyOpenAiStreamEvent { + request_id: request_id.clone(), + sequence: event.sequence, + payload: match event.payload { + CodexTransportEventPayload::TextDelta { text } => { + EpiphanyOpenAiStreamPayload::TextDelta { text } + } + CodexTransportEventPayload::ToolCall { + call_id, + name, + arguments, + } => EpiphanyOpenAiStreamPayload::ToolCall { + call_id, + name, + arguments, + }, + }, + }) + .collect::>(); + let mut terminal = EpiphanyOpenAiModelReceipt::new(&request_id, &receipt.model); + terminal.transport = Some(receipt.transport.clone()); + terminal.caller_runtime_id = Some(receipt.caller_runtime_id.clone()); + terminal.native_request_sha256 = Some(hex_digest(receipt.native_request_sha256)); + terminal.provider_request_sha256 = Some(hex_digest(receipt.provider_request_sha256)); + match receipt.outcome { + CodexTransportOutcome::Completed { + provider_response_id, + input_tokens, + output_tokens, + reasoning_output_tokens, + cached_input_tokens, + } => { + terminal.response_id = provider_response_id; + terminal.input_tokens = input_tokens; + terminal.output_tokens = output_tokens; + terminal.reasoning_output_tokens = reasoning_output_tokens; + terminal.cached_input_tokens = cached_input_tokens; + projected.push(EpiphanyOpenAiStreamEvent { + request_id, + sequence: projected.len() as u64, + payload: EpiphanyOpenAiStreamPayload::Completed { + receipt: Box::new(terminal), + }, + }); + } + CodexTransportOutcome::Failed { + failure_kind, + message, + } => { + projected.push(EpiphanyOpenAiStreamEvent { + request_id, + sequence: projected.len() as u64, + payload: EpiphanyOpenAiStreamPayload::Failed { + message: format!("Codex connector {failure_kind}: {message}"), + }, + }); + } + } + Ok(projected) + } + } +} + +async fn execute_openrouter( + options: &EpiphanyOpenAiRuntimeOptions, + request: EpiphanyOpenAiModelRequest, +) -> Result> { + let api_key = Zeroizing::new(read_static_provider_credential( + options.provider_credential_path.as_deref(), + OPENROUTER_MODEL_PROVIDER, + )?); + let request_timeout = options.request_timeout; + tokio::task::spawn_blocking(move || { + let body = serde_json::to_vec(&openrouter_request_body(&request)?)?; + let agent: ureq::Agent = ureq::Agent::config_builder() + .timeout_connect(Some(Duration::from_secs(10))) + .timeout_recv_response(request_timeout) + .timeout_recv_body(request_timeout) + .max_redirects(0) + .build() + .into(); + let authorization = Zeroizing::new(format!("Bearer {}", api_key.as_str())); + let response = agent + .post(OPENROUTER_COMPLETIONS_URL) + .header("authorization", authorization.as_str()) + .header("content-type", "application/json") + .header("accept", "application/json") + .send(body) + .context("OpenRouter request failed")?; + let mut bytes = Vec::new(); + response + .into_body() + .into_reader() + .take(MAX_OPENROUTER_RESPONSE_BYTES + 1) + .read_to_end(&mut bytes) + .context("OpenRouter response read failed")?; + if bytes.len() as u64 > MAX_OPENROUTER_RESPONSE_BYTES { + return Err(anyhow!("OpenRouter response exceeded its byte bound")); + } + openrouter_events_from_response(&request, &bytes) + }) + .await + .context("OpenRouter client task failed")? +} + async fn collect_transport_events(future: F, request_id: &str) -> Vec where F: std::future::Future>>, @@ -78,3 +334,21 @@ fn read_static_provider_credential(path: Option<&Path>, provider: &str) -> Resul } Ok(credential.to_string()) } + +fn unix_time_ms() -> Result { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .context("system clock predates Unix epoch")? + .as_millis() + .try_into() + .context("Unix time does not fit u64 milliseconds") +} + +fn hex_digest(digest: [u8; 32]) -> String { + let mut value = String::with_capacity(64); + for byte in digest { + use std::fmt::Write as _; + write!(&mut value, "{byte:02x}").expect("writing to a String cannot fail"); + } + value +} From 3421af57a42a96812c78aa91faf5a89a88b8d10d Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 18:03:00 +0200 Subject: [PATCH 080/340] Record standalone Codex consumer cut --- notes/epiphany-current-algorithmic-map.md | 28 ++++--- notes/epiphany-fork-implementation-plan.md | 53 ++++++------- notes/fresh-workspace-handoff.md | 75 ++++++++++++------ notes/standalone-codex-transport-migration.md | 38 +++++---- state/ledgers.msgpack | Bin 719747 -> 720443 bytes state/map.yaml | 12 +-- 6 files changed, 121 insertions(+), 85 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index fc87856c..2fc6926b 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -646,7 +646,7 @@ Codex-derived code remains only where an OpenAI provider needs its earned authentication or transport. Neither owns Epiphany Mind, scheduler, route, or interface authority. -Exact `a6cf9383` makes that boundary physical in the package graph. The pure +Exact `a6cf9383` first made that boundary physical in the package graph. The pure `epiphany-openai-runtime` library opens the exact model execution, derives the provider request, normalizes typed provider events, emits governed tool intents, and records terminal physiology/audit without depending on a Codex @@ -654,15 +654,16 @@ crate. One shared source module at the release-bundle edge owns concrete Codex/OpenRouter authentication, credential reading, and network calls for the model and Persona entrypoints. Persona keeps its three-stage family executor; the service owns its concrete runner. Workers have one governed tool-capable -route, not a tool route plus a parallel no-tools opinion. The remaining broad -`codex-login` graph is therefore isolated supply-chain liability, not hidden -runtime-library anatomy. +route, not a tool route plus a parallel no-tools opinion. The target boundary is the independent daemon mapped in `notes/standalone-codex-transport-migration.md`. Independent `GameCult/CodexConnector` exact -`9da6070faa1c4a29455b2383abfaae44d9a7b229` now owns one typed multi-caller +`54d8bc2525b7e7fa1b9dd26b95871247ff4c7566` now owns one typed multi-caller transport package and one public daemon binary without linking a Codex crate. +Its default library is only the encrypted contract/client ABI; daemon-only +auth, raw Responses transport, CultCache replay, and Ureq/Rustls dependencies +sit behind the `daemon` feature. Each consumer internally derives its exact typed provider request. The daemon verifies those exact bytes, returns a digest-bound transport receipt plus typed events, and uses a private digest-pinned official `codex app-server` child only @@ -673,10 +674,17 @@ Redb store. `Active` is durable before provider I/O; the exact encrypted `Completed` response is durable before socket reply. After restart, completed work replays byte-identically and ambiguous active work refuses without consuming unrelated live capacity. RAM retains only the current process's live -execution set. Redacted CultMesh/Odin readiness remains open before the shared -consumer cuts. Once both consumers pass that contract, Epiphany deletes its -Codex spine, Codex-home/readiness plumbing, and every compiled Codex dependency; -Ghostlight deletes its copied wire law and connector deployment path. +execution set. + +Exact Epiphany `ed7357a2` completes its source-side consumer cut. The model and +Persona entrypoints cross the shared client ABI; the complete embedded Codex +spine, compiled Codex graph, direct auth/HTTP/SSE path, and Codex-home/readiness +plumbing are gone. OpenRouter remains a separate direct provider edge. Durable +model receipts retain Connector caller identity, exact native/provider digests, +and cached-token usage without requiring a transcript. Redacted CultMesh/Odin +readiness, the independent Idunn target, Yggdrasil installation, one real +Epiphany round trip, and Ghostlight's copied wire/deployment deletion remain +open. ## Canonical authority map @@ -689,7 +697,7 @@ Ghostlight deletes its copied wire law and connector deployment path. | `current_work.rs` | keyed Mind view and exact runtime request/job/result/decision families | pure family scheduling and continuation projections | Events, timestamps, role lanes, and thread provenance cannot create or suppress work. | | coordinator policy/status | keyed Mind presence, exact current work, and the accepted continuity decision | one action/reason pair plus operator-readable role lanes | Coordinator presence is derived; no mutable coordinator head, pressure tableau, or duplicate policy wrapper exists. | | runtime worker attempt owner | immutable launch, exact process claim, typed result, job result, archival evidence | one terminal attempt authority | Scheduling, process liveness, and semantic admission remain distinct authorities. | -| model-provider boundary | sealed native model request plus explicit provider configuration | exact internally derived provider request and transport result | OpenRouter remains a release-owned direct boundary. Codex transport is moving to independent CodexConnector, which owns only caller admission, credential refresh, exact transport, and durable replay. Provider selection cannot author a second request truth or admit Mind state. | +| model-provider boundary | sealed native model request plus explicit provider configuration | exact internally derived provider request and transport result | OpenRouter remains a release-owned direct boundary. Codex crosses the lean CodexConnector client ABI; the daemon owns only caller admission, credential refresh, exact transport, and durable replay. Provider selection cannot author a second request truth or admit Mind state. | | OpenAI Responses schema projector | full native typed output schema | one provider-legal strict generation schema | Provider formatting preserves useful supported constraints but never replaces native decoding or Mind admission. | | model-pass terminal owner | sealed reasoning basis/context and typed failure class | exact transport closure plus `EpiphanyModelPassFailure` and terminal session/job result in one batch CAS | The caller cannot nominate a job/session; the context-derived binding closes role, reorient, and Persona failures without granting generic transport results decision authority. | | Substrate Gate | exact worker/job authority and requested operation | scoped grant or refusal | Access permission does not admit Mind state. | diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 13c7d41b..ef05b5b6 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -223,42 +223,39 @@ Delete or demote: ## Immediate Next Action Keep the five-day shakedown, Ox17 deployment, and Model Atlas operational Gate -1 paused. Continue the source-subtraction and test-authority audit from exact -`a6cf9383`. The current sequence has deleted the semantic-memory/workspace-coverage -projection system, its local daemon supervisor, and the surviving generic -RepoModel profile, impossible lifecycle, producerless receipt/summary, and -decorative scoring axes. Modeling consumes typed Body and keyed RepoModel state -directly. Domains are seed-owned; model passes mutate only live keyed operations. -Persona consumes keyed memory and social state directly. No -Epiphany-owned Rider or Unity bridge exists: Brokkr owns Unity through typed -Eve/CultMesh capabilities, and a future Rider daemon will own Rider. Do not -admit a fresh package until the remaining production surfaces and tests have -earned their authority under the same audit. +1 paused. Exact `ed7357a2` completes Epiphany's source-side Codex transport cut: +the embedded spine, compiled Codex graph, direct auth/HTTP/SSE path, and +Codex-home readiness are absent. Modeling still consumes typed Body and keyed +RepoModel state directly; Persona still consumes keyed memory and social state +directly. No Epiphany-owned Rider or Unity bridge exists: Brokkr owns Unity +through typed Eve/CultMesh capabilities, and a future Rider daemon owns Rider. +Do not admit a fresh package until the standalone Connector has redacted signed +readiness, an independent Idunn target, and a real digest-bound Epiphany round +trip. -The immediate comparison is now explicit. The release-edge `codex-login` -dependency still imports configuration, app-server protocol, telemetry, -Starlark, image, and clipboard anatomy; a pure runtime consequence test still -costs 1.869 GiB because `epiphany-core` remains broad. Audit those as owned -behavior, not as cleanup chores. A narrower OpenAI auth/refresh boundary must -preserve exact provider capability and refresh-token authority; a core split -must expose an existing semantic owner rather than invent a package taxonomy. +The immediate comparison is now explicit. The former release-edge +`codex-login` graph is gone from Epiphany. `epiphany-core` remains broad and +`runtime_spine.rs` remains its largest mixed owner; audit those as owned +behavior, not as cleanup chores. A future core split must expose an existing +semantic owner rather than invent a package taxonomy. The provider decision is a service extraction specified by `notes/standalone-codex-transport-migration.md`. Independent `GameCult/CodexConnector` exact -`9da6070faa1c4a29455b2383abfaae44d9a7b229` owns the v2 multi-caller contract, +`54d8bc2525b7e7fa1b9dd26b95871247ff4c7566` owns the v2 multi-caller contract, exact native/provider digest binding, typed tool and terminal receipts, the pinned official Codex credential child, raw Responses transport, and durable -keyed replay. It links no Codex crate. Active replay identity is written before -network access; the exact encrypted completion is durable before reply; -restart ambiguity refuses rather than re-executing. Redacted CultMesh/Odin -readiness is the remaining daemon source cut before consumer work. +keyed replay. Its default feature set is the lean encrypted client/contract ABI; +daemon-only anatomy is feature-gated. It links no Codex crate. Active replay +identity is written before network access; the exact encrypted completion is +durable before reply; restart ambiguity refuses rather than re-executing. +Redacted CultMesh/Odin readiness is the remaining daemon source cut before its +independent Idunn deployment. -Then Epiphany and Ghostlight must pass their shared-client contracts before the -old paths are deleted. The completed migration removes Epiphany's Codex spine -and auth/readiness plumbing, Ghostlight's copied wire types and connector -deployment authority, and the stale bridge branch as a production source. No -dual daemon or refresh writer is an acceptable transition state. +Epiphany now passes the shared client contract and its old path is deleted. +Ghostlight must adopt the same ABI and remove its copied wire types plus +connector deployment authority after the standalone service is proven on +Yggdrasil. No dual daemon or refresh writer is an acceptable transition state. Model Atlas has component proofs but no live inter-swarm collaboration run. Preserve its publication, trust, transport, projection, Soul verification, Self diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index a8dcd326..739912ed 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,10 +2,11 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed Epiphany boundary document: `1ff87ab3` -Current connector source: `9da6070faa1c4a29455b2383abfaae44d9a7b229` -Current pass: durable standalone Codex transport core landed; redacted -CultMesh/Odin readiness is next; Ox17 and Atlas Gate 1 remain paused +Latest committed Epiphany source cut: `ed7357a2` +Current connector source: `54d8bc2525b7e7fa1b9dd26b95871247ff4c7566` +Current pass: Codex transport is absent from Epiphany's compiled body; redacted +Connector readiness and its independent Idunn target are next; Ox17 and Atlas +Gate 1 remain paused ## Orientation @@ -16,7 +17,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `a6cf9383` is the current +production symlink body and is inactive. Exact `ed7357a2` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -50,7 +51,7 @@ authorize the next capstone or Gate 1. map for removing Codex transport entirely from Epiphany's process/build body. Independent repository `GameCult/CodexConnector` now owns one Cargo package with one public daemon binary and no linked Codex crates. Exact -`9da6070faa1c4a29455b2383abfaae44d9a7b229` admits distinct authenticated +`54d8bc2525b7e7fa1b9dd26b95871247ff4c7566` admits distinct authenticated callers, preserves caller-native and exact provider-request digests, passes typed text/tool/usage/failure results, and uses a digest-pinned official `codex app-server` child only as the private credential writer. The connector @@ -63,15 +64,34 @@ I/O and replaces it with the exact encrypted `Completed` response before socket reply. Completed retries survive restart byte-for-byte; a restart-era active identity returns explicit `Indeterminate` and never re-executes. A non-secret connection-key epoch detects rotation without persisting a -secret-derived verifier. Focused native acceptance passes 22/22 plus exact -library/binary checks and Clippy. The disposable target peaked at 625 MiB and -was removed completely. +secret-derived verifier. Its default feature set is now only the lean encrypted +client/contract ABI; the daemon, CultCache, Ureq/Rustls, auth child, and replay +owner are behind the `daemon` feature. Default acceptance passes 10/10 and the +daemon feature passes 23/23 plus exact library/binary checks and Clippy. Every +disposable connector target was removed completely. -Redacted CultMesh/Odin publication, Epiphany and Ghostlight shared-client cuts, -the independent Idunn target, and deletion of the old embedded/copied paths -remain open. Consumers keep prompts, projections, tools, retries, -interpretation, decisions, and admission. No live service, credential, or -deployment authority has moved. +Exact Epiphany `ed7357a2` consumes that lean client ABI and deletes the entire +`epiphany-openai-codex-spine` package, every compiled `codex-login` and +`codex-client` dependency, direct Codex HTTP/SSE, `CODEX_HOME`, auth.json +readiness, and Codex credential creation/argv. Model and Persona workers now +pass an explicit loopback connector endpoint, caller runtime identity, and +caller-key credential file. Connector receipts retain caller identity, native +and provider request digests, transport identity, and cached-token usage in the +durable model receipt; runtime/model-receipt epochs advance to v38/v1. +OpenRouter remains direct through one Ureq/Rustls terminal-tool path and its +separate credential. + +The maintained non-lock source shrinks by 857 lines and `Cargo.lock` shrinks by +4,830 lines. Core passes 150/150, runtime 21/21, pure adapter 5/5, model edge +12/12, Persona 1/1, both launch targets compile, and focused adapter/root-edge +Clippy passes. The test runs generated 6.2 GiB and 4.6 GiB in the bounded target; +both roots were removed. Only the exact 1,776,640-byte state inspector remains, +SHA-256 `DD38855C6F092C2C53D2212A938E737643F41130F4681708840BA6075320A04E`. + +Redacted CultMesh/Odin publication, the independent Connector Idunn target, +Yggdrasil installation, a real Epiphany connector round trip, and Ghostlight's +shared-client/deployment cut remain open. No live service, credential, or +deployment authority moved in this source pass. Exact `a6cf9383` quarantines concrete Codex/OpenRouter authentication, credential reading, and network transport at the two release entrypoints that @@ -85,11 +105,10 @@ coordinator switch are gone. Provider strict-shape proofs now live with the release-owned lowering edge. The cut removes 176 net source lines without a new crate, executable, process, schema, or epoch. Focused runtime, model, Persona, and coordinator checks pass. The pure runtime consequence-test root -falls from 12.713 GiB/19,134 files to 1.869 GiB/2,942 files. The release-edge -test still reaches 10.473 GiB/16,483 files because `codex-login` imports config, -app-server protocol, telemetry, Starlark, image, and clipboard anatomy; that is -the next named provider-edge liability. Cleanup removed 10.5 GiB and restored -the exact 1,776,640-byte state inspector. Atlas is untouched; no live +fell from 12.713 GiB/19,134 files to 1.869 GiB/2,942 files. At that intermediate +boundary the release edge still reached 10.473 GiB/16,483 files through +`codex-login`; exact `ed7357a2` subsequently deletes that graph. Cleanup +restored the exact 1,776,640-byte state inspector. Atlas is untouched; no live inter-swarm collaboration has run. Exact `ce6bff12` makes execution bindings identity edges instead of miniature @@ -1158,13 +1177,17 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action -The Ox17 deployment lane is paused. Continue the registered-document and test- -liability audit from exact `fdefb889`; do not compile or deploy through Idunn -yet. Delete an abstraction with tests that merely animate it when it has no -decision-bearing consumer. Preserve keyed Mind, sealed reasoning, direct Body- -to-Modeling flow, family admission owners, Persona social state, provider -boundaries, consequence-verifying receipts, and the complete Model Atlas -vertical slice until its first live inter-swarm collaboration trial. +The Ox17 deployment lane remains paused. Continue the standalone transport cut +from Epiphany `ed7357a2` and Connector +`54d8bc2525b7e7fa1b9dd26b95871247ff4c7566`: add one redacted provider-owned +CultMesh/Odin readiness projection, audit its dependency cost, then give the +Connector an independent Idunn target and install the frozen daemon on +Yggdrasil. Prove one Epiphany round trip with exact digest-bound receipt, +transcript-free decision audit, and governed tool continuation before asking +Ghostlight to adopt the same client ABI and delete its copied wire/deployment +authority. Preserve keyed Mind, direct Body-to-Modeling flow, consequence +receipts, and the complete Model Atlas vertical slice; no live inter-swarm +collaboration has run. Yggdrasil previously exposed 96 GiB of dead native Cargo targets after interrupted full-workspace builds; exact cleanup returned the builder target diff --git a/notes/standalone-codex-transport-migration.md b/notes/standalone-codex-transport-migration.md index 1d69039a..c1bcd058 100644 --- a/notes/standalone-codex-transport-migration.md +++ b/notes/standalone-codex-transport-migration.md @@ -14,19 +14,19 @@ and release cadence. ## Current mechanism -Two mechanisms currently overlap: +The source and live mechanisms are deliberately distinct during the braked cut: -1. Epiphany compiles `epiphany-openai-codex-spine` into its model and Persona - entrypoints. That crate imports vendored `codex-login` and `codex-client`. - Epiphany therefore carries Codex credential paths, readiness checks, CLI - arguments, HTTP transport, and the complete transitive Codex build graph. -2. Yggdrasil already runs `epiphany-model-connector.service` for Ghostlight. +1. Exact Epiphany `ed7357a2` uses the standalone Connector client ABI for Codex + requests. Its embedded spine, direct Codex auth/HTTP/SSE path, compiled Codex + graph, `CODEX_HOME`, and auth.json readiness are deleted. That source is not + deployed; production Epiphany remains inactive on its historical release. +2. Yggdrasil still runs `epiphany-model-connector.service` for Ghostlight. It uses encrypted CultNet/MessagePack on loopback TCP 4103, owns a private writable Codex home, serializes refresh through one `AuthManager`, bounds payloads and parallelism, rejects replay/substitution, and advertises a redacted `model.generate.structured` capability through Odin. -The second path is source-owned by the stale +The live Ghostlight path is source-owned by the stale `codex/epiphany-model-bridge` branch, admits only `ghostlight-dungeon-yggdrasil`, and is built/deployed inside Ghostlight's Idunn transaction. Ghostlight duplicates its wire documents locally. The live proof @@ -35,9 +35,10 @@ is useful; the ownership is not. ## Current cut status Independent `GameCult/CodexConnector` exact -`9da6070faa1c4a29455b2383abfaae44d9a7b229` completes migration steps 1-3 -except redacted CultMesh/Odin publication. It owns one Cargo package, one -public daemon binary, the v2 multi-caller encrypted MessagePack contract, +`54d8bc2525b7e7fa1b9dd26b95871247ff4c7566` completes migration steps 1-4 on +the source side except redacted CultMesh/Odin publication and the Ghostlight +cut. It owns one Cargo package, one public daemon binary, the v2 multi-caller +encrypted MessagePack contract and lean default client ABI, caller-native and exact provider-request digest binding, typed tool/result transport, a private digest-pinned official `codex app-server` credential child, raw Responses HTTP/SSE, and durable keyed replay. It links no Codex @@ -52,9 +53,16 @@ capacity for unrelated identities. Replay records do not disappear merely because request admission expiry elapsed. A non-secret connection-key epoch detects rotation without persisting a secret-derived verifier. -Focused native acceptance passes 22/22 plus exact library/binary checks and -Clippy. The disposable target peaked at 625 MiB and was removed. No live -service, credential, consumer, or deployment authority has moved. +Default acceptance passes 10/10 and daemon acceptance passes 23/23 plus exact +library/binary checks and Clippy. All disposable Connector targets were removed. + +Exact Epiphany `ed7357a2` consumes the lean client, keeps OpenRouter as a direct +separate provider edge, and preserves Connector caller/native/provider digest +evidence in its typed model receipt. Core 150/150, runtime 21/21, adapter 5/5, +model edge 12/12, Persona 1/1, launch checks, and focused Clippy pass. Its +maintained non-lock source shrinks by 857 lines and Cargo.lock by 4,830 lines. +The bounded verification roots were removed; only the exact state inspector +remains. No live service, credential, or deployment authority moved. ## Authority map @@ -198,9 +206,9 @@ second opinion about consumer-native cognition. ## Deletion line -After both consumers pass v2 acceptance: +The deletion line is tracked per consumer; no dual-read fallback is allowed. -### Epiphany +### Epiphany — complete at `ed7357a2` - delete the `epiphany-openai-codex-spine` package; - delete all non-vendor compiled dependencies on `codex-login`, `codex-client`, diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index b3f50700c8e4b6af19a1527df349f49fd2ec448e..5068d1fca48f4dcf7b1b6e3335503992004e269e 100644 GIT binary patch delta 716 zcmX|9J#Q015ak>`BOwZ;hysa`D09BA_k0wD@Idj1G46d*DFfZ}Pjnzu7=-rKXE>tBAae^?7{wzraGtChX{c4_s` zosai}*FnI~&Kqye8v$W)q!p$=c1NY-X*)w0)r- ztlWFpc-uQ++yjbYBQID67RP#m4!T<433$ttGunC>SUrZGk!Hly=@tmA(4)Kfx*yzK z4T0;ikrj%I@9%@#Q(j3_K7{V>!GoSH)_@N5DtOkC#RcG_M^k*sZ40m{Ty!xd@(X z)vPo>2B&LFQWbh=mU#iyECY&&*`bc+jCrXQmK({U7(tpuB|MSapa;;`wGuP`7D-zm d$4u>)|3!3`!klM*ZRUtGi@=OUhjxM@`U~qx@PhyV delta 73 zcmdn}N4xpE_69M=>3@H4v9m=TW8nIguvwY0kdZN|c`8%;R3=6s2GPtw%mT!$K+Fcj R>_E%`#GKowGI7280RZrd8MOca diff --git a/state/map.yaml b/state/map.yaml index 9b83117a..cf1980b4 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -52,10 +52,10 @@ current_status: summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. The pure OpenAI runtime library opens exact model execution and admits typed provider events; concrete Codex/OpenRouter auth and network transport exist only in release-entrypoint source. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Workers use one governed tool-capable route; no parallel no-tools mode survives. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v37. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. The pure OpenAI runtime library opens exact model execution and admits typed provider events. OpenRouter auth/networking remains a direct release-entrypoint boundary; Codex transport crosses the lean authenticated CodexConnector client ABI and no Codex auth, HTTP/SSE, Codex-home, or compiled Codex dependency remains in Epiphany. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Workers use one governed tool-capable route; no parallel no-tools mode survives. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v38. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. execution_binding_authority_cut: Exact ce6bff12 reduces model and tool execution bindings to the only facts they own. A model binding maps one native request to its runtime session and job; a tool binding maps one typed intent to its runtime session and job. Provider identity, source worker, reasoning basis, and model-request ancestry are no longer copied into bindings or compared through timestamp-shaped API arguments. Validation, retention, public-source lookup, worker terminality, decision sealing, and tool continuation reload the exact native request or tool intent. Runtime writable state advances to v37. Core, epoch refusal, transcript-free decision audit, OpenAI tool continuation, and the release-owned tool runtime pass. The cut removes 67 net source lines and leaves runtime_spine.rs at 9,300 physical lines with 50 public functions and 25 public structs. Verification generated 12.713 GiB across 19,134 files; Cargo cleanup restored the single 1.78 MiB state inspector. Atlas is untouched; no live inter-swarm collaboration has run. - provider_transport_boundary_cut: Exact a6cf9383 moves concrete Codex/OpenRouter authentication, credential reading, and network transport out of epiphany-openai-runtime and into one source module included only by the two release entrypoints that perform inference. The pure runtime library retains exact native-request lowering, model-execution opening, typed event admission, tool intent emission, terminal physiology, and audit persistence without depending on any Codex crate. Provider strict-shape proofs move to the release-owned model binary. Persona keeps its family-owned three-stage executor while its concrete runner moves to the Persona service. The duplicate worker route without governed tools plus its CLI mode, DTOs, and coordinator switch are deleted; all workers use one tool-capable route. The cut removes 176 net source lines and adds no crate, executable, process, schema, or epoch. The runtime-library consequence test falls from 12.713 GiB/19,134 files to 1.869 GiB/2,942 files; the release-edge test still reaches 10.473 GiB/16,483 files through codex-login. All focused checks pass, then cleanup restores the exact 1,776,640-byte state inspector. Atlas is untouched and no collaboration acceptance is claimed. - standalone_codex_transport_target: Independent GameCult/CodexConnector now owns the target transport source. Exact 9da6070faa1c4a29455b2383abfaae44d9a7b229 provides one Cargo package, one public daemon binary, authenticated distinct callers, exact caller-native and provider-request digest binding, typed text/tool/usage/failure results, bounded live concurrency, a private digest-pinned official codex app-server child used only for credential authority, and keyed CultCache replay. Active identity is sealed in an owned Redb store before provider I/O; the exact encrypted response replaces it before socket reply. Completed replay survives restart byte-identically, while restart-era active work refuses as indeterminate and never re-executes. A non-secret connection-key epoch detects rotation without persisting a secret-derived verifier. No Codex crate is linked. Epiphany and Ghostlight retain prompts, projections, tools, retries, decisions, and admission. Redacted CultMesh/Odin publication, shared consumer cuts, the independent Idunn target, and deletion of the old paths remain open. No live service, credential, or deployment authority has moved. + provider_transport_boundary_cut: Exact ed7357a2 removes Codex transport from Epiphany's compiled body. The complete epiphany-openai-codex-spine package, codex-login/codex-client graph, CODEX_HOME/auth.json readiness, direct Codex HTTP/SSE, and Codex credential creation/argv are gone. Model and Persona entrypoints use the lean typed client from exact CodexConnector 54d8bc2525b7e7fa1b9dd26b95871247ff4c7566 over authenticated loopback MessagePack; Connector owns Codex auth, transport, replay, and exact native/provider digest receipts. Epiphany retains sealed native/provider requests, strict schema/call-ID projection, tool continuation, decision admission, and typed receipt evidence. OpenRouter remains one direct ureq/Rustls boundary with its own credential and terminal-tool dialect. Model receipts advance to v1 and runtime to v38; caller identity, both request digests, and cached-token usage survive transcript deletion. The maintained non-lock source shrinks by 857 lines and Cargo.lock drops 4,830 lines. Core 150/150, runtime 21/21, adapter 5/5, model edge 12/12, Persona 1/1, exact launch checks, and focused no-deps Clippy pass. Two focused build roots totaling 10.8 GiB were removed; only the exact 1,776,640-byte state inspector at SHA-256 DD38855C6F092C2C53D2212A938E737643F41130F4681708840BA6075320A04E remains. Atlas is untouched and no collaboration acceptance is claimed. + standalone_codex_transport_target: Independent GameCult/CodexConnector exact 54d8bc2525b7e7fa1b9dd26b95871247ff4c7566 owns one Cargo package and one public daemon binary. Its default library is the lean encrypted client/contract ABI; the daemon feature adds the public service, bounded raw Responses transport, the private digest-pinned official codex app-server credential child, and keyed CultCache replay. Active identity is sealed before provider I/O; the exact encrypted completion is durable before reply; completed replay survives restart byte-identically; restart-era active work refuses as indeterminate without consuming current capacity. Callers own native/provider projection, prompts, tools, decisions, and admission. Redacted CultMesh/Odin readiness, the independent Idunn target, Yggdrasil service installation, and Ghostlight's consumer/deployment cut remain open. No live credential or deployment authority has moved. fixed_routing_and_retention_cargo_cut: Exact ffd91c20 deletes EyesEvidencePacket.source_role_id, PersonaSocialMention.target_agent_id, and ResidentSelfRetentionHead.retained_at_millis. Each producer supplied one fixed or non-causal value and no consumer read it; the request/context, Persona queue plus turn request, and retention chain remain the real owners. Eyes packet v2, Persona mention v2, Resident Self state v3/retention head v1, and runtime v27 form a hard cut. Core and the three consuming release entrypoints compile; consequential Persona, Research, and epoch-refusal proofs pass. The maintained source delta is 6 net deletions. Atlas is untouched; no live inter-swarm collaboration has run. provider_stream_authority_cut: Exact fe118e13 makes OpenAI/OpenRouter events and receipts transient transport values. The runtime immediately normalizes them into the single persisted native model event/receipt family used by tool continuation, assistant reconstruction, terminal validation, and bounded retention. Duplicate provider writes, registrations, archive requirements, schema IDs, two public schemas/index rows, and the include-only model-runtime shell are gone; the exact provider request remains durable. Runtime advances to v28 and the catalog drops to 18 schemas. The cut removes 270 net maintained lines. Adapter 1/1, provider spine 14/14, reasoning context 8/8, runtime 23/23, model entrypoint 11/11, swarm 4/4, epoch refusal 1/1, and release construction 15/15 pass. Atlas is untouched; live inter-swarm collaboration remains unproven. cultnet_catalog_authority_cut: Exact dbed11b3 and 8bb0719b delete the hand-maintained JSON shadow registry. The nonexistent runtime-event contract and obsolete public archived-session tombstone schema disappear first. Runtime-local identity, session, job, binding, coordinator, native model/tool, and state-ledger schemas then disappear because no live CultNet provider carries them and several contradicted their Rust owners. Typed CultCache registration and owner-projected CultMesh state remain authoritative. The catalog has exactly three earned boundaries: the exact OpenAI-compatible provider request, gamecult.persona_state.v0, and epiphany.work_organ_state.v0. Parse/path/unindexed/forbidden-contract checks pass at 3/3/0/0/0. The cuts remove 850 net maintained lines. Atlas is untouched; live inter-swarm collaboration remains unproven. @@ -154,10 +154,10 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,300 physical lines, 50 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs carry only lifecycle identity/status; terminal result documents own summaries and artifacts. Generic session/job creation is gone; real family launch, model execution, and coordinator owners create runtime physiology. All persisted family launch-binding documents, the standalone verdict-driven Modeling writer, coordinator artifact/status cargo, uninhabited aggregate state-model DTO families, public registered-type catalog, duplicate Eyes acceptance documents, test-only arbitrary runtime writers, and duplicate Persona delivery evidence are gone; immutable worker launches plus typed family requests and atomic admission receipts own launch ancestry and downstream work creation. The release-edge Codex provider still pulls a broad codex-login graph that includes configuration, app-server protocol, telemetry, Starlark, image codecs, and clipboard support; the pure runtime no longer pays that cost. Continue splitting only by deleting callerless or duplicate authority and auditing tests against consequential behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path is a real consumer of Epiphany's short-lived request-bound permit signature, so the distinct permit identity/process remains an earned privilege boundary; current Ygg deployment doctrine still points that crossing at the old Starfire endpoint and installs no issuer unit, which the Idunn lane must repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Continue the standalone Codex transport migration from notes/standalone-codex-transport-migration.md at exact connector source 9da6070faa1c4a29455b2383abfaae44d9a7b229. Add one redacted provider-owned CultMesh/Odin readiness projection without prompt, credential, account, replay, or decision cargo; audit its dependency/build cost before admitting it. Then add Epiphany's shared typed client, prove fake-connector transcript-free decision audit and governed tool continuation, and delete the embedded Codex spine/build/auth-readiness path in the same accepted source sequence. Ghostlight and Idunn cuts follow under their owning lanes. Preserve one refresh writer, exact decision audit, provider capability, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live deployment, credential transfer, Ox root, or Model Atlas Gate run. + unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,300 physical lines, 50 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs carry only lifecycle identity/status; terminal result documents own summaries and artifacts. Generic session/job creation is gone; real family launch, model execution, and coordinator owners create runtime physiology. The embedded Codex build/auth authority is now absent. Continue splitting runtime authority only by deleting callerless or duplicate behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path remains an earned privilege boundary and its Yggdrasil issuer/crossing route still requires owning-lane repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Continue the standalone transport migration from exact Epiphany source ed7357a2 and CodexConnector 54d8bc2525b7e7fa1b9dd26b95871247ff4c7566. Add one redacted provider-owned CultMesh/Odin readiness projection without prompt, credential, account, replay, or decision cargo; audit its dependency/build cost before admission. Then give CodexConnector its independent Idunn target, install the frozen daemon on Yggdrasil, and prove an Epiphany connector round trip with transcript-free decision audit and governed tool continuation. Ghostlight must then adopt the same client ABI and delete its copied wire/deployment authority. Preserve one refresh writer, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live credential transfer, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v37. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator opening are the only session/job creation owners. The spine is 9,300 physical lines with 50 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v38. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator opening are the only session/job creation owners. The spine is 9,300 physical lines with 50 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. From 07529fb52196ad3bab030e02d6c2e114ee2d70d1 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 18:29:58 +0200 Subject: [PATCH 081/340] Collapse semantic state contracts into core --- Cargo.lock | 99 ------------------- Cargo.toml | 8 -- README.md | 6 +- docs/epiphany_body_whitepaper.tex | 41 ++++---- docs/epiphany_investor_brief.md | 4 +- epiphany-core/Cargo.toml | 1 - epiphany-core/src/current_work.rs | 8 +- epiphany-core/src/lib.rs | 13 +-- epiphany-core/src/memory_graph/mod.rs | 11 --- epiphany-core/src/memory_graph/validation.rs | 14 +-- epiphany-core/src/mind_documents.rs | 2 +- epiphany-core/src/reasoning_context.rs | 22 ++--- epiphany-core/src/reorientation_work.rs | 8 +- epiphany-core/src/repo_model_documents.rs | 26 ++--- epiphany-core/src/repo_model_gateway.rs | 2 +- .../src/state_model.rs | 90 +++++------------ .../src/surfaces/research_decision.rs | 6 +- epiphany-state-model/Cargo.toml | 19 ---- notes/codex-auth-spine-inventory.md | 10 +- notes/epiphany-fork-implementation-plan.md | 9 +- 20 files changed, 99 insertions(+), 300 deletions(-) rename epiphany-state-model/src/lib.rs => epiphany-core/src/state_model.rs (74%) delete mode 100644 epiphany-state-model/Cargo.toml diff --git a/Cargo.lock b/Cargo.lock index 0470736e..daebe993 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -507,12 +507,6 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - [[package]] name = "ed25519" version = "2.2.3" @@ -551,7 +545,6 @@ dependencies = [ "epiphany-model-adapter", "epiphany-openai-adapter", "epiphany-release-construction", - "epiphany-state-model", "epiphany-tool-adapter", "ghostlight-persona-projection", "ignore", @@ -649,15 +642,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "epiphany-state-model" -version = "0.1.0" -dependencies = [ - "schemars", - "serde", - "ts-rs", -] - [[package]] name = "epiphany-tool-adapter" version = "0.1.0" @@ -1867,30 +1851,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "schemars" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" -dependencies = [ - "dyn-clone", - "schemars_derive", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 2.0.119", -] - [[package]] name = "security-framework" version = "3.7.0" @@ -1964,17 +1924,6 @@ dependencies = [ "syn 3.0.3", ] -[[package]] -name = "serde_derive_internals" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - [[package]] name = "serde_json" version = "1.0.151" @@ -2177,15 +2126,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - [[package]] name = "thiserror" version = "2.0.20" @@ -2414,30 +2354,6 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "ts-rs" -version = "11.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4994acea2522cd2b3b85c1d9529a55991e3ad5e25cdcd3de9d505972c4379424" -dependencies = [ - "serde_json", - "thiserror", - "ts-rs-macros", - "uuid", -] - -[[package]] -name = "ts-rs-macros" -version = "11.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6ff59666c9cbaec3533964505d39154dc4e0a56151fdea30a09ed0301f62e2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", - "termcolor", -] - [[package]] name = "typenum" version = "1.20.1" @@ -3047,18 +2963,3 @@ name = "zmij" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" - -[[patch.unused]] -name = "tungstenite" -version = "0.27.0" -source = "git+https://github.com/openai-oss-forks/tungstenite-rs?rev=9200079d3b54a1ff51072e24d81fd354f085156f#9200079d3b54a1ff51072e24d81fd354f085156f" - -[[patch.unused]] -name = "tokio-tungstenite" -version = "0.28.0" -source = "git+https://github.com/openai-oss-forks/tokio-tungstenite?rev=132f5b39c862e3a970f731d709608b3e6276d5f6#132f5b39c862e3a970f731d709608b3e6276d5f6" - -[[patch.unused]] -name = "tungstenite" -version = "0.27.0" -source = "git+https://github.com/openai-oss-forks/tungstenite-rs?rev=9200079d3b54a1ff51072e24d81fd354f085156f#9200079d3b54a1ff51072e24d81fd354f085156f" diff --git a/Cargo.toml b/Cargo.toml index 6618cf68..f208bbc6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,6 @@ members = [ "epiphany-openai-adapter", "epiphany-openai-runtime", "epiphany-release-construction", - "epiphany-state-model", "epiphany-tool-adapter", "epiphany-tool-mcp-runtime", ] @@ -54,13 +53,6 @@ incremental = true [dev-dependencies] tempfile = "3" -[patch.crates-io] -tokio-tungstenite = { git = "https://github.com/openai-oss-forks/tokio-tungstenite", rev = "132f5b39c862e3a970f731d709608b3e6276d5f6" } -tungstenite = { git = "https://github.com/openai-oss-forks/tungstenite-rs", rev = "9200079d3b54a1ff51072e24d81fd354f085156f" } - -[patch."ssh://git@github.com/openai-oss-forks/tungstenite-rs.git"] -tungstenite = { git = "https://github.com/openai-oss-forks/tungstenite-rs", rev = "9200079d3b54a1ff51072e24d81fd354f085156f" } - [[bin]] name = "epiphany-release" path = "epiphany-core/src/bin/epiphany-release.rs" diff --git a/README.md b/README.md index 5c05bc1e..259a8c36 100644 --- a/README.md +++ b/README.md @@ -120,15 +120,15 @@ Epiphany is a native GameCult runtime that began as an opinionated Codex fork. Her body is made of: -- typed Rust domain organs in `epiphany-core` and `epiphany-state-model` +- typed Rust domain organs owned by `epiphany-core` - CultCache `.cc` stores for runtime, heartbeat, agent state, local Verse, memory graph, and thread state - CultMesh and CultNet contracts for local and distributed state - provider-neutral model and tool request/receipt documents - Mind, Substrate Gate, Eyes, Hands, Soul, Continuity, Persona, and heartbeat authority surfaces -- Codex retained only for honest OpenAI subscription auth and model transport; - Epiphany does not publish a Codex-owned project-state surface +- a narrow standalone CodexConnector process for OpenAI subscription auth and + model transport; Epiphany compiles no Codex crate and keeps cognition local That last clause matters. Codex and other frontier agents can be excellent workers. They do not decide which organizational state is authoritative, who diff --git a/docs/epiphany_body_whitepaper.tex b/docs/epiphany_body_whitepaper.tex index a857393c..05046be2 100644 --- a/docs/epiphany_body_whitepaper.tex +++ b/docs/epiphany_body_whitepaper.tex @@ -48,7 +48,7 @@ The practical definition in this repository is: \begin{itemize} \item the root checkout at \code{F:\Projects\Epiphany}; - \item Epiphany Rust crates such as \code{epiphany-core}, \code{epiphany-state-model}, model/tool adapters, and OpenAI transport crates; + \item Epiphany Rust crates such as \code{epiphany-core}, model/tool adapters, and provider runtimes; \item vendored substrate in \code{vendor/codex}, \code{vendor/cultcache-rs}, \code{vendor/cultnet-rs}, and \code{vendor/cultmesh-rs}; \item typed state stores under \code{state/}; \item schemas under \code{schemas/cultnet/}; @@ -59,20 +59,19 @@ The practical definition in this repository is: \section{Executive Map} -Epiphany's current Body is a hybrid machine in transition. Its center of gravity -has moved into typed Rust/CultCache organs, but compatibility arteries still -run through vendored Codex. The live target is not a cleaner pile of Codex -routes. The target is an Epiphany-native CultCache/CultMesh/CultNet body with a -relatively vanilla Codex-derived reliquary retained for OpenAI subscription -auth and model transport. +Epiphany's current Body is a typed Rust/CultCache organism with provider +transport outside its cognition boundary. Codex requests cross a lean client +ABI into the independent CodexConnector daemon, which owns subscription +credential refresh, transport, and replay. Epiphany owns prompts, tools, +reasoning context, decisions, and Mind admission; it compiles no Codex crate. \begin{longtable}{>{\raggedright\arraybackslash}p{0.23\linewidth}>{\raggedright\arraybackslash}p{0.32\linewidth}>{\raggedright\arraybackslash}p{0.35\linewidth}} \textbf{Body Region} & \textbf{Current Owner} & \textbf{Invariant} \\ \hline Durable Mind state & keyed CultCache documents assembled by \code{epiphany-core} & Prompt rendering consumes sealed typed projections; no persisted thread aggregate or global authority revision exists. \\ Domain policy & \code{epiphany-core} & Verdicts, launch policy, acceptance rules, runtime lifecycle, and mutation law live here, not in bridge DTOs. \\ -Vendored Codex & \code{vendor/codex} & Retain host/app-server/auth/model compatibility where useful; do not let Codex own Epiphany prompts, scheduler, or state. \\ -Runtime spine & \code{epiphany-core/src/runtime_spine.rs} and \code{state/runtime-spine.cc} & Runtime identity, jobs, events, receipts, tool/model documents are typed CultCache records. \\ +Codex transport & independent \code{GameCult/CodexConnector} daemon & Own subscription credentials, provider transport, and exact replay only; never own Epiphany prompts, scheduler, decisions, or state. \\ +Runtime spine & \code{epiphany-core/src/runtime_spine.rs} and \code{state/runtime-spine.cc} & Runtime identity, jobs, receipts, and tool/model documents are typed CultCache records. \\ Persona memory & keyed Mind Persona-memory documents & Persona decisions admit bounded memories by semantic identity; no parallel role-memory aggregate or generation head exists. \\ Resident Self physiology & Resident Self CultCache documents via \code{epiphany-swarm} & Typed pressure, exact grant creation, launch exclusion, leases, terminal receipts, retry, and bounded retention have one owner. No scheduler singleton or acknowledgement loop exists. \\ Local Verse & CultMesh over \code{state/local-verse.cc} & Local Verse context is compact prompt/operator context; private state does not become public by flipping a flag. \\ @@ -82,27 +81,21 @@ Operator artifacts & \code{.epiphany-*}, \code{tools/epiphany_local_run.ps1} & A \section{Repository Body} -The checkout has nine primary Epiphany Rust crates: +The checkout has eight primary Epiphany Rust packages: \begin{itemize} - \item \code{epiphany-core}: the main domain organ. It owns state-update - validation, launch documents, runtime spine, Resident Self, Persona - projection, Substrate Gate, Mind, Eyes, Hands, Soul, Continuity, CultMesh - integration, surface derivation, smokes, and local operator binaries. - \item \code{epiphany-state-model}: the durable \code{EpiphanyThreadState} - type plus \code{render_epiphany_state}. This is the typed Mind surface that - prompt fragments and views read. + \item \code{epiphany-core}: the main domain organ. It owns semantic state + contracts, keyed Mind admission, launch documents, runtime spine, Resident + Self, Persona projection, Substrate Gate, Eyes, Hands, Soul, Continuity, + CultMesh integration, and surface derivation. \item \code{epiphany-model-adapter}: provider-neutral model request, stream event, receipt, and status documents. \item \code{epiphany-openai-adapter}: OpenAI-shaped request/event/receipt and status documents. - \item \code{epiphany-openai-auth-spine}: Codex-derived auth boundary over - \code{codex-login}. It preserves honest Codex-compatible credential and token - behavior rather than impersonating it from scratch. - \item \code{epiphany-openai-codex-spine}: model transport over vendored Codex - client machinery. \item \code{epiphany-openai-runtime}: executable model runtime, including \code{epiphany-model-runtime}. + \item \code{epiphany-release-construction}: exact package construction and + release-witness verification. \item \code{epiphany-tool-adapter}: typed tool capability, invocation intent, and invocation receipt documents. \item \code{epiphany-tool-mcp-runtime}: first-party tool executor. Native @@ -114,8 +107,8 @@ The checkout has nine primary Epiphany Rust crates: The vendored region contains: \begin{itemize} - \item \code{vendor/codex}: the Codex-derived host and compatibility substrate. - It is tracked directly, not as a submodule. + \item \code{vendor/codex}: retained Codex-fork source history. It is not in + Epiphany's compiled runtime graph. \item \code{vendor/cultcache-rs}, \code{vendor/cultnet-rs}, and \code{vendor/cultmesh-rs}: repo-contained Rust Cult substrate. \end{itemize} diff --git a/docs/epiphany_investor_brief.md b/docs/epiphany_investor_brief.md index b5ab23f2..cbd5c556 100644 --- a/docs/epiphany_investor_brief.md +++ b/docs/epiphany_investor_brief.md @@ -77,7 +77,7 @@ conflicts, or a consequential judgment cannot be derived honestly. The current native Epiphany body includes: -- typed Rust domain organs in `epiphany-core` and `epiphany-state-model` +- typed Rust domain organs owned by `epiphany-core` - keyed Mind state with typed projection and promotion paths - RepoModel and Model Atlas surfaces for source-grounded architectural belief - CultCache `.cc` state and CultMesh/CultNet contracts @@ -86,7 +86,7 @@ The current native Epiphany body includes: - runtime-spine job and worker-result documents - Mind, Modeling, Substrate Gate, Eyes, Hands, Soul, Continuity, Persona, and heartbeat authority surfaces -- local operator status, coordinator, smoke, and Verse-context commands +- local operator status, coordinator, and Verse-context commands Codex is retained only for OpenAI authentication and model transport. Epiphany does not publish Codex app-server state as its project Mind. diff --git a/epiphany-core/Cargo.toml b/epiphany-core/Cargo.toml index 891efb46..b9b06b31 100644 --- a/epiphany-core/Cargo.toml +++ b/epiphany-core/Cargo.toml @@ -21,7 +21,6 @@ epiphany-openai-adapter = { path = "../epiphany-openai-adapter" } epiphany-release-construction = { path = "../epiphany-release-construction" } epiphany-model-adapter = { path = "../epiphany-model-adapter" } epiphany-tool-adapter = { path = "../epiphany-tool-adapter" } -epiphany-state-model = { path = "../epiphany-state-model" } ghostlight-persona-projection = { git = "https://github.com/GameCult/Ghostlight.git", rev = "22281891cbf9258db80c15a9fd465e6fa251e7dd", package = "ghostlight-persona-projection" } ed25519-dalek = "2" ignore = "0.4.23" diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index 3b26c232..8f3d637a 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -3406,7 +3406,7 @@ fn resolve_body_modeling_work( #[cfg(test)] mod tests { use super::*; - use epiphany_state_model::{ + use crate::state_model::{ EpiphanyMemoryDomain, EpiphanyMemoryLifecycle, EpiphanyMemoryNode, EpiphanyMemoryNodeKind, RepoFrontierItem, RepoFrontierStatus, }; @@ -5792,12 +5792,12 @@ mod tests { research_cache.put(&research_context.context_id, &research_context)?; let stale_research_store = temp.path().join("stale-research-output.cc"); std::fs::copy(&store, &stale_research_store)?; - let evidence = epiphany_state_model::EpiphanyEvidenceRecord { + let evidence = crate::EpiphanyEvidenceRecord { id: "research-evidence-1".into(), kind: "external-source".into(), status: "ok".into(), summary: "The bounded external claim is supported.".into(), - code_refs: vec![epiphany_state_model::EpiphanyCodeRef { + code_refs: vec![crate::EpiphanyCodeRef { path: "epiphany-core/src/current_work.rs".into(), start_line: Some(1), end_line: None, @@ -5805,7 +5805,7 @@ mod tests { note: None, }], }; - let observation = epiphany_state_model::EpiphanyObservation { + let observation = crate::EpiphanyObservation { id: "research-observation-1".into(), summary: "External evidence answers the exact frontier question.".into(), source_kind: "research".into(), diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index 64e07e45..d9b4dc9c 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -32,6 +32,7 @@ mod runtime_spine; mod runtime_store_backend; mod runtime_worker_attempt; mod soul_gateway; +mod state_model; mod state_ledger; mod substrate_gate; mod surfaces; @@ -99,11 +100,6 @@ pub use cultmesh_integration::{ }; pub use current_work::*; -pub use epiphany_state_model::EpiphanyMemoryAnchor; -pub use epiphany_state_model::EpiphanyMemoryDomain; -pub use epiphany_state_model::EpiphanyMemoryEdge; -pub use epiphany_state_model::EpiphanyMemoryLifecycle; -pub use epiphany_state_model::EpiphanyMemoryNode; pub use hands_gateway::*; pub use idunn_provider_health::{ EPIPHANY_IDUNN_PROVIDER_HEALTH_ADMISSION_SCHEMA, EPIPHANY_IDUNN_PROVIDER_HEALTH_ADMISSION_TYPE, @@ -133,13 +129,7 @@ pub use imagination_consideration::{ validate_candidate as validate_imagination_consideration_candidate, validate_current_request as validate_current_imagination_consideration_request, }; -pub use memory_graph::EpiphanyMemoryEdgeKind; -pub use memory_graph::EpiphanyMemoryGraphSnapshot; pub use memory_graph::EpiphanyMemoryGraphValidationError; -pub use memory_graph::EpiphanyMemoryNodeKind; -pub use memory_graph::RepoFrontierAdoptedPlan; -pub use memory_graph::RepoFrontierItem; -pub use memory_graph::RepoFrontierStatus; pub use memory_graph::validate_memory_graph_snapshot; pub use mind_documents::*; pub use packaged_release::{ @@ -301,6 +291,7 @@ pub use runtime_spine::select_and_commit_repo_frontier_route; pub use runtime_spine::terminalize_model_pass_failure_session; pub(crate) use runtime_worker_attempt::{RuntimeTypedRequestRef, WorkerProcessStatus}; pub use soul_gateway::*; +pub use state_model::*; pub use state_ledger::EpiphanyBranchRecord; pub use state_ledger::EpiphanyLedgerEvidenceRecord; pub use state_ledger::EpiphanyStateLedgerEntry; diff --git a/epiphany-core/src/memory_graph/mod.rs b/epiphany-core/src/memory_graph/mod.rs index 3a4d5073..d1620351 100644 --- a/epiphany-core/src/memory_graph/mod.rs +++ b/epiphany-core/src/memory_graph/mod.rs @@ -1,16 +1,5 @@ pub mod validation; -pub use epiphany_state_model::EpiphanyMemoryDomain; -pub use epiphany_state_model::EpiphanyMemoryEdge; -pub use epiphany_state_model::EpiphanyMemoryEdgeKind; -pub use epiphany_state_model::EpiphanyMemoryGraphSnapshot; -pub use epiphany_state_model::EpiphanyMemoryLifecycle; -pub use epiphany_state_model::EpiphanyMemoryNode; -pub use epiphany_state_model::EpiphanyMemoryNodeKind; -pub use epiphany_state_model::RepoFrontierAdoptedPlan; -pub use epiphany_state_model::RepoFrontierItem; -pub use epiphany_state_model::RepoFrontierStatus; - pub use validation::EpiphanyMemoryGraphValidationError; pub(crate) use validation::frontier_item_has_routeable_repository_scope; pub(crate) use validation::repo_paths_are_canonical_and_safe; diff --git a/epiphany-core/src/memory_graph/validation.rs b/epiphany-core/src/memory_graph/validation.rs index 10e4ad8b..e064e708 100644 --- a/epiphany-core/src/memory_graph/validation.rs +++ b/epiphany-core/src/memory_graph/validation.rs @@ -1,9 +1,9 @@ -use super::EpiphanyMemoryDomain; -use super::EpiphanyMemoryEdge; -use super::EpiphanyMemoryGraphSnapshot; -use super::EpiphanyMemoryLifecycle; -use super::EpiphanyMemoryNode; -use super::RepoFrontierStatus; +use crate::EpiphanyMemoryDomain; +use crate::EpiphanyMemoryEdge; +use crate::EpiphanyMemoryGraphSnapshot; +use crate::EpiphanyMemoryLifecycle; +use crate::EpiphanyMemoryNode; +use crate::RepoFrontierStatus; use std::collections::{HashMap, HashSet}; pub(crate) fn repo_paths_are_canonical_and_safe(paths: &[String]) -> bool { @@ -23,7 +23,7 @@ pub(crate) fn repo_paths_are_canonical_and_safe(paths: &[String]) -> bool { } pub(crate) fn frontier_item_has_routeable_repository_scope( - item: &epiphany_state_model::RepoFrontierItem, + item: &crate::RepoFrontierItem, ) -> bool { !item.repository_scope.is_empty() && repo_paths_are_canonical_and_safe(&item.repository_scope) } diff --git a/epiphany-core/src/mind_documents.rs b/epiphany-core/src/mind_documents.rs index 3167cbe1..63857eed 100644 --- a/epiphany-core/src/mind_documents.rs +++ b/epiphany-core/src/mind_documents.rs @@ -2,7 +2,7 @@ use std::path::Path; use anyhow::{Result, anyhow}; use cultcache_rs::{CultCache, CultCacheEnvelope, DatabaseEntry}; -use epiphany_state_model::{ +use crate::state_model::{ EpiphanyEvidenceRecord, EpiphanyInvariant, EpiphanyInvestigationCheckpoint, EpiphanyModeState, EpiphanyObservation, EpiphanySubgoal, }; diff --git a/epiphany-core/src/reasoning_context.rs b/epiphany-core/src/reasoning_context.rs index 4078bbfe..51a2ea4c 100644 --- a/epiphany-core/src/reasoning_context.rs +++ b/epiphany-core/src/reasoning_context.rs @@ -68,10 +68,10 @@ impl From for EpiphanyRolePassAuthorityProject pub struct EpiphanyRepoModelPromptProjection { pub identity: crate::EpiphanyRepoModelIdentityDocument, pub projection_digest: String, - pub domains: Vec, - pub nodes: Vec, - pub edges: Vec, - pub frontier: Vec, + pub domains: Vec, + pub nodes: Vec, + pub edges: Vec, + pub frontier: Vec, pub claim_obligations: Vec, pub surface_offers: Vec, pub dependency_claims: Vec, @@ -104,16 +104,16 @@ pub struct EpiphanyMindPromptProjection { pub projection_digest: String, pub objective: Option, pub active_subgoal_id: Option, - pub subgoals: Vec, - pub invariants: Vec, - pub observations: Vec, - pub evidence: Vec, + pub subgoals: Vec, + pub invariants: Vec, + pub observations: Vec, + pub evidence: Vec, pub verification_audits: Vec, pub reorientation_decisions: Vec, pub reorientation_failures: Vec, pub agent_pass_admission_refusals: Vec, - pub investigation_checkpoint: Option, - pub mode: Option, + pub investigation_checkpoint: Option, + pub mode: Option, pub repository_body_observation: Option, pub repo_model: Option, } @@ -2627,7 +2627,7 @@ mod tests { let make = |key: &str, summary: &str| -> Result { let cache = runtime_spine_cache(&store)?; let document = crate::EpiphanyMindObservationDocument { - value: epiphany_state_model::EpiphanyObservation { + value: crate::EpiphanyObservation { id: key.into(), summary: summary.into(), source_kind: "test".into(), diff --git a/epiphany-core/src/reorientation_work.rs b/epiphany-core/src/reorientation_work.rs index 09fa74e2..2e7a80bc 100644 --- a/epiphany-core/src/reorientation_work.rs +++ b/epiphany-core/src/reorientation_work.rs @@ -19,10 +19,10 @@ pub struct EpiphanyReorientationStateProjection { pub runtime_id: String, pub objective: Option, pub active_subgoal_id: Option, - pub investigation_checkpoint: Option, - pub mode: Option, + pub investigation_checkpoint: Option, + pub mode: Option, pub repository_body_observation: Option, - pub frontier: Vec, + pub frontier: Vec, pub projection_digest: String, } @@ -1060,7 +1060,7 @@ mod tests { cache.put( "unrelated-observation", &crate::EpiphanyMindObservationDocument { - value: epiphany_state_model::EpiphanyObservation { + value: crate::EpiphanyObservation { id: "unrelated-observation".into(), summary: "Persona observed an unrelated social fact.".into(), ..Default::default() diff --git a/epiphany-core/src/repo_model_documents.rs b/epiphany-core/src/repo_model_documents.rs index 32703de1..5b66ca6e 100644 --- a/epiphany-core/src/repo_model_documents.rs +++ b/epiphany-core/src/repo_model_documents.rs @@ -3,7 +3,7 @@ use std::path::Path; use anyhow::{Result, anyhow}; use cultcache_rs::{CultCache, CultCacheEnvelope, DatabaseEntry}; -use epiphany_state_model::{ +use crate::state_model::{ EpiphanyMemoryDomain, EpiphanyMemoryEdge, EpiphanyMemoryGraphSnapshot, EpiphanyMemoryNode, RepoFrontierItem, }; @@ -835,7 +835,7 @@ pub fn plan_repo_model_mutation( { insert_strong_envelope(&mut strong, existing)?; } - node.lifecycle = epiphany_state_model::EpiphanyMemoryLifecycle::Retired; + node.lifecycle = crate::EpiphanyMemoryLifecycle::Retired; nodes.insert(node_id.clone(), node.clone()); insert_envelope( &mut writes, @@ -879,7 +879,7 @@ pub fn plan_repo_model_mutation( .get_envelope::(edge_id)? .ok_or_else(|| anyhow!("RepoModel edge lost its envelope"))?; insert_strong_envelope(&mut strong, existing)?; - edge.lifecycle = epiphany_state_model::EpiphanyMemoryLifecycle::Retired; + edge.lifecycle = crate::EpiphanyMemoryLifecycle::Retired; edges.insert(edge_id.clone(), edge.clone()); insert_envelope( &mut writes, @@ -1319,9 +1319,9 @@ fn require_semantic_id(value: &str, label: &str) -> Result<()> { fn frontier_is_unresolved(item: &RepoFrontierItem) -> bool { matches!( item.status, - epiphany_state_model::RepoFrontierStatus::Proposed - | epiphany_state_model::RepoFrontierStatus::Active - | epiphany_state_model::RepoFrontierStatus::Blocked + crate::RepoFrontierStatus::Proposed + | crate::RepoFrontierStatus::Active + | crate::RepoFrontierStatus::Blocked ) } @@ -1509,9 +1509,9 @@ fn validate_claim_obligations( if !item.target_claim_ids.contains(&obligation.node_id) || !matches!( item.status, - epiphany_state_model::RepoFrontierStatus::Proposed - | epiphany_state_model::RepoFrontierStatus::Active - | epiphany_state_model::RepoFrontierStatus::Blocked + crate::RepoFrontierStatus::Proposed + | crate::RepoFrontierStatus::Active + | crate::RepoFrontierStatus::Blocked ) { return Err(anyhow!("RepoModel claim obligation is not live")); @@ -1521,9 +1521,9 @@ fn validate_claim_obligations( for item in frontier.iter().filter(|item| { matches!( item.status, - epiphany_state_model::RepoFrontierStatus::Proposed - | epiphany_state_model::RepoFrontierStatus::Active - | epiphany_state_model::RepoFrontierStatus::Blocked + crate::RepoFrontierStatus::Proposed + | crate::RepoFrontierStatus::Active + | crate::RepoFrontierStatus::Blocked ) }) { for node_id in &item.target_claim_ids { @@ -1542,7 +1542,7 @@ fn validate_claim_obligations( mod tests { use super::*; use crate::{RuntimeSpineInitOptions, initialize_runtime_spine}; - use epiphany_state_model::{ + use crate::state_model::{ EpiphanyMemoryEdgeKind, EpiphanyMemoryLifecycle, EpiphanyMemoryNodeKind, RepoFrontierStatus, }; diff --git a/epiphany-core/src/repo_model_gateway.rs b/epiphany-core/src/repo_model_gateway.rs index fcbd9370..9193d843 100644 --- a/epiphany-core/src/repo_model_gateway.rs +++ b/epiphany-core/src/repo_model_gateway.rs @@ -418,7 +418,7 @@ pub struct RepoFrontierRoute { #[cultcache(key = 11)] pub authorized_paths: Vec, #[cultcache(key = 12, default)] - pub adopted_plan: Option, + pub adopted_plan: Option, #[cultcache(key = 13)] pub selected_at: String, } diff --git a/epiphany-state-model/src/lib.rs b/epiphany-core/src/state_model.rs similarity index 74% rename from epiphany-state-model/src/lib.rs rename to epiphany-core/src/state_model.rs index 4fb147a5..4e893012 100644 --- a/epiphany-state-model/src/lib.rs +++ b/epiphany-core/src/state_model.rs @@ -1,83 +1,70 @@ +//! Core-owned semantic state contracts. + use std::path::PathBuf; -use schemars::JsonSchema; use serde::Deserialize; use serde::Serialize; -use ts_rs::TS; -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Default)] pub struct EpiphanySubgoal { pub id: String, pub title: String, pub status: String, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] pub summary: Option, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Default)] pub struct EpiphanyInvariant { pub id: String, pub description: String, pub status: String, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] pub rationale: Option, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Default)] pub struct EpiphanyCodeRef { pub path: PathBuf, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "number | null")] pub start_line: Option, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "number | null")] pub end_line: Option, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] pub symbol: Option, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] pub note: Option, } -#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, JsonSchema, TS, Default)] +#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Default)] #[serde(rename_all = "snake_case")] -#[ts(rename_all = "snake_case")] pub enum EpiphanyInvestigationDisposition { #[default] ResumeReady, RegatherRequired, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Default)] pub struct EpiphanyInvestigationCheckpoint { pub checkpoint_id: String, pub kind: String, pub disposition: EpiphanyInvestigationDisposition, pub focus: String, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] pub summary: Option, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] pub next_action: Option, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] pub captured_at_turn_id: Option, #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] pub open_questions: Vec, #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] pub code_refs: Vec, #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] pub evidence_ids: Vec, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Default)] pub struct EpiphanyObservation { pub id: String, pub summary: String, @@ -89,7 +76,7 @@ pub struct EpiphanyObservation { pub evidence_ids: Vec, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Default)] pub struct EpiphanyEvidenceRecord { pub id: String, pub kind: String, @@ -99,16 +86,15 @@ pub struct EpiphanyEvidenceRecord { pub code_refs: Vec, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Default)] pub struct EpiphanyModeState { pub name: String, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "ModeKind | null")] pub kind: Option, } #[derive( - Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash, JsonSchema, TS, Default, + Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash, Default, )] #[serde(rename_all = "snake_case")] pub enum EpiphanyModeKind { @@ -123,36 +109,30 @@ pub enum EpiphanyModeKind { Default, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Default)] pub struct EpiphanyMemoryGraphSnapshot { pub graph_id: String, #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] pub domains: Vec, #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] pub nodes: Vec, #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] pub edges: Vec, #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] pub frontier: Vec, } /// A durable piece of unfinished repository anatomy. This is Modeling-owned state, /// not a scheduler job or a presentation card. -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Default)] pub struct RepoFrontierItem { pub id: String, pub migration_body: String, pub question: String, pub gap: String, #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] pub target_claim_ids: Vec, #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] /// Canonical repository-relative path ceiling for this wound. This is the /// scope that downstream Planning may narrow and Hands may eventually /// change; inspected files and evidence provenance belong elsewhere. @@ -162,36 +142,28 @@ pub struct RepoFrontierItem { /// propose this payload, but only the dedicated model transition may make /// it part of Modeling-owned truth. #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "RepoFrontierAdoptedPlan | null")] pub adopted_plan: Option, #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] pub dependency_item_ids: Vec, #[serde(default)] pub status: RepoFrontierStatus, #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] pub evidence_refs: Vec, /// Exact immutable public sources selected upstream for Eyes. These are /// causal retrieval inputs, not evidence produced by Modeling. #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] pub public_source_refs: Vec, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] pub created_at: Option, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] pub updated_at: Option, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] pub retired_at: Option, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] pub superseded_by: Option, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Default)] pub struct RepoFrontierAdoptedPlan { pub planning_request_id: String, pub result_id: String, @@ -199,18 +171,14 @@ pub struct RepoFrontierAdoptedPlan { pub candidate_id: String, pub candidate_sha256: String, #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] pub safe_paths: Vec, pub action: String, pub command: String, #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] pub checks: Vec, #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] pub stop_conditions: Vec, #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] pub rollback_steps: Vec, pub commit_message: String, } @@ -225,9 +193,8 @@ impl RepoFrontierAdoptedPlan { } } -#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, JsonSchema, TS, Default)] +#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Default)] #[serde(rename_all = "snake_case")] -#[ts(rename_all = "snake_case")] pub enum RepoFrontierStatus { #[default] Proposed, @@ -238,22 +205,20 @@ pub enum RepoFrontierStatus { Superseded, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Default)] pub struct EpiphanyMemoryDomain { pub id: String, pub title: String, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] pub description: Option, #[serde(default)] pub lifecycle: EpiphanyMemoryLifecycle, } #[derive( - Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash, JsonSchema, TS, Default, + Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash, Default, )] #[serde(rename_all = "snake_case")] -#[ts(rename_all = "snake_case")] pub enum EpiphanyMemoryLifecycle { #[default] Observed, @@ -264,10 +229,9 @@ pub enum EpiphanyMemoryLifecycle { } #[derive( - Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash, JsonSchema, TS, Default, + Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash, Default, )] #[serde(rename_all = "snake_case")] -#[ts(rename_all = "snake_case")] pub enum EpiphanyMemoryNodeKind { #[default] Domain, @@ -283,7 +247,7 @@ pub enum EpiphanyMemoryNodeKind { Other, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Default)] pub struct EpiphanyMemoryNode { pub id: String, pub domain_id: String, @@ -294,26 +258,21 @@ pub struct EpiphanyMemoryNode { pub tension: String, pub action_implication: String, #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] pub anchors: Vec, #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] pub source_hashes: Vec, #[serde(default)] pub lifecycle: EpiphanyMemoryLifecycle, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] pub created_at: Option, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] pub updated_at: Option, } #[derive( - Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash, JsonSchema, TS, Default, + Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash, Default, )] #[serde(rename_all = "snake_case")] -#[ts(rename_all = "snake_case")] pub enum EpiphanyMemoryEdgeKind { #[default] Owns, @@ -332,7 +291,7 @@ pub enum EpiphanyMemoryEdgeKind { Other, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Default)] pub struct EpiphanyMemoryEdge { pub id: String, pub source_id: String, @@ -340,27 +299,22 @@ pub struct EpiphanyMemoryEdge { pub kind: EpiphanyMemoryEdgeKind, pub claim: String, #[serde(default, skip_serializing_if = "Vec::is_empty")] - #[ts(type = "Array")] pub anchors: Vec, #[serde(default)] pub lifecycle: EpiphanyMemoryLifecycle, } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema, TS, Default)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, Default)] pub struct EpiphanyMemoryAnchor { pub id: String, pub kind: String, pub target: String, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "EpiphanyCodeRef | null")] pub code_ref: Option, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] pub evidence_id: Option, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] pub source_hash: Option, #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(type = "string | null")] pub note: Option, } diff --git a/epiphany-core/src/surfaces/research_decision.rs b/epiphany-core/src/surfaces/research_decision.rs index b4030934..119c1d07 100644 --- a/epiphany-core/src/surfaces/research_decision.rs +++ b/epiphany-core/src/surfaces/research_decision.rs @@ -1,7 +1,7 @@ use anyhow::{Result, anyhow}; -use epiphany_state_model::EpiphanyEvidenceRecord; -use epiphany_state_model::EpiphanyInvestigationCheckpoint; -use epiphany_state_model::EpiphanyObservation; +use crate::state_model::EpiphanyEvidenceRecord; +use crate::state_model::EpiphanyInvestigationCheckpoint; +use crate::state_model::EpiphanyObservation; use serde::{Deserialize, Serialize}; use std::collections::BTreeSet; diff --git a/epiphany-state-model/Cargo.toml b/epiphany-state-model/Cargo.toml deleted file mode 100644 index 5d48d99a..00000000 --- a/epiphany-state-model/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "epiphany-state-model" -version = "0.1.0" -edition = "2024" -publish = false -license-file = "../LICENSE" - -[lib] -name = "epiphany_state_model" -path = "src/lib.rs" - -[dependencies] -schemars = "0.8" -serde = { version = "1", features = ["derive"] } -ts-rs = { version = "11", features = [ - "uuid-impl", - "serde-json-impl", - "no-serde-warnings", -] } diff --git a/notes/codex-auth-spine-inventory.md b/notes/codex-auth-spine-inventory.md index 606fb4c2..4393641f 100644 --- a/notes/codex-auth-spine-inventory.md +++ b/notes/codex-auth-spine-inventory.md @@ -188,11 +188,11 @@ application. `codex-core` re-exports the contract only as a compatibility alias, and `CodexThread` now calls native state-update functions around its remaining revision check, persistence validation, and rollout/session writeback. -The credential extraction overcut has been corrected. Codex file/keyring/auto -auth, env API key handling, ChatGPT token refresh, account metadata parsing, -and header-client setup remain in vendored `codex-login`. The redundant -Epiphany re-export crate is gone; the root workspace carries the Codex -`tokio-tungstenite` / `tungstenite` patches required for standalone builds. +This paragraph describes the superseded embedded-auth phase. Exact `ed7357a2` +later removed Codex credential and transport anatomy from Epiphany entirely; +the independent CodexConnector owns that boundary. The unused root +`tokio-tungstenite` / `tungstenite` patches are gone with the compiled Codex +graph. The point is ownership: Epiphany calls a model adapter; it does not live inside the Codex host brain. diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index ef05b5b6..304d018e 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -7,14 +7,13 @@ of app-server routes. ## Objective Build an inspectable native organism whose typed state, runtime, organ gates, -memory, scheduling, interfaces, and social crossings can operate without Codex -owning Epiphany cognition. Retain Codex-derived code only where it provides an -earned OpenAI-compatible authentication or model-transport capability. +memory, scheduling, interfaces, and social crossings operate without Codex +owning Epiphany cognition. OpenAI subscription authentication and model +transport belong to the independent CodexConnector daemon, not Epiphany's body. ## Current Mechanism -- `epiphany-state-model` owns shared typed semantic contracts; durable Mind is keyed CultCache owned by `epiphany-core`. -- `epiphany-core` owns keyed Mind admission, runtime spine, organ gates, +- `epiphany-core` owns the semantic contracts, keyed Mind admission, runtime spine, organ gates, Resident Self physiology, Persona, and CultMesh integration. Coordinator policy, status, and every migrated work family consume keyed Mind plus exact runtime receipts. Persisted `EpiphanyThreadStateEntry`, the in-memory From dd55f0f8969cea505775eb50d35a918ef283839a Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 18:33:08 +0200 Subject: [PATCH 082/340] Record semantic state package collapse --- notes/fresh-workspace-handoff.md | 43 +++++++++++++++++++------------ state/ledgers.msgpack | Bin 720443 -> 720980 bytes state/map.yaml | 19 +++++++++++--- state/scratch.md | 12 ++++++--- 4 files changed, 52 insertions(+), 22 deletions(-) diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 739912ed..b1343d08 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,11 +2,11 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed Epiphany source cut: `ed7357a2` +Latest committed Epiphany source cut: `07529fb5` Current connector source: `54d8bc2525b7e7fa1b9dd26b95871247ff4c7566` -Current pass: Codex transport is absent from Epiphany's compiled body; redacted -Connector readiness and its independent Idunn target are next; Ox17 and Atlas -Gate 1 remain paused +Current pass: source subtraction continues after collapsing semantic state into +Core; duplicate family request identities on generic worker launch/result +records are next; Ox17 and Atlas Gate 1 remain paused ## Orientation @@ -17,7 +17,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `ed7357a2` is the current +production symlink body and is inactive. Exact `07529fb5` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -93,6 +93,17 @@ Yggdrasil installation, a real Epiphany connector round trip, and Ghostlight's shared-client/deployment cut remain open. No live service, credential, or deployment authority moved in this source pass. +Exact `07529fb5` deletes `epiphany-state-model` as a Cargo package. Only +`epiphany-core` consumed it; the semantic Serde contracts now live in a plain +Core-owned module. Unused JsonSchema/TypeScript derives, `schemars`, `ts-rs`, +duplicate memory-graph re-exports, three stale WebSocket patch pins, and 99 +lockfile lines are gone. The commit removes 201 maintained lines net and one +package without changing serialized contracts or schema epochs. Core checks +without warnings; the deterministic keyed-Mind and repository-path proofs pass. +Whole-Core Clippy exposes 58 pre-existing lints outside this cut. Verification +generated 1.842 GB across 2,718 files; cleanup restored only the exact state +inspector. + Exact `a6cf9383` quarantines concrete Codex/OpenRouter authentication, credential reading, and network transport at the two release entrypoints that perform inference. `epiphany-openai-runtime` now owns only exact native-request @@ -1177,17 +1188,17 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action -The Ox17 deployment lane remains paused. Continue the standalone transport cut -from Epiphany `ed7357a2` and Connector -`54d8bc2525b7e7fa1b9dd26b95871247ff4c7566`: add one redacted provider-owned -CultMesh/Odin readiness projection, audit its dependency cost, then give the -Connector an independent Idunn target and install the frozen daemon on -Yggdrasil. Prove one Epiphany round trip with exact digest-bound receipt, -transcript-free decision audit, and governed tool continuation before asking -Ghostlight to adopt the same client ABI and delete its copied wire/deployment -authority. Preserve keyed Mind, direct Body-to-Modeling flow, consequence -receipts, and the complete Model Atlas vertical slice; no live inter-swarm -collaboration has run. +The Ox17 deployment lane remains paused. Continue subtraction from exact +`07529fb5`: remove the optional family request-ID mirrors on the generic worker +launch and their role-result echoes wherever the exact typed launch document or +structured decision already owns identity. Delete their validators, +constructor defaults, and fixture assertions rather than replacing them with a +registry. Then audit whether the generic runtime session aggregate protects any +invariant not already owned by jobs, decision contexts, coordinator receipts, +and retention tombstones. The Connector CultMesh/Idunn/Yggdrasil proof and +Ghostlight adoption remain queued behind source stabilization. Preserve keyed +Mind, direct Body-to-Modeling flow, consequence receipts, and the complete +Model Atlas vertical slice; no live inter-swarm collaboration has run. Yggdrasil previously exposed 96 GiB of dead native Cargo targets after interrupted full-workspace builds; exact cleanup returned the builder target diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 5068d1fca48f4dcf7b1b6e3335503992004e269e..2daa905506469d557afed771fdc44e16e0c1f909 100644 GIT binary patch delta 504 zcmXw#&x#X45XPPOXV>u}3L+v{;7w-Ri!fw{htcND!w8#HdQkMWl-7& zFvA9`{Hf+R>qr5;BOP66a&~3Y;M{~b0Z|tYrt2%TLq-vBOHj&ujg0ZTE*g{G+O z5uYKTk@3tvuIlgUt!~jBYzuh&uqU$JVgT#>XA8Aa=AO-oow>(Z)2v26(|i8_^)#>h delta 73 zcmcc8ptJjr_67+?ZUX}=6QihO3|xODHY+n0GBPGNPi1PK%ESo7AetG7S%8=oh}nRc Q9f&!Am~;D7Caz__0ddzCaR2}S diff --git a/state/map.yaml b/state/map.yaml index cf1980b4..1ea5ad17 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -43,6 +43,19 @@ invariants: - Evidence and git retain history; this map retains only state that changes future decisions. current_status: + semantic_state_package_cut: >- + Exact 07529fb5 deletes the epiphany-state-model package after proving + epiphany-core is its sole consumer. The ordinary Serde semantic contracts + move unchanged into one Core-owned module; unused JsonSchema and TypeScript + derives, schemars and ts-rs, duplicate memory-graph re-exports, three stale + WebSocket patch pins, and 99 lockfile lines disappear. The committed + structural delta is 201 net deletions and one fewer Cargo package. Core + checks without warnings; the deterministic keyed-Mind and repository-path + consequence proofs pass. Whole-Core Clippy remains blocked by 58 + pre-existing lints outside this cut. Verification generated 1.842 GB across + 2,718 files; cleanup restored only the exact 1,776,640-byte state inspector. + No schema epoch changes because serialized contracts did not change. Atlas + and live deployment remain untouched. decision_audit_cut: Exact f8412b69 adds a read-only context-ID audit projection over the sealed basis, decoded reasoning projection, exact terminal native/provider requests, governed tool observations, structured terminal records, and exact Mind commit receipts. Exact 5f66d6c9 adds deterministic read-only discovery of fully auditable terminal context IDs through the existing packaged model runtime; sealed but nonterminal contexts remain physiology and are omitted. Worker archive v1 retains the typed role and generic result family; runtime schema v2 refuses the prior digest-only writable archive shape. Yggdrasil CI then falsified five portable-test assumptions and accepted their source repairs through exact ebc0ffe4. Its sealed Linux package predates the operator-control-plane deletion and is now historical package evidence, not a deployable current release. provider_schema_cut: Exact 553f79d9 makes one OpenAI Responses dialect compiler own every role and Persona output schema. Provider-illegal conditional and parent-relative structure is removed, literal-only schemas receive explicit types, supported standard-model constraints remain generation guidance, and UUID formats lower to exact patterns. Full native decoding and family Mind admission remain final authority. Preserved packaged falsifications at 55fb4cf8, edd664db, and 1e01c339 prove refusal before inference, typed failure without Mind writes, successful concurrent Persona cognition, and transcript-free failure audit. repo_model_body_cut: Exact a8f3c1f0 makes the authenticated runtime Body route own initial keyed RepoModel binding. Bootstrap derives the digest from the admitted RepositoryBodyObservationBasis, initialization reauthenticates runtime, swarm, workspace, and Body binding before any write, and a hostile seed refuses with the whole store byte-identical. The exact 553f79d9 package exposed this root after concurrent Persona and terminal Modeling cognition; its result is not transplanted. Exact 79292fe3 makes one authenticated Repository Body snapshot load own runtime route, Body binding, historical observation, and manifest validation. Basis validation, Mind admission, Modeling projection, and manifest consumers no longer validate, reopen, and reconstruct the same head against a second store read. @@ -154,10 +167,10 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,300 physical lines, 50 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs carry only lifecycle identity/status; terminal result documents own summaries and artifacts. Generic session/job creation is gone; real family launch, model execution, and coordinator owners create runtime physiology. The embedded Codex build/auth authority is now absent. Continue splitting runtime authority only by deleting callerless or duplicate behavior; do not create family frameworks or adapters. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path remains an earned privilege boundary and its Yggdrasil issuer/crossing route still requires owning-lane repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Continue the standalone transport migration from exact Epiphany source ed7357a2 and CodexConnector 54d8bc2525b7e7fa1b9dd26b95871247ff4c7566. Add one redacted provider-owned CultMesh/Odin readiness projection without prompt, credential, account, replay, or decision cargo; audit its dependency/build cost before admission. Then give CodexConnector its independent Idunn target, install the frozen daemon on Yggdrasil, and prove an Epiphany connector round trip with transcript-free decision audit and governed tool continuation. Ghostlight must then adopt the same client ABI and delete its copied wire/deployment authority. Preserve one refresh writer, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live credential transfer, Ox root, or Model Atlas Gate run. + unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,301 physical lines, 50 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs carry only lifecycle identity/status; terminal result documents own summaries and artifacts. Generic session/job creation is gone; real family launch, model execution, and coordinator owners create runtime physiology. The generic worker launch still mirrors eight optional family request identities beside its exact typed launch document, and structured role results repeat several of the same family identities. Continue deleting those duplicate authorities before considering a split or abstraction. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path remains an earned privilege boundary and its Yggdrasil issuer/crossing route still requires owning-lane repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Continue source subtraction from exact 07529fb5. Audit the eight optional family request-ID mirrors on EpiphanyRuntimeWorkerLaunchRequest and their role-result echoes against the exact typed launch document and structured terminal decision. Derive family identity from its existing owner and delete each redundant field, validator branch, constructor default, and fixture assertion without adding a generic launch registry or compatibility reader. Then reassess whether the generic runtime session aggregate protects any invariant not already owned by jobs, decision contexts, coordinator receipts, and retention tombstones. Keep the standalone Connector readiness/Idunn/Yggdrasil/Ghostlight deployment sequence queued until the source body stabilizes. Preserve one refresh writer, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live credential transfer, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v38. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator opening are the only session/job creation owners. The spine is 9,300 physical lines with 50 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v38. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator opening are the only session/job creation owners. The spine is 9,301 physical lines with 50 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. diff --git a/state/scratch.md b/state/scratch.md index b3a51381..ed456925 100644 --- a/state/scratch.md +++ b/state/scratch.md @@ -211,13 +211,19 @@ and janitors may reduce the symptom but cannot substitute for deleting code. sealed document identity; current-work, admission, coordinator actuation, and archival now consume it directly. Runtime epoch is v17; 70 net source lines are gone. -38. Next: apply the same ownership test to Body Modeling, Planning, PlanMind, +38. Done: exact `07529fb5` collapses the single-consumer + `epiphany-state-model` package into a plain Core-owned module. Unused + JsonSchema/TypeScript derives, `schemars`, `ts-rs`, duplicate graph + re-exports, stale WebSocket patch pins, and 99 lockfile lines are gone. The + commit removes 201 maintained lines net and one Cargo package without a + schema-epoch change. +39. Next: apply the same ownership test to Body Modeling, Planning, PlanMind, Imagination consideration, and Reorientation launch bindings. Delete the family when the worker launch and typed request already own its facts; do not create generic launch authority. -39. Continue the public runtime-spine and test-liability audit by live owner +40. Continue the public runtime-spine and test-liability audit by live owner and consequential invariant. Do not subtract the unrun Atlas vertical slice; no inter-swarm collaboration has yet been exercised. Streamline it only around its one end-to-end authority map. -40. Run focused tests after each cut. Only after source subtraction stabilizes +41. Run focused tests after each cut. Only after source subtraction stabilizes should Idunn's build scratch contract be reconsidered. From edb5c3a3c3785b73e6e107835eec64507f62db6b Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 19:37:44 +0200 Subject: [PATCH 083/340] Derive worker authority from sealed launches --- epiphany-core/src/current_work.rs | 622 +++++------- epiphany-core/src/reasoning_context.rs | 18 - epiphany-core/src/reorientation_work.rs | 18 - epiphany-core/src/resident_self.rs | 11 +- epiphany-core/src/runtime_spine.rs | 908 ++++++++---------- epiphany-core/src/runtime_worker_attempt.rs | 95 +- epiphany-core/src/surfaces/mod.rs | 2 + epiphany-core/src/surfaces/role_result.rs | 6 - epiphany-core/src/surfaces/worker_launch.rs | 21 +- .../src/bin/epiphany-openai-runtime.rs | 48 +- epiphany-openai-runtime/src/lib.rs | 192 +--- 11 files changed, 749 insertions(+), 1192 deletions(-) diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index 8f3d637a..14ba5d0e 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -345,18 +345,93 @@ pub(crate) fn register_current_work_types(cache: &mut CultCache) -> Result<()> { Ok(()) } +fn role_launch_document( + launch: &crate::EpiphanyRuntimeWorkerLaunchRequest, +) -> Result { + match launch.launch_document()? { + crate::EpiphanyWorkerLaunchDocument::Role(document) => Ok(document), + crate::EpiphanyWorkerLaunchDocument::Reorient(_) => { + Err(anyhow!("typed role work carried reorientation authority")) + } + } +} + +fn launch_matches_typed_request( + launch: &crate::EpiphanyRuntimeWorkerLaunchRequest, + request: crate::RuntimeTypedRequestRef<'_>, +) -> Result { + request.matches_launch(launch) +} + +fn typed_request_launches<'a>( + launches: &'a [crate::EpiphanyRuntimeWorkerLaunchRequest], + request: crate::RuntimeTypedRequestRef<'_>, +) -> Result> { + launches + .iter() + .map(|launch| Ok(launch_matches_typed_request(launch, request)?.then_some(launch))) + .filter_map(Result::transpose) + .collect() +} + +fn launch_matches_frontier_planning_request( + launch: &crate::EpiphanyRuntimeWorkerLaunchRequest, + request_id: &str, +) -> Result { + Ok(role_launch_document(launch)? + .frontier_planning_context + .is_some_and(|context| context.request_id == request_id)) +} + +fn launch_matches_frontier_plan_mind_request( + launch: &crate::EpiphanyRuntimeWorkerLaunchRequest, + request_id: &str, +) -> Result { + Ok(role_launch_document(launch)? + .frontier_plan_mind_context + .is_some_and(|context| context.request.request_id == request_id)) +} + +fn frontier_planning_launches<'a>( + launches: &'a [crate::EpiphanyRuntimeWorkerLaunchRequest], + request_id: &str, +) -> Result> { + launches + .iter() + .map(|launch| { + Ok(launch_matches_frontier_planning_request(launch, request_id)?.then_some(launch)) + }) + .filter_map(Result::transpose) + .collect() +} + +fn frontier_plan_mind_launches<'a>( + launches: &'a [crate::EpiphanyRuntimeWorkerLaunchRequest], + request_id: &str, +) -> Result> { + launches + .iter() + .map(|launch| { + Ok(launch_matches_frontier_plan_mind_request(launch, request_id)?.then_some(launch)) + }) + .filter_map(Result::transpose) + .collect() +} + pub(crate) fn body_modeling_decision_envelope( store_path: &Path, result: &crate::EpiphanyRuntimeRoleWorkerResult, disposition: &str, decided_at: &str, ) -> Result { - let body_basis = result - .repository_body_observation_basis - .clone() - .ok_or_else(|| anyhow!("Body Modeling result has no Body observation basis"))?; let mut cache = crate::runtime_spine_cache(store_path)?; cache.pull_all_backing_stores()?; + let launch = cache + .get::(&result.job_id)? + .ok_or_else(|| anyhow!("Body Modeling result lost its immutable launch"))?; + let body_basis = launch + .repository_body_observation_basis()? + .ok_or_else(|| anyhow!("Body Modeling result has no Body observation basis"))?; let context = cache .get::(&result.decision_context_id)? .ok_or_else(|| anyhow!("Body Modeling result has no decision context"))?; @@ -504,19 +579,18 @@ fn current_imagination_consideration_work( continue; } crate::validate_current_imagination_consideration_request(cache, &request)?; - let mut job_ids = launches - .iter() - .filter(|launch| { - launch.imagination_consideration_request_id.as_deref() - == Some(request.request_id.as_str()) - }) - .map(|launch| { - Ok(( - consideration_attempt_ordinal(&request.request_id, &launch.job_id)?, - launch.job_id.clone(), - )) - }) - .collect::>>()?; + let mut job_ids = typed_request_launches( + &launches, + crate::RuntimeTypedRequestRef::ImaginationConsideration(&request.request_id), + )? + .into_iter() + .map(|launch| { + Ok(( + consideration_attempt_ordinal(&request.request_id, &launch.job_id)?, + launch.job_id.clone(), + )) + }) + .collect::>>()?; job_ids.sort_by_key(|(ordinal, _)| *ordinal); for (expected, (ordinal, _)) in job_ids.iter().enumerate() { if *ordinal != expected { @@ -554,21 +628,18 @@ fn current_admitted_model_direction_consideration_work( continue; } crate::validate_current_admitted_model_direction_consideration_request(cache, &request)?; - let mut job_ids = launches - .iter() - .filter(|launch| { - launch - .admitted_model_direction_consideration_request_id - .as_deref() - == Some(request.request_id.as_str()) - }) - .map(|launch| { - Ok(( - consideration_attempt_ordinal(&request.request_id, &launch.job_id)?, - launch.job_id.clone(), - )) - }) - .collect::>>()?; + let mut job_ids = typed_request_launches( + &launches, + crate::RuntimeTypedRequestRef::AdmittedModelDirection(&request.request_id), + )? + .into_iter() + .map(|launch| { + Ok(( + consideration_attempt_ordinal(&request.request_id, &launch.job_id)?, + launch.job_id.clone(), + )) + }) + .collect::>>()?; job_ids.sort_by_key(|(ordinal, _)| *ordinal); let job_ids = job_ids .into_iter() @@ -601,19 +672,18 @@ fn current_verification_work( let admission_refusals = cache.get_all::()?; for request in requests { crate::runtime_spine::validate_repo_frontier_verification_request_intrinsic(&request)?; - let mut request_launches = launches - .iter() - .filter(|launch| { - launch.repo_frontier_verification_request_id.as_deref() - == Some(request.request_id.as_str()) - }) - .map(|launch| { - Ok(( - verification_attempt_ordinal(&request.request_id, &launch.job_id)?, - launch, - )) - }) - .collect::>>()?; + let mut request_launches = typed_request_launches( + &launches, + crate::RuntimeTypedRequestRef::FrontierVerification(&request.request_id), + )? + .into_iter() + .map(|launch| { + Ok(( + verification_attempt_ordinal(&request.request_id, &launch.job_id)?, + launch, + )) + }) + .collect::>>()?; request_launches.sort_by_key(|(ordinal, _)| *ordinal); if let Some((_, launch)) = request_launches.last() && let Some(result) = @@ -640,14 +710,6 @@ fn current_verification_work( continue; }; let result = cache.get::(&launch.job_id)?; - if let Some(result) = result.as_ref() - && (result.verification_request_id.as_deref() != Some(request.request_id.as_str()) - || result.frontier_route_id.as_deref() != Some(request.route_id.as_str())) - { - return Err(anyhow!( - "frontier Verification result crossed request authority" - )); - } let job = cache .get::(&launch.job_id)? .ok_or_else(|| anyhow!("frontier Verification launch lost its runtime job"))?; @@ -699,19 +761,18 @@ fn current_frontier_verdict_modeling_work( let receipts = cache.get_all::()?; let admission_refusals = cache.get_all::()?; for request in requests { - let mut request_launches = launches - .iter() - .filter(|launch| { - launch.repo_frontier_modeling_request_id.as_deref() - == Some(request.request_id.as_str()) - }) - .map(|launch| { - Ok(( - frontier_verdict_attempt_ordinal(&request.request_id, &launch.job_id)?, - launch, - )) - }) - .collect::>>()?; + let mut request_launches = typed_request_launches( + &launches, + crate::RuntimeTypedRequestRef::FrontierVerdictModeling(&request.request_id), + )? + .into_iter() + .map(|launch| { + Ok(( + frontier_verdict_attempt_ordinal(&request.request_id, &launch.job_id)?, + launch, + )) + }) + .collect::>>()?; request_launches.sort_by_key(|(ordinal, _)| *ordinal); if let Some((_, launch)) = request_launches.last() && let Some(result) = @@ -736,14 +797,6 @@ fn current_frontier_verdict_modeling_work( })); }; let result = cache.get::(&launch.job_id)?; - if let Some(result) = result.as_ref() - && result.repo_frontier_modeling_request_id.as_deref() - != Some(request.request_id.as_str()) - { - return Err(anyhow!( - "frontier verdict Modeling result crossed request authority" - )); - } let job = cache .get::(&launch.job_id)? .ok_or_else(|| anyhow!("frontier verdict Modeling launch lost its runtime job"))?; @@ -804,16 +857,7 @@ fn body_modeling_launches( || document.thread_id() != launch.job_id || role.role_id != "modeling" || role.repository_body_observation_basis.as_ref() != Some(&work.body_basis) - || launch.proposal_modeling_request_id.is_some() - || launch.repo_frontier_modeling_request_id.is_some() - || launch.frontier_planning_request_id.is_some() - || launch.frontier_plan_mind_request_id.is_some() - || launch.imagination_consideration_request_id.is_some() - || launch - .admitted_model_direction_consideration_request_id - .is_some() - || launch.repo_frontier_research_request_id.is_some() - || launch.repo_frontier_verification_request_id.is_some() + || role.family_context_count() != 0 { return Err(anyhow!( "Body Modeling immutable launch crossed family authority" @@ -886,18 +930,18 @@ fn current_proposal_modeling_work( let admission_refusals = cache.get_all::()?; 'requests: for request in requests { crate::runtime_spine::validate_repo_frontier_proposal_modeling_request(&request)?; - let mut request_launches = launches - .iter() - .filter(|launch| { - launch.proposal_modeling_request_id.as_deref() == Some(request.request_id.as_str()) - }) - .map(|launch| { - Ok(( - proposal_modeling_attempt_ordinal(&request.request_id, &launch.job_id)?, - launch, - )) - }) - .collect::>>()?; + let mut request_launches = typed_request_launches( + &launches, + crate::RuntimeTypedRequestRef::ProposalModeling(&request.request_id), + )? + .into_iter() + .map(|launch| { + Ok(( + proposal_modeling_attempt_ordinal(&request.request_id, &launch.job_id)?, + launch, + )) + }) + .collect::>>()?; request_launches.sort_by_key(|(ordinal, _)| *ordinal); for (expected, (ordinal, _)) in request_launches.iter().enumerate() { if *ordinal != expected { @@ -920,13 +964,6 @@ fn current_proposal_modeling_work( for (ordinal, launch) in &request_launches { let result = cache.get::(&launch.job_id)?; if let Some(result) = result.as_ref() { - if result.proposal_modeling_request_id.as_deref() - != Some(request.request_id.as_str()) - { - return Err(anyhow!( - "proposal Modeling launch result crossed request authority" - )); - } if receipts.iter().any(|receipt| { receipt.invariant_owner == "Modeling.proposal_frontier" && matches!( @@ -1099,12 +1136,10 @@ pub fn launch_current_frontier_planning_work( let identity = cache .get::(crate::RUNTIME_IDENTITY_KEY)? .ok_or_else(|| anyhow!("frontier Planning launch requires runtime identity"))?; - let mut prior = cache - .get_all::()? + let launches = cache.get_all::()?; + let mut prior = frontier_planning_launches(&launches, &request.request_id)? .into_iter() - .filter(|launch| { - launch.frontier_planning_request_id.as_deref() == Some(request.request_id.as_str()) - }) + .cloned() .map(|launch| { Ok(( frontier_planning_attempt_ordinal(&request.request_id, &launch.job_id)?, @@ -1175,14 +1210,6 @@ pub fn launch_current_frontier_planning_work( instruction: "Act as Epiphany Imagination. Propose one bounded candidate for only the exact typed frontier and return the dedicated planning candidate contract.".into(), launch_document, output_contract_id: output_contract_id.clone(), - proposal_modeling_request_id: None, - frontier_planning_request_id: Some(request.request_id.clone()), - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, created_at: created_at.into(), }, )?; @@ -1270,12 +1297,10 @@ pub fn launch_current_frontier_plan_mind_work( let identity = cache .get::(crate::RUNTIME_IDENTITY_KEY)? .ok_or_else(|| anyhow!("frontier plan Mind launch requires runtime identity"))?; - let mut prior = cache - .get_all::()? + let launches = cache.get_all::()?; + let mut prior = frontier_plan_mind_launches(&launches, &request.request_id)? .into_iter() - .filter(|launch| { - launch.frontier_plan_mind_request_id.as_deref() == Some(request.request_id.as_str()) - }) + .cloned() .map(|launch| { Ok(( frontier_plan_mind_attempt_ordinal(&request.request_id, &launch.job_id)?, @@ -1346,14 +1371,6 @@ pub fn launch_current_frontier_plan_mind_work( instruction: "Act as Epiphany Mind. Adopt, refuse, or hold only the exact typed candidate and return the dedicated plan decision contract.".into(), launch_document, output_contract_id: output_contract_id.clone(), - proposal_modeling_request_id: None, - frontier_planning_request_id: None, - frontier_plan_mind_request_id: Some(request.request_id.clone()), - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, created_at: created_at.into(), }, )?; @@ -1446,14 +1463,12 @@ pub fn launch_current_frontier_verification_work( let identity = cache .get::(crate::RUNTIME_IDENTITY_KEY)? .ok_or_else(|| anyhow!("frontier Verification launch requires runtime identity"))?; - let attempt_ordinal = cache - .get_all::()? - .into_iter() - .filter(|launch| { - launch.repo_frontier_verification_request_id.as_deref() - == Some(request.request_id.as_str()) - }) - .count() + let launches = cache.get_all::()?; + let attempt_ordinal = typed_request_launches( + &launches, + crate::RuntimeTypedRequestRef::FrontierVerification(&request.request_id), + )? + .len() + cache .get_all::()? .into_iter() @@ -1499,14 +1514,6 @@ pub fn launch_current_frontier_verification_work( instruction: "Act as Epiphany Verification. Audit only the exact typed Hands consequence and route carried by this request; return a structured verdict, evidence ids, and risks.".into(), launch_document, output_contract_id: output_contract_id.clone(), - proposal_modeling_request_id: None, - frontier_planning_request_id: None, - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: Some(request.request_id.clone()), created_at: created_at.to_string(), }, )?; @@ -1606,13 +1613,12 @@ pub fn launch_current_frontier_research_work( let identity = cache .get::(crate::RUNTIME_IDENTITY_KEY)? .ok_or_else(|| anyhow!("frontier Research launch requires runtime identity"))?; - let attempt_ordinal = cache - .get_all::()? - .into_iter() - .filter(|launch| { - launch.repo_frontier_research_request_id.as_deref() == Some(request.request_id.as_str()) - }) - .count() + let launches = cache.get_all::()?; + let attempt_ordinal = typed_request_launches( + &launches, + crate::RuntimeTypedRequestRef::FrontierResearch(&request.request_id), + )? + .len() + cache .get_all::()? .into_iter() @@ -1658,14 +1664,6 @@ pub fn launch_current_frontier_research_work( instruction: "Act as Epiphany Research. Gather only the evidence required by the exact frontier request and return keyed evidence and observations for Mind review.".into(), launch_document, output_contract_id: output_contract_id.clone(), - proposal_modeling_request_id: None, - frontier_planning_request_id: None, - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: Some(request.request_id.clone()), - repo_frontier_verification_request_id: None, created_at: created_at.to_string(), }, )?; @@ -1732,23 +1730,24 @@ pub fn accept_frontier_research_result( } if let Some(receipt) = receipts.pop() { receipt.validate()?; - let request_id = result - .repo_frontier_research_request_id - .as_deref() - .ok_or_else(|| anyhow!("frontier Research replay lost its request identity"))?; - if !receipt.strong_reads.iter().any(|read| { - read.document_type == crate::RepoFrontierResearchRequest::TYPE - && read.document_key == request_id - }) || !receipt.strong_reads.iter().any(|read| { - read.document_type == crate::EpiphanyRuntimeRoleWorkerResult::TYPE - && read.document_key == job_id - }) || !receipt.writes.iter().any(|write| { - matches!( - write.document_type.as_str(), - crate::EpiphanyMindEvidenceDocument::TYPE - | crate::EpiphanyMindObservationDocument::TYPE - ) - }) { + if receipt + .strong_reads + .iter() + .filter(|read| read.document_type == crate::RepoFrontierResearchRequest::TYPE) + .count() + != 1 + || !receipt.strong_reads.iter().any(|read| { + read.document_type == crate::EpiphanyRuntimeRoleWorkerResult::TYPE + && read.document_key == job_id + }) + || !receipt.writes.iter().any(|write| { + matches!( + write.document_type.as_str(), + crate::EpiphanyMindEvidenceDocument::TYPE + | crate::EpiphanyMindObservationDocument::TYPE + ) + }) + { return Err(anyhow!( "frontier Research replay does not preserve its exact accepted decision" )); @@ -1785,10 +1784,7 @@ pub fn accept_frontier_research_result( let result = cache .get::(job_id)? .ok_or_else(|| anyhow!("frontier Research acceptance lost its typed result"))?; - if !result.role_id.eq_ignore_ascii_case("research") - || result.repo_frontier_research_request_id.as_deref() != Some(request.request_id.as_str()) - || result.item_error.is_some() - { + if !result.role_id.eq_ignore_ascii_case("research") || result.item_error.is_some() { return Err(anyhow!("frontier Research result crossed family authority")); } let decision = result @@ -1985,11 +1981,7 @@ pub fn accept_frontier_verification_result( let result = cache .get::(job_id)? .ok_or_else(|| anyhow!("frontier Verification acceptance lost its typed result"))?; - if !result.role_id.eq_ignore_ascii_case("verification") - || result.verification_request_id.as_deref() != Some(request.request_id.as_str()) - || result.frontier_route_id.as_deref() != Some(request.route_id.as_str()) - || result.item_error.is_some() - { + if !result.role_id.eq_ignore_ascii_case("verification") || result.item_error.is_some() { return Err(anyhow!( "frontier Verification result crossed request authority" )); @@ -2161,13 +2153,14 @@ pub fn accept_body_modeling_result( let result = cache .get::(job_id)? .ok_or_else(|| anyhow!("Body Modeling acceptance lost its typed result"))?; - if result.role_id != "modeling" - || result.proposal_modeling_request_id.is_some() - || result.repo_frontier_modeling_request_id.is_some() - { + let launch = cache + .get::(job_id)? + .ok_or_else(|| anyhow!("Body Modeling acceptance lost its immutable launch"))?; + let role_launch = role_launch_document(&launch)?; + if result.role_id != "modeling" || role_launch.family_context_count() != 0 { return Err(anyhow!("result is not baseline Body Modeling authority")); } - let body_basis = result + let body_basis = role_launch .repository_body_observation_basis .clone() .ok_or_else(|| anyhow!("Body Modeling result has no Body observation basis"))?; @@ -2273,13 +2266,16 @@ pub fn accept_proposal_modeling_result( let result = cache .get::(job_id)? .ok_or_else(|| anyhow!("proposal Modeling acceptance lost its typed result"))?; - let request_id = result - .proposal_modeling_request_id - .as_deref() + let launch = cache + .get::(job_id)? + .ok_or_else(|| anyhow!("proposal Modeling acceptance lost its immutable launch"))?; + let role_launch = role_launch_document(&launch)?; + let request_id = role_launch + .proposal_modeling_context + .as_ref() + .map(|context| context.request_id.as_str()) .ok_or_else(|| anyhow!("result is not proposal Modeling authority"))?; - if !result.role_id.eq_ignore_ascii_case("modeling") - || result.repo_frontier_modeling_request_id.is_some() - { + if !result.role_id.eq_ignore_ascii_case("modeling") || role_launch.family_context_count() != 1 { return Err(anyhow!("proposal Modeling result crossed family authority")); } let evidence = crate::runtime_typed_request_fulfillment( @@ -2474,9 +2470,14 @@ pub fn accept_frontier_verdict_modeling_result( let result = cache .get::(job_id)? .ok_or_else(|| anyhow!("frontier verdict Modeling acceptance lost its typed result"))?; - let request_id = result - .repo_frontier_modeling_request_id - .as_deref() + let launch = cache + .get::(job_id)? + .ok_or_else(|| anyhow!("frontier verdict Modeling acceptance lost its immutable launch"))?; + let role_launch = role_launch_document(&launch)?; + let request_id = role_launch + .frontier_verdict_modeling_context + .as_ref() + .map(|context| context.request.request_id.as_str()) .ok_or_else(|| anyhow!("result is not frontier verdict Modeling authority"))?; let current = match current_frontier_verdict_modeling_work(&cache) { Ok(Some(work)) @@ -2505,7 +2506,7 @@ pub fn accept_frontier_verdict_modeling_result( }; if !result.role_id.eq_ignore_ascii_case("modeling") || request_id != current.request.request_id - || result.proposal_modeling_request_id.is_some() + || role_launch.family_context_count() != 1 { return Err(anyhow!( "frontier verdict Modeling result crossed family authority" @@ -2683,19 +2684,15 @@ fn launch_consideration_work( let model = crate::repo_model_documents::assemble_repo_model_view_from_cache(&cache)?; let request_id = launch.request_id().to_string(); let is_feedback = matches!(launch, ConsiderationLaunch::PersonaFeedback(_)); - let mut prior_launches = cache - .get_all::()? + let launches = cache.get_all::()?; + let request_ref = if is_feedback { + crate::RuntimeTypedRequestRef::ImaginationConsideration(&request_id) + } else { + crate::RuntimeTypedRequestRef::AdmittedModelDirection(&request_id) + }; + let mut prior_launches = typed_request_launches(&launches, request_ref)? .into_iter() - .filter(|worker| { - if is_feedback { - worker.imagination_consideration_request_id.as_deref() == Some(request_id.as_str()) - } else { - worker - .admitted_model_direction_consideration_request_id - .as_deref() - == Some(request_id.as_str()) - } - }) + .cloned() .map(|worker| { Ok(( consideration_attempt_ordinal(&request_id, &worker.job_id)?, @@ -2789,15 +2786,6 @@ fn launch_consideration_work( instruction: "Act as Epiphany Imagination for one exact proposal-only typed consideration pass and return only its dedicated terminal contract.".into(), launch_document, output_contract_id: output_contract_id.clone(), - proposal_modeling_request_id: None, - frontier_planning_request_id: None, - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: is_feedback.then_some(request_id.clone()), - admitted_model_direction_consideration_request_id: (!is_feedback) - .then_some(request_id.clone()), - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, created_at: created_at.into(), }, )?; @@ -2958,14 +2946,6 @@ pub fn launch_current_body_modeling_work( instruction: instruction.clone(), launch_document: launch_document.clone(), output_contract_id: output_contract_id.clone(), - proposal_modeling_request_id: None, - frontier_planning_request_id: None, - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, created_at: created_at.into(), }, )?; @@ -3080,13 +3060,12 @@ pub fn launch_current_proposal_modeling_work( .repo_model .as_ref() .ok_or_else(|| anyhow!("proposal Modeling launch requires keyed RepoModel state"))?; - let attempt_ordinal = cache - .get_all::()? - .into_iter() - .filter(|launch| { - launch.proposal_modeling_request_id.as_deref() == Some(request.request_id.as_str()) - }) - .count() + let launches = cache.get_all::()?; + let attempt_ordinal = typed_request_launches( + &launches, + crate::RuntimeTypedRequestRef::ProposalModeling(&request.request_id), + )? + .len() + cache .get_all::()? .into_iter() @@ -3140,14 +3119,6 @@ pub fn launch_current_proposal_modeling_work( instruction: "Act as Epiphany Modeling. Evaluate the exact admitted proposal against the sealed keyed Mind projection and return only the proposal Modeling result contract.".into(), launch_document, output_contract_id: output_contract_id.clone(), - proposal_modeling_request_id: Some(request.request_id.clone()), - frontier_planning_request_id: None, - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, created_at: options.created_at.clone(), }, )?; @@ -3225,17 +3196,17 @@ pub fn launch_current_frontier_verdict_modeling_work( let identity = cache .get::(crate::RUNTIME_IDENTITY_KEY)? .ok_or_else(|| anyhow!("frontier verdict Modeling launch requires runtime identity"))?; - let attempt_ordinal = cache - .get_all::()? - .into_iter() - .filter(|launch| { - launch.repo_frontier_modeling_request_id.as_deref() == Some(request.request_id.as_str()) - }) - .map(|launch| frontier_verdict_attempt_ordinal(&request.request_id, &launch.job_id)) - .collect::>>()? - .into_iter() - .max() - .map_or(0, |ordinal| ordinal + 1); + let launches = cache.get_all::()?; + let attempt_ordinal = typed_request_launches( + &launches, + crate::RuntimeTypedRequestRef::FrontierVerdictModeling(&request.request_id), + )? + .into_iter() + .map(|launch| frontier_verdict_attempt_ordinal(&request.request_id, &launch.job_id)) + .collect::>>()? + .into_iter() + .max() + .map_or(0, |ordinal| ordinal + 1); let job_id = format!( "frontier-verdict-modeling-{}-attempt-{attempt_ordinal}", request.request_id @@ -3278,14 +3249,6 @@ pub fn launch_current_frontier_verdict_modeling_work( instruction: "Act as Epiphany Modeling. Incorporate the exact typed Soul verdict into only its routed frontier item and return the frontier-verdict result contract.".into(), launch_document, output_contract_id: output_contract_id.clone(), - proposal_modeling_request_id: None, - frontier_planning_request_id: None, - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: Some(request.request_id.clone()), - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, created_at: created_at.to_string(), }, )?; @@ -3875,19 +3838,9 @@ mod tests { item_error: None, metadata: Default::default(), repo_model_mutation_proposal_msgpack: None, - verification_request_id: None, - frontier_route_id: None, - repo_frontier_modeling_request_id: None, - proposal_modeling_request_id: None, - repo_frontier_research_request_id: None, - frontier_planning_request_id: None, frontier_plan_candidate_msgpack: None, - frontier_plan_mind_request_id: None, frontier_plan_mind_decision_msgpack: None, - repository_body_observation_basis: Some(body.clone()), - imagination_consideration_request_id: None, imagination_consideration_candidate_msgpack: None, - admitted_model_direction_consideration_request_id: None, admitted_model_direction_consideration_result_msgpack: None, decision_context_id: context.context_id, }; @@ -4009,21 +3962,9 @@ mod tests { item_error: None, metadata: Default::default(), repo_model_mutation_proposal_msgpack: None, - verification_request_id: None, - frontier_route_id: None, - repo_frontier_modeling_request_id: None, - proposal_modeling_request_id: None, - repo_frontier_research_request_id: None, - frontier_planning_request_id: None, frontier_plan_candidate_msgpack: None, - frontier_plan_mind_request_id: None, frontier_plan_mind_decision_msgpack: None, - repository_body_observation_basis: None, - imagination_consideration_request_id: None, imagination_consideration_candidate_msgpack: None, - admitted_model_direction_consideration_request_id: Some( - direction_request.request_id.clone(), - ), admitted_model_direction_consideration_result_msgpack: Some(rmp_serde::to_vec_named( &direction_result, )?), @@ -4181,10 +4122,13 @@ mod tests { final_cache .get_all::()? .into_iter() - .filter(|launch| { - launch.proposal_modeling_request_id.as_deref() - == Some(request.request_id.as_str()) - }) + .map( + |launch| crate::RuntimeTypedRequestRef::ProposalModeling(&request.request_id) + .matches_launch(&launch) + ) + .collect::>>()? + .into_iter() + .filter(|matches| *matches) .count(), 2 ); @@ -4269,19 +4213,9 @@ mod tests { item_error: None, metadata: Default::default(), repo_model_mutation_proposal_msgpack: Some(rmp_serde::to_vec_named(&mutation)?), - verification_request_id: None, - frontier_route_id: None, - repo_frontier_modeling_request_id: None, - proposal_modeling_request_id: Some(request.request_id.clone()), - repo_frontier_research_request_id: None, - frontier_planning_request_id: None, frontier_plan_candidate_msgpack: None, - frontier_plan_mind_request_id: None, frontier_plan_mind_decision_msgpack: None, - repository_body_observation_basis: Some(body.clone()), - imagination_consideration_request_id: None, imagination_consideration_candidate_msgpack: None, - admitted_model_direction_consideration_request_id: None, admitted_model_direction_consideration_result_msgpack: None, decision_context_id: proposal_context.context_id.clone(), }; @@ -4714,12 +4648,6 @@ mod tests { let verification_launch = accepted_cache .get::(&verification_job_id)? .expect("exact Verification launch"); - assert_eq!( - verification_launch - .repo_frontier_verification_request_id - .as_deref(), - Some(verification_request.request_id.as_str()) - ); let crate::EpiphanyWorkerLaunchDocument::Role(verification_document) = verification_launch.launch_document()? else { @@ -4808,19 +4736,9 @@ mod tests { item_error: None, metadata: Default::default(), repo_model_mutation_proposal_msgpack: None, - verification_request_id: Some(verification_request.request_id.clone()), - frontier_route_id: Some(route.route_id.clone()), - repo_frontier_modeling_request_id: None, - proposal_modeling_request_id: None, - repo_frontier_research_request_id: None, - frontier_planning_request_id: None, frontier_plan_candidate_msgpack: None, - frontier_plan_mind_request_id: None, frontier_plan_mind_decision_msgpack: None, - repository_body_observation_basis: None, - imagination_consideration_request_id: None, imagination_consideration_candidate_msgpack: None, - admitted_model_direction_consideration_request_id: None, admitted_model_direction_consideration_result_msgpack: None, decision_context_id: verification_context.context_id.clone(), }; @@ -5153,19 +5071,9 @@ mod tests { item_error: None, metadata: Default::default(), repo_model_mutation_proposal_msgpack: Some(rmp_serde::to_vec_named(&verdict_mutation)?), - verification_request_id: None, - frontier_route_id: None, - repo_frontier_modeling_request_id: Some(verdict_request.request_id.clone()), - proposal_modeling_request_id: None, - repo_frontier_research_request_id: None, - frontier_planning_request_id: None, frontier_plan_candidate_msgpack: None, - frontier_plan_mind_request_id: None, frontier_plan_mind_decision_msgpack: None, - repository_body_observation_basis: Some(body.clone()), - imagination_consideration_request_id: None, imagination_consideration_candidate_msgpack: None, - admitted_model_direction_consideration_request_id: None, admitted_model_direction_consideration_result_msgpack: None, decision_context_id: verdict_context.context_id.clone(), }; @@ -5407,8 +5315,16 @@ mod tests { let planning_launch = planning_cache .get::(&planning_job)? .expect("exact Planning launch"); + let crate::EpiphanyWorkerLaunchDocument::Role(planning_document) = + planning_launch.launch_document()? + else { + panic!("Planning must launch as a role pass") + }; assert_eq!( - planning_launch.frontier_planning_request_id.as_deref(), + planning_document + .frontier_planning_context + .as_ref() + .map(|context| context.request_id.as_str()), Some(planning_request.request_id.as_str()) ); let planning_basis = crate::worker_reasoning_basis(&store, &planning_launch)?; @@ -5482,19 +5398,9 @@ mod tests { item_error: None, metadata: Default::default(), repo_model_mutation_proposal_msgpack: None, - verification_request_id: None, - frontier_route_id: None, - repo_frontier_modeling_request_id: None, - proposal_modeling_request_id: None, - repo_frontier_research_request_id: None, - frontier_planning_request_id: Some(planning_request.request_id.clone()), frontier_plan_candidate_msgpack: Some(rmp_serde::to_vec_named(&candidate)?), - frontier_plan_mind_request_id: None, frontier_plan_mind_decision_msgpack: None, - repository_body_observation_basis: None, - imagination_consideration_request_id: None, imagination_consideration_candidate_msgpack: None, - admitted_model_direction_consideration_request_id: None, admitted_model_direction_consideration_result_msgpack: None, decision_context_id: planning_context.context_id.clone(), }; @@ -5544,8 +5450,16 @@ mod tests { let mind_launch = planning_cache .get::(&mind_job)? .expect("exact plan Mind launch"); + let crate::EpiphanyWorkerLaunchDocument::Role(mind_document) = + mind_launch.launch_document()? + else { + panic!("plan Mind must launch as a role pass") + }; assert_eq!( - mind_launch.frontier_plan_mind_request_id.as_deref(), + mind_document + .frontier_plan_mind_context + .as_ref() + .map(|context| context.request.request_id.as_str()), Some(mind_request.request_id.as_str()) ); let mind_basis = crate::worker_reasoning_basis(&store, &mind_launch)?; @@ -5612,19 +5526,9 @@ mod tests { item_error: None, metadata: Default::default(), repo_model_mutation_proposal_msgpack: None, - verification_request_id: None, - frontier_route_id: None, - repo_frontier_modeling_request_id: None, - proposal_modeling_request_id: None, - repo_frontier_research_request_id: None, - frontier_planning_request_id: None, frontier_plan_candidate_msgpack: None, - frontier_plan_mind_request_id: Some(mind_request.request_id.clone()), frontier_plan_mind_decision_msgpack: Some(rmp_serde::to_vec_named(&mind_decision)?), - repository_body_observation_basis: None, - imagination_consideration_request_id: None, imagination_consideration_candidate_msgpack: None, - admitted_model_direction_consideration_request_id: None, admitted_model_direction_consideration_result_msgpack: None, decision_context_id: mind_context.context_id.clone(), }; @@ -5760,13 +5664,11 @@ mod tests { let research_launch = research_cache .get::(&research_job)? .expect("exact Research launch"); - let research_request_id = research_launch - .repo_frontier_research_request_id - .clone() - .expect("exact Research request identity"); - let research_request = research_cache - .get::(&research_request_id)? - .expect("exact Research request"); + let research_request = crate::runtime_spine::frontier_research_request_for_launch( + &research_cache, + &research_launch, + )? + .expect("exact Research request"); assert_eq!(research_request.frontier_item_id, eyes_frontier.id); assert!( research_request.frontier_authority_documents.len() @@ -5838,19 +5740,9 @@ mod tests { item_error: None, metadata: Default::default(), repo_model_mutation_proposal_msgpack: None, - verification_request_id: None, - frontier_route_id: None, - repo_frontier_modeling_request_id: None, - proposal_modeling_request_id: None, - repo_frontier_research_request_id: Some(research_request_id.clone()), - frontier_planning_request_id: None, frontier_plan_candidate_msgpack: None, - frontier_plan_mind_request_id: None, frontier_plan_mind_decision_msgpack: None, - repository_body_observation_basis: None, - imagination_consideration_request_id: None, imagination_consideration_candidate_msgpack: None, - admitted_model_direction_consideration_request_id: None, admitted_model_direction_consideration_result_msgpack: None, decision_context_id: research_context.context_id.clone(), }; diff --git a/epiphany-core/src/reasoning_context.rs b/epiphany-core/src/reasoning_context.rs index 51a2ea4c..de65eef3 100644 --- a/epiphany-core/src/reasoning_context.rs +++ b/epiphany-core/src/reasoning_context.rs @@ -1952,14 +1952,6 @@ mod tests { document_kind: "role".into(), launch_document_msgpack: rmp_serde::to_vec_named(&document)?, metadata: Default::default(), - proposal_modeling_request_id: None, - frontier_planning_request_id: None, - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, }) } @@ -2455,19 +2447,9 @@ mod tests { item_error: Some(failure_summary.clone()), metadata: std::collections::BTreeMap::new(), repo_model_mutation_proposal_msgpack: None, - verification_request_id: None, - frontier_route_id: None, - repo_frontier_modeling_request_id: None, - proposal_modeling_request_id: None, - repo_frontier_research_request_id: None, - frontier_planning_request_id: None, frontier_plan_candidate_msgpack: None, - frontier_plan_mind_request_id: None, frontier_plan_mind_decision_msgpack: None, - repository_body_observation_basis: None, - imagination_consideration_request_id: None, imagination_consideration_candidate_msgpack: None, - admitted_model_direction_consideration_request_id: None, admitted_model_direction_consideration_result_msgpack: None, decision_context_id: context.context_id.clone(), }; diff --git a/epiphany-core/src/reorientation_work.rs b/epiphany-core/src/reorientation_work.rs index 2e7a80bc..5cc2d3dd 100644 --- a/epiphany-core/src/reorientation_work.rs +++ b/epiphany-core/src/reorientation_work.rs @@ -211,16 +211,6 @@ fn reorientation_launch_document( || document.schema_version != "epiphany.reorientation_launch_projection.v1" || document.request_id.trim().is_empty() || document.creation_thread_id != launch.job_id - || launch.proposal_modeling_request_id.is_some() - || launch.frontier_planning_request_id.is_some() - || launch.frontier_plan_mind_request_id.is_some() - || launch.imagination_consideration_request_id.is_some() - || launch - .admitted_model_direction_consideration_request_id - .is_some() - || launch.repo_frontier_modeling_request_id.is_some() - || launch.repo_frontier_research_request_id.is_some() - || launch.repo_frontier_verification_request_id.is_some() { return Err(anyhow!( "reorientation immutable launch crossed family authority" @@ -477,14 +467,6 @@ pub fn launch_current_reorientation_work( instruction: "Decide resume or regather from only the sealed typed continuity projection. Return the reorientation result contract; do not invent live state.".into(), launch_document, output_contract_id: output_contract_id.clone(), - proposal_modeling_request_id: None, - frontier_planning_request_id: None, - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, created_at: created_at.into(), }, )?; diff --git a/epiphany-core/src/resident_self.rs b/epiphany-core/src/resident_self.rs index 8623bf1c..3bd3f1c8 100644 --- a/epiphany-core/src/resident_self.rs +++ b/epiphany-core/src/resident_self.rs @@ -1323,11 +1323,12 @@ pub fn recover_dead_resident_typed_worker( }; let mut cache = crate::runtime_spine_cache(runtime_store)?; cache.pull_all_backing_stores()?; - let mut launches = cache - .get_all::()? - .into_iter() - .filter(|launch| request.matches_launch(launch)) - .collect::>(); + let mut launches = Vec::new(); + for launch in cache.get_all::()? { + if request.matches_launch(&launch)? { + launches.push(launch); + } + } launches.sort_by(|a, b| a.job_id.cmp(&b.job_id)); let mut retryable = Vec::new(); for launch in &launches { diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index 9e268ef4..4efe7ee3 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -55,7 +55,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v38"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v39"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache(type = "epiphany.runtime.identity", schema = "EpiphanyRuntimeIdentity")] @@ -198,22 +198,6 @@ pub struct EpiphanyRuntimeWorkerLaunchRequest { pub launch_document_msgpack: Vec, #[cultcache(key = 9, default)] pub metadata: BTreeMap, - #[cultcache(key = 11, default)] - pub proposal_modeling_request_id: Option, - #[cultcache(key = 12, default)] - pub repo_frontier_verification_request_id: Option, - #[cultcache(key = 13, default)] - pub frontier_planning_request_id: Option, - #[cultcache(key = 14, default)] - pub frontier_plan_mind_request_id: Option, - #[cultcache(key = 15, default)] - pub imagination_consideration_request_id: Option, - #[cultcache(key = 16, default)] - pub admitted_model_direction_consideration_request_id: Option, - #[cultcache(key = 17, default)] - pub repo_frontier_modeling_request_id: Option, - #[cultcache(key = 19, default)] - pub repo_frontier_research_request_id: Option, } #[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] @@ -366,6 +350,21 @@ impl EpiphanyRuntimeWorkerLaunchRequest { } } +fn role_launch_document_for_job( + cache: &CultCache, + job_id: &str, +) -> Result { + let launch = cache + .get::(job_id)? + .ok_or_else(|| anyhow!("typed role result lost its immutable launch"))?; + match launch.launch_document()? { + EpiphanyWorkerLaunchDocument::Role(document) => Ok(document), + EpiphanyWorkerLaunchDocument::Reorient(_) => { + Err(anyhow!("typed role result carried reorientation authority")) + } + } +} + #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache( type = "epiphany.runtime.role_worker_result", @@ -404,39 +403,18 @@ pub struct EpiphanyRuntimeRoleWorkerResult { pub risks: Vec, #[cultcache(key = 16, default)] pub research_decision_msgpack: Option>, - #[cultcache(key = 17, default)] #[cultcache(key = 18, default)] pub item_error: Option, #[cultcache(key = 19, default)] pub metadata: BTreeMap, #[cultcache(key = 20, default)] pub repo_model_mutation_proposal_msgpack: Option>, - #[cultcache(key = 21, default)] - pub verification_request_id: Option, - #[cultcache(key = 22, default)] - pub frontier_route_id: Option, - #[cultcache(key = 23, default)] - pub repo_frontier_modeling_request_id: Option, - #[cultcache(key = 24, default)] - pub proposal_modeling_request_id: Option, - #[cultcache(key = 25, default)] - pub repo_frontier_research_request_id: Option, - #[cultcache(key = 26, default)] - pub frontier_planning_request_id: Option, #[cultcache(key = 27, default)] pub frontier_plan_candidate_msgpack: Option>, - #[cultcache(key = 28, default)] - pub frontier_plan_mind_request_id: Option, #[cultcache(key = 29, default)] pub frontier_plan_mind_decision_msgpack: Option>, - #[cultcache(key = 30, default)] - pub repository_body_observation_basis: Option, - #[cultcache(key = 31, default)] - pub imagination_consideration_request_id: Option, #[cultcache(key = 32, default)] pub imagination_consideration_candidate_msgpack: Option>, - #[cultcache(key = 33, default)] - pub admitted_model_direction_consideration_request_id: Option, #[cultcache(key = 34, default)] pub admitted_model_direction_consideration_result_msgpack: Option>, #[cultcache(key = 35)] @@ -692,14 +670,6 @@ pub struct RuntimeSpineHeartbeatJobOptions { pub instruction: String, pub launch_document: EpiphanyWorkerLaunchDocument, pub output_contract_id: String, - pub proposal_modeling_request_id: Option, - pub frontier_planning_request_id: Option, - pub frontier_plan_mind_request_id: Option, - pub imagination_consideration_request_id: Option, - pub admitted_model_direction_consideration_request_id: Option, - pub repo_frontier_modeling_request_id: Option, - pub repo_frontier_research_request_id: Option, - pub repo_frontier_verification_request_id: Option, pub created_at: String, } @@ -2137,42 +2107,48 @@ pub fn prepare_runtime_spine_heartbeat_job( validate_proposal_modeling_launch_carrier( &options.role, &options.binding_id, - options.proposal_modeling_request_id.as_deref(), &options.launch_document, )?; validate_frontier_planning_launch_carrier( &options.role, &options.binding_id, - options.frontier_planning_request_id.as_deref(), &options.launch_document, )?; validate_frontier_plan_mind_launch_carrier( &options.role, &options.binding_id, - options.frontier_plan_mind_request_id.as_deref(), &options.launch_document, )?; validate_frontier_research_launch_carrier( &options.role, &options.binding_id, - options.repo_frontier_research_request_id.as_deref(), &options.launch_document, )?; validate_frontier_verification_launch_carrier( &options.role, &options.binding_id, - options.repo_frontier_verification_request_id.as_deref(), &options.launch_document, )?; validate_imagination_consideration_launch_carrier( &options.role, &options.binding_id, - options.imagination_consideration_request_id.as_deref(), &options.launch_document, )?; + validate_admitted_model_direction_launch_carrier( + &options.role, + &options.binding_id, + &options.launch_document, + )?; + if matches!( + &options.launch_document, + EpiphanyWorkerLaunchDocument::Role(document) if document.family_context_count() > 1 + ) { + return Err(anyhow!( + "worker launch carries multiple family request authorities" + )); + } validate_repo_frontier_verdict_modeling_launch_authority( &options.role, - options.repo_frontier_modeling_request_id.as_deref(), &options.launch_document, )?; validate_non_empty(&options.binding_id, "binding id")?; @@ -2253,15 +2229,6 @@ pub fn prepare_runtime_spine_heartbeat_job( document_kind: worker_launch_document_kind(&options.launch_document).to_string(), launch_document_msgpack: encode_worker_launch_document(&options.launch_document)?, metadata: BTreeMap::new(), - proposal_modeling_request_id: options.proposal_modeling_request_id, - frontier_planning_request_id: options.frontier_planning_request_id, - frontier_plan_mind_request_id: options.frontier_plan_mind_request_id, - imagination_consideration_request_id: options.imagination_consideration_request_id, - admitted_model_direction_consideration_request_id: options - .admitted_model_direction_consideration_request_id, - repo_frontier_modeling_request_id: options.repo_frontier_modeling_request_id, - repo_frontier_research_request_id: options.repo_frontier_research_request_id, - repo_frontier_verification_request_id: options.repo_frontier_verification_request_id, }; let session_envelope = match cache.get_envelope::(&session.session_id)? { @@ -2279,7 +2246,6 @@ pub fn prepare_runtime_spine_heartbeat_job( fn validate_repo_frontier_verdict_modeling_launch_authority( role: &str, - request_id: Option<&str>, launch_document: &EpiphanyWorkerLaunchDocument, ) -> Result<()> { let authority = match launch_document { @@ -2288,25 +2254,18 @@ fn validate_repo_frontier_verdict_modeling_launch_authority( } EpiphanyWorkerLaunchDocument::Reorient(_) => None, }; - match (request_id, authority) { - (None, None) => Ok(()), - (Some(_), None) => Err(anyhow!( - "verdict-bound Modeling launch omitted its typed authority body" - )), - (None, Some(_)) => Err(anyhow!( - "verdict-bound Modeling authority body has no indexed request id" - )), - (Some(request_id), Some(authority)) => { + match authority { + None => Ok(()), + Some(authority) => { if role != EPIPHANY_MODELING_OWNER_ROLE { return Err(anyhow!( "verdict-bound Modeling authority belongs only to the Modeling owner role" )); } - if request_id != authority.request.request_id { - return Err(anyhow!( - "verdict-bound Modeling request id does not match its typed authority body" - )); - } + validate_non_empty( + &authority.request.request_id, + "verdict-bound Modeling request id", + )?; if authority.request.frontier_item_id != authority.frontier_item.id { return Err(anyhow!( "verdict-bound Modeling authority does not carry its exact frontier item" @@ -2397,33 +2356,21 @@ fn validate_repo_frontier_verdict_modeling_mutation( fn validate_proposal_modeling_launch_carrier( role: &str, binding_id: &str, - proposal_modeling_request_id: Option<&str>, launch_document: &EpiphanyWorkerLaunchDocument, ) -> Result<()> { let projection = match launch_document { EpiphanyWorkerLaunchDocument::Role(document) => document.proposal_modeling_context.as_ref(), EpiphanyWorkerLaunchDocument::Reorient(_) => None, }; - let Some(request_id) = proposal_modeling_request_id else { - if projection.is_some() { - return Err(anyhow!( - "proposal Modeling context requires its typed request id" - )); - } + let Some(projection) = projection else { return Ok(()); }; - validate_non_empty(request_id, "proposal Modeling request id")?; + validate_non_empty(&projection.request_id, "proposal Modeling request id")?; if role != EPIPHANY_MODELING_OWNER_ROLE || binding_id != EPIPHANY_MODELING_ROLE_BINDING_ID { return Err(anyhow!( "proposal Modeling request id may only be transported by the Modeling role launch" )); } - let projection = projection.ok_or_else(|| { - anyhow!("proposal Modeling request id requires coordinator-owned typed context") - })?; - if projection.request_id != request_id { - return Err(anyhow!("proposal Modeling context/request mismatch")); - } Ok(()) } @@ -2461,40 +2408,28 @@ fn validate_repository_body_launch_carrier( fn validate_frontier_planning_launch_carrier( role: &str, binding_id: &str, - planning_request_id: Option<&str>, launch_document: &EpiphanyWorkerLaunchDocument, ) -> Result<()> { let projection = match launch_document { EpiphanyWorkerLaunchDocument::Role(document) => document.frontier_planning_context.as_ref(), EpiphanyWorkerLaunchDocument::Reorient(_) => None, }; - let Some(request_id) = planning_request_id else { - if projection.is_some() { - return Err(anyhow!( - "frontier planning context requires its typed request id" - )); - } + let Some(projection) = projection else { return Ok(()); }; - validate_non_empty(request_id, "frontier planning request id")?; + validate_non_empty(&projection.request_id, "frontier planning request id")?; if role != EPIPHANY_IMAGINATION_OWNER_ROLE || binding_id != EPIPHANY_IMAGINATION_ROLE_BINDING_ID { return Err(anyhow!( "frontier planning request may only be transported by the Imagination role launch" )); } - let projection = projection - .ok_or_else(|| anyhow!("frontier planning request requires its typed context"))?; - if projection.request_id != request_id { - return Err(anyhow!("frontier planning context/request mismatch")); - } Ok(()) } fn validate_frontier_plan_mind_launch_carrier( role: &str, binding_id: &str, - request_id: Option<&str>, launch_document: &EpiphanyWorkerLaunchDocument, ) -> Result<()> { let projection = match launch_document { @@ -2503,32 +2438,24 @@ fn validate_frontier_plan_mind_launch_carrier( } EpiphanyWorkerLaunchDocument::Reorient(_) => None, }; - let Some(request_id) = request_id else { - if projection.is_some() { - return Err(anyhow!( - "frontier plan Mind context requires its typed request id" - )); - } + let Some(projection) = projection else { return Ok(()); }; - validate_non_empty(request_id, "frontier plan Mind request id")?; + validate_non_empty( + &projection.request.request_id, + "frontier plan Mind request id", + )?; if role != EPIPHANY_MIND_OWNER_ROLE || binding_id != EPIPHANY_MIND_ROLE_BINDING_ID { return Err(anyhow!( "frontier plan Mind request may only be transported by the Mind role launch" )); } - let projection = projection - .ok_or_else(|| anyhow!("frontier plan Mind request requires its typed context"))?; - if projection.request.request_id != request_id { - return Err(anyhow!("frontier plan Mind context/request mismatch")); - } Ok(()) } fn validate_imagination_consideration_launch_carrier( role: &str, binding_id: &str, - request_id: Option<&str>, launch_document: &EpiphanyWorkerLaunchDocument, ) -> Result<()> { let projection = match launch_document { @@ -2537,23 +2464,50 @@ fn validate_imagination_consideration_launch_carrier( } EpiphanyWorkerLaunchDocument::Reorient(_) => None, }; - let Some(request_id) = request_id else { - if projection.is_some() { - return Err(anyhow!( - "consideration context requires its typed request id" - )); - } + let Some(projection) = projection else { return Ok(()); }; - validate_non_empty(request_id, "imagination consideration request id")?; + validate_non_empty( + &projection.request.request_id, + "imagination consideration request id", + )?; if role != EPIPHANY_IMAGINATION_OWNER_ROLE || binding_id != EPIPHANY_IMAGINATION_ROLE_BINDING_ID { return Err(anyhow!( "consideration may only be transported by Imagination" )); } - if projection.map(|p| p.request.request_id.as_str()) != Some(request_id) { - return Err(anyhow!("consideration context/request mismatch")); + Ok(()) +} + +fn validate_admitted_model_direction_launch_carrier( + role: &str, + binding_id: &str, + launch_document: &EpiphanyWorkerLaunchDocument, +) -> Result<()> { + let projection = match launch_document { + EpiphanyWorkerLaunchDocument::Role(document) => document + .admitted_model_direction_consideration_context + .as_ref(), + EpiphanyWorkerLaunchDocument::Reorient(_) => None, + }; + let Some(projection) = projection else { + return Ok(()); + }; + validate_non_empty( + &projection.request.request_id, + "admitted model direction consideration request id", + )?; + if role != EPIPHANY_IMAGINATION_OWNER_ROLE + || binding_id != EPIPHANY_IMAGINATION_ROLE_BINDING_ID + || projection.schema_version + != crate::surfaces::ADMITTED_MODEL_DIRECTION_CONSIDERATION_CONTEXT_SCHEMA_VERSION + || projection.contract + != crate::surfaces::ADMITTED_MODEL_DIRECTION_CONSIDERATION_CONTEXT_CONTRACT + { + return Err(anyhow!( + "admitted model direction consideration belongs only to its typed Imagination launch" + )); } Ok(()) } @@ -2611,22 +2565,16 @@ pub fn runtime_worker_process_claim( fn validate_frontier_research_launch_carrier( role: &str, binding_id: &str, - research_request_id: Option<&str>, launch_document: &EpiphanyWorkerLaunchDocument, ) -> Result<()> { let projection = match launch_document { EpiphanyWorkerLaunchDocument::Role(document) => document.frontier_research_context.as_ref(), EpiphanyWorkerLaunchDocument::Reorient(_) => None, }; - let Some(request_id) = research_request_id else { - if projection.is_some() { - return Err(anyhow!( - "frontier Research context requires its typed request id" - )); - } + let Some(projection) = projection else { return Ok(()); }; - validate_non_empty(request_id, "frontier Research request id")?; + validate_non_empty(&projection.request_id, "frontier Research request id")?; if role != crate::EPIPHANY_RESEARCH_OWNER_ROLE || binding_id != crate::EPIPHANY_RESEARCH_ROLE_BINDING_ID { @@ -2634,10 +2582,7 @@ fn validate_frontier_research_launch_carrier( "frontier Research request may only be transported by the Research role launch" )); } - let projection = projection - .ok_or_else(|| anyhow!("frontier Research request requires its typed context"))?; - if projection.request_id != request_id - || projection.schema_version != crate::REPO_FRONTIER_RESEARCH_CONTEXT_SCHEMA_VERSION + if projection.schema_version != crate::REPO_FRONTIER_RESEARCH_CONTEXT_SCHEMA_VERSION || projection.contract != crate::REPO_FRONTIER_RESEARCH_CONTEXT_CONTRACT { return Err(anyhow!("frontier Research context/request mismatch")); @@ -2648,7 +2593,6 @@ fn validate_frontier_research_launch_carrier( fn validate_frontier_verification_launch_carrier( role: &str, binding_id: &str, - verification_request_id: Option<&str>, launch_document: &EpiphanyWorkerLaunchDocument, ) -> Result<()> { let projection = match launch_document { @@ -2657,15 +2601,13 @@ fn validate_frontier_verification_launch_carrier( } EpiphanyWorkerLaunchDocument::Reorient(_) => None, }; - let Some(request_id) = verification_request_id else { - if projection.is_some() { - return Err(anyhow!( - "frontier Verification context requires its typed request id" - )); - } + let Some(projection) = projection else { return Ok(()); }; - validate_non_empty(request_id, "frontier Verification request id")?; + validate_non_empty( + &projection.request.request_id, + "frontier Verification request id", + )?; if role != crate::EPIPHANY_VERIFICATION_OWNER_ROLE || binding_id != crate::EPIPHANY_VERIFICATION_ROLE_BINDING_ID { @@ -2673,10 +2615,7 @@ fn validate_frontier_verification_launch_carrier( "frontier Verification request may only be transported by the Verification role launch" )); } - let projection = projection - .ok_or_else(|| anyhow!("frontier Verification request requires its typed context"))?; - if projection.request.request_id != request_id - || projection.schema_version != crate::REPO_FRONTIER_VERIFICATION_CONTEXT_SCHEMA_VERSION + if projection.schema_version != crate::REPO_FRONTIER_VERIFICATION_CONTEXT_SCHEMA_VERSION || projection.contract != crate::REPO_FRONTIER_VERIFICATION_CONTEXT_CONTRACT { return Err(anyhow!("frontier Verification context/request mismatch")); @@ -2783,15 +2722,15 @@ pub(crate) fn frontier_research_request_for_launch( ) -> Result> { let document: EpiphanyWorkerLaunchDocument = rmp_serde::from_slice(&launch.launch_document_msgpack)?; - validate_frontier_research_launch_carrier( - &launch.role, - &launch.binding_id, - launch.repo_frontier_research_request_id.as_deref(), - &document, - )?; - let Some(request_id) = launch.repo_frontier_research_request_id.as_deref() else { + validate_frontier_research_launch_carrier(&launch.role, &launch.binding_id, &document)?; + let carried = match &document { + EpiphanyWorkerLaunchDocument::Role(document) => document.frontier_research_context.as_ref(), + EpiphanyWorkerLaunchDocument::Reorient(_) => None, + }; + let Some(carried) = carried else { return Ok(None); }; + let request_id = carried.request_id.as_str(); let request = cache .get::(request_id)? .ok_or_else(|| anyhow!("frontier Research launch lost its typed request"))?; @@ -2802,15 +2741,7 @@ pub(crate) fn frontier_research_request_for_launch( "frontier Research launch names an invalid typed request" )); } - let carried = match document { - EpiphanyWorkerLaunchDocument::Role(document) => document.frontier_research_context, - EpiphanyWorkerLaunchDocument::Reorient(_) => None, - }; - if carried.as_ref() - != Some(&crate::RepoFrontierResearchContextProjection::from( - &request, - )) - { + if carried != &crate::RepoFrontierResearchContextProjection::from(&request) { return Err(anyhow!( "frontier Research launch carries substituted context" )); @@ -2824,24 +2755,21 @@ pub(crate) fn frontier_verification_request_for_launch( ) -> Result> { let document: EpiphanyWorkerLaunchDocument = rmp_serde::from_slice(&launch.launch_document_msgpack)?; - validate_frontier_verification_launch_carrier( - &launch.role, - &launch.binding_id, - launch.repo_frontier_verification_request_id.as_deref(), - &document, - )?; - let Some(request_id) = launch.repo_frontier_verification_request_id.as_deref() else { + validate_frontier_verification_launch_carrier(&launch.role, &launch.binding_id, &document)?; + let carried = match &document { + EpiphanyWorkerLaunchDocument::Role(document) => { + document.frontier_verification_context.as_ref() + } + EpiphanyWorkerLaunchDocument::Reorient(_) => None, + }; + let Some(carried) = carried else { return Ok(None); }; + let request_id = carried.request.request_id.as_str(); let request = cache .get::(request_id)? .ok_or_else(|| anyhow!("frontier Verification launch lost its typed request"))?; validate_repo_frontier_verification_request_intrinsic(&request)?; - let carried = match document { - EpiphanyWorkerLaunchDocument::Role(document) => document.frontier_verification_context, - EpiphanyWorkerLaunchDocument::Reorient(_) => None, - } - .ok_or_else(|| anyhow!("frontier Verification launch lost its typed context"))?; if carried.request != request || carried.route.route_id != request.route_id || carried.hands_authority.route_id != request.route_id @@ -3727,12 +3655,38 @@ pub fn put_runtime_role_worker_result( .get::(&result.job_id)? .ok_or_else(|| anyhow!("role worker result requires its immutable worker launch"))?; let launch_document = worker_launch.launch_document()?; - let launch_body_basis = match &launch_document { - EpiphanyWorkerLaunchDocument::Role(document) => { - document.repository_body_observation_basis.as_ref() - } - EpiphanyWorkerLaunchDocument::Reorient(_) => None, + let EpiphanyWorkerLaunchDocument::Role(role_launch) = &launch_document else { + return Err(anyhow!( + "role worker result requires a role launch document" + )); }; + if !role_launch.role_id.eq_ignore_ascii_case(&result.role_id) { + return Err(anyhow!( + "role worker result cannot substitute its sealed launch role" + )); + } + let is_failure = match result.item_error.as_deref() { + Some(error) if error.trim().is_empty() => { + return Err(anyhow!( + "typed role worker failure requires a nonempty error" + )); + } + Some(_) => true, + None => false, + }; + let carries_semantic_success = result.research_decision_msgpack.is_some() + || result.repo_model_mutation_proposal_msgpack.is_some() + || result.frontier_plan_candidate_msgpack.is_some() + || result.frontier_plan_mind_decision_msgpack.is_some() + || result.imagination_consideration_candidate_msgpack.is_some() + || result + .admitted_model_direction_consideration_result_msgpack + .is_some(); + if is_failure && carries_semantic_success { + return Err(anyhow!( + "typed role worker failure cannot carry successful semantic cargo" + )); + } let launch_is_modeling = worker_launch.role == EPIPHANY_MODELING_OWNER_ROLE; let result_is_modeling = result.role_id.eq_ignore_ascii_case("modeling"); if launch_is_modeling != result_is_modeling { @@ -3741,137 +3695,71 @@ pub fn put_runtime_role_worker_result( )); } if launch_is_modeling { - let expected = launch_body_basis.ok_or_else(|| { - anyhow!("Modeling worker launch is missing its repository Body observation basis") - })?; - if result.repository_body_observation_basis.as_ref() != Some(expected) { + role_launch + .repository_body_observation_basis + .as_ref() + .ok_or_else(|| { + anyhow!("Modeling worker launch is missing its repository Body observation basis") + })?; + } else if role_launch.repository_body_observation_basis.is_some() { + return Err(anyhow!( + "non-Modeling worker launch must not carry a repository Body observation basis" + )); + } + let launch_context_count = role_launch.family_context_count(); + if launch_context_count > 1 { + return Err(anyhow!( + "role worker launch carries multiple family request authorities" + )); + } + + if role_launch.frontier_research_context.is_some() { + if !result.role_id.eq_ignore_ascii_case("research") { return Err(anyhow!( - "Modeling runtime result must exactly bind its immutable launch repository Body observation basis" + "frontier Research result must retain its launch role" )); } - } else if launch_body_basis.is_some() || result.repository_body_observation_basis.is_some() { - return Err(anyhow!( - "non-Modeling worker launch and result must not carry a repository Body observation basis" - )); - } - let is_verification = result.role_id == "verification"; - if is_verification - != (result - .verification_request_id - .as_ref() - .is_some_and(|id| !id.trim().is_empty()) - && result - .frontier_route_id - .as_ref() - .is_some_and(|id| !id.trim().is_empty())) - { - return Err(anyhow!( - "Verification results require verificationRequestId and frontierRouteId; other roles must not claim them" - )); - } - if result.repo_frontier_modeling_request_id.is_some() - && !result.role_id.eq_ignore_ascii_case("modeling") - { - return Err(anyhow!( - "only Modeling results may carry a frontier Modeling request binding" - )); - } - if result.proposal_modeling_request_id.is_some() - && !result.role_id.eq_ignore_ascii_case("modeling") - { - return Err(anyhow!( - "only Modeling results may carry a proposal Modeling request binding" - )); - } - let is_modeling = result.role_id.eq_ignore_ascii_case("modeling"); - let modeling_binding_count = [ - result.repo_frontier_modeling_request_id.is_some(), - result.proposal_modeling_request_id.is_some(), - ] - .into_iter() - .filter(|present| *present) - .count(); - if is_modeling && modeling_binding_count > 1 { - return Err(anyhow!( - "Modeling result authority bindings are mutually exclusive" - )); - } - if is_modeling - && (result.repo_frontier_modeling_request_id - != worker_launch.repo_frontier_modeling_request_id - || result.proposal_modeling_request_id != worker_launch.proposal_modeling_request_id) - { - return Err(anyhow!( - "Modeling result must exactly preserve its runtime-owned request authority" - )); - } - let is_frontier_research = worker_launch.repo_frontier_research_request_id.is_some(); - if is_frontier_research - != result - .repo_frontier_research_request_id - .as_ref() - .is_some_and(|id| !id.trim().is_empty()) - || result.repo_frontier_research_request_id - != worker_launch.repo_frontier_research_request_id - || (is_frontier_research && !result.role_id.eq_ignore_ascii_case("research")) - || (!is_frontier_research && result.repo_frontier_research_request_id.is_some()) - { - return Err(anyhow!( - "Research result must exactly preserve its runtime-owned frontier request" - )); - } - if is_frontier_research { - let request = frontier_research_request_for_launch(&cache, &worker_launch)? + frontier_research_request_for_launch(&cache, &worker_launch)? .ok_or_else(|| anyhow!("Research result lost its typed request"))?; - if result.repo_frontier_research_request_id.as_deref() != Some(request.request_id.as_str()) - { - return Err(anyhow!("Research result substituted its typed request")); + if !is_failure { + result + .research_decision()? + .ok_or_else(|| anyhow!("Research result requires its typed decision"))? + .validate()?; } - result - .research_decision()? - .ok_or_else(|| anyhow!("Research result requires its typed decision"))? - .validate()?; } else if result.research_decision_msgpack.is_some() { return Err(anyhow!( "only an exact frontier Research result may carry a Research decision" )); } - let is_frontier_verification = worker_launch - .repo_frontier_verification_request_id - .is_some(); - if is_verification != is_frontier_verification { + let is_verification = result.role_id.eq_ignore_ascii_case("verification"); + if is_verification != role_launch.frontier_verification_context.is_some() { return Err(anyhow!( "Verification result and launch must share one exact frontier request" )); } - if is_frontier_verification { - let request = frontier_verification_request_for_launch(&cache, &worker_launch)? + if is_verification { + frontier_verification_request_for_launch(&cache, &worker_launch)? .ok_or_else(|| anyhow!("Verification result lost its typed request"))?; - if result.verification_request_id.as_deref() != Some(request.request_id.as_str()) - || result.frontier_route_id.as_deref() != Some(request.route_id.as_str()) - { - return Err(anyhow!( - "Verification result substituted its exact request or route" - )); - } } - if is_modeling - && (result.verification_request_id.is_some() || result.frontier_route_id.is_some()) - { + + let has_frontier_modeling_context = role_launch.proposal_modeling_context.is_some() + || role_launch.frontier_verdict_modeling_context.is_some(); + if !result_is_modeling && result.repo_model_mutation_proposal_msgpack.is_some() { return Err(anyhow!( - "Modeling result cannot claim Verification route authority" + "only Modeling results may carry a RepoModel mutation proposal" )); } - if is_modeling - && (modeling_binding_count == 1 || result.repo_model_mutation_proposal_msgpack.is_some()) + if result_is_modeling + && !is_failure + && (has_frontier_modeling_context || result.repo_model_mutation_proposal_msgpack.is_some()) { let proposal = result.repo_model_mutation_proposal()?.ok_or_else(|| { anyhow!("Modeling authority binding requires a RepoModel mutation proposal") })?; proposal.validate()?; let operations = proposal.operations()?; - if (worker_launch.repo_frontier_modeling_request_id.is_some() - || worker_launch.proposal_modeling_request_id.is_some()) + if has_frontier_modeling_context && operations.iter().any(|operation| { !matches!( operation, @@ -3883,21 +3771,29 @@ pub fn put_runtime_role_worker_result( "frontier Modeling request may authorize only semantic RepoModel frontier mutation" )); } - if worker_launch.repo_frontier_modeling_request_id.is_some() { + if role_launch.frontier_verdict_modeling_context.is_some() { validate_repo_frontier_verdict_modeling_mutation(&cache, &launch_document, &proposal)?; } } - let has_planning_echo = result.frontier_planning_request_id.is_some(); + + let planning_context = role_launch.frontier_planning_context.as_ref(); let has_planning_candidate = result.frontier_plan_candidate_msgpack.is_some(); - if has_planning_echo != has_planning_candidate { + if planning_context.is_none() && has_planning_candidate { return Err(anyhow!( - "frontier planning result requires both its request echo and typed candidate" + "frontier planning candidate requires its immutable launch context" )); } - if has_planning_echo { + if planning_context.is_some() && !is_failure && !has_planning_candidate { + return Err(anyhow!( + "successful frontier planning result requires its typed candidate" + )); + } + if let Some(planning_context) = planning_context + && has_planning_candidate + { if !result.role_id.eq_ignore_ascii_case("imagination") { return Err(anyhow!( - "only Imagination results may echo a frontier planning request" + "only Imagination results may carry a frontier planning candidate" )); } if result.item_error.is_some() { @@ -3905,21 +3801,7 @@ pub fn put_runtime_role_worker_result( "frontier planning result with an item error cannot carry an executable candidate" )); } - if result.research_decision_msgpack.is_some() - || result.repo_model_mutation_proposal_msgpack.is_some() - || result.verification_request_id.is_some() - || result.frontier_route_id.is_some() - || result.repo_frontier_modeling_request_id.is_some() - || result.proposal_modeling_request_id.is_some() - { - return Err(anyhow!( - "frontier planning result may carry only its request echo and typed candidate authority" - )); - } - let request_id = result - .frontier_planning_request_id - .as_deref() - .ok_or_else(|| anyhow!("frontier planning request echo disappeared"))?; + let request_id = planning_context.request_id.as_str(); let request = cache .get::(request_id)? .ok_or_else(|| anyhow!("frontier planning result requires persisted request"))?; @@ -3928,16 +3810,6 @@ pub fn put_runtime_role_worker_result( .frontier_plan_candidate()? .ok_or_else(|| anyhow!("frontier planning candidate disappeared"))?; validate_repo_frontier_plan_candidate_against_request(&cache, &candidate, &request)?; - let worker_launch = cache - .get::(&result.job_id)? - .ok_or_else(|| anyhow!("frontier planning result requires its worker launch"))?; - let launch_document = worker_launch.launch_document()?; - let projection = match &launch_document { - EpiphanyWorkerLaunchDocument::Role(document) => { - document.frontier_planning_context.as_ref() - } - EpiphanyWorkerLaunchDocument::Reorient(_) => None, - }; let expected_projection = crate::RepoFrontierPlanningContextProjection::from_request(&request); crate::current_work::frontier_planning_attempt_ordinal( @@ -3947,11 +3819,8 @@ pub fn put_runtime_role_worker_result( if worker_launch.job_id != result.job_id || worker_launch.role != EPIPHANY_IMAGINATION_OWNER_ROLE || worker_launch.binding_id != EPIPHANY_IMAGINATION_ROLE_BINDING_ID - || worker_launch.frontier_planning_request_id.as_deref() - != Some(request.request_id.as_str()) - || worker_launch.proposal_modeling_request_id.is_some() || launch_document.thread_id() != result.job_id - || projection != Some(&expected_projection) + || planning_context != &expected_projection { return Err(anyhow!( "frontier planning result does not exactly bind request, immutable launch, and candidate" @@ -3959,33 +3828,36 @@ pub fn put_runtime_role_worker_result( } } let mut model_direction_companion = None; - let has_model_direction_echo = result - .admitted_model_direction_consideration_request_id - .is_some(); + let model_direction_context = role_launch + .admitted_model_direction_consideration_context + .as_ref(); let has_model_direction_result = result .admitted_model_direction_consideration_result_msgpack .is_some(); - if has_model_direction_echo != has_model_direction_result { + if model_direction_context.is_none() && has_model_direction_result { return Err(anyhow!( - "model direction result requires exact request echo and result" + "model direction result requires its immutable launch context" )); } - if has_model_direction_echo { + if model_direction_context.is_some() && !is_failure && !has_model_direction_result { + return Err(anyhow!( + "successful model direction result requires its typed decision" + )); + } + if let Some(model_direction_context) = model_direction_context + && has_model_direction_result + { if !result.role_id.eq_ignore_ascii_case("imagination") || result.item_error.is_some() || result.research_decision_msgpack.is_some() || result.repo_model_mutation_proposal_msgpack.is_some() - || result.imagination_consideration_request_id.is_some() || result.imagination_consideration_candidate_msgpack.is_some() { return Err(anyhow!( "model direction result carries foreign authority cargo" )); } - let request_id = result - .admitted_model_direction_consideration_request_id - .as_deref() - .unwrap(); + let request_id = model_direction_context.request.request_id.as_str(); let request = cache .get::(request_id)? .ok_or_else(|| anyhow!("model direction result request disappeared"))?; @@ -4004,25 +3876,11 @@ pub fn put_runtime_role_worker_result( "model direction result identity was not assigned by exact launch" )); } - let worker = cache - .get::(&result.job_id)? - .ok_or_else(|| anyhow!("model direction result requires worker launch"))?; - let document = worker.launch_document()?; - let projection = match &document { - EpiphanyWorkerLaunchDocument::Role(document) => document - .admitted_model_direction_consideration_context - .as_ref(), - EpiphanyWorkerLaunchDocument::Reorient(_) => None, - }; - if worker.role != EPIPHANY_IMAGINATION_OWNER_ROLE - || worker.binding_id != EPIPHANY_IMAGINATION_ROLE_BINDING_ID - || worker - .admitted_model_direction_consideration_request_id - .as_deref() - != Some(request_id) - || projection.map(|projection| &projection.request) != Some(&request) - || projection.map(|projection| projection.model.reasoning_basis()) - != Some(crate::EpiphanyRepoModelBasis { + if worker_launch.role != EPIPHANY_IMAGINATION_OWNER_ROLE + || worker_launch.binding_id != EPIPHANY_IMAGINATION_ROLE_BINDING_ID + || model_direction_context.request != request + || model_direction_context.model.reasoning_basis() + != (crate::EpiphanyRepoModelBasis { projection_digest: request.model_projection_digest.clone(), source_documents: request.model_source_documents.clone(), }) @@ -4034,35 +3892,33 @@ pub fn put_runtime_role_worker_result( model_direction_companion = Some(direction_result); } let mut imagination_candidate_companion = None; - let has_consideration_echo = result.imagination_consideration_request_id.is_some(); + let consideration_context = role_launch.imagination_consideration_context.as_ref(); let has_consideration_candidate = result.imagination_consideration_candidate_msgpack.is_some(); - if has_consideration_echo != has_consideration_candidate { + if consideration_context.is_none() && has_consideration_candidate { return Err(anyhow!( - "consideration result requires request echo and candidate" + "consideration candidate requires its immutable launch context" )); } - if has_consideration_echo { + if consideration_context.is_some() && !is_failure && !has_consideration_candidate { + return Err(anyhow!( + "successful consideration result requires its typed candidate" + )); + } + if let Some(consideration_context) = consideration_context + && has_consideration_candidate + { if !result.role_id.eq_ignore_ascii_case("imagination") || result.item_error.is_some() || result.research_decision_msgpack.is_some() || result.repo_model_mutation_proposal_msgpack.is_some() - || result.verification_request_id.is_some() - || result.frontier_route_id.is_some() - || result.repo_frontier_modeling_request_id.is_some() - || result.proposal_modeling_request_id.is_some() - || result.frontier_planning_request_id.is_some() || result.frontier_plan_candidate_msgpack.is_some() - || result.frontier_plan_mind_request_id.is_some() || result.frontier_plan_mind_decision_msgpack.is_some() { return Err(anyhow!( "consideration result carries foreign authority cargo" )); } - let request_id = result - .imagination_consideration_request_id - .as_deref() - .unwrap(); + let request_id = consideration_context.request.request_id.as_str(); let request = cache .get::(request_id)? .ok_or_else(|| anyhow!("consideration result request disappeared"))?; @@ -4078,25 +3934,14 @@ pub fn put_runtime_role_worker_result( "consideration candidate identity was not assigned by exact launch" )); } - let worker = cache - .get::(&result.job_id)? - .ok_or_else(|| anyhow!("consideration result requires worker launch"))?; - let document = worker.launch_document()?; - let projection = match &document { - EpiphanyWorkerLaunchDocument::Role(document) => { - document.imagination_consideration_context.as_ref() - } - EpiphanyWorkerLaunchDocument::Reorient(_) => None, - }; crate::current_work::consideration_attempt_ordinal(request_id, &result.job_id)?; - if worker.job_id != result.job_id - || worker.role != EPIPHANY_IMAGINATION_OWNER_ROLE - || worker.binding_id != EPIPHANY_IMAGINATION_ROLE_BINDING_ID - || worker.imagination_consideration_request_id.as_deref() != Some(request_id) - || document.thread_id() != result.job_id - || projection.map(|projection| &projection.request) != Some(&request) - || projection.map(|projection| projection.model.reasoning_basis()) - != Some(crate::EpiphanyRepoModelBasis { + if worker_launch.job_id != result.job_id + || worker_launch.role != EPIPHANY_IMAGINATION_OWNER_ROLE + || worker_launch.binding_id != EPIPHANY_IMAGINATION_ROLE_BINDING_ID + || launch_document.thread_id() != result.job_id + || consideration_context.request != request + || consideration_context.model.reasoning_basis() + != (crate::EpiphanyRepoModelBasis { projection_digest: request.model_projection_digest.clone(), source_documents: request.model_source_documents.clone(), }) @@ -4107,30 +3952,32 @@ pub fn put_runtime_role_worker_result( } imagination_candidate_companion = Some(candidate); } - let has_mind_echo = result.frontier_plan_mind_request_id.is_some(); + let mind_context = role_launch.frontier_plan_mind_context.as_ref(); let has_mind_decision = result.frontier_plan_mind_decision_msgpack.is_some(); - if has_mind_echo != has_mind_decision { + if mind_context.is_none() && has_mind_decision { return Err(anyhow!( - "Mind result requires both exact request echo and typed decision" + "Mind decision requires its immutable launch context" )); } - if has_mind_echo { + if mind_context.is_some() && !is_failure && !has_mind_decision { + return Err(anyhow!( + "successful Mind result requires its typed decision" + )); + } + if let Some(mind_context) = mind_context + && has_mind_decision + { if !result.role_id.eq_ignore_ascii_case("mindAdmissionReview") || result.item_error.is_some() || result.research_decision_msgpack.is_some() || result.repo_model_mutation_proposal_msgpack.is_some() - || result.frontier_planning_request_id.is_some() || result.frontier_plan_candidate_msgpack.is_some() - || result.verification_request_id.is_some() - || result.frontier_route_id.is_some() - || result.repo_frontier_modeling_request_id.is_some() - || result.proposal_modeling_request_id.is_some() { return Err(anyhow!( "Mind decision result carries foreign authority cargo" )); } - let request_id = result.frontier_plan_mind_request_id.as_deref().unwrap(); + let request_id = mind_context.request.request_id.as_str(); let request = cache .get::(request_id)? .ok_or_else(|| anyhow!("Mind result request disappeared"))?; @@ -4150,25 +3997,16 @@ pub fn put_runtime_role_worker_result( "Mind decision substituted request echo or immutable candidate identity" )); } - let launch = cache - .get::(&result.job_id)? - .ok_or_else(|| anyhow!("Mind result launch disappeared"))?; - let document = launch.launch_document()?; - let projection = match &document { - EpiphanyWorkerLaunchDocument::Role(d) => d.frontier_plan_mind_context.as_ref(), - _ => None, - }; let expected = RepoFrontierPlanMindContextProjection::new(&request, &planning, &candidate); crate::current_work::frontier_plan_mind_attempt_ordinal( &request.request_id, &result.job_id, )?; - if launch.job_id != result.job_id - || launch.role != EPIPHANY_MIND_OWNER_ROLE - || launch.binding_id != EPIPHANY_MIND_ROLE_BINDING_ID - || launch.frontier_plan_mind_request_id.as_deref() != Some(request.request_id.as_str()) - || document.thread_id() != result.job_id - || projection != Some(&expected) + if worker_launch.job_id != result.job_id + || worker_launch.role != EPIPHANY_MIND_OWNER_ROLE + || worker_launch.binding_id != EPIPHANY_MIND_ROLE_BINDING_ID + || launch_document.thread_id() != result.job_id + || mind_context != &expected { return Err(anyhow!( "Mind result does not exactly bind request, immutable launch, and candidate" @@ -4327,15 +4165,21 @@ fn validated_proposal_modeling_worker_fulfillment( cache: &CultCache, result: &EpiphanyRuntimeRoleWorkerResult, ) -> Result { - let request_id = result - .proposal_modeling_request_id - .as_deref() - .ok_or_else(|| anyhow!("proposal Modeling fulfillment lost request echo"))?; if !result.role_id.eq_ignore_ascii_case("modeling") || result.item_error.is_some() { return Err(anyhow!( "proposal Modeling fulfillment requires a successful Modeling result" )); } + let launch = cache + .get::(&result.job_id)? + .ok_or_else(|| anyhow!("proposal Modeling fulfillment worker launch is missing"))?; + let document = launch.launch_document()?; + let projection = match &document { + EpiphanyWorkerLaunchDocument::Role(document) => document.proposal_modeling_context.as_ref(), + EpiphanyWorkerLaunchDocument::Reorient(_) => None, + } + .ok_or_else(|| anyhow!("proposal Modeling fulfillment lost immutable launch context"))?; + let request_id = projection.request_id.as_str(); let mutation_proposal = result .repo_model_mutation_proposal()? .ok_or_else(|| anyhow!("proposal Modeling fulfillment lost RepoModel mutation proposal"))?; @@ -4350,14 +4194,6 @@ fn validated_proposal_modeling_worker_fulfillment( .ok_or_else(|| anyhow!("proposal Modeling fulfillment proposal is missing"))?; validate_repo_frontier_work_proposal(&proposal)?; validate_autonomous_proposal_origin_request(cache, &proposal)?; - let launch = cache - .get::(&result.job_id)? - .ok_or_else(|| anyhow!("proposal Modeling fulfillment worker launch is missing"))?; - let document = launch.launch_document()?; - let projection = match &document { - EpiphanyWorkerLaunchDocument::Role(document) => document.proposal_modeling_context.as_ref(), - EpiphanyWorkerLaunchDocument::Reorient(_) => None, - }; let identity = require_identity(cache)?; let proposal_payload_sha256 = crate::repo_frontier_proposal_payload_sha256( &proposal.title, @@ -4372,7 +4208,7 @@ fn validated_proposal_modeling_worker_fulfillment( request_id, attempt_ordinal, )?; - let projection_matches_authenticated_request = projection.is_some_and(|projection| { + let projection_matches_authenticated_request = { let expected = crate::RepoFrontierProposalModelingContextProjection { schema_version: crate::REPO_FRONTIER_PROPOSAL_MODELING_CONTEXT_SCHEMA_VERSION.into(), contract: crate::REPO_FRONTIER_PROPOSAL_MODELING_CONTEXT_CONTRACT.into(), @@ -4392,7 +4228,7 @@ fn validated_proposal_modeling_worker_fulfillment( prior_admission_refusals: prior_admission_refusals.clone(), }; projection == &expected - }); + }; let mismatches = [ ( "request.payload", @@ -4418,10 +4254,6 @@ fn validated_proposal_modeling_worker_fulfillment( launch.binding_id != EPIPHANY_MODELING_ROLE_BINDING_ID, ), ("launch.role", launch.role != EPIPHANY_MODELING_OWNER_ROLE), - ( - "launch.request", - launch.proposal_modeling_request_id.as_deref() != Some(request.request_id.as_str()), - ), ( "launch.projection", !projection_matches_authenticated_request, @@ -4546,16 +4378,6 @@ pub(crate) fn runtime_typed_request_fulfillment( return Err(anyhow!("archived typed fulfillment tombstone is invalid")); } attempt.validate_decision_record(true)?; - let archived_role_result = attempt - .decision - .as_ref() - .and_then(|decision| decision.role_result.as_ref()) - .ok_or_else(|| anyhow!("archived typed fulfillment lost its structured result"))?; - if !request.matches_result(archived_role_result) { - return Err(anyhow!( - "archived typed fulfillment substituted its structured result" - )); - } if cache .get::(&attempt.job_id)? .is_some() @@ -4580,11 +4402,20 @@ pub(crate) fn runtime_typed_request_fulfillment( .expect("validated archived result"), })); } + let matching_job_ids = cache + .get_all::()? + .into_iter() + .filter_map(|launch| match request.matches_launch(&launch) { + Ok(true) => Some(Ok(launch.job_id)), + Ok(false) => None, + Err(error) => Some(Err(error)), + }) + .collect::>>()?; let matches = cache .get_all::()? .into_iter() .filter(|result| { - request.matches_result(result) + matching_job_ids.contains(&result.job_id) && !admission_refusals.iter().any(|refusal| { refusal.pass_family.request_kind() == request.kind() && refusal.request_id == request_id @@ -4732,13 +4563,6 @@ fn validate_autonomous_proposal_origin_request( "worker role", worker_result.role_id.eq_ignore_ascii_case("imagination"), ), - ( - "worker request echo", - worker_result - .admitted_model_direction_consideration_request_id - .as_deref() - == Some(request.request_id.as_str()), - ), ("worker direction cargo", worker_direction == result), ( "direction launch identity", @@ -4762,13 +4586,6 @@ fn validate_autonomous_proposal_origin_request( "launch binding", worker_launch.binding_id == EPIPHANY_IMAGINATION_ROLE_BINDING_ID, ), - ( - "launch request echo", - worker_launch - .admitted_model_direction_consideration_request_id - .as_deref() - == Some(request.request_id.as_str()), - ), ( "launch request projection", launch_projection.map(|projection| projection.request) == Some(request.clone()), @@ -5416,10 +5233,12 @@ pub fn commit_repo_frontier_plan_mind_request( } let result = &results[0]; put_runtime_role_worker_result(runtime_store, result)?; - let planning_request_id = result - .frontier_planning_request_id - .as_deref() - .ok_or_else(|| anyhow!("Mind request source lacks planning request echo"))?; + let source_launch = role_launch_document_for_job(&cache, &result.job_id)?; + let planning_request_id = source_launch + .frontier_planning_context + .as_ref() + .map(|context| context.request_id.as_str()) + .ok_or_else(|| anyhow!("Mind request source lacks typed planning authority"))?; let planning = cache .get::(planning_request_id)? .ok_or_else(|| anyhow!("Mind request source planning request disappeared"))?; @@ -5511,9 +5330,13 @@ fn validate_repo_frontier_plan_mind_request_identity( .frontier_plan_candidate()? .ok_or_else(|| anyhow!("Mind request candidate disappeared"))?; let hash = format!("{:x}", Sha256::digest(rmp_serde::to_vec_named(&candidate)?)); + let source_launch = role_launch_document_for_job(cache, &result.job_id)?; + let launch_planning_request_id = source_launch + .frontier_planning_context + .as_ref() + .map(|context| context.request_id.as_str()); if result.job_id != request.imagination_job_id - || result.frontier_planning_request_id.as_deref() - != Some(request.planning_request_id.as_str()) + || launch_planning_request_id != Some(request.planning_request_id.as_str()) || candidate.candidate_id != request.candidate_id || hash != request.candidate_sha256 || request.runtime_id != planning.runtime_id @@ -5657,11 +5480,14 @@ fn commit_repo_frontier_plan_decision_inner( let typed = result.frontier_plan_mind_decision()?.ok_or_else(|| { anyhow!("frontier plan decision requires a typed Mind decision") })?; + let launch = role_launch_document_for_job(&cache, &result.job_id)?; + let mind_request_id = launch + .frontier_plan_mind_context + .as_ref() + .map(|context| context.request.request_id.clone()) + .ok_or_else(|| anyhow!("Mind result lacks typed plan authority"))?; ( - result - .frontier_plan_mind_request_id - .clone() - .ok_or_else(|| anyhow!("Mind result lacks its plan request echo"))?, + mind_request_id, typed.decision, typed.rationale, typed.decided_at, @@ -6376,9 +6202,16 @@ pub(crate) fn runtime_repo_frontier_research_lifecycle( }; let mut attempts = launches .iter() - .filter(|launch| { - launch.repo_frontier_research_request_id.as_deref() == Some(request.request_id.as_str()) + .map(|launch| { + Ok( + crate::RuntimeTypedRequestRef::FrontierResearch(&request.request_id) + .matches_launch(launch)? + .then_some(launch), + ) }) + .filter_map(Result::transpose) + .collect::>>()? + .into_iter() .map(|launch| { let carried_request = frontier_research_request_for_launch(&cache, launch)? .ok_or_else(|| anyhow!("frontier Research launch lost its typed request"))?; @@ -6418,10 +6251,7 @@ pub(crate) fn runtime_repo_frontier_research_lifecycle( .iter() .find(|result| result.job_id == job.job_id) .ok_or_else(|| anyhow!("completed frontier Research job lost its typed result"))?; - if result.repo_frontier_research_request_id.as_deref() - != Some(request.request_id.as_str()) - || !result.role_id.eq_ignore_ascii_case("research") - { + if !result.role_id.eq_ignore_ascii_case("research") { return Err(anyhow!( "frontier Research result crossed request-family authority" )); @@ -6503,7 +6333,9 @@ fn repo_frontier_research_request_is_covered( ) -> Result { let mut matching_jobs = BTreeSet::new(); for launch in launches { - if launch.repo_frontier_research_request_id.as_deref() != Some(&request.request_id) { + if !crate::RuntimeTypedRequestRef::FrontierResearch(&request.request_id) + .matches_launch(launch)? + { continue; } let carried_request = frontier_research_request_for_launch(&cache, launch)? @@ -6517,21 +6349,18 @@ fn repo_frontier_research_request_is_covered( } for job_id in matching_jobs { if let Some(result) = cache.get::(job_id)? - && result.repo_frontier_research_request_id.as_deref() - == Some(request.request_id.as_str()) && result.role_id.eq_ignore_ascii_case("research") && result.item_error.is_none() && worker_result_has_keyed_mind_commit(cache, &result)? { return Ok(true); } - if let Some(attempt) = cache.get::(job_id)? - && attempt.request_kind == "frontier-research" + } + for attempt in cache.get_all::()? { + if attempt.request_kind == "frontier-research" && attempt.request_id == request.request_id && let Some(decision) = attempt.decision.as_ref() && let Some(result) = decision.role_result.as_ref() - && result.repo_frontier_research_request_id.as_deref() - == Some(request.request_id.as_str()) && result.role_id.eq_ignore_ascii_case("research") && result.item_error.is_none() && attempt.fulfilled_result_id() == Some(result.result_id.as_str()) @@ -6779,9 +6608,18 @@ pub fn runtime_repo_frontier_planning_lifecycle( let mut imagination_launches = cache .get_all::()? .into_iter() - .filter(|launch| { - launch.frontier_planning_request_id.as_deref() == Some(request.request_id.as_str()) + .map(|launch| { + let matches = match launch.launch_document()? { + EpiphanyWorkerLaunchDocument::Role(document) => document + .frontier_planning_context + .is_some_and(|context| context.request_id == request.request_id), + EpiphanyWorkerLaunchDocument::Reorient(_) => false, + }; + Ok(matches.then_some(launch)) }) + .filter_map(Result::transpose) + .collect::>>()? + .into_iter() .map(|launch| { Ok(( crate::current_work::frontier_planning_attempt_ordinal( @@ -6821,9 +6659,7 @@ pub fn runtime_repo_frontier_planning_lifecycle( }; lifecycle.imagination_job_id = Some(imagination_result.job_id.clone()); lifecycle.imagination_result_id = Some(imagination_result.result_id.clone()); - if imagination_result.frontier_planning_request_id.as_deref() - != Some(request.request_id.as_str()) - { + if imagination_result.item_error.is_some() { if !imagination_result .role_id .eq_ignore_ascii_case("imagination") @@ -6850,6 +6686,15 @@ pub fn runtime_repo_frontier_planning_lifecycle( }; return Ok(lifecycle); } + if !imagination_result + .role_id + .eq_ignore_ascii_case("imagination") + || imagination_result.frontier_plan_candidate_msgpack.is_none() + { + return Err(anyhow!( + "Self found malformed typed frontier planning result" + )); + } let mind_requests = cache .get_all::()? .into_iter() @@ -6870,10 +6715,18 @@ pub fn runtime_repo_frontier_planning_lifecycle( let mut mind_launches = cache .get_all::()? .into_iter() - .filter(|launch| { - launch.frontier_plan_mind_request_id.as_deref() - == Some(mind_request.request_id.as_str()) + .map(|launch| { + let matches = match launch.launch_document()? { + EpiphanyWorkerLaunchDocument::Role(document) => document + .frontier_plan_mind_context + .is_some_and(|context| context.request.request_id == mind_request.request_id), + EpiphanyWorkerLaunchDocument::Reorient(_) => false, + }; + Ok(matches.then_some(launch)) }) + .filter_map(Result::transpose) + .collect::>>()? + .into_iter() .map(|launch| { Ok(( crate::current_work::frontier_plan_mind_attempt_ordinal( @@ -6911,9 +6764,7 @@ pub fn runtime_repo_frontier_planning_lifecycle( }; lifecycle.mind_job_id = Some(mind_result.job_id.clone()); lifecycle.mind_result_id = Some(mind_result.result_id.clone()); - if mind_result.frontier_plan_mind_request_id.as_deref() - != Some(mind_request.request_id.as_str()) - { + if mind_result.item_error.is_some() { if !mind_result .role_id .eq_ignore_ascii_case("mindAdmissionReview") @@ -6935,6 +6786,13 @@ pub fn runtime_repo_frontier_planning_lifecycle( }; return Ok(lifecycle); } + if !mind_result + .role_id + .eq_ignore_ascii_case("mindAdmissionReview") + || mind_result.frontier_plan_mind_decision_msgpack.is_none() + { + return Err(anyhow!("Self found malformed typed Mind result")); + } lifecycle.stage = RepoFrontierPlanningLifecycleStage::MindResultReady; Ok(lifecycle) } @@ -7561,6 +7419,13 @@ pub(crate) fn derive_repo_frontier_modeling_request( let verification_request = cache .get::(&verdict.verification_request_id)? .ok_or_else(|| anyhow!("frontier Modeling request requires the exact Soul request"))?; + let verification_launch = cache + .get::(&result.job_id)? + .ok_or_else(|| anyhow!("frontier Modeling request lost the Verification launch"))?; + let launched_verification_request = + frontier_verification_request_for_launch(&cache, &verification_launch)?.ok_or_else( + || anyhow!("frontier Modeling request lost typed Verification authority"), + )?; let route = cache .get::(&verdict.frontier_route_id)? .ok_or_else(|| anyhow!("frontier Modeling request requires the exact frontier route"))?; @@ -7588,9 +7453,7 @@ pub(crate) fn derive_repo_frontier_modeling_request( || result.item_error.is_some() || result.result_id != verdict.source_result_id || result.job_id != verdict.source_job_id - || result.verification_request_id.as_deref() - != Some(verification_request.request_id.as_str()) - || result.frontier_route_id.as_deref() != Some(route.route_id.as_str()) + || launched_verification_request != verification_request || verdict.verdict != result.verdict || verdict.summary != result.summary || verdict.risks != result.risks @@ -8054,15 +7917,16 @@ pub(crate) fn runtime_typed_request_attempt_exists( )) }) .collect::>>()?; - Ok(cache - .get_all::()? - .iter() - .filter(|launch| { - claims - .get(&launch.job_id) - .is_none_or(|status| !status.allows_retry()) - }) - .any(|launch| request.matches_launch(launch))) + for launch in cache.get_all::()? { + if claims + .get(&launch.job_id) + .is_none_or(|status| !status.allows_retry()) + && request.matches_launch(&launch)? + { + return Ok(true); + } + } + Ok(false) } fn validate_archivable_typed_worker_launch( @@ -8080,12 +7944,7 @@ fn validate_archivable_typed_worker_launch( let identity = require_identity(cache)?; match request_kind { "proposal-modeling" => { - validate_proposal_modeling_launch_carrier( - &launch.role, - &launch.binding_id, - Some(request_id), - &document, - )?; + validate_proposal_modeling_launch_carrier(&launch.role, &launch.binding_id, &document)?; validate_repository_body_launch_carrier(&launch.role, &document)?; let request = cache .get::(request_id)? @@ -8119,11 +7978,7 @@ fn validate_archivable_typed_worker_launch( } } "frontier-verdict-modeling" => { - validate_repo_frontier_verdict_modeling_launch_authority( - &launch.role, - Some(request_id), - &document, - )?; + validate_repo_frontier_verdict_modeling_launch_authority(&launch.role, &document)?; validate_repository_body_launch_carrier(&launch.role, &document)?; let request = cache .get::(request_id)? @@ -8167,7 +8022,6 @@ fn validate_archivable_typed_worker_launch( validate_imagination_consideration_launch_carrier( &launch.role, &launch.binding_id, - Some(request_id), &document, )?; let request = cache @@ -8283,7 +8137,8 @@ fn archive_runtime_worker_attempt( let launch = cache .get::(job_id)? .ok_or_else(|| anyhow!("worker attempt archive requires its immutable launch"))?; - let request = launch.typed_request_ref()?.ok_or_else(|| { + let document = launch.launch_document()?; + let request = document.typed_request_ref()?.ok_or_else(|| { anyhow!("worker attempt archive requires exactly one supported typed request") })?; let request_kind = request.kind(); @@ -8490,14 +8345,14 @@ pub fn retain_failed_runtime_worker_attempts( .into_iter() .map(|launch| (launch.job_id.clone(), launch)) .collect::>(); - let typed_request_ids = launches + let typed_requests = launches .values() .map(|launch| { + let document = launch.launch_document()?; + let request = document.typed_request_ref()?; Ok(( launch.job_id.clone(), - launch - .typed_request_ref()? - .map(|request| request.request_id().to_string()), + request.map(|request| (request.kind(), request.request_id().to_string())), )) }) .collect::>>()?; @@ -8522,7 +8377,7 @@ pub fn retain_failed_runtime_worker_attempts( ) { return None; } - let request_id = typed_request_ids.get(&claim.job_id)?.as_deref()?; + let request_id = typed_requests.get(&claim.job_id)?.as_ref()?.1.as_str(); (!live_resident_request_ids.contains(request_id)).then_some(claim) }) .collect::>(); @@ -8556,14 +8411,14 @@ pub fn retain_fulfilled_runtime_worker_attempts( .into_iter() .map(|launch| (launch.job_id.clone(), launch)) .collect::>(); - let typed_request_ids = launches + let typed_requests = launches .values() .map(|launch| { + let document = launch.launch_document()?; + let request = document.typed_request_ref()?; Ok(( launch.job_id.clone(), - launch - .typed_request_ref()? - .map(|request| request.request_id().to_string()), + request.map(|request| (request.kind(), request.request_id().to_string())), )) }) .collect::>>()?; @@ -8586,16 +8441,19 @@ pub fn retain_fulfilled_runtime_worker_attempts( .into_iter() .filter(|(status, _)| status.is_fulfilled_terminal()) .filter_map(|(_, claim)| { - let launch = launches.get(&claim.job_id)?; + launches.get(&claim.job_id)?; let job = jobs.get(&claim.job_id)?; let result = role_results.get(&claim.job_id)?; if job.status != EpiphanyRuntimeJobStatus::Completed - || (launch.proposal_modeling_request_id.is_some() + || (typed_requests + .get(&claim.job_id)? + .as_ref() + .is_some_and(|(kind, _)| *kind == "proposal-modeling") && !worker_result_has_keyed_mind_commit(&cache, result).ok()?) { return None; } - let request_id = typed_request_ids.get(&claim.job_id)?.as_deref()?; + let request_id = typed_requests.get(&claim.job_id)?.as_ref()?.1.as_str(); (!live_resident_request_ids.contains(request_id)).then_some(claim) }) .collect::>(); diff --git a/epiphany-core/src/runtime_worker_attempt.rs b/epiphany-core/src/runtime_worker_attempt.rs index bb52aa2d..e96ddc28 100644 --- a/epiphany-core/src/runtime_worker_attempt.rs +++ b/epiphany-core/src/runtime_worker_attempt.rs @@ -84,77 +84,50 @@ impl<'a> RuntimeTypedRequestRef<'a> { } } - pub(crate) fn matches_launch(self, launch: &crate::EpiphanyRuntimeWorkerLaunchRequest) -> bool { - match self { - Self::ProposalModeling(id) => { - launch.proposal_modeling_request_id.as_deref() == Some(id) - } - Self::FrontierVerdictModeling(id) => { - launch.repo_frontier_modeling_request_id.as_deref() == Some(id) - } - Self::FrontierResearch(id) => { - launch.repo_frontier_research_request_id.as_deref() == Some(id) - } - Self::FrontierVerification(id) => { - launch.repo_frontier_verification_request_id.as_deref() == Some(id) - } - Self::ImaginationConsideration(id) => { - launch.imagination_consideration_request_id.as_deref() == Some(id) - } - Self::AdmittedModelDirection(id) => { - launch - .admitted_model_direction_consideration_request_id - .as_deref() - == Some(id) - } - } - } - - pub(crate) fn matches_result(self, result: &crate::EpiphanyRuntimeRoleWorkerResult) -> bool { - match self { - Self::ProposalModeling(id) => { - result.proposal_modeling_request_id.as_deref() == Some(id) - } - Self::FrontierVerdictModeling(id) => { - result.repo_frontier_modeling_request_id.as_deref() == Some(id) - } - Self::FrontierResearch(id) => { - result.repo_frontier_research_request_id.as_deref() == Some(id) - } - Self::FrontierVerification(id) => result.verification_request_id.as_deref() == Some(id), - Self::ImaginationConsideration(id) => { - result.imagination_consideration_request_id.as_deref() == Some(id) - } - Self::AdmittedModelDirection(id) => { - result - .admitted_model_direction_consideration_request_id - .as_deref() - == Some(id) - } - } + pub(crate) fn matches_launch( + self, + launch: &crate::EpiphanyRuntimeWorkerLaunchRequest, + ) -> Result { + let document = launch.launch_document()?; + Ok(document.typed_request_ref()? == Some(self)) } } -impl crate::EpiphanyRuntimeWorkerLaunchRequest { +impl crate::EpiphanyWorkerLaunchDocument { pub(crate) fn typed_request_ref(&self) -> Result>> { + let crate::EpiphanyWorkerLaunchDocument::Role(document) = self else { + return Ok(None); + }; let requests = [ - self.proposal_modeling_request_id - .as_deref() + document + .proposal_modeling_context + .as_ref() + .map(|context| context.request_id.as_str()) .map(RuntimeTypedRequestRef::ProposalModeling), - self.repo_frontier_modeling_request_id - .as_deref() + document + .frontier_verdict_modeling_context + .as_ref() + .map(|context| context.request.request_id.as_str()) .map(RuntimeTypedRequestRef::FrontierVerdictModeling), - self.repo_frontier_research_request_id - .as_deref() + document + .frontier_research_context + .as_ref() + .map(|context| context.request_id.as_str()) .map(RuntimeTypedRequestRef::FrontierResearch), - self.repo_frontier_verification_request_id - .as_deref() + document + .frontier_verification_context + .as_ref() + .map(|context| context.request.request_id.as_str()) .map(RuntimeTypedRequestRef::FrontierVerification), - self.imagination_consideration_request_id - .as_deref() + document + .imagination_consideration_context + .as_ref() + .map(|context| context.request.request_id.as_str()) .map(RuntimeTypedRequestRef::ImaginationConsideration), - self.admitted_model_direction_consideration_request_id - .as_deref() + document + .admitted_model_direction_consideration_context + .as_ref() + .map(|context| context.request.request_id.as_str()) .map(RuntimeTypedRequestRef::AdmittedModelDirection), ] .into_iter() diff --git a/epiphany-core/src/surfaces/mod.rs b/epiphany-core/src/surfaces/mod.rs index a40e5898..48b62e00 100644 --- a/epiphany-core/src/surfaces/mod.rs +++ b/epiphany-core/src/surfaces/mod.rs @@ -19,6 +19,8 @@ pub use role_result::EpiphanyRoleFindingInterpretation; pub use role_result::EpiphanyRoleResultRoleId; pub use role_result::interpret_runtime_reorient_worker_result; pub use role_result::interpret_runtime_role_worker_result; +pub use worker_launch::ADMITTED_MODEL_DIRECTION_CONSIDERATION_CONTEXT_CONTRACT; +pub use worker_launch::ADMITTED_MODEL_DIRECTION_CONSIDERATION_CONTEXT_SCHEMA_VERSION; pub use worker_launch::AdmittedModelDirectionConsiderationContextProjection; pub use worker_launch::EpiphanyReorientWorkerLaunchDocument; pub use worker_launch::EpiphanyRoleWorkerLaunchDocument; diff --git a/epiphany-core/src/surfaces/role_result.rs b/epiphany-core/src/surfaces/role_result.rs index 740cd055..86dfe00a 100644 --- a/epiphany-core/src/surfaces/role_result.rs +++ b/epiphany-core/src/surfaces/role_result.rs @@ -32,9 +32,6 @@ pub struct EpiphanyRoleFindingInterpretation { pub repo_model_mutation_proposal: Option, pub job_error: Option, pub item_error: Option, - pub verification_request_id: Option, - pub frontier_route_id: Option, - pub proposal_modeling_request_id: Option, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] @@ -122,9 +119,6 @@ pub fn interpret_runtime_role_worker_result( | EpiphanyRoleResultRoleId::Verification | EpiphanyRoleResultRoleId::Reorientation => item_error, }, - verification_request_id: result.verification_request_id.clone(), - frontier_route_id: result.frontier_route_id.clone(), - proposal_modeling_request_id: result.proposal_modeling_request_id.clone(), } } diff --git a/epiphany-core/src/surfaces/worker_launch.rs b/epiphany-core/src/surfaces/worker_launch.rs index 5b9464bb..af709e3b 100644 --- a/epiphany-core/src/surfaces/worker_launch.rs +++ b/epiphany-core/src/surfaces/worker_launch.rs @@ -1,7 +1,7 @@ use serde::Deserialize; use serde::Serialize; -pub const ROLE_WORKER_OUTPUT_CONTRACT_ID: &str = "epiphany.worker.role_result.v4"; +pub const ROLE_WORKER_OUTPUT_CONTRACT_ID: &str = "epiphany.worker.role_result.v5"; pub const REORIENT_WORKER_OUTPUT_CONTRACT_ID: &str = "epiphany.worker.reorient_result.v0"; pub const REPO_FRONTIER_PROPOSAL_MODELING_CONTEXT_SCHEMA_VERSION: &str = "epiphany.worker.repo_frontier_proposal_modeling_context.v4"; @@ -102,6 +102,25 @@ pub struct EpiphanyRoleWorkerLaunchDocument { Option, } +impl EpiphanyRoleWorkerLaunchDocument { + pub(crate) fn family_context_count(&self) -> usize { + [ + self.proposal_modeling_context.is_some(), + self.frontier_verdict_modeling_context.is_some(), + self.frontier_planning_context.is_some(), + self.frontier_research_context.is_some(), + self.frontier_verification_context.is_some(), + self.frontier_plan_mind_context.is_some(), + self.imagination_consideration_context.is_some(), + self.admitted_model_direction_consideration_context + .is_some(), + ] + .into_iter() + .filter(|present| *present) + .count() + } +} + #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RepoFrontierResearchContextProjection { diff --git a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs index c9483c69..948e05db 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs @@ -463,16 +463,20 @@ async fn run_worker_launch( epiphany_core::put_reasoning_basis(&options.store_path, &basis)?; let mut initial_request = build_worker_model_request(&launch_request, &options.provider, &options.model, &basis)?; - let requested_public_source_intents = - if launch_request.repo_frontier_research_request_id.is_some() { - epiphany_core::put_runtime_requested_public_source_intents( - &options.store_path, - &options.job_id, - &now(), - )? - } else { - Vec::new() - }; + let is_frontier_research = matches!( + launch_request.launch_document()?, + epiphany_core::EpiphanyWorkerLaunchDocument::Role(document) + if document.frontier_research_context.is_some() + ); + let requested_public_source_intents = if is_frontier_research { + epiphany_core::put_runtime_requested_public_source_intents( + &options.store_path, + &options.job_id, + &now(), + )? + } else { + Vec::new() + }; let mut requested_public_source_runs = Vec::new(); for intent in &requested_public_source_intents { requested_public_source_runs.push(run_tool_adapter( @@ -1276,14 +1280,6 @@ mod tests { }, ), output_contract_id: epiphany_core::ROLE_WORKER_OUTPUT_CONTRACT_ID.to_string(), - proposal_modeling_request_id: None, - frontier_planning_request_id: None, - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, created_at: now(), }, )?; @@ -1375,14 +1371,6 @@ mod tests { }, ), output_contract_id: epiphany_core::ROLE_WORKER_OUTPUT_CONTRACT_ID.to_string(), - proposal_modeling_request_id: None, - frontier_planning_request_id: None, - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, created_at: now(), }, )?; @@ -1493,14 +1481,6 @@ mod tests { }, ), output_contract_id: epiphany_core::ROLE_WORKER_OUTPUT_CONTRACT_ID.to_string(), - proposal_modeling_request_id: None, - frontier_planning_request_id: None, - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, created_at: now(), }, )?; diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index 511732a9..d9efaf2d 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -348,7 +348,7 @@ pub fn build_worker_model_request( )); } } - let output_schema_json = worker_output_schema_json(launch_request, &launch_document)?; + let output_schema_json = worker_output_schema_json(&launch_document)?; let request_id = format!( "worker-{}-{}", sanitize_request_id(&launch_request.job_id), @@ -1079,7 +1079,7 @@ fn worker_instructions( launch_request: &EpiphanyRuntimeWorkerLaunchRequest, launch_document: &EpiphanyWorkerLaunchDocument, ) -> String { - let output_contract = worker_output_contract_text(launch_request, launch_document); + let output_contract = worker_output_contract_text(launch_document); let dynamic_context = launch_document .dynamic_prompt_context() .map(|context| format!("\n\n{context}")) @@ -1090,10 +1090,7 @@ fn worker_instructions( ) } -fn worker_output_schema_json( - launch_request: &EpiphanyRuntimeWorkerLaunchRequest, - document: &EpiphanyWorkerLaunchDocument, -) -> Result { +fn worker_output_schema_json(document: &EpiphanyWorkerLaunchDocument) -> Result { let schema = match document { EpiphanyWorkerLaunchDocument::Role(document) => { if document.frontier_plan_mind_context.is_some() { @@ -1116,27 +1113,12 @@ fn worker_output_schema_json( } else if document.proposal_modeling_context.is_some() { epiphany_core::epiphany_proposal_modeling_output_schema() } else if role_id == epiphany_core::EpiphanyRoleResultRoleId::Modeling - && launch_request.repo_frontier_modeling_request_id.is_some() + && document.frontier_verdict_modeling_context.is_some() { - let request_id = launch_request - .repo_frontier_modeling_request_id - .as_deref() - .expect("checked verdict-bound Modeling request identity"); let authority = document .frontier_verdict_modeling_context .as_ref() - .ok_or_else(|| { - anyhow!( - "verdict-bound Modeling launch {request_id:?} omitted its typed authority body" - ) - })?; - if authority.request.request_id != request_id { - return Err(anyhow!( - "verdict-bound Modeling launch identity mismatch: indexed {:?}, authority {:?}", - request_id, - authority.request.request_id - )); - } + .expect("checked verdict-bound Modeling authority"); epiphany_core::epiphany_frontier_verdict_modeling_output_schema(authority) } else { epiphany_core::epiphany_role_launch_output_schema(role_id) @@ -1163,13 +1145,10 @@ fn role_result_id_for_launch_role( } } -fn worker_output_contract_text( - launch_request: &EpiphanyRuntimeWorkerLaunchRequest, - document: &EpiphanyWorkerLaunchDocument, -) -> &'static str { +fn worker_output_contract_text(document: &EpiphanyWorkerLaunchDocument) -> &'static str { match document { - EpiphanyWorkerLaunchDocument::Role(_) - if launch_request.repo_frontier_modeling_request_id.is_some() => + EpiphanyWorkerLaunchDocument::Role(document) + if document.frontier_verdict_modeling_context.is_some() => { "Required verdict-bound Modeling fields: roleId=modeling, verdict, summary, nextSafeMove, filesInspected, frontierNodeIds, evidenceIds, frontierVerdictGap. Emit only the semantic gap explaining the allowed resolved or blocked transition. Runtime binds the exact request, keyed RepoModel basis, frontier item and disposition, evidence identities, timestamps, proposal, strong reads, writes, and receipts. Do not emit repoModelOperations, repositoryBodyObservationBasis, request ids, generic Mind patches, selfPatch, commands, release, or deployment cargo." } @@ -1414,14 +1393,6 @@ fn role_worker_result_from_ingress( runtime_evidence_ids: Vec, artifact_refs: Vec, ) -> EpiphanyRuntimeRoleWorkerResult { - let verification_authority = rmp_serde::from_slice::( - &launch_request.launch_document_msgpack, - ) - .ok() - .and_then(|document| match document { - EpiphanyWorkerLaunchDocument::Role(role) => role.frontier_verification_context, - EpiphanyWorkerLaunchDocument::Reorient(_) => None, - }); let accepted_evidence_ids = { let mut evidence_ids = clean_string_vec(&result.evidence_ids); evidence_ids.extend(clean_string_vec(&runtime_evidence_ids)); @@ -1782,10 +1753,6 @@ fn role_worker_result_from_ingress( (None, None) }; EpiphanyRuntimeRoleWorkerResult { - repository_body_observation_basis: role_id - .eq_ignore_ascii_case("modeling") - .then(|| repository_body_observation_basis.cloned()) - .flatten(), result_id: result_id.to_string(), job_id: launch_request.job_id.clone(), role_id: clean_optional_string(result.role_id.as_deref()) @@ -1822,26 +1789,9 @@ fn role_worker_result_from_ingress( ), metadata: std::collections::BTreeMap::new(), repo_model_mutation_proposal_msgpack, - verification_request_id: verification_authority - .as_ref() - .map(|authority| authority.request.request_id.clone()), - frontier_route_id: verification_authority - .as_ref() - .map(|authority| authority.route.route_id.clone()), - repo_frontier_modeling_request_id: launch_request.repo_frontier_modeling_request_id.clone(), - proposal_modeling_request_id: launch_request.proposal_modeling_request_id.clone(), - repo_frontier_research_request_id: launch_request.repo_frontier_research_request_id.clone(), - frontier_planning_request_id: launch_request.frontier_planning_request_id.clone(), frontier_plan_candidate_msgpack, - frontier_plan_mind_request_id: frontier_plan_mind_context - .map(|context| context.request.request_id.clone()), frontier_plan_mind_decision_msgpack, - imagination_consideration_request_id: imagination_consideration_context - .map(|context| context.request.request_id.clone()), imagination_consideration_candidate_msgpack, - admitted_model_direction_consideration_request_id: - admitted_model_direction_consideration_context - .map(|context| context.request.request_id.clone()), admitted_model_direction_consideration_result_msgpack, decision_context_id: decision_context_id.to_string(), } @@ -1856,8 +1806,13 @@ pub fn failed_frontier_planning_role_result( failure_summary: &str, decision_context_id: &str, ) -> Result> { - if launch_request.frontier_planning_request_id.is_none() - && launch_request.frontier_plan_mind_request_id.is_none() + let document = launch_request.launch_document()?; + let EpiphanyWorkerLaunchDocument::Role(document) = document else { + return Err(anyhow!( + "frontier planning failure projection requires a role launch" + )); + }; + if document.frontier_planning_context.is_none() && document.frontier_plan_mind_context.is_none() { return Ok(None); } @@ -1866,12 +1821,6 @@ pub fn failed_frontier_planning_role_result( "model-backed planning failure requires its sealed decision context" )); } - let document = launch_request.launch_document()?; - let EpiphanyWorkerLaunchDocument::Role(document) = document else { - return Err(anyhow!( - "frontier planning failure projection requires a role launch" - )); - }; let summary = failure_summary.trim().to_string(); Ok(Some(EpiphanyRuntimeRoleWorkerResult { result_id: format!("result-worker-{}", launch_request.job_id), @@ -1894,19 +1843,9 @@ pub fn failed_frontier_planning_role_result( item_error: Some(summary.clone()), metadata: std::collections::BTreeMap::new(), repo_model_mutation_proposal_msgpack: None, - verification_request_id: None, - frontier_route_id: None, - repo_frontier_modeling_request_id: None, - proposal_modeling_request_id: None, - repo_frontier_research_request_id: None, - frontier_planning_request_id: None, frontier_plan_candidate_msgpack: None, - frontier_plan_mind_request_id: None, frontier_plan_mind_decision_msgpack: None, - repository_body_observation_basis: document.repository_body_observation_basis, - imagination_consideration_request_id: None, imagination_consideration_candidate_msgpack: None, - admitted_model_direction_consideration_request_id: None, admitted_model_direction_consideration_result_msgpack: None, decision_context_id: decision_context_id.to_string(), })) @@ -2266,14 +2205,6 @@ mod tests { document_kind: "role".into(), launch_document_msgpack: Vec::new(), metadata: std::collections::BTreeMap::new(), - proposal_modeling_request_id: Some("proposal-request-1".into()), - frontier_planning_request_id: None, - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, }; let basis = epiphany_core::RepositoryBodyObservationBasis { schema_version: "epiphany.repository_body.v2".into(), @@ -2345,11 +2276,6 @@ mod tests { vec!["openai-request:proposal".into()], Vec::new(), ); - assert_eq!(result.repository_body_observation_basis, Some(basis)); - assert_eq!( - result.proposal_modeling_request_id.as_deref(), - Some("proposal-request-1") - ); assert!(result.evidence_ids.contains(&"proposal-1".to_string())); let proposal: epiphany_core::EpiphanyRepoModelMutationProposal = rmp_serde::from_slice( result @@ -2399,14 +2325,6 @@ mod tests { document_kind: "role".into(), launch_document_msgpack: Vec::new(), metadata: std::collections::BTreeMap::new(), - proposal_modeling_request_id: None, - frontier_planning_request_id: None, - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, }; let atlas = RoleWorkerResultIngress { role_id: Some("modeling".into()), @@ -2537,14 +2455,6 @@ mod tests { document_kind: "role".into(), launch_document_msgpack: rmp_serde::to_vec_named(&document)?, metadata: std::collections::BTreeMap::new(), - proposal_modeling_request_id: Some("proposal-request-1".into()), - frontier_planning_request_id: None, - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, }; let request = build_worker_model_request( @@ -2614,14 +2524,6 @@ mod tests { document_kind: "role".into(), launch_document_msgpack: Vec::new(), metadata: std::collections::BTreeMap::new(), - proposal_modeling_request_id: None, - frontier_planning_request_id: Some("planning-request-1".into()), - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, }; let planning_context = epiphany_core::RepoFrontierPlanningContextProjection { schema_version: epiphany_core::REPO_FRONTIER_PLANNING_CONTEXT_SCHEMA_VERSION.into(), @@ -2655,10 +2557,6 @@ mod tests { Vec::new(), Vec::new(), ); - assert_eq!( - result.frontier_planning_request_id.as_deref(), - Some("planning-request-1") - ); assert!(result.research_decision_msgpack.is_none()); let candidate = result .frontier_plan_candidate()? @@ -2772,14 +2670,6 @@ mod tests { document_kind: "role".into(), launch_document_msgpack: Vec::new(), metadata: std::collections::BTreeMap::new(), - proposal_modeling_request_id: None, - frontier_planning_request_id: None, - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: Some(request.request_id.clone()), - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, }; let result = role_worker_result_from_ingress( &launch, @@ -2798,10 +2688,6 @@ mod tests { Vec::new(), Vec::new(), ); - assert_eq!( - result.imagination_consideration_request_id.as_deref(), - Some("request-1") - ); let candidate = result .imagination_consideration_candidate()? .expect("runtime-composed candidate"); @@ -2845,7 +2731,24 @@ mod tests { repository_body_observation_basis: None, proposal_modeling_context: None, frontier_verdict_modeling_context: None, - frontier_planning_context: None, + frontier_planning_context: Some( + epiphany_core::RepoFrontierPlanningContextProjection { + schema_version: + epiphany_core::REPO_FRONTIER_PLANNING_CONTEXT_SCHEMA_VERSION.into(), + contract: epiphany_core::REPO_FRONTIER_PLANNING_CONTEXT_CONTRACT.into(), + request_id: "planning-request-failed".into(), + model_projection_digest: "model-digest".into(), + model_source_documents: Vec::new(), + frontier_item_id: "frontier-failed".into(), + frontier_item_hash: "frontier-hash".into(), + selected_organ: "Imagination".into(), + repository_scope: vec!["src".into()], + requested_at: "2026-07-15T09:59:00Z".into(), + runtime_id: "runtime-1".into(), + frontier_authority_documents: Vec::new(), + claim_obligation_documents: Vec::new(), + }, + ), frontier_research_context: None, frontier_verification_context: None, frontier_plan_mind_context: None, @@ -2862,14 +2765,6 @@ mod tests { document_kind: "role".into(), launch_document_msgpack: rmp_serde::to_vec_named(&document)?, metadata: std::collections::BTreeMap::new(), - proposal_modeling_request_id: None, - frontier_planning_request_id: Some("planning-request-1".into()), - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, }; let failed = failed_frontier_planning_role_result( &launch, @@ -2880,7 +2775,6 @@ mod tests { assert_eq!(failed.job_id, launch.job_id); assert_eq!(failed.role_id, "imagination"); assert_eq!(failed.item_error.as_deref(), Some("candidate mismatch")); - assert!(failed.frontier_planning_request_id.is_none()); assert!(failed.frontier_plan_candidate_msgpack.is_none()); assert!(failed.research_decision_msgpack.is_none()); assert!(failed.repo_model_mutation_proposal_msgpack.is_none()); @@ -2907,14 +2801,6 @@ mod tests { document_kind: "role".into(), launch_document_msgpack: Vec::new(), metadata: std::collections::BTreeMap::new(), - proposal_modeling_request_id: None, - frontier_planning_request_id: None, - frontier_plan_mind_request_id: Some("mind-request-1".into()), - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, }; let context = epiphany_core::RepoFrontierPlanMindContextProjection { schema_version: epiphany_core::REPO_FRONTIER_PLAN_MIND_CONTEXT_SCHEMA_VERSION.into(), @@ -2976,10 +2862,6 @@ mod tests { Vec::new(), Vec::new(), ); - assert_eq!( - result.frontier_plan_mind_request_id.as_deref(), - Some("mind-request-1") - ); let decision = result .frontier_plan_mind_decision()? .expect("typed Mind decision"); @@ -3450,14 +3332,6 @@ mod tests { }, ), output_contract_id: epiphany_core::ROLE_WORKER_OUTPUT_CONTRACT_ID.to_string(), - proposal_modeling_request_id: None, - frontier_planning_request_id: None, - frontier_plan_mind_request_id: None, - imagination_consideration_request_id: None, - admitted_model_direction_consideration_request_id: None, - repo_frontier_modeling_request_id: None, - repo_frontier_research_request_id: None, - repo_frontier_verification_request_id: None, created_at: now(), }, )?; From d75583c45e1130e15ca1072f9dbbdb83eb2faa15 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 19:42:14 +0200 Subject: [PATCH 084/340] Record sealed launch authority cut --- notes/epiphany-current-algorithmic-map.md | 39 ++++++++++++++---- notes/epiphany-fork-implementation-plan.md | 9 +++++ notes/fresh-workspace-handoff.md | 44 +++++++++++++++------ state/ledgers.msgpack | Bin 720980 -> 721401 bytes state/map.yaml | 23 ++++++++--- state/scratch.md | 18 ++++++--- 6 files changed, 102 insertions(+), 31 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 2fc6926b..5b60d184 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -696,7 +696,7 @@ open. | concrete family admission owners | sealed decision context, exact family request/result chain, affected semantic documents | one family-specific `MindMutation` | The model cannot choose which stale state is safe to ignore. | | `current_work.rs` | keyed Mind view and exact runtime request/job/result/decision families | pure family scheduling and continuation projections | Events, timestamps, role lanes, and thread provenance cannot create or suppress work. | | coordinator policy/status | keyed Mind presence, exact current work, and the accepted continuity decision | one action/reason pair plus operator-readable role lanes | Coordinator presence is derived; no mutable coordinator head, pressure tableau, or duplicate policy wrapper exists. | -| runtime worker attempt owner | immutable launch, exact process claim, typed result, job result, archival evidence | one terminal attempt authority | Scheduling, process liveness, and semantic admission remain distinct authorities. | +| runtime worker attempt owner | sealed typed launch, exact process claim, semantic result or typed failure, job result, archival evidence | one terminal attempt authority | The launch document solely owns live family identity. The result cannot repeat routing identity; after live deletion the archive owns exact request kind/ID beside the preserved structured decision. Scheduling, process liveness, and semantic admission remain distinct authorities. | | model-provider boundary | sealed native model request plus explicit provider configuration | exact internally derived provider request and transport result | OpenRouter remains a release-owned direct boundary. Codex crosses the lean CodexConnector client ABI; the daemon owns only caller admission, credential refresh, exact transport, and durable replay. Provider selection cannot author a second request truth or admit Mind state. | | OpenAI Responses schema projector | full native typed output schema | one provider-legal strict generation schema | Provider formatting preserves useful supported constraints but never replaces native decoding or Mind admission. | | model-pass terminal owner | sealed reasoning basis/context and typed failure class | exact transport closure plus `EpiphanyModelPassFailure` and terminal session/job result in one batch CAS | The caller cannot nominate a job/session; the context-derived binding closes role, reorient, and Persona failures without granting generic transport results decision authority. | @@ -1016,6 +1016,16 @@ flowchart TD Eyes may create evidence that creates Modeling work. Eyes acceptance never suppresses or authorizes ordinary Body Modeling. +Exact `edb5c3a3` deletes the eight optional family request-ID mirrors from the +generic worker launch and heartbeat options, plus their terminal-result echoes, +the copied Body basis, and the copied frontier route. Every current-work, +admission, retry, schema, and tool path derives live family identity from the +sealed typed launch. A successful terminal result must contain the semantic +payload required by that context; a typed failure contains one nonempty error +and no success cargo. Retained attempts carry request kind/ID explicitly because +retention deletes the live launch. Runtime is v39 and the role-result contract +is v5; no old-store reader exists. + Each simple unresolved model-pass family embeds one `EpiphanyAgentPassAttemptProjection`: continuation action plus the exact latest runtime job identity when one exists. Body, proposal and frontier-verdict @@ -1051,11 +1061,14 @@ worker, and reasoning basis are read from the exact native model request. A tool binding contains only intent, session, and job identity; its optional model ancestry is read from the exact typed tool intent. Validation and retention reload those owners. No binding timestamp participates in causality. -Runtime writable state is v37. +Runtime writable state is v39. -The attempt aggregate centralizes exact request association and typed terminal -classification. Archived fulfilled attempts must retain recoverable decision -authority, not merely an ID/digest tombstone. +The sealed typed launch owns exact live request association. The terminal role +result owns only semantic decision cargo or typed failure. The archived attempt +owns historical request kind/ID and typed terminal classification after the +live launch is deleted. Archived fulfilled attempts retain the structured role +result, exact generic result family, and decision context—not an ID/digest +tombstone. The heartbeat scheduler does not exist. Resident Self directly selects the oldest pending pressure when no grant, prepared launch, or active lease exists. @@ -1121,12 +1134,22 @@ receipts, and their direct context links. Runtime retention may remove SSE frames, deltas, intermediate requests, provider events, and tool scaffolding only after the terminal context is sealed and the retained decision can still reach its basis/context without them. -The v1 worker-attempt archive embeds the exact typed role result and its -context-bound generic result family. The read-only decision audit consumes the -same durable records before and after archival. +The v1 worker-attempt archive embeds exact request kind/ID, the typed role +result, and its context-bound generic result family. The read-only decision +audit consumes the same durable records before and after archival; it never +reconstructs family identity from terminal-result echoes. ## Verification and open gates +Focused acceptance at exact `edb5c3a3` proves the complete keyed state-flow +across Body and both frontier Modeling families, Planning/PlanMind, +Hands/Verification, and Eyes/Research without thread-state or result-echo +authority. Content-addressed basis/context substitution, exact provider/tool +bytes, transcript-free audit, typed failure, disjoint merge, same-identity +conflict, and v38 writable-store refusal all pass. Core/OpenAI libraries and the +release-owned model binary compile natively. The cut removes 443 maintained +lines net; it does not claim a fresh package, Atlas Gate, or live collaboration. + Accepted through the local `5b799b12` source boundary: - core library `494/494`; diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 304d018e..0a338bcb 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -803,6 +803,15 @@ Cut in this order: run summary loses its fixed adapter/schema catalogue and caller-supplied store echo. Exact authority remains the typed receipt; stdout returns only intent ID, receipt ID, and terminal status. +47. **The sealed launch owns pass-family identity at `edb5c3a3`:** eight + optional request-ID mirrors are deleted from worker launch/runtime options, + and terminal role results lose the same family echoes plus copied Body basis + and frontier route. Live routing decodes the typed launch; retained history + uses archived request kind/ID beside the preserved structured decision. + Success requires the family semantic payload and typed failure forbids + success cargo. Runtime is v39 and role-result output is v5 with no legacy + reader. The next subtraction target is the generic runtime session + aggregate, not a replacement launch registry. Do not preserve the aggregate for compatibility, manufacture a bootstrap thread, release autonomous scheduling, register topology in `gamecult-ops`, diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index b1343d08..b1b677e6 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,11 +2,11 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed Epiphany source cut: `07529fb5` +Latest committed Epiphany source cut: `edb5c3a3` Current connector source: `54d8bc2525b7e7fa1b9dd26b95871247ff4c7566` -Current pass: source subtraction continues after collapsing semantic state into -Core; duplicate family request identities on generic worker launch/result -records are next; Ox17 and Atlas Gate 1 remain paused +Current pass: source subtraction continues after making the sealed typed worker +launch the sole live owner of pass-family identity; the generic runtime session +aggregate is next; Ox17 and Atlas Gate 1 remain paused ## Orientation @@ -17,7 +17,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `07529fb5` is the current +production symlink body and is inactive. Exact `edb5c3a3` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -104,6 +104,26 @@ Whole-Core Clippy exposes 58 pre-existing lints outside this cut. Verification generated 1.842 GB across 2,718 files; cleanup restored only the exact state inspector. +Exact `edb5c3a3` deletes the duplicate pass-family authority from runtime +physiology. Eight optional request-ID fields are gone from +`EpiphanyRuntimeWorkerLaunchRequest` and its heartbeat options. The terminal +role result no longer repeats those family identities, the Body observation +basis, or the frontier route. Live current-work, admission, retry, provider +schema selection, and tool setup decode the one sealed typed launch document. +After retention deletes that live launch, the archived attempt retains exact +request kind/ID beside the full structured decision and decision context. + +Terminal success now requires the semantic payload named by the sealed family +context; a typed failure requires one nonempty error and may carry no successful +semantic cargo. Runtime advances to v39 and the role-result output contract to +v5 with no old-store reader. The committed delta is 742 additions and 1,185 +deletions: 443 maintained lines removed. Core and OpenAI runtime libraries and +the release-owned model binary compile. The complete keyed state-flow test, +content-addressed/context substitution tests, transcript-free decision audit, +model-failure audit, concurrent disjoint/same-identity CAS proof, old-epoch +refusal, and focused proposal/Verification/Planning/consideration/Mind/provider +completion tests pass. + Exact `a6cf9383` quarantines concrete Codex/OpenRouter authentication, credential reading, and network transport at the two release entrypoints that perform inference. `epiphany-openai-runtime` now owns only exact native-request @@ -1189,13 +1209,13 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action The Ox17 deployment lane remains paused. Continue subtraction from exact -`07529fb5`: remove the optional family request-ID mirrors on the generic worker -launch and their role-result echoes wherever the exact typed launch document or -structured decision already owns identity. Delete their validators, -constructor defaults, and fixture assertions rather than replacing them with a -registry. Then audit whether the generic runtime session aggregate protects any -invariant not already owned by jobs, decision contexts, coordinator receipts, -and retention tombstones. The Connector CultMesh/Idunn/Yggdrasil proof and +`edb5c3a3`: map every reader and writer of `EpiphanyRuntimeSession` and +`EpiphanyArchivedRuntimeSession`. Determine whether session identity, objective, +coordinator note, lifecycle status, and archive membership protect an invariant +not already owned by exact jobs, native requests, decision contexts, +coordinator receipts, and retention tombstones. Delete the aggregate or reduce +it to the smallest earned physiology; do not replace it with a registry, +adapter, compatibility reader, or latest head. The Connector CultMesh/Idunn/Yggdrasil proof and Ghostlight adoption remain queued behind source stabilization. Preserve keyed Mind, direct Body-to-Modeling flow, consequence receipts, and the complete Model Atlas vertical slice; no live inter-swarm collaboration has run. diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 2daa905506469d557afed771fdc44e16e0c1f909..69a3968884f4161ef1df42a59085545afe1fed08 100644 GIT binary patch delta 421 zcmXAkJx>Bb5QaGfK@5qBK^u!PwugiOF=A!>NQ{Mv#>Q^Fn}ZE|AMDP8SE-?}v?BL6 zOe`$z`~_-n?Juw}alqo)$;{6C?z``I?$5-1T63y9-FCCv>0G_#mUExaTh7pNa5Bw5 zO!E#is|!qlDKd*pi77KnFVlSG^*4L`u2hT7nNK!cDQ|2#_UJ}<1n6IPyq0J|CWsZx+WMkFbPcpRbL1EIY>@Ax2yFignIELc#*H+pVneQCYt|jy-GG zXn-l7h6G_fQ1RFWFOCRr2qc%D=14A(7LoC^OsF1cL=e`O#N#w!Z6Ktw8s|dKYR&(E rgZ&E^Fp0fBCk?C-%7wE8qx}=M?QyJC- + Exact edb5c3a3 makes the sealed typed worker launch document the sole live + owner of pass-family identity. Eight optional request-ID fields disappear + from the persisted launch and heartbeat options; eight family echoes plus + Body basis and frontier-route echoes disappear from the terminal role + result. Live routing decodes the launch, while retained history uses the + archived attempt's exact request kind/ID and preserved structured decision. + Terminal success must carry the semantic payload required by its launch; + typed failure carries one nonempty error and no success cargo. Runtime + advances to v39 and the role-result contract to v5 with no compatibility + reader. The cut removes 443 maintained lines net. Focused Core, OpenAI + runtime, release-owned model binary, state-flow capstone, context audit, + concurrent CAS, failure, and old-epoch proofs pass. semantic_state_package_cut: >- Exact 07529fb5 deletes the epiphany-state-model package after proving epiphany-core is its sole consumer. The ordinary Serde semantic contracts @@ -62,10 +75,10 @@ current_status: semantic_cache_cut: Exact 856648de deletes the unused semantic-memory and workspace-coverage projection subsystem rather than preserving a second derived model of Mind. Four binaries, the local daemon supervisor, Qdrant/Ollama/Postgres configuration, projector policy/lifecycle/heartbeat/recovery state, semantic query/context packets, aggregate model revision/hash cargo, workspace file-cache reader, and Persona's always-empty semantic-recall fields are gone. No agent request builder or sealed reasoning projection consumed this cache. Modeling now reads the exact typed Body and keyed RepoModel projection directly; future retrieval evidence must enter through an earned typed provider receipt. Idunn remains the sole deployment and daemon-survival authority. Core 165/165, OpenAI runtime 25/25, and release construction 19/19 pass. repo_model_vocabulary_cut: Exact 6ea4ff3c deletes the redundant generic memory profile, dead SHA-1 ID factory, empty profile module, cache-only node/edge kinds, and impossible lifecycle variants. Exact 5218cf2c deletes the producerless RepoModel lifecycle-receipt family. Exact 8bb039af makes domains seed-owned and deletes the unreachable summary mutation/document/validation/registry path plus the test cargo that alone produced it. Exact ab1afc27 removes node salience/confidence and edge confidence because no owner read, validated, routed, or displayed those values. Modeling can author only the keyed repository operations advertised by its provider schema. Affected targets check cleanly; core remains 165/165, RepoModel 5/5, and reasoning-context 8/8. package_baseline: Exact d2ca66301fb6af4e7d2d27fff0b772b0f0fccdf4 remains the admitted production source and current symlink target. Its native serialized full-workspace gate passed with receipt SHA-256 de0fc6b360ce03493b13208d917dc8349801f03364617d966152c85846c47482. Idunn sealed 26 root-owned non-writable binaries plus release-witness.ccmp as release sha256-46407552b4a0937f63d2b7f2bd09a1dacb89d671a6e3807c97209159541aef06; witness-file SHA-256 is 348785ffb0fc3130d3b4538329870c6e6f8442a8da4a01b32fa9b7ffb1f01357. Source 9b9b5c85 also passed Idunn's native test gate under receipt SHA-256 6c6a71359f8c31297419665d2872f6982a89f84e197d71fc5b36a7fc86216093 and remains sealed as release sha256-30a910785a380224bbdbd56a7b742c8d058fa70cb72dab3562e3907903e0d191 with witness-file SHA-256 75bf52d31c56ea3b08e1a702273301c1db12a4b1ffae45e3d948ce8a29b50e1d. A foreign-target helper restarted Idunn during the Epiphany transaction; rollback restored d2ca, removed deployment.env, and left production Epiphany units inactive. OpenRouter model stealth/ox-alpha and its systemd-injected credential are readiness-proven. Idunn is active with zero restarts and its deployment brake is engaged. - summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. + summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. Exact edb5c3a3 deletes the launch, heartbeat, and terminal-result family identity mirrors: the sealed typed launch owns live pass identity and the archived attempt owns historical request identity. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. The pure OpenAI runtime library opens exact model execution and admits typed provider events. OpenRouter auth/networking remains a direct release-entrypoint boundary; Codex transport crosses the lean authenticated CodexConnector client ABI and no Codex auth, HTTP/SSE, Codex-home, or compiled Codex dependency remains in Epiphany. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Workers use one governed tool-capable route; no parallel no-tools mode survives. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v38. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. The pure OpenAI runtime library opens exact model execution and admits typed provider events. OpenRouter auth/networking remains a direct release-entrypoint boundary; Codex transport crosses the lean authenticated CodexConnector client ABI and no Codex auth, HTTP/SSE, Codex-home, or compiled Codex dependency remains in Epiphany. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Workers use one governed tool-capable route; no parallel no-tools mode survives. The sealed typed worker launch is the sole live owner of pass-family identity; terminal role results contain semantic decision cargo rather than routing echoes, and archived attempts retain historical request identity plus the structured decision. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v39. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. execution_binding_authority_cut: Exact ce6bff12 reduces model and tool execution bindings to the only facts they own. A model binding maps one native request to its runtime session and job; a tool binding maps one typed intent to its runtime session and job. Provider identity, source worker, reasoning basis, and model-request ancestry are no longer copied into bindings or compared through timestamp-shaped API arguments. Validation, retention, public-source lookup, worker terminality, decision sealing, and tool continuation reload the exact native request or tool intent. Runtime writable state advances to v37. Core, epoch refusal, transcript-free decision audit, OpenAI tool continuation, and the release-owned tool runtime pass. The cut removes 67 net source lines and leaves runtime_spine.rs at 9,300 physical lines with 50 public functions and 25 public structs. Verification generated 12.713 GiB across 19,134 files; Cargo cleanup restored the single 1.78 MiB state inspector. Atlas is untouched; no live inter-swarm collaboration has run. provider_transport_boundary_cut: Exact ed7357a2 removes Codex transport from Epiphany's compiled body. The complete epiphany-openai-codex-spine package, codex-login/codex-client graph, CODEX_HOME/auth.json readiness, direct Codex HTTP/SSE, and Codex credential creation/argv are gone. Model and Persona entrypoints use the lean typed client from exact CodexConnector 54d8bc2525b7e7fa1b9dd26b95871247ff4c7566 over authenticated loopback MessagePack; Connector owns Codex auth, transport, replay, and exact native/provider digest receipts. Epiphany retains sealed native/provider requests, strict schema/call-ID projection, tool continuation, decision admission, and typed receipt evidence. OpenRouter remains one direct ureq/Rustls boundary with its own credential and terminal-tool dialect. Model receipts advance to v1 and runtime to v38; caller identity, both request digests, and cached-token usage survive transcript deletion. The maintained non-lock source shrinks by 857 lines and Cargo.lock drops 4,830 lines. Core 150/150, runtime 21/21, adapter 5/5, model edge 12/12, Persona 1/1, exact launch checks, and focused no-deps Clippy pass. Two focused build roots totaling 10.8 GiB were removed; only the exact 1,776,640-byte state inspector at SHA-256 DD38855C6F092C2C53D2212A938E737643F41130F4681708840BA6075320A04E remains. Atlas is untouched and no collaboration acceptance is claimed. standalone_codex_transport_target: Independent GameCult/CodexConnector exact 54d8bc2525b7e7fa1b9dd26b95871247ff4c7566 owns one Cargo package and one public daemon binary. Its default library is the lean encrypted client/contract ABI; the daemon feature adds the public service, bounded raw Responses transport, the private digest-pinned official codex app-server credential child, and keyed CultCache replay. Active identity is sealed before provider I/O; the exact encrypted completion is durable before reply; completed replay survives restart byte-identically; restart-era active work refuses as indeterminate without consuming current capacity. Callers own native/provider projection, prompts, tools, decisions, and admission. Redacted CultMesh/Odin readiness, the independent Idunn target, Yggdrasil service installation, and Ghostlight's consumer/deployment cut remain open. No live credential or deployment authority has moved. @@ -167,10 +180,10 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability at 9,301 physical lines, 50 public functions, and 25 public structs; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. Sessions and jobs carry only lifecycle identity/status; terminal result documents own summaries and artifacts. Generic session/job creation is gone; real family launch, model execution, and coordinator owners create runtime physiology. The generic worker launch still mirrors eight optional family request identities beside its exact typed launch document, and structured role results repeat several of the same family identities. Continue deleting those duplicate authorities before considering a split or abstraction. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path remains an earned privilege boundary and its Yggdrasil issuer/crossing route still requires owning-lane repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Continue source subtraction from exact 07529fb5. Audit the eight optional family request-ID mirrors on EpiphanyRuntimeWorkerLaunchRequest and their role-result echoes against the exact typed launch document and structured terminal decision. Derive family identity from its existing owner and delete each redundant field, validator branch, constructor default, and fixture assertion without adding a generic launch registry or compatibility reader. Then reassess whether the generic runtime session aggregate protects any invariant not already owned by jobs, decision contexts, coordinator receipts, and retention tombstones. Keep the standalone Connector readiness/Idunn/Yggdrasil/Ghostlight deployment sequence queued until the source body stabilizes. Preserve one refresh writer, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live credential transfer, Ox root, or Model Atlas Gate run. + unresolved_authority: `runtime_spine.rs` remains the largest central liability; it still mixes immutable identity, sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. The sealed launch now solely owns live family identity and archived attempts own retained request identity. Sessions and jobs carry only lifecycle identity/status; terminal result documents own summaries and artifacts. Generic session/job creation is gone, but the generic runtime session aggregate may still duplicate ownership already present in exact jobs, native requests, decision contexts, coordinator receipts, and retention tombstones. Audit that aggregate before considering a split or abstraction. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path remains an earned privilege boundary and its Yggdrasil issuer/crossing route still requires owning-lane repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Continue source subtraction from exact edb5c3a3. Map every reader and writer of EpiphanyRuntimeSession and EpiphanyArchivedRuntimeSession. Decide whether session identity, objective, coordinator note, lifecycle status, and archive membership protect an invariant not already owned by exact jobs, native requests, decision contexts, coordinator receipts, and worker/session retention tombstones. Delete the aggregate or reduce it to the smallest earned physiology; do not add a registry, adapter, compatibility reader, or derived latest head. Keep the standalone Connector readiness/Idunn/Yggdrasil/Ghostlight deployment sequence queued until the source body stabilizes. Preserve one refresh writer, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live credential transfer, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone; archived worker retention keeps exact request/terminal identity, deletion digest, decision context, structured result, and terminal job records. Mind/runtime writable epochs are v10/v38. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator opening are the only session/job creation owners. The spine is 9,301 physical lines with 50 public functions and 25 public structs. Continue subtraction by tracing each public surface and verifier to a live consumer and consequential invariant; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, exact sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. The sealed typed launch document owns live pass-family identity. Terminal role results carry semantic outcome or typed failure, never duplicate family, route, or Body-basis routing fields. Archived worker attempts retain exact request kind/ID, deletion digest, decision context, structured result, and terminal job records after live launch deletion. Session/job documents carry lifecycle identity and status; terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone. Mind/runtime writable epochs are v10/v39. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator opening are the only session/job creation owners. Continue subtraction by auditing whether the generic runtime session aggregate retains any authority not already owned by exact jobs, requests, decision contexts, coordinator receipts, and retention tombstones; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. diff --git a/state/scratch.md b/state/scratch.md index ed456925..0bd3f4de 100644 --- a/state/scratch.md +++ b/state/scratch.md @@ -217,13 +217,19 @@ and janitors may reduce the symptom but cannot substitute for deleting code. re-exports, stale WebSocket patch pins, and 99 lockfile lines are gone. The commit removes 201 maintained lines net and one Cargo package without a schema-epoch change. -39. Next: apply the same ownership test to Body Modeling, Planning, PlanMind, - Imagination consideration, and Reorientation launch bindings. Delete the - family when the worker launch and typed request already own its facts; do not - create generic launch authority. -40. Continue the public runtime-spine and test-liability audit by live owner +39. Done: exact `edb5c3a3` deletes the eight optional family request-ID mirrors + from the generic worker launch and heartbeat options, then deletes the same + echoes plus Body-basis and route echoes from terminal role results. The + sealed typed launch owns live family identity; archived attempts own retained + request identity. Runtime is v39, the role-result contract is v5, and 443 net + maintained lines are gone. +40. Next: map every `EpiphanyRuntimeSession` and + `EpiphanyArchivedRuntimeSession` reader/writer. Delete or reduce the session + aggregate if exact jobs, native requests, decision contexts, coordinator + receipts, and retention tombstones already own its claimed invariants. +41. Continue the public runtime-spine and test-liability audit by live owner and consequential invariant. Do not subtract the unrun Atlas vertical slice; no inter-swarm collaboration has yet been exercised. Streamline it only around its one end-to-end authority map. -41. Run focused tests after each cut. Only after source subtraction stabilizes +42. Run focused tests after each cut. Only after source subtraction stabilizes should Idunn's build scratch contract be reconsidered. From cabdd6c386f35528defa1cbe2d17a59adc2468e6 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 20:16:31 +0200 Subject: [PATCH 085/340] Split coordinator authority from model sessions --- .../src/bin/epiphany-mvp-coordinator.rs | 36 +- epiphany-core/src/current_work.rs | 24 - epiphany-core/src/lib.rs | 3 +- epiphany-core/src/reasoning_context.rs | 24 - epiphany-core/src/reorientation_work.rs | 12 - epiphany-core/src/runtime_spine.rs | 525 ++++++++++-------- epiphany-core/src/runtime_store_backend.rs | 15 - .../src/bin/epiphany-openai-runtime.rs | 17 - epiphany-openai-runtime/src/lib.rs | 25 - .../src/persona_executor.rs | 37 +- 10 files changed, 328 insertions(+), 390 deletions(-) diff --git a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs index 9df3f9c2..26d41178 100644 --- a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs +++ b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs @@ -1315,11 +1315,7 @@ fn run_coordinator(args: &Args) -> Result { ]; let receipt_created_at = now(); let coordinator_run_receipt = EpiphanyCoordinatorRunReceipt { - receipt_id: format!( - "coordinator-run-{}-{}", - sanitize_id(&thread_id), - chrono::Utc::now().timestamp_millis() - ), + receipt_id: format!("coordinator-run-terminal-{runtime_session_id}"), session_id: runtime_session_id.clone(), thread_id: thread_id.clone(), mode: args.mode.clone(), @@ -1417,11 +1413,7 @@ fn failed_coordinator_run_receipt( ) -> EpiphanyCoordinatorRunReceipt { let created_at = now(); EpiphanyCoordinatorRunReceipt { - receipt_id: format!( - "coordinator-run-{}-failed-{}", - sanitize_id(thread_id), - chrono::Utc::now().timestamp_millis() - ), + receipt_id: format!("coordinator-run-terminal-{session_id}"), session_id: session_id.to_string(), thread_id: thread_id.to_string(), mode: args.mode.clone(), @@ -2092,7 +2084,7 @@ mod tests { } #[test] - fn coordinator_error_after_opening_terminalizes_the_exact_session() -> Result<()> { + fn coordinator_error_preserves_basis_and_writes_terminal_receipt() -> Result<()> { let smoke_root = env::current_dir()?.join(".epiphany-smoke"); fs::create_dir_all(&smoke_root)?; let temp = tempfile::tempdir_in(smoke_root)?; @@ -2141,17 +2133,25 @@ mod tests { ); let mut cache = epiphany_core::runtime_spine_cache(&runtime_store)?; cache.pull_all_backing_stores()?; - let session = cache.get_required::( - "coordinator-error-terminalization", - )?; - assert_eq!( - session.status, - epiphany_core::EpiphanyRuntimeSessionStatus::Completed + assert!( + cache + .get::( + "coordinator-error-terminalization", + )? + .is_some(), + "terminal receipt must retain the exact immutable coordinator basis" ); let receipts = cache.get_all::()?; assert_eq!(receipts.len(), 1); assert_eq!(receipts[0].status, "failed"); - assert_eq!(receipts[0].session_id, session.session_id); + assert_eq!(receipts[0].session_id, "coordinator-error-terminalization"); + assert!( + cache + .get::( + "coordinator-error-terminalization", + )? + .is_some() + ); Ok(()) } diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index 14ba5d0e..e6d3ad36 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -3694,12 +3694,6 @@ mod tests { failed_native.source_worker_job_id = Some(failed_launch.job_id.clone()); crate::open_runtime_model_execution( &store, - crate::RuntimeSpineSessionOptions { - session_id: "body-failed-model-session".into(), - objective: "Model the exact Body projection.".into(), - created_at: "2026-08-17T00:00:02.100Z".into(), - coordinator_note: "Test dead worker audit context.".into(), - }, crate::RuntimeSpineJobOptions { job_id: "body-failed-model-job".into(), session_id: "body-failed-model-session".into(), @@ -4675,12 +4669,6 @@ mod tests { verification_native.source_worker_job_id = Some(verification_job_id.clone()); crate::open_runtime_model_execution( &store, - crate::RuntimeSpineSessionOptions { - session_id: "verification-model-session".into(), - objective: "Verify the exact Hands consequence.".into(), - created_at: "2026-08-17T00:00:14.750Z".into(), - coordinator_note: "Bound Verification model pass.".into(), - }, crate::RuntimeSpineJobOptions { job_id: "verification-model-job".into(), session_id: "verification-model-session".into(), @@ -5344,12 +5332,6 @@ mod tests { )?); crate::open_runtime_model_execution( &store, - crate::RuntimeSpineSessionOptions { - session_id: "planning-model-session".into(), - objective: "Propose the exact frontier plan.".into(), - created_at: "2026-08-17T00:00:21.750Z".into(), - coordinator_note: "Bound Planning model pass.".into(), - }, crate::RuntimeSpineJobOptions { job_id: "planning-model-job".into(), session_id: "planning-model-session".into(), @@ -5479,12 +5461,6 @@ mod tests { )?); crate::open_runtime_model_execution( &store, - crate::RuntimeSpineSessionOptions { - session_id: "plan-mind-model-session".into(), - objective: "Adjudicate the exact frontier plan.".into(), - created_at: "2026-08-17T00:00:22.250Z".into(), - coordinator_note: "Bound plan Mind model pass.".into(), - }, crate::RuntimeSpineJobOptions { job_id: "plan-mind-model-job".into(), session_id: "plan-mind-model-session".into(), diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index d9b4dc9c..fc5a61f5 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -200,7 +200,9 @@ pub use runtime_spine::EPIPHANY_RUNTIME_ROOT_SESSION_ID; pub use runtime_spine::EpiphanyArchivedRuntimeWorkerAttempt; pub use runtime_spine::EpiphanyArchivedRuntimeWorkerDecision; pub use runtime_spine::EpiphanyCoordinatorDeathRecovery; +pub use runtime_spine::EpiphanyCoordinatorRunBasis; pub use runtime_spine::EpiphanyCoordinatorRunReceipt; +pub use runtime_spine::EpiphanyCoordinatorRunTerminality; pub use runtime_spine::EpiphanyRuntimeIdentity; pub use runtime_spine::EpiphanyRuntimeJob; pub use runtime_spine::EpiphanyRuntimeJobResult; @@ -230,7 +232,6 @@ pub use runtime_spine::RuntimeSpineInitOptions; pub use runtime_spine::RuntimeSpineJobOptions; pub use runtime_spine::RuntimeSpineJobResultOptions; pub use runtime_spine::RuntimeSpineSessionClosureOptions; -pub use runtime_spine::RuntimeSpineSessionOptions; pub use runtime_spine::abandon_unactivated_runtime_worker_process; pub use runtime_spine::activate_runtime_worker_process; pub use runtime_spine::bind_runtime_repository_domain; diff --git a/epiphany-core/src/reasoning_context.rs b/epiphany-core/src/reasoning_context.rs index de65eef3..83055d3b 100644 --- a/epiphany-core/src/reasoning_context.rs +++ b/epiphany-core/src/reasoning_context.rs @@ -2235,12 +2235,6 @@ mod tests { let (initial_native, _) = requests(&reasoning_basis); crate::open_runtime_model_execution( &store, - crate::RuntimeSpineSessionOptions { - session_id: "session-1".into(), - objective: "Prove governed decision context".into(), - created_at: "2026-08-17T00:00:01Z".into(), - coordinator_note: "decision context binding test".into(), - }, crate::RuntimeSpineJobOptions { job_id: "model-job-1".into(), session_id: "session-1".into(), @@ -2288,12 +2282,6 @@ mod tests { ]); crate::open_runtime_model_execution( &store, - crate::RuntimeSpineSessionOptions { - session_id: "session-1".into(), - objective: "Prove governed decision context".into(), - created_at: "2026-08-17T00:00:04Z".into(), - coordinator_note: "decision context binding test".into(), - }, crate::RuntimeSpineJobOptions { job_id: "model-job-2".into(), session_id: "session-1".into(), @@ -2362,12 +2350,6 @@ mod tests { let (native, _provider) = requests(&reasoning_basis); crate::open_runtime_model_execution( &store, - crate::RuntimeSpineSessionOptions { - session_id: "failed-pass-session".into(), - objective: "Prove terminal failure ownership".into(), - created_at: "2026-08-18T00:00:01Z".into(), - coordinator_note: "model pass failure test".into(), - }, crate::RuntimeSpineJobOptions { job_id: "failed-model-job".into(), session_id: "failed-pass-session".into(), @@ -2587,12 +2569,6 @@ mod tests { let (native, _) = requests(&basis); crate::open_runtime_model_execution( &store, - crate::RuntimeSpineSessionOptions { - session_id: "session-1".into(), - objective: "Test sealed decision context".into(), - created_at: "2026-08-14T00:00:01Z".into(), - coordinator_note: "reasoning context test".into(), - }, crate::RuntimeSpineJobOptions { job_id: "model-job-1".into(), session_id: "session-1".into(), diff --git a/epiphany-core/src/reorientation_work.rs b/epiphany-core/src/reorientation_work.rs index 5cc2d3dd..ab0bc692 100644 --- a/epiphany-core/src/reorientation_work.rs +++ b/epiphany-core/src/reorientation_work.rs @@ -968,12 +968,6 @@ mod tests { )?); crate::open_runtime_model_execution( &store, - crate::RuntimeSpineSessionOptions { - session_id: "reorientation-model-session".into(), - objective: "Reorient from exact Mind state".into(), - created_at: "2026-08-18T10:00:03Z".into(), - coordinator_note: "test".into(), - }, crate::RuntimeSpineJobOptions { job_id: "reorientation-model-job".into(), session_id: "reorientation-model-session".into(), @@ -1098,12 +1092,6 @@ mod tests { )?); crate::open_runtime_model_execution( &store, - crate::RuntimeSpineSessionOptions { - session_id: "failed-reorientation-model-session".into(), - objective: "Fail from exact Mind state".into(), - created_at: "2026-08-18T10:00:10Z".into(), - coordinator_note: "test".into(), - }, crate::RuntimeSpineJobOptions { job_id: "failed-reorientation-model-job".into(), session_id: "failed-reorientation-model-session".into(), diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index 4efe7ee3..f69b4d4f 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -55,7 +55,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v39"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v40"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache(type = "epiphany.runtime.identity", schema = "EpiphanyRuntimeIdentity")] @@ -100,15 +100,25 @@ pub struct EpiphanyRuntimeSession { #[cultcache(key = 1)] pub session_id: String, #[cultcache(key = 2)] - pub objective: String, - #[cultcache(key = 3)] pub status: EpiphanyRuntimeSessionStatus, +} + +#[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] +#[cultcache( + type = "epiphany.coordinator_run_basis.v0", + schema = "EpiphanyCoordinatorRunBasis" +)] +pub struct EpiphanyCoordinatorRunBasis { + #[cultcache(key = 1)] + pub session_id: String, + #[cultcache(key = 2)] + pub thread_id: String, + #[cultcache(key = 3, default)] + pub resident_launch_digest: Option, #[cultcache(key = 4)] - pub created_at: String, + pub objective: String, #[cultcache(key = 5)] - pub updated_at: String, - #[cultcache(key = 6, default)] - pub coordinator_note: String, + pub started_at: String, } #[derive(Clone, Debug, PartialEq, DatabaseEntry)] @@ -582,16 +592,30 @@ pub struct EpiphanyCoordinatorRunReceipt { pub resident_executable_digest: Option, } +#[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] +#[cultcache( + type = "epiphany.coordinator_run_terminality.v0", + schema = "EpiphanyCoordinatorRunTerminality" +)] +pub struct EpiphanyCoordinatorRunTerminality { + #[cultcache(key = 1)] + pub terminal_id: String, + #[cultcache(key = 2)] + pub session_id: String, + #[cultcache(key = 3)] + pub terminal_kind: String, + #[cultcache(key = 4)] + pub authority_id: String, + #[cultcache(key = 5)] + pub authority_sha256: String, +} + #[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub enum EpiphanyRuntimeSessionStatus { #[default] - Proposed, Active, - WaitingForReview, - Sleeping, Completed, - Archived, } #[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] @@ -613,19 +637,9 @@ pub struct RuntimeSpineInitOptions { pub created_at: String, } -#[derive(Clone, Debug, PartialEq, Eq)] -pub struct RuntimeSpineSessionOptions { - pub session_id: String, - pub objective: String, - pub created_at: String, - pub coordinator_note: String, -} - #[derive(Clone, Debug, PartialEq, Eq)] pub struct RuntimeSpineSessionClosureOptions { pub session_id: String, - pub completed_at: String, - pub summary: String, } #[derive(Clone, Debug, PartialEq, Eq)] @@ -697,6 +711,8 @@ fn runtime_spine_schema_cache() -> Result { cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; + cache.register_entry_type::()?; + cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; @@ -920,8 +936,6 @@ pub fn close_runtime_session( options: RuntimeSpineSessionClosureOptions, ) -> Result { validate_non_empty(&options.session_id, "session id")?; - validate_non_empty(&options.completed_at, "session completion time")?; - validate_non_empty(&options.summary, "session completion summary")?; if options.session_id == EPIPHANY_RUNTIME_ROOT_SESSION_ID { return Err(anyhow!( "runtime root session {:?} is long-lived and cannot be generically completed", @@ -937,12 +951,6 @@ pub fn close_runtime_session( if session.status == EpiphanyRuntimeSessionStatus::Completed { return Ok(session); } - if session.status == EpiphanyRuntimeSessionStatus::Archived { - return Err(anyhow!( - "runtime session {:?} is archived and cannot be completed", - options.session_id - )); - } let open_job_ids = cache .get_all::()? .into_iter() @@ -965,8 +973,6 @@ pub fn close_runtime_session( )); } session.status = EpiphanyRuntimeSessionStatus::Completed; - session.updated_at = options.completed_at.clone(); - session.coordinator_note = options.summary.clone(); cache.put(&session.session_id, &session)?; Ok(session) } @@ -1089,8 +1095,6 @@ pub fn terminalize_model_pass_failure_session( )); } session.status = EpiphanyRuntimeSessionStatus::Completed; - session.updated_at = options.failed_at.clone(); - session.coordinator_note = options.summary.clone(); let mut expected = vec![session_envelope]; let mut replacements = vec![ cache.prepare_entry(&failure.failure_id, &failure)?.0, @@ -1168,24 +1172,13 @@ pub fn model_pass_failure_for_request( pub fn open_runtime_model_execution( store_path: impl AsRef, - session_options: RuntimeSpineSessionOptions, job_options: RuntimeSpineJobOptions, model_request: &EpiphanyModelRequest, ) -> Result { - validate_non_empty(&session_options.session_id, "model execution session id")?; - validate_non_empty(&session_options.objective, "model execution objective")?; - validate_non_empty( - &session_options.created_at, - "model execution session creation time", - )?; + validate_non_empty(&job_options.session_id, "model execution session id")?; validate_non_empty(&job_options.job_id, "model execution job id")?; validate_non_empty(&job_options.role, "model execution job role")?; validate_non_empty(&job_options.created_at, "model execution job creation time")?; - if job_options.session_id != session_options.session_id { - return Err(anyhow!( - "model execution job and session options disagree on session identity" - )); - } validate_non_empty(&model_request.request_id, "model execution request id")?; validate_non_empty(&model_request.provider, "model execution provider")?; let provider_request = epiphany_openai_adapter::request_from_native(model_request); @@ -1194,7 +1187,7 @@ pub fn open_runtime_model_execution( let mut cache = runtime_spine_cache(store_path)?; cache.pull_all_backing_stores()?; require_identity(&cache)?; - require_runtime_identity_not_archived(&cache, "session", &session_options.session_id)?; + require_runtime_identity_not_archived(&cache, "session", &job_options.session_id)?; require_runtime_identity_not_archived(&cache, "job", &job_options.job_id)?; require_runtime_identity_not_archived(&cache, "model-request", &model_request.request_id)?; let mut reasoning_basis_envelope = None; @@ -1253,21 +1246,14 @@ pub fn open_runtime_model_execution( } else { Vec::new() }; - let existing_session = cache.get::(&session_options.session_id)?; + let existing_session = cache.get::(&job_options.session_id)?; let session = existing_session .clone() .unwrap_or_else(|| EpiphanyRuntimeSession { - session_id: session_options.session_id.clone(), - objective: session_options.objective.clone(), + session_id: job_options.session_id.clone(), status: EpiphanyRuntimeSessionStatus::Active, - created_at: session_options.created_at.clone(), - updated_at: session_options.created_at.clone(), - coordinator_note: session_options.coordinator_note.clone(), }); - if matches!( - session.status, - EpiphanyRuntimeSessionStatus::Completed | EpiphanyRuntimeSessionStatus::Archived - ) { + if session.status == EpiphanyRuntimeSessionStatus::Completed { return Err(anyhow!( "model execution session {:?} is terminal", session.session_id @@ -1370,10 +1356,7 @@ pub fn put_runtime_tool_execution_intent( let session = cache .get::(session_id)? .ok_or_else(|| anyhow!("tool execution session {session_id:?} does not exist"))?; - if matches!( - session.status, - EpiphanyRuntimeSessionStatus::Completed | EpiphanyRuntimeSessionStatus::Archived - ) { + if session.status == EpiphanyRuntimeSessionStatus::Completed { return Err(anyhow!("tool execution session {session_id:?} is terminal")); } let job = cache @@ -1497,7 +1480,7 @@ pub(crate) fn validate_runtime_model_execution_binding( .ok_or_else(|| { anyhow!("model execution binding {request_id:?} lost its provider request") })?; - let session = cache + cache .get::(&binding.session_id)? .ok_or_else(|| anyhow!("model execution binding {request_id:?} lost its session"))?; let job = cache @@ -1505,7 +1488,6 @@ pub(crate) fn validate_runtime_model_execution_binding( .ok_or_else(|| anyhow!("model execution binding {request_id:?} lost its job"))?; if binding.request_id != request_id || provider != epiphany_openai_adapter::request_from_native(&native) - || session.status == EpiphanyRuntimeSessionStatus::Archived || job.session_id != binding.session_id { return Err(anyhow!( @@ -1570,15 +1552,13 @@ pub(crate) fn validate_runtime_tool_execution_binding( "tool execution binding {intent_id:?} disagrees with its intent" )); } - let session = cache + cache .get::(&binding.session_id)? .ok_or_else(|| anyhow!("tool execution binding {intent_id:?} lost its session"))?; let job = cache .get::(&binding.job_id)? .ok_or_else(|| anyhow!("tool execution binding {intent_id:?} lost its job"))?; - if session.status == EpiphanyRuntimeSessionStatus::Archived - || job.session_id != binding.session_id - { + if job.session_id != binding.session_id { return Err(anyhow!( "tool execution binding {intent_id:?} has foreign or archived ownership" )); @@ -1698,12 +1678,7 @@ pub fn retain_completed_runtime_sessions( }) }) .collect::>(); - candidates.sort_by(|left, right| { - right - .updated_at - .cmp(&left.updated_at) - .then_with(|| right.session_id.cmp(&left.session_id)) - }); + candidates.sort_by(|left, right| right.session_id.cmp(&left.session_id)); for session in candidates.into_iter().skip(retain_recent.max(1)) { archive_completed_model_session(store_path, &session.session_id)?; @@ -1797,9 +1772,11 @@ fn archive_completed_model_session( .iter() .any(|item| job_ids.contains(&item.job_id)) || cache - .get_all::()? - .iter() - .any(|item| item.session_id == session_id) + .get::(session_id)? + .is_some() + || cache + .get::(session_id)? + .is_some() { return Err(anyhow!( "runtime session archive refuses outer-worker or coordinator authority" @@ -2178,12 +2155,7 @@ pub fn prepare_runtime_spine_heartbeat_job( )); } let session = match cache.get::(&options.session_id)? { - Some(existing) - if matches!( - existing.status, - EpiphanyRuntimeSessionStatus::Completed | EpiphanyRuntimeSessionStatus::Archived - ) => - { + Some(existing) if existing.status == EpiphanyRuntimeSessionStatus::Completed => { return Err(anyhow!( "runtime session {:?} is terminal and cannot accept jobs", options.session_id @@ -2192,11 +2164,7 @@ pub fn prepare_runtime_spine_heartbeat_job( Some(existing) => existing, None => EpiphanyRuntimeSession { session_id: options.session_id.clone(), - objective: options.objective, status: EpiphanyRuntimeSessionStatus::Active, - created_at: options.created_at.clone(), - updated_at: options.created_at.clone(), - coordinator_note: options.coordinator_note, }, }; if cache.get::(&options.job_id)?.is_some() { @@ -7896,9 +7864,31 @@ fn validate_coordinator_run_receipt(receipt: &EpiphanyCoordinatorRunReceipt) -> validate_non_empty(&receipt.created_at, "coordinator run receipt created at")?; chrono::DateTime::parse_from_rfc3339(&receipt.created_at) .map_err(|error| anyhow!("coordinator run receipt timestamp is invalid: {error}"))?; + if receipt.receipt_id != format!("coordinator-run-terminal-{}", receipt.session_id) { + return Err(anyhow!( + "coordinator run receipt identity is not its session's terminal identity" + )); + } Ok(()) } +fn coordinator_run_terminality( + session_id: &str, + terminal_kind: &str, + authority_id: &str, + authority: &T, +) -> Result { + let payload = rmp_serde::to_vec_named(authority) + .context("failed to encode coordinator terminal authority")?; + Ok(EpiphanyCoordinatorRunTerminality { + terminal_id: format!("coordinator-run-terminal-{session_id}"), + session_id: session_id.to_string(), + terminal_kind: terminal_kind.to_string(), + authority_id: authority_id.to_string(), + authority_sha256: format!("sha256:{:x}", Sha256::digest(payload)), + }) +} + pub(crate) fn runtime_typed_request_attempt_exists( store_path: impl AsRef, request: RuntimeTypedRequestRef<'_>, @@ -8468,13 +8458,6 @@ pub fn retain_fulfilled_runtime_worker_attempts( Ok(()) } -fn coordinator_completion_summary(receipt: &EpiphanyCoordinatorRunReceipt) -> String { - format!( - "Coordinator run {:?} terminalized with status {:?}.", - receipt.receipt_id, receipt.status - ) -} - #[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] #[cultcache( type = "epiphany.coordinator_death_recovery.v0", @@ -8540,7 +8523,7 @@ pub fn open_coordinator_run( resident_launch_digest: Option<&str>, objective: &str, started_at: &str, -) -> Result { +) -> Result { validate_non_empty(session_id, "coordinator run session id")?; validate_non_empty(thread_id, "coordinator run thread id")?; validate_non_empty(objective, "coordinator run objective")?; @@ -8555,56 +8538,29 @@ pub fn open_coordinator_run( let mut cache = runtime_spine_cache(store_path)?; cache.pull_all_backing_stores()?; require_identity(&cache)?; - if cache.get::(session_id)?.is_some() + if cache + .get::(session_id)? + .is_some() || cache - .get::(session_id)? + .get::(session_id)? .is_some() - || cache - .get_all::()? - .iter() - .any(|receipt| { - receipt.session_id == session_id - || (resident_launch_digest.is_none() && receipt.thread_id == thread_id) - }) - || cache - .get_all::()? - .iter() - .any(|recovery| recovery.session_id == session_id) { return Err(anyhow!( "coordinator run session or thread authority already exists" )); } - let session = EpiphanyRuntimeSession { + let basis = EpiphanyCoordinatorRunBasis { session_id: session_id.to_string(), + thread_id: thread_id.to_string(), + resident_launch_digest: resident_launch_digest.map(str::to_string), objective: objective.to_string(), - status: EpiphanyRuntimeSessionStatus::Active, - created_at: started_at.to_string(), - updated_at: started_at.to_string(), - coordinator_note: "Coordinator owns native runtime receipts before process exit." - .to_string(), + started_at: started_at.to_string(), }; - let snapshot = cache.snapshot_envelopes(); - let replacements = vec![cache.prepare_entry(session_id, &session)?.0]; - if !runtime_spine_backing_store(store_path)? - .replace_and_append_if_snapshot_unchanged(&snapshot, replacements)? - { - return Err(anyhow!( - "coordinator run opening lost its full snapshot fence" - )); + let envelope = cache.prepare_entry(session_id, &basis)?.0; + if !runtime_spine_backing_store(store_path)?.compare_and_swap_batch(&[], vec![envelope])? { + return Err(anyhow!("coordinator run opening lost immutable admission")); } - Ok(session) -} - -fn coordinator_death_recovery_summary(recovery: &EpiphanyCoordinatorDeathRecovery) -> String { - format!( - "Continuity terminalized coordinator session after exact process observation {:?}{}.", - recovery.observation, - recovery - .exit_code - .map(|code| format!(" with exit code {code}")) - .unwrap_or_default() - ) + Ok(basis) } pub(crate) fn coordinator_run_incarnation_is_absent( @@ -8616,29 +8572,23 @@ pub(crate) fn coordinator_run_incarnation_is_absent( let mut cache = runtime_spine_cache(store_path)?; cache.pull_all_backing_stores()?; require_identity(&cache)?; - Ok(cache.get::(&session_id)?.is_none() + Ok(cache + .get::(&session_id)? + .is_none() && cache - .get::(&session_id)? + .get::(&session_id)? .is_none() && !cache .get_all::()? .iter() - .any(|job| job.session_id == session_id) - && !cache - .get_all::()? - .iter() - .any(|receipt| receipt.session_id == session_id) - && !cache - .get_all::()? - .iter() - .any(|recovery| recovery.session_id == session_id)) + .any(|job| job.session_id == session_id)) } pub(crate) fn recover_coordinator_run_after_exact_process_death( store_path: impl AsRef, recovery: &EpiphanyCoordinatorDeathRecovery, expected_objective: &str, -) -> Result { +) -> Result<()> { validate_non_empty(expected_objective, "recovered coordinator objective")?; if recovery.recovery_id != format!("coordinator-death-recovery-{}", recovery.session_id) || recovery.session_id @@ -8664,32 +8614,33 @@ pub(crate) fn recover_coordinator_run_after_exact_process_death( let mut cache = runtime_spine_cache(store_path)?; cache.pull_all_backing_stores()?; require_identity(&cache)?; - let mut session = cache - .get::(&recovery.session_id)? - .ok_or_else(|| anyhow!("coordinator death recovery session is absent"))?; - let completion_summary = coordinator_death_recovery_summary(recovery); - if session.status == EpiphanyRuntimeSessionStatus::Completed { - let existing_recovery = - cache.get::(&recovery.recovery_id)?; - if existing_recovery.as_ref() == Some(recovery) - && session.objective == expected_objective - && session.updated_at == recovery.recovered_at - && session.coordinator_note == completion_summary + let terminality = coordinator_run_terminality( + &recovery.session_id, + "death-recovery", + &recovery.recovery_id, + recovery, + )?; + if let Some(existing) = cache.get::(&recovery.session_id)? { + if existing == terminality + && cache.get::(&recovery.recovery_id)? + == Some(recovery.clone()) { - return Ok(session); + return Ok(()); } - return Err(anyhow!( - "completed coordinator session does not match exact death recovery" - )); + return Err(anyhow!("coordinator terminal authority conflict")); } - if session.status != EpiphanyRuntimeSessionStatus::Active - || session.objective != expected_objective + let basis = cache + .get::(&recovery.session_id)? + .ok_or_else(|| anyhow!("coordinator death recovery basis is absent"))?; + if basis.objective != expected_objective + || basis.thread_id != recovery.thread_id + || basis.resident_launch_digest.as_deref() != Some(&recovery.resident_launch_digest) { return Err(anyhow!( - "coordinator death recovery requires the exact active session objective" + "coordinator death recovery requires the exact run basis" )); } - let session_started_at = chrono::DateTime::parse_from_rfc3339(&session.created_at) + let session_started_at = chrono::DateTime::parse_from_rfc3339(&basis.started_at) .map_err(|error| anyhow!("coordinator session start timestamp is invalid: {error}"))?; let recovered_at = chrono::DateTime::parse_from_rfc3339(&recovery.recovered_at) .map_err(|error| anyhow!("coordinator death recovery timestamp is invalid: {error}"))?; @@ -8700,40 +8651,34 @@ pub(crate) fn recover_coordinator_run_after_exact_process_death( .iter() .any(|job| job.session_id == recovery.session_id) || cache - .get_all::()? - .iter() - .any(|receipt| receipt.session_id == recovery.session_id) - || cache - .get_all::()? - .iter() - .any(|existing| existing.session_id == recovery.session_id) + .get::(&recovery.session_id)? + .is_some() { return Err(anyhow!( "coordinator death recovery found substituted or competing authority" )); } - let snapshot = cache.snapshot_envelopes(); - session.status = EpiphanyRuntimeSessionStatus::Completed; - session.updated_at = recovery.recovered_at.clone(); - session.coordinator_note = completion_summary; + let basis_envelope = + cache.get_required_envelope::(&recovery.session_id)?; let replacements = vec![ - cache.prepare_entry(&session.session_id, &session)?.0, + basis_envelope.clone(), + cache + .prepare_entry(&terminality.session_id, &terminality)? + .0, cache.prepare_entry(&recovery.recovery_id, recovery)?.0, ]; if !runtime_spine_backing_store(store_path)? - .replace_and_append_if_snapshot_unchanged(&snapshot, replacements)? + .compare_and_swap_batch(&[basis_envelope], replacements)? { - return Err(anyhow!( - "coordinator death recovery lost its full snapshot fence" - )); + return Err(anyhow!("coordinator death recovery lost exact admission")); } - Ok(session) + Ok(()) } pub fn finalize_coordinator_run( store_path: impl AsRef, receipt: &EpiphanyCoordinatorRunReceipt, -) -> Result { +) -> Result<()> { validate_coordinator_run_receipt(receipt)?; if receipt.session_id != coordinator_run_session_id( @@ -8749,32 +8694,29 @@ pub fn finalize_coordinator_run( let mut cache = runtime_spine_cache(store_path)?; cache.pull_all_backing_stores()?; require_identity(&cache)?; - let mut session = cache - .get::(&receipt.session_id)? + let terminality = + coordinator_run_terminality(&receipt.session_id, "receipt", &receipt.receipt_id, receipt)?; + if let Some(existing) = cache.get::(&receipt.session_id)? { + if existing == terminality + && cache.get::(&receipt.receipt_id)? + == Some(receipt.clone()) + { + return Ok(()); + } + return Err(anyhow!("coordinator terminal authority conflict")); + } + let basis = cache + .get::(&receipt.session_id)? .ok_or_else(|| { anyhow!( - "coordinator run receipt session {:?} does not exist", + "coordinator run basis {:?} does not exist", receipt.session_id ) })?; - let completion_summary = coordinator_completion_summary(receipt); - if session.status == EpiphanyRuntimeSessionStatus::Completed { - let existing_receipt = cache.get::(&receipt.receipt_id)?; - if existing_receipt.as_ref() == Some(receipt) - && session.updated_at == receipt.created_at - && session.coordinator_note == completion_summary - { - return Ok(session); - } - return Err(anyhow!( - "completed coordinator session does not match the terminal run transaction" - )); - } - if session.status != EpiphanyRuntimeSessionStatus::Active { - return Err(anyhow!( - "coordinator run session {:?} is not active", - receipt.session_id - )); + if basis.thread_id != receipt.thread_id + || basis.resident_launch_digest != receipt.resident_launch_digest + { + return Err(anyhow!("coordinator run receipt substituted its run basis")); } if cache .get_all::()? @@ -8785,32 +8727,21 @@ pub fn finalize_coordinator_run( "coordinator run finalization refuses a session with runtime jobs" )); } - if cache - .get_all::()? - .iter() - .any(|existing| existing.session_id == receipt.session_id) - { - return Err(anyhow!( - "coordinator run session already has partial terminal authority" - )); - } - let expected_session = - cache.get_required_envelope::(&receipt.session_id)?; - session.status = EpiphanyRuntimeSessionStatus::Completed; - session.updated_at = receipt.created_at.clone(); - session.coordinator_note = completion_summary; + let basis_envelope = + cache.get_required_envelope::(&receipt.session_id)?; let replacements = vec![ - cache.prepare_entry(&session.session_id, &session)?.0, + basis_envelope.clone(), + cache + .prepare_entry(&terminality.session_id, &terminality)? + .0, cache.prepare_entry(&receipt.receipt_id, receipt)?.0, ]; if !runtime_spine_backing_store(store_path)? - .compare_and_swap_batch(&[expected_session], replacements)? + .compare_and_swap_batch(&[basis_envelope], replacements)? { - return Err(anyhow!( - "coordinator run finalization lost its exact session transaction" - )); + return Err(anyhow!("coordinator run finalization lost exact admission")); } - Ok(session) + Ok(()) } pub fn coordinator_run_receipts( @@ -9156,4 +9087,154 @@ pub(crate) mod tests { ); Ok(()) } + + #[test] + fn coordinator_terminal_receipts_preserve_exact_immutable_run_basis() -> Result<()> { + let temp = tempfile::tempdir()?; + let completed_store = temp.path().join("completed.cc"); + initialize_runtime_spine( + &completed_store, + RuntimeSpineInitOptions { + runtime_id: "coordinator-terminal-state".into(), + display_name: "Coordinator terminal state test".into(), + created_at: "2026-08-24T00:00:00Z".into(), + }, + )?; + let session_id = coordinator_run_session_id("thread-completed", None)?; + open_coordinator_run( + &completed_store, + &session_id, + "thread-completed", + None, + "Complete one coordinator run.", + "2026-08-24T00:00:01Z", + )?; + let receipt = EpiphanyCoordinatorRunReceipt { + receipt_id: format!("coordinator-run-terminal-{session_id}"), + session_id: session_id.clone(), + thread_id: "thread-completed".into(), + mode: "execute".into(), + status: "completed".into(), + final_action: "stop".into(), + final_reason: None, + created_at: "2026-08-24T00:00:02Z".into(), + resident_grant_id: None, + resident_launch_digest: None, + resident_policy_digest: None, + resident_argv_digest: None, + resident_objective_digest: None, + resident_release_commit: None, + resident_release_manifest_digest: None, + resident_executable_digest: None, + }; + finalize_coordinator_run(&completed_store, &receipt)?; + finalize_coordinator_run(&completed_store, &receipt)?; + let mut cache = runtime_spine_cache(&completed_store)?; + cache.pull_all_backing_stores()?; + assert!( + cache + .get::(&session_id)? + .is_some() + ); + assert!(cache.get::(&session_id)?.is_none()); + assert_eq!( + cache.get::(&receipt.receipt_id)?, + Some(receipt.clone()) + ); + assert_eq!( + cache + .get::(&session_id)? + .expect("completed run should have one terminality owner") + .authority_id, + receipt.receipt_id + ); + let mut competing_receipt = receipt; + competing_receipt.status = "failed".into(); + assert!(finalize_coordinator_run(&completed_store, &competing_receipt).is_err()); + + let recovered_store = temp.path().join("recovered.cc"); + initialize_runtime_spine( + &recovered_store, + RuntimeSpineInitOptions { + runtime_id: "coordinator-recovery-state".into(), + display_name: "Coordinator recovery state test".into(), + created_at: "2026-08-24T00:00:00Z".into(), + }, + )?; + let digest = format!("sha256:{}", "a".repeat(64)); + let recovered_session_id = coordinator_run_session_id("thread-recovered", Some(&digest))?; + let started_at = "2026-08-24T00:00:03Z"; + open_coordinator_run( + &recovered_store, + &recovered_session_id, + "thread-recovered", + Some(&digest), + "Resident coordinator launch objective-digest.", + started_at, + )?; + let recovery = EpiphanyCoordinatorDeathRecovery { + recovery_id: format!("coordinator-death-recovery-{recovered_session_id}"), + session_id: recovered_session_id.clone(), + thread_id: "thread-recovered".into(), + resident_grant_id: "grant-1".into(), + resident_launch_digest: digest, + process_id: 42, + process_creation_token: 7, + process_executable_path: "F:\\Epiphany\\epiphany-mvp-coordinator.exe".into(), + resident_started_at_millis: chrono::DateTime::parse_from_rfc3339(started_at)? + .timestamp_millis() as u64, + observation: "missing".into(), + recovered_at: "2026-08-24T00:00:04Z".into(), + private_state_exposed: false, + exit_code: None, + }; + recover_coordinator_run_after_exact_process_death( + &recovered_store, + &recovery, + "Resident coordinator launch objective-digest.", + )?; + recover_coordinator_run_after_exact_process_death( + &recovered_store, + &recovery, + "Resident coordinator launch objective-digest.", + )?; + let mut cache = runtime_spine_cache(&recovered_store)?; + cache.pull_all_backing_stores()?; + assert!( + cache + .get::(&recovered_session_id)? + .is_some() + ); + assert_eq!( + cache.get::(&recovery.recovery_id)?, + Some(recovery.clone()) + ); + assert_eq!( + cache + .get::(&recovered_session_id)? + .expect("recovered run should have one terminality owner") + .authority_id, + recovery.recovery_id + ); + let competing_receipt = EpiphanyCoordinatorRunReceipt { + receipt_id: format!("coordinator-run-terminal-{recovered_session_id}"), + session_id: recovered_session_id, + thread_id: "thread-recovered".into(), + mode: "execute".into(), + status: "completed".into(), + final_action: "stop".into(), + final_reason: None, + created_at: "2026-08-24T00:00:05Z".into(), + resident_grant_id: Some("grant-1".into()), + resident_launch_digest: Some(recovery.resident_launch_digest), + resident_policy_digest: None, + resident_argv_digest: None, + resident_objective_digest: None, + resident_release_commit: None, + resident_release_manifest_digest: None, + resident_executable_digest: None, + }; + assert!(finalize_coordinator_run(&recovered_store, &competing_receipt).is_err()); + Ok(()) + } } diff --git a/epiphany-core/src/runtime_store_backend.rs b/epiphany-core/src/runtime_store_backend.rs index 9e09b2d7..4f0add24 100644 --- a/epiphany-core/src/runtime_store_backend.rs +++ b/epiphany-core/src/runtime_store_backend.rs @@ -74,21 +74,6 @@ impl RuntimeSpineBackingStore { ), } } - - pub(crate) fn replace_and_append_if_snapshot_unchanged( - &self, - expected_snapshot: &[CultCacheEnvelope], - replacements: Vec, - ) -> Result { - match self.selected()? { - SelectedBackingStore::Snapshot(store) => { - store.replace_and_append_if_snapshot_unchanged(expected_snapshot, replacements) - } - SelectedBackingStore::Keyed(store) => { - store.replace_and_append_if_snapshot_unchanged(expected_snapshot, replacements) - } - } - } } impl CacheBackingStore for RuntimeSpineBackingStore { diff --git a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs index 948e05db..5b17a645 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs @@ -593,11 +593,6 @@ async fn run_worker_launch( &options.store_path, epiphany_core::RuntimeSpineSessionClosureOptions { session_id: openai_options.session_id.clone(), - completed_at: chrono::Utc::now().to_rfc3339(), - summary: format!( - "Worker model execution {} reached terminal result {}.", - launch_request.job_id, worker_result.result_id - ), }, )?; @@ -1146,12 +1141,6 @@ mod tests { model_request.reasoning_basis_id = Some(basis.basis_id); epiphany_core::open_runtime_model_execution( store, - epiphany_core::RuntimeSpineSessionOptions { - session_id: session_id.clone(), - objective: format!("Run model execution for {worker_job_id}."), - created_at: chrono::Utc::now().to_rfc3339(), - coordinator_note: "test".to_string(), - }, epiphany_core::RuntimeSpineJobOptions { job_id: job_id.clone(), session_id: session_id.clone(), @@ -1391,12 +1380,6 @@ mod tests { request.reasoning_basis_id = Some(basis.basis_id); epiphany_core::open_runtime_model_execution( &store, - epiphany_core::RuntimeSpineSessionOptions { - session_id: "openai-runtime-error".into(), - objective: "Exercise model-backed runtime failure.".into(), - created_at: now(), - coordinator_note: "test".into(), - }, epiphany_core::RuntimeSpineJobOptions { job_id: "openai-job-runtime-error".into(), session_id: "openai-runtime-error".into(), diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index d9efaf2d..80154f73 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -15,7 +15,6 @@ use epiphany_core::EpiphanyWorkerLaunchDocument; use epiphany_core::RuntimeSpineInitOptions; use epiphany_core::RuntimeSpineJobOptions; use epiphany_core::RuntimeSpineJobResultOptions; -use epiphany_core::RuntimeSpineSessionOptions; use epiphany_core::complete_runtime_job; use epiphany_core::initialize_runtime_spine; use epiphany_core::open_runtime_model_execution; @@ -115,12 +114,6 @@ pub fn open_model_turn( ensure_openai_runtime_ready(&options)?; open_runtime_model_execution( &options.store_path, - RuntimeSpineSessionOptions { - session_id: options.session_id.clone(), - objective: options.objective.clone(), - created_at: now(), - coordinator_note: options.coordinator_note.clone(), - }, RuntimeSpineJobOptions { job_id: options.job_id.clone(), session_id: options.session_id.clone(), @@ -2966,12 +2959,6 @@ mod tests { ensure_openai_runtime_ready(&options)?; open_runtime_model_execution( &store, - RuntimeSpineSessionOptions { - session_id: options.session_id.clone(), - objective: options.objective.clone(), - created_at: now(), - coordinator_note: options.coordinator_note.clone(), - }, RuntimeSpineJobOptions { job_id: options.job_id.clone(), session_id: options.session_id.clone(), @@ -3069,12 +3056,6 @@ mod tests { )?; epiphany_core::open_runtime_model_execution( &store, - RuntimeSpineSessionOptions { - session_id: "openai-worker-session-modeling-checkpoint-worker".into(), - objective: "Run the exact Modeling pass.".into(), - created_at: "2026-08-14T00:00:00Z".into(), - coordinator_note: "decision context fixture".into(), - }, RuntimeSpineJobOptions { job_id: "openai-worker-worker-job-1".into(), session_id: "openai-worker-session-modeling-checkpoint-worker".into(), @@ -3441,12 +3422,6 @@ mod tests { ensure_openai_runtime_ready(&options)?; open_runtime_model_execution( &store, - RuntimeSpineSessionOptions { - session_id: options.session_id.clone(), - objective: options.objective.clone(), - created_at: now(), - coordinator_note: options.coordinator_note.clone(), - }, RuntimeSpineJobOptions { job_id: options.job_id.clone(), session_id: options.session_id.clone(), diff --git a/epiphany-openai-runtime/src/persona_executor.rs b/epiphany-openai-runtime/src/persona_executor.rs index c09cf0cf..deff9ca3 100644 --- a/epiphany-openai-runtime/src/persona_executor.rs +++ b/epiphany-openai-runtime/src/persona_executor.rs @@ -14,8 +14,7 @@ use epiphany_core::{ build_persona_projector_prompt_with_transcript, build_persona_turn_prompt, close_runtime_session, model_pass_failure_for_request, parse_and_validate_persona_interpreter_effect_set, persona_interpreter_effect_set_json_schema, - runtime_spine_cache, - terminalize_model_pass_failure_session, + runtime_spine_cache, terminalize_model_pass_failure_session, }; use epiphany_model_adapter::{EpiphanyModelInputItem, EpiphanyModelRequest}; use sha2::{Digest, Sha256}; @@ -82,18 +81,11 @@ pub async fn execute_persona_model_turn( ) -> Result { match execute_persona_model_turn_with_runner(store_path, plan, runner).await { Ok(terminal) => { - close_persona_session_if_active( - store_path, - plan, - format!( - "Persona turn {} reached terminal decision {}.", - plan.turn_id, terminal.receipt_id - ), - )?; + close_persona_session_if_active(store_path, plan)?; Ok(terminal) } Err(error) => { - terminalize_persona_execution_error(store_path, plan, &error)?; + terminalize_persona_execution_error(store_path, plan)?; Err(error) } } @@ -102,7 +94,6 @@ pub async fn execute_persona_model_turn( fn terminalize_persona_execution_error( store_path: &Path, plan: &PersonaModelExecutionPlan, - error: &anyhow::Error, ) -> Result<()> { for stage in ["interpreter", "persona", "projector"] { let request_id = stage_request_id(&plan.turn_id, stage); @@ -110,17 +101,12 @@ fn terminalize_persona_execution_error( return Ok(()); } } - close_persona_session_if_active( - store_path, - plan, - format!("Persona turn orchestration refused: {error:#}"), - ) + close_persona_session_if_active(store_path, plan) } fn close_persona_session_if_active( store_path: &Path, plan: &PersonaModelExecutionPlan, - summary: String, ) -> Result<()> { let session_id = format!("persona-turn-{}", plan.turn_id); let mut cache = runtime_spine_cache(store_path)?; @@ -131,14 +117,7 @@ fn close_persona_session_if_active( session.status == epiphany_core::EpiphanyRuntimeSessionStatus::Active }) { - close_runtime_session( - store_path, - RuntimeSpineSessionClosureOptions { - session_id, - completed_at: now(), - summary, - }, - )?; + close_runtime_session(store_path, RuntimeSpineSessionClosureOptions { session_id })?; } Ok(()) } @@ -612,12 +591,6 @@ mod tests { } epiphany_core::open_runtime_model_execution( store_path, - epiphany_core::RuntimeSpineSessionOptions { - session_id: format!("persona-turn-{turn_id}"), - objective: format!("Run Persona {stage} test stage"), - created_at: "2026-08-14T00:00:00Z".into(), - coordinator_note: "Persona test".into(), - }, epiphany_core::RuntimeSpineJobOptions { job_id: format!("persona-{stage}-{turn_id}"), session_id: format!("persona-turn-{turn_id}"), From 734fbd3b8466234c1af4de622700a1011721cbf8 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 20:20:41 +0200 Subject: [PATCH 086/340] Record coordinator session authority split --- notes/epiphany-current-algorithmic-map.md | 15 +++++++++- notes/epiphany-fork-implementation-plan.md | 13 +++++++-- notes/fresh-workspace-handoff.md | 31 ++++++++++++++++----- state/ledgers.msgpack | Bin 721401 -> 722026 bytes state/map.yaml | 11 ++++---- state/scratch.md | 20 +++++++++---- 6 files changed, 70 insertions(+), 20 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 5b60d184..e81d2965 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1061,7 +1061,20 @@ worker, and reasoning basis are read from the exact native model request. A tool binding contains only intent, session, and job identity; its optional model ancestry is read from the exact typed tool intent. Validation and retention reload those owners. No binding timestamp participates in causality. -Runtime writable state is v39. +Runtime writable state is v40. + +Exact `cabdd6c3` separates coordinator incarnation audit from model-session +admission. `EpiphanyRuntimeSession` now owns only a grouping identity and the +active/completed latch that prevents new model/tool work after closure. +Coordinator runs never inhabit that aggregate. Their immutable +`EpiphanyCoordinatorRunBasis` records thread, resident launch identity, +objective, and start time. Terminal success/failure receipts and exact process +death recovery both compete through one deterministic +`EpiphanyCoordinatorRunTerminality` identity; the winner and its full typed +authority are inserted atomically while the exact basis is replayed +byte-identically. Unrelated document commits do not participate. Timestamp +ordering, coordinator notes, whole-store snapshots, and generic archived status +do not own terminality. The sealed typed launch owns exact live request association. The terminal role result owns only semantic decision cargo or typed failure. The archived attempt diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 0a338bcb..4e015ef0 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -810,8 +810,17 @@ Cut in this order: uses archived request kind/ID beside the preserved structured decision. Success requires the family semantic payload and typed failure forbids success cargo. Runtime is v39 and role-result output is v5 with no legacy - reader. The next subtraction target is the generic runtime session - aggregate, not a replacement launch registry. + reader. +48. **Coordinator incarnation and model-session authority split at + `cabdd6c3`:** model sessions retain only identity plus active/completed + admission state. Coordinator start provenance is an immutable typed basis; + one deterministic terminality identity admits either the exact full run + receipt or exact death recovery, so competing outcomes conflict while + unrelated document inserts still merge. Runtime is v40. The generic session + loses objective, timestamps, notes, and four unused states; the redundant + one-field open options and whole-snapshot append helper are deleted. The next + subtraction target is the generic runtime job aggregate, not a lifecycle + registry. Do not preserve the aggregate for compatibility, manufacture a bootstrap thread, release autonomous scheduling, register topology in `gamecult-ops`, diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index b1b677e6..544840f2 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -124,6 +124,23 @@ model-failure audit, concurrent disjoint/same-identity CAS proof, old-epoch refusal, and focused proposal/Verification/Planning/consideration/Mind/provider completion tests pass. +Exact `cabdd6c3` splits coordinator incarnation authority from generic model +sessions. Model sessions now contain only their grouping identity and an +active/completed admission latch. Coordinator launch provenance is preserved in +an immutable `EpiphanyCoordinatorRunBasis`; exact completion/failure receipts +and process-death recovery compete through one deterministic +`EpiphanyCoordinatorRunTerminality` document, so only one terminal outcome can +commit while unrelated document inserts merge. The full typed winning authority +remains beside the latch. Objective prose, session clocks, coordinator notes, +four unused status variants, the redundant one-field session options wrapper, +and the dead whole-snapshot append helper are gone. Runtime advances to v40 +without a compatibility reader. Focused Core, model-failure audit, Persona, +coordinator terminality/conflict, release coordinator, and release model-runtime +checks pass. The code delta removes 62 maintained lines net. The focused checks +created 6.3 GiB/7,017 Cargo files; cleanup restored exactly the 1,776,640-byte +state inspector at SHA-256 +`DD38855C6F092C2C53D2212A938E737643F41130F4681708840BA6075320A04E`. + Exact `a6cf9383` quarantines concrete Codex/OpenRouter authentication, credential reading, and network transport at the two release entrypoints that perform inference. `epiphany-openai-runtime` now owns only exact native-request @@ -1209,13 +1226,13 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action The Ox17 deployment lane remains paused. Continue subtraction from exact -`edb5c3a3`: map every reader and writer of `EpiphanyRuntimeSession` and -`EpiphanyArchivedRuntimeSession`. Determine whether session identity, objective, -coordinator note, lifecycle status, and archive membership protect an invariant -not already owned by exact jobs, native requests, decision contexts, -coordinator receipts, and retention tombstones. Delete the aggregate or reduce -it to the smallest earned physiology; do not replace it with a registry, -adapter, compatibility reader, or latest head. The Connector CultMesh/Idunn/Yggdrasil proof and +`cabdd6c3`: map every reader, writer, and transition of `EpiphanyRuntimeJob`. +Determine whether role, session membership, timestamps, and mutable status +protect an invariant not already owned by sealed worker launches, model +bindings, process claims, terminal results, decision contexts, and archived +attempts. Delete mirrors and collapse transitions to the smallest earned +physiology; do not replace them with a registry, adapter, compatibility reader, +or latest head. The Connector CultMesh/Idunn/Yggdrasil proof and Ghostlight adoption remain queued behind source stabilization. Preserve keyed Mind, direct Body-to-Modeling flow, consequence receipts, and the complete Model Atlas vertical slice; no live inter-swarm collaboration has run. diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 69a3968884f4161ef1df42a59085545afe1fed08..1f14fcd425145dc33b859ef495772e0e33de76d4 100644 GIT binary patch delta 639 zcmYk3F>g~b5XVUhB&0%OLMrNT66;ISq%^I%K?N0Cg_zhJ`(B?_Kil}u4Vf}@fRQE2 z*Fa)mLt^2>@C}&Y-m8Kb{_oj;pYML>`+ZaV`c!;*+(kEr zPN%$CcR#MX9Z~b&5#1Ht6Wtf}M19eNZ|m;B{MlUedi}x4aQf`+q)E2mb)Ucd zpfrP4b7N-u5GXp!1UiIdtXCWoSg%!*r41fbHkP4Gp@!OeTPp{3FzAMaL~VenZMz!5 z>$=XY<_;lc4|7G9Ai7LokTEsaX~k9pFC!YbwUks}LQF`Qu91K%gfcq^2{qctAUp;Y zSB(*_F)a(I)s;l*P)B6zFaKqNkXhXJ%$Lqen+wa8xUi^#!y)l1Bn0v*QWcmAN$rG9 z2(vtcRxDiG#$pPDW9@>zqOl;z2}=Nh@&YfI2~GA!dEQW!wV?8VDrHqp=fkz&}tDrN9btZ7qUHiPHvMx8<3rrNeD*m6)HnBrRxcU5j@MMB! w1ZOH;2GHXA90jkbYhX4ygme31d|Vt%j-j;fwuSZn?%t!eBbhfv)H3 Date: Mon, 24 Aug 2026 20:32:47 +0200 Subject: [PATCH 087/340] Remove timestamp authority from runtime jobs --- epiphany-core/src/coordinator_results.rs | 4 - epiphany-core/src/current_work.rs | 16 +- epiphany-core/src/reasoning_context.rs | 4 - epiphany-core/src/reorientation_work.rs | 3 - epiphany-core/src/runtime_spine.rs | 195 +++++++----------- .../src/bin/epiphany-openai-runtime.rs | 2 - epiphany-openai-runtime/src/lib.rs | 4 - .../src/persona_executor.rs | 1 - 8 files changed, 81 insertions(+), 148 deletions(-) diff --git a/epiphany-core/src/coordinator_results.rs b/epiphany-core/src/coordinator_results.rs index 1d35fadc..d70a3740 100644 --- a/epiphany-core/src/coordinator_results.rs +++ b/epiphany-core/src/coordinator_results.rs @@ -119,15 +119,11 @@ fn interpret_reorient_lifecycle_failure( fn reorient_result_status(snapshot: &EpiphanyRuntimeJobSnapshot) -> EpiphanyCrrcResultStatus { match snapshot.job.status { EpiphanyRuntimeJobStatus::Queued => EpiphanyCrrcResultStatus::Pending, - EpiphanyRuntimeJobStatus::Running | EpiphanyRuntimeJobStatus::WaitingForReview => { - EpiphanyCrrcResultStatus::Running - } EpiphanyRuntimeJobStatus::Completed if snapshot.result.is_some() => { EpiphanyCrrcResultStatus::Completed } EpiphanyRuntimeJobStatus::Completed => EpiphanyCrrcResultStatus::Pending, EpiphanyRuntimeJobStatus::Failed => EpiphanyCrrcResultStatus::Failed, - EpiphanyRuntimeJobStatus::Cancelled => EpiphanyCrrcResultStatus::Cancelled, } } diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index e6d3ad36..df8350e0 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -161,10 +161,7 @@ impl EpiphanyAgentPassAttemptProjection { fn from_job(job: &crate::EpiphanyRuntimeJob, completed_is_reviewable: bool) -> Self { let action = match job.status { - crate::EpiphanyRuntimeJobStatus::Failed - | crate::EpiphanyRuntimeJobStatus::Cancelled => { - EpiphanyAgentPassContinuationAction::Launch - } + crate::EpiphanyRuntimeJobStatus::Failed => EpiphanyAgentPassContinuationAction::Launch, crate::EpiphanyRuntimeJobStatus::Completed if completed_is_reviewable => { EpiphanyAgentPassContinuationAction::Review } @@ -1000,11 +997,7 @@ fn current_proposal_modeling_work( )?; } if *ordinal != latest_ordinal - && !matches!( - job.status, - crate::EpiphanyRuntimeJobStatus::Failed - | crate::EpiphanyRuntimeJobStatus::Cancelled - ) + && !matches!(job.status, crate::EpiphanyRuntimeJobStatus::Failed) && !admission_refused { return Err(anyhow!( @@ -3698,7 +3691,6 @@ mod tests { job_id: "body-failed-model-job".into(), session_id: "body-failed-model-session".into(), role: "openai-model".into(), - created_at: "2026-08-17T00:00:02.100Z".into(), }, &failed_native, )?; @@ -3843,7 +3835,6 @@ mod tests { .get::(&result.job_id)? .unwrap(); job.status = crate::EpiphanyRuntimeJobStatus::Completed; - job.updated_at = "2026-08-17T00:00:04Z".into(); cache.put(&job.job_id, &job)?; assert_eq!( project_current_work(&store)? @@ -4673,7 +4664,6 @@ mod tests { job_id: "verification-model-job".into(), session_id: "verification-model-session".into(), role: "openai-model".into(), - created_at: "2026-08-17T00:00:14.750Z".into(), }, &verification_native, )?; @@ -5336,7 +5326,6 @@ mod tests { job_id: "planning-model-job".into(), session_id: "planning-model-session".into(), role: "openai-model".into(), - created_at: "2026-08-17T00:00:21.750Z".into(), }, &planning_native, )?; @@ -5465,7 +5454,6 @@ mod tests { job_id: "plan-mind-model-job".into(), session_id: "plan-mind-model-session".into(), role: "openai-model".into(), - created_at: "2026-08-17T00:00:22.250Z".into(), }, &mind_native, )?; diff --git a/epiphany-core/src/reasoning_context.rs b/epiphany-core/src/reasoning_context.rs index 83055d3b..96fa72bb 100644 --- a/epiphany-core/src/reasoning_context.rs +++ b/epiphany-core/src/reasoning_context.rs @@ -2239,7 +2239,6 @@ mod tests { job_id: "model-job-1".into(), session_id: "session-1".into(), role: "model-adapter".into(), - created_at: "2026-08-17T00:00:01Z".into(), }, &initial_native, )?; @@ -2286,7 +2285,6 @@ mod tests { job_id: "model-job-2".into(), session_id: "session-1".into(), role: "model-adapter".into(), - created_at: "2026-08-17T00:00:04Z".into(), }, &terminal_native, )?; @@ -2354,7 +2352,6 @@ mod tests { job_id: "failed-model-job".into(), session_id: "failed-pass-session".into(), role: "model-adapter".into(), - created_at: "2026-08-18T00:00:01Z".into(), }, &native, )?; @@ -2573,7 +2570,6 @@ mod tests { job_id: "model-job-1".into(), session_id: "session-1".into(), role: "model-adapter".into(), - created_at: "2026-08-14T00:00:01Z".into(), }, &native, )?; diff --git a/epiphany-core/src/reorientation_work.rs b/epiphany-core/src/reorientation_work.rs index ab0bc692..19c74d33 100644 --- a/epiphany-core/src/reorientation_work.rs +++ b/epiphany-core/src/reorientation_work.rs @@ -299,7 +299,6 @@ pub(crate) fn current_reorientation_work( None => EpiphanyAgentPassContinuationAction::Launch, } } - EpiphanyRuntimeJobStatus::Cancelled => EpiphanyAgentPassContinuationAction::Launch, _ => EpiphanyAgentPassContinuationAction::Wait, }; return Ok(Some(EpiphanyReorientationWorkProjection { @@ -972,7 +971,6 @@ mod tests { job_id: "reorientation-model-job".into(), session_id: "reorientation-model-session".into(), role: "openai-model".into(), - created_at: "2026-08-18T10:00:03Z".into(), }, &native, )?; @@ -1096,7 +1094,6 @@ mod tests { job_id: "failed-reorientation-model-job".into(), session_id: "failed-reorientation-model-session".into(), role: "openai-model".into(), - created_at: "2026-08-18T10:00:10Z".into(), }, &failed_native, )?; diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index f69b4d4f..c8ddc6c8 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -55,7 +55,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v40"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v41"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache(type = "epiphany.runtime.identity", schema = "EpiphanyRuntimeIdentity")] @@ -132,10 +132,6 @@ pub struct EpiphanyRuntimeJob { pub role: String, #[cultcache(key = 4)] pub status: EpiphanyRuntimeJobStatus, - #[cultcache(key = 5)] - pub created_at: String, - #[cultcache(key = 6)] - pub updated_at: String, } #[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] @@ -623,11 +619,8 @@ pub enum EpiphanyRuntimeSessionStatus { pub enum EpiphanyRuntimeJobStatus { #[default] Queued, - Running, - WaitingForReview, Completed, Failed, - Cancelled, } #[derive(Clone, Debug, PartialEq, Eq)] @@ -655,7 +648,6 @@ pub struct RuntimeSpineJobOptions { pub job_id: String, pub session_id: String, pub role: String, - pub created_at: String, } #[derive(Clone, Debug, PartialEq, Eq)] @@ -956,12 +948,7 @@ pub fn close_runtime_session( .into_iter() .filter(|job| { job.session_id == options.session_id - && matches!( - job.status, - EpiphanyRuntimeJobStatus::Queued - | EpiphanyRuntimeJobStatus::Running - | EpiphanyRuntimeJobStatus::WaitingForReview - ) + && matches!(job.status, EpiphanyRuntimeJobStatus::Queued) }) .map(|job| job.job_id) .collect::>(); @@ -1052,12 +1039,7 @@ pub fn terminalize_model_pass_failure_session( "model pass failure runtime job is outside its exact session" )); } - let model_job_is_live = matches!( - model_job.status, - EpiphanyRuntimeJobStatus::Queued - | EpiphanyRuntimeJobStatus::Running - | EpiphanyRuntimeJobStatus::WaitingForReview - ); + let model_job_is_live = matches!(model_job.status, EpiphanyRuntimeJobStatus::Queued); let model_job_results = cache .get_all::()? .into_iter() @@ -1079,12 +1061,7 @@ pub fn terminalize_model_pass_failure_session( .filter(|job| { job.session_id == binding.session_id && (!model_job_is_live || job.job_id != binding.job_id) - && matches!( - job.status, - EpiphanyRuntimeJobStatus::Queued - | EpiphanyRuntimeJobStatus::Running - | EpiphanyRuntimeJobStatus::WaitingForReview - ) + && matches!(job.status, EpiphanyRuntimeJobStatus::Queued) }) .map(|job| job.job_id) .collect::>(); @@ -1102,7 +1079,6 @@ pub fn terminalize_model_pass_failure_session( ]; if model_job_is_live { model_job.status = EpiphanyRuntimeJobStatus::Failed; - model_job.updated_at = options.failed_at.clone(); let model_result = EpiphanyRuntimeJobResult { result_id: format!("result-model-pass-failure-{}", failure.failure_id), job_id: binding.job_id.clone(), @@ -1178,7 +1154,6 @@ pub fn open_runtime_model_execution( validate_non_empty(&job_options.session_id, "model execution session id")?; validate_non_empty(&job_options.job_id, "model execution job id")?; validate_non_empty(&job_options.role, "model execution job role")?; - validate_non_empty(&job_options.created_at, "model execution job creation time")?; validate_non_empty(&model_request.request_id, "model execution request id")?; validate_non_empty(&model_request.provider, "model execution provider")?; let provider_request = epiphany_openai_adapter::request_from_native(model_request); @@ -1226,9 +1201,7 @@ pub fn open_runtime_model_execution( if worker_job.role != launch.role || matches!( worker_job.status, - EpiphanyRuntimeJobStatus::Completed - | EpiphanyRuntimeJobStatus::Failed - | EpiphanyRuntimeJobStatus::Cancelled + EpiphanyRuntimeJobStatus::Completed | EpiphanyRuntimeJobStatus::Failed ) { return Err(anyhow!( @@ -1273,8 +1246,6 @@ pub fn open_runtime_model_execution( session_id: session.session_id.clone(), role: job_options.role, status: EpiphanyRuntimeJobStatus::Queued, - created_at: job_options.created_at.clone(), - updated_at: job_options.created_at.clone(), }; let binding_id = model_request.request_id.clone(); if cache @@ -1365,9 +1336,7 @@ pub fn put_runtime_tool_execution_intent( if job.session_id != session_id || matches!( job.status, - EpiphanyRuntimeJobStatus::Completed - | EpiphanyRuntimeJobStatus::Failed - | EpiphanyRuntimeJobStatus::Cancelled + EpiphanyRuntimeJobStatus::Completed | EpiphanyRuntimeJobStatus::Failed ) { return Err(anyhow!( @@ -1723,12 +1692,7 @@ fn archive_completed_model_session( if jobs.is_empty() || jobs.iter().any(|job| { job.role != "openai-model-adapter" - || matches!( - job.status, - EpiphanyRuntimeJobStatus::Queued - | EpiphanyRuntimeJobStatus::Running - | EpiphanyRuntimeJobStatus::WaitingForReview - ) + || matches!(job.status, EpiphanyRuntimeJobStatus::Queued) }) { return Err(anyhow!( @@ -2184,8 +2148,6 @@ pub fn prepare_runtime_spine_heartbeat_job( session_id: options.session_id.clone(), role: options.role.clone(), status: EpiphanyRuntimeJobStatus::Queued, - created_at: options.created_at.clone(), - updated_at: options.created_at.clone(), }; let request = EpiphanyRuntimeWorkerLaunchRequest { job_id: options.job_id.clone(), @@ -2912,9 +2874,7 @@ fn validate_governed_source_tool_intent( .ok_or_else(|| anyhow!("governed source tool intent lost its source worker job"))?; if matches!( source_worker_job.status, - EpiphanyRuntimeJobStatus::Completed - | EpiphanyRuntimeJobStatus::Failed - | EpiphanyRuntimeJobStatus::Cancelled + EpiphanyRuntimeJobStatus::Completed | EpiphanyRuntimeJobStatus::Failed ) { return Err(anyhow!( "governed source tool intent {:?} is outside its launch grant", @@ -3306,14 +3266,7 @@ fn terminal_worker_request_id(cache: &CultCache, worker_job_id: &str) -> Result< let live = bindings .iter() - .filter(|(_, job, _)| { - matches!( - job.status, - EpiphanyRuntimeJobStatus::Queued - | EpiphanyRuntimeJobStatus::Running - | EpiphanyRuntimeJobStatus::WaitingForReview - ) - }) + .filter(|(_, job, _)| matches!(job.status, EpiphanyRuntimeJobStatus::Queued)) .collect::>(); if live.len() > 1 { return Err(anyhow!( @@ -3451,12 +3404,7 @@ fn commit_runtime_worker_process_death( let mut job = cache .get::(job_id)? .ok_or_else(|| anyhow!("worker death recovery requires its runtime job"))?; - if !matches!( - job.status, - EpiphanyRuntimeJobStatus::Queued - | EpiphanyRuntimeJobStatus::Running - | EpiphanyRuntimeJobStatus::WaitingForReview - ) { + if !matches!(job.status, EpiphanyRuntimeJobStatus::Queued) { return Err(anyhow!( "worker death recovery found a terminal runtime job" )); @@ -3481,7 +3429,6 @@ fn commit_runtime_worker_process_death( next.terminal_authority_id = Some(terminal_authority_id.into()); let summary = "Runtime Continuity proved the exact worker process terminal before a structured outcome was admitted.".to_string(); job.status = EpiphanyRuntimeJobStatus::Failed; - job.updated_at = terminal_at.to_string(); let result = EpiphanyRuntimeJobResult { result_id: format!("result-worker-death-{job_id}"), job_id: job_id.to_string(), @@ -6168,7 +6115,7 @@ pub(crate) fn runtime_repo_frontier_research_lifecycle( }); } }; - let mut attempts = launches + let attempts = launches .iter() .map(|launch| { Ok( @@ -6195,59 +6142,84 @@ pub(crate) fn runtime_repo_frontier_research_lifecycle( Ok((launch, job)) }) .collect::>>()?; - attempts.sort_by(|(_, left), (_, right)| { - left.created_at - .cmp(&right.created_at) - .then_with(|| left.job_id.cmp(&right.job_id)) - }); - let Some((launch, job)) = attempts.last() else { + if attempts.is_empty() { return Ok(RepoFrontierResearchLifecycle { stage: RepoFrontierResearchLifecycleStage::LaunchReady, frontier_item_id: Some(request.frontier_item_id.clone()), request_id: Some(request.request_id.clone()), worker_job_id: None, }); - }; - let stage = match job.status { - EpiphanyRuntimeJobStatus::Queued - | EpiphanyRuntimeJobStatus::Running - | EpiphanyRuntimeJobStatus::WaitingForReview => { - RepoFrontierResearchLifecycleStage::WorkerRunning - } - EpiphanyRuntimeJobStatus::Completed => { - let result = role_results - .iter() - .find(|result| result.job_id == job.job_id) - .ok_or_else(|| anyhow!("completed frontier Research job lost its typed result"))?; - if !result.role_id.eq_ignore_ascii_case("research") { - return Err(anyhow!( - "frontier Research result crossed request-family authority" - )); + } + let live = attempts + .iter() + .filter(|(_, job)| job.status == EpiphanyRuntimeJobStatus::Queued) + .collect::>(); + if live.len() > 1 { + return Err(anyhow!( + "frontier Research request has multiple live worker attempts" + )); + } + if let Some((launch, _)) = live.first() { + return Ok(RepoFrontierResearchLifecycle { + stage: RepoFrontierResearchLifecycleStage::WorkerRunning, + frontier_item_id: Some(request.frontier_item_id.clone()), + request_id: Some(request.request_id.clone()), + worker_job_id: Some(launch.job_id.clone()), + }); + } + + let mut successful = Vec::new(); + for (launch, job) in &attempts { + match job.status { + EpiphanyRuntimeJobStatus::Completed => { + let result = role_results + .iter() + .find(|result| result.job_id == job.job_id) + .ok_or_else(|| { + anyhow!("completed frontier Research job lost its typed result") + })?; + if !result.role_id.eq_ignore_ascii_case("research") { + return Err(anyhow!( + "frontier Research result crossed request-family authority" + )); + } + if result.item_error.is_none() { + successful.push(*launch); + } } - if result.item_error.is_some() { - RepoFrontierResearchLifecycleStage::LaunchReady - } else { - RepoFrontierResearchLifecycleStage::ResultReady + EpiphanyRuntimeJobStatus::Failed => { + let terminal = job_results + .iter() + .filter(|result| result.job_id == job.job_id) + .count(); + if terminal != 1 { + return Err(anyhow!( + "failed frontier Research attempt lost its exact terminal result" + )); + } } + EpiphanyRuntimeJobStatus::Queued => unreachable!("live attempts returned above"), } - EpiphanyRuntimeJobStatus::Failed | EpiphanyRuntimeJobStatus::Cancelled => { - let terminal = job_results - .iter() - .filter(|result| result.job_id == job.job_id) - .count(); - if terminal != 1 { - return Err(anyhow!( - "failed frontier Research attempt lost its exact terminal result" - )); - } - RepoFrontierResearchLifecycleStage::LaunchReady - } - }; + } + if successful.len() > 1 { + return Err(anyhow!( + "frontier Research request has multiple successful worker authorities" + )); + } + let (stage, worker_job_id) = successful.first().map_or( + (RepoFrontierResearchLifecycleStage::LaunchReady, None), + |launch| { + ( + RepoFrontierResearchLifecycleStage::ResultReady, + Some(launch.job_id.clone()), + ) + }, + ); Ok(RepoFrontierResearchLifecycle { stage, frontier_item_id: Some(request.frontier_item_id.clone()), request_id: Some(request.request_id.clone()), - worker_job_id: Some(launch.job_id.clone()), + worker_job_id, }) } @@ -8166,10 +8138,7 @@ fn archive_runtime_worker_attempt( let valid_job = if fulfilled { job.status == EpiphanyRuntimeJobStatus::Completed } else { - matches!( - job.status, - EpiphanyRuntimeJobStatus::Failed | EpiphanyRuntimeJobStatus::Cancelled - ) + matches!(job.status, EpiphanyRuntimeJobStatus::Failed) }; if !valid_job { return Err(anyhow!( @@ -8361,10 +8330,7 @@ pub fn retain_failed_runtime_worker_attempts( .filter(|(status, _)| status.is_failed_terminal()) .filter_map(|(_, claim)| { let job = jobs.get(&claim.job_id)?; - if !matches!( - job.status, - EpiphanyRuntimeJobStatus::Failed | EpiphanyRuntimeJobStatus::Cancelled - ) { + if !matches!(job.status, EpiphanyRuntimeJobStatus::Failed) { return None; } let request_id = typed_requests.get(&claim.job_id)?.as_ref()?.1.as_str(); @@ -8770,9 +8736,7 @@ pub fn complete_runtime_job( .ok_or_else(|| anyhow!("runtime job {:?} does not exist", options.job_id))?; if matches!( job.status, - EpiphanyRuntimeJobStatus::Completed - | EpiphanyRuntimeJobStatus::Failed - | EpiphanyRuntimeJobStatus::Cancelled + EpiphanyRuntimeJobStatus::Completed | EpiphanyRuntimeJobStatus::Failed ) { return Err(anyhow!( "runtime job {:?} is already terminal", @@ -8796,7 +8760,6 @@ pub fn complete_runtime_job( .ok_or_else(|| anyhow!("runtime job lost its exact envelope"))?; let terminal_status = terminal_status_for_verdict(&options.verdict); job.status = terminal_status; - job.updated_at = options.completed_at.clone(); let result = EpiphanyRuntimeJobResult { result_id: options.result_id.clone(), job_id: options.job_id.clone(), diff --git a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs index 5b17a645..31a8010c 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs @@ -1145,7 +1145,6 @@ mod tests { job_id: job_id.clone(), session_id: session_id.clone(), role: OPENAI_RUNTIME_ROLE.to_string(), - created_at: chrono::Utc::now().to_rfc3339(), }, &model_request, )?; @@ -1384,7 +1383,6 @@ mod tests { job_id: "openai-job-runtime-error".into(), session_id: "openai-runtime-error".into(), role: OPENAI_RUNTIME_ROLE.into(), - created_at: now(), }, &request, )?; diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index 80154f73..a3cf7e06 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -118,7 +118,6 @@ pub fn open_model_turn( job_id: options.job_id.clone(), session_id: options.session_id.clone(), role: OPENAI_RUNTIME_ROLE.to_string(), - created_at: now(), }, model_request, )?; @@ -2963,7 +2962,6 @@ mod tests { job_id: options.job_id.clone(), session_id: options.session_id.clone(), role: OPENAI_RUNTIME_ROLE.to_string(), - created_at: now(), }, &native_request, )?; @@ -3060,7 +3058,6 @@ mod tests { job_id: "openai-worker-worker-job-1".into(), session_id: "openai-worker-session-modeling-checkpoint-worker".into(), role: "openai-model-adapter".into(), - created_at: "2026-08-14T00:00:00Z".into(), }, &model_request, )?; @@ -3426,7 +3423,6 @@ mod tests { job_id: options.job_id.clone(), session_id: options.session_id.clone(), role: OPENAI_RUNTIME_ROLE.to_string(), - created_at: now(), }, &native_request, )?; diff --git a/epiphany-openai-runtime/src/persona_executor.rs b/epiphany-openai-runtime/src/persona_executor.rs index deff9ca3..a312232a 100644 --- a/epiphany-openai-runtime/src/persona_executor.rs +++ b/epiphany-openai-runtime/src/persona_executor.rs @@ -595,7 +595,6 @@ mod tests { job_id: format!("persona-{stage}-{turn_id}"), session_id: format!("persona-turn-{turn_id}"), role: "openai-model-adapter".into(), - created_at: "2026-08-14T00:00:00Z".into(), }, &request, )?; From f5cd509a1e574bbfe64dfcad93a1f73f35003024 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 20:39:14 +0200 Subject: [PATCH 088/340] Record runtime job authority cut --- notes/epiphany-current-algorithmic-map.md | 11 +++++++++ notes/epiphany-fork-implementation-plan.md | 7 ++++++ notes/fresh-workspace-handoff.md | 25 +++++++++++++++------ state/ledgers.msgpack | Bin 722026 -> 722658 bytes state/map.yaml | 11 ++++----- state/scratch.md | 19 ++++++++++------ 6 files changed, 54 insertions(+), 19 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index e81d2965..009d848f 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1076,6 +1076,17 @@ byte-identically. Unrelated document commits do not participate. Timestamp ordering, coordinator notes, whole-store snapshots, and generic archived status do not own terminality. +Exact `a46725a1` reduces the generic runtime job to the only transition it +actually performs. A job is inserted `Queued` and terminalizes as `Completed` +or `Failed`; no writer ever produced `Running`, `WaitingForReview`, or +`Cancelled`, so those states and both creation/update clocks are deleted. +Frontier Research no longer sorts attempts by creation time. It evaluates the +exact set: more than one live or successful authority refuses, one live attempt +waits, one successful attempt becomes reviewable, and terminal failures require +their exact job result before retry. Runtime writable state is v41. The next +audit boundary is the remaining job role/session join and generic terminal-result +cargo, not another lifecycle layer. + The sealed typed launch owns exact live request association. The terminal role result owns only semantic decision cargo or typed failure. The archived attempt owns historical request kind/ID and typed terminal classification after the diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 4e015ef0..a5445b80 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -821,6 +821,13 @@ Cut in this order: one-field open options and whole-snapshot append helper are deleted. The next subtraction target is the generic runtime job aggregate, not a lifecycle registry. +49. **Runtime jobs carry lifecycle, not chronology, at `a46725a1`:** every + production job is inserted queued and terminalizes completed or failed. + Unwritten running/review/cancelled states and creation/update clocks are + deleted. Research derives its exact attempt set, refuses multiple live or + successful authorities, and never selects work by timestamp order. Runtime + is v41; the cut removes 67 maintained lines net. The remaining audit target + is duplicated role/session identity and generic terminal-result cargo. Do not preserve the aggregate for compatibility, manufacture a bootstrap thread, release autonomous scheduling, register topology in `gamecult-ops`, diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 544840f2..92fa64ae 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -141,6 +141,17 @@ created 6.3 GiB/7,017 Cargo files; cleanup restored exactly the 1,776,640-byte state inspector at SHA-256 `DD38855C6F092C2C53D2212A938E737643F41130F4681708840BA6075320A04E`. +Exact `a46725a1` removes timestamp authority from generic runtime jobs. Jobs now +carry only identity, session join, role, and a Queued/Completed/Failed admission +latch; the unwritten Running, WaitingForReview, and Cancelled states plus both +creation/update clocks are gone. Frontier Research derives the exact attempt +set and refuses multiple live or successful authorities instead of selecting a +latest creation time. Runtime advances to v41. Focused Core, epoch-refusal, +model-failure, Persona replay, OpenAI runtime, release coordinator, and release +model-runtime checks pass. The cut removes 67 maintained lines net. Verification +generated 3.2 GiB across 4,498 files; cleanup restored only the authenticated +1,776,640-byte state inspector. + Exact `a6cf9383` quarantines concrete Codex/OpenRouter authentication, credential reading, and network transport at the two release entrypoints that perform inference. `epiphany-openai-runtime` now owns only exact native-request @@ -1226,13 +1237,13 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action The Ox17 deployment lane remains paused. Continue subtraction from exact -`cabdd6c3`: map every reader, writer, and transition of `EpiphanyRuntimeJob`. -Determine whether role, session membership, timestamps, and mutable status -protect an invariant not already owned by sealed worker launches, model -bindings, process claims, terminal results, decision contexts, and archived -attempts. Delete mirrors and collapse transitions to the smallest earned -physiology; do not replace them with a registry, adapter, compatibility reader, -or latest head. The Connector CultMesh/Idunn/Yggdrasil proof and +`a46725a1`: map every producer and consumer of `EpiphanyRuntimeJob.role` and +`session_id` plus generic terminal job-result role/session/summary cargo against +sealed worker launches, model bindings, structured role results, typed pass +failures, process claims, and archived attempts. Delete mirrors whose exact +owner already exists; preserve only the minimal join or terminal latch that +prevents an invalid consequence. Do not replace them with a registry, adapter, +compatibility reader, or latest head. The Connector CultMesh/Idunn/Yggdrasil proof and Ghostlight adoption remain queued behind source stabilization. Preserve keyed Mind, direct Body-to-Modeling flow, consequence receipts, and the complete Model Atlas vertical slice; no live inter-swarm collaboration has run. diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 1f14fcd425145dc33b859ef495772e0e33de76d4..5c9d3c49e9b6da46108e1d9017e0b533a5b550e0 100644 GIT binary patch delta 560 zcmYLGJ&)5s5XH%bJ8V($AsWO;v`)fZa$F9oBf9WW@R0_IZqFXaE3J2y{kY&N1qC#S zDss;+K%$_8ihn>!LkS%cJ!67I@if}qd2ipF`SCja{w95YB}ztPFNRNr^jv3T z=Xfe{Ih+cep;DLw^E|o%u#N*wOYl}`C;dv22GXjACjkRDdV(ocMxo~eS(pjQ{M%4i zVk2l_jt+&*O32a5)+ufRu#?L8zC#WZd`axB{_E3X5ghkbL3zo-pqSQ5yO3oobgl>r z#D?y`3SaUsp0k5Pg;|>jPU`>Z2QZ_I6>~OfF$Ge29}Q(?3Kiw3`UP7K?aO1dj3VAwR5R?_&dJ#2fgRTn*aa+ delta 77 zcmaFVtMjTuXM+SIw~>LBk!jR125x5e&B~00jErf`Q<>VQGBE-%h-L<279eH?Vm2UV T2VxE&<^*D{?Ngb!uQCDvmO2*V diff --git a/state/map.yaml b/state/map.yaml index 7c72a863..8d023c57 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -75,13 +75,14 @@ current_status: semantic_cache_cut: Exact 856648de deletes the unused semantic-memory and workspace-coverage projection subsystem rather than preserving a second derived model of Mind. Four binaries, the local daemon supervisor, Qdrant/Ollama/Postgres configuration, projector policy/lifecycle/heartbeat/recovery state, semantic query/context packets, aggregate model revision/hash cargo, workspace file-cache reader, and Persona's always-empty semantic-recall fields are gone. No agent request builder or sealed reasoning projection consumed this cache. Modeling now reads the exact typed Body and keyed RepoModel projection directly; future retrieval evidence must enter through an earned typed provider receipt. Idunn remains the sole deployment and daemon-survival authority. Core 165/165, OpenAI runtime 25/25, and release construction 19/19 pass. repo_model_vocabulary_cut: Exact 6ea4ff3c deletes the redundant generic memory profile, dead SHA-1 ID factory, empty profile module, cache-only node/edge kinds, and impossible lifecycle variants. Exact 5218cf2c deletes the producerless RepoModel lifecycle-receipt family. Exact 8bb039af makes domains seed-owned and deletes the unreachable summary mutation/document/validation/registry path plus the test cargo that alone produced it. Exact ab1afc27 removes node salience/confidence and edge confidence because no owner read, validated, routed, or displayed those values. Modeling can author only the keyed repository operations advertised by its provider schema. Affected targets check cleanly; core remains 165/165, RepoModel 5/5, and reasoning-context 8/8. package_baseline: Exact d2ca66301fb6af4e7d2d27fff0b772b0f0fccdf4 remains the admitted production source and current symlink target. Its native serialized full-workspace gate passed with receipt SHA-256 de0fc6b360ce03493b13208d917dc8349801f03364617d966152c85846c47482. Idunn sealed 26 root-owned non-writable binaries plus release-witness.ccmp as release sha256-46407552b4a0937f63d2b7f2bd09a1dacb89d671a6e3807c97209159541aef06; witness-file SHA-256 is 348785ffb0fc3130d3b4538329870c6e6f8442a8da4a01b32fa9b7ffb1f01357. Source 9b9b5c85 also passed Idunn's native test gate under receipt SHA-256 6c6a71359f8c31297419665d2872f6982a89f84e197d71fc5b36a7fc86216093 and remains sealed as release sha256-30a910785a380224bbdbd56a7b742c8d058fa70cb72dab3562e3907903e0d191 with witness-file SHA-256 75bf52d31c56ea3b08e1a702273301c1db12a4b1ffae45e3d948ce8a29b50e1d. A foreign-target helper restarted Idunn during the Epiphany transaction; rollback restored d2ca, removed deployment.env, and left production Epiphany units inactive. OpenRouter model stealth/ox-alpha and its systemd-injected credential are readiness-proven. Idunn is active with zero restarts and its deployment brake is engaged. - summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. Exact edb5c3a3 deletes the launch, heartbeat, and terminal-result family identity mirrors: the sealed typed launch owns live pass identity and the archived attempt owns historical request identity. Exact cabdd6c3 separates immutable coordinator incarnation basis/terminality from minimal model-session admission and removes the remaining session prose, clocks, dead states, redundant options, and whole-store coordinator snapshot. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. + summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. Exact edb5c3a3 deletes the launch, heartbeat, and terminal-result family identity mirrors: the sealed typed launch owns live pass identity and the archived attempt owns historical request identity. Exact cabdd6c3 separates immutable coordinator incarnation basis/terminality from minimal model-session admission and removes the remaining session prose, clocks, dead states, redundant options, and whole-store coordinator snapshot. Exact a46725a1 reduces runtime jobs to Queued/Completed/Failed admission latches and removes timestamp selection from Research. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. The pure OpenAI runtime library opens exact model execution and admits typed provider events. OpenRouter auth/networking remains a direct release-entrypoint boundary; Codex transport crosses the lean authenticated CodexConnector client ABI and no Codex auth, HTTP/SSE, Codex-home, or compiled Codex dependency remains in Epiphany. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Workers use one governed tool-capable route; no parallel no-tools mode survives. The sealed typed worker launch is the sole live owner of pass-family identity; terminal role results contain semantic decision cargo rather than routing echoes, and archived attempts retain historical request identity plus the structured decision. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v40. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. The pure OpenAI runtime library opens exact model execution and admits typed provider events. OpenRouter auth/networking remains a direct release-entrypoint boundary; Codex transport crosses the lean authenticated CodexConnector client ABI and no Codex auth, HTTP/SSE, Codex-home, or compiled Codex dependency remains in Epiphany. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Workers use one governed tool-capable route; no parallel no-tools mode survives. The sealed typed worker launch is the sole live owner of pass-family identity; terminal role results contain semantic decision cargo rather than routing echoes, and archived attempts retain historical request identity plus the structured decision. Runtime jobs are only mutable Queued-to-Completed-or-Failed admission latches; clocks and unowned intermediate states are absent, and Research derives attempt authority as an exact set rather than timestamp order. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v41. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. execution_binding_authority_cut: Exact ce6bff12 reduces model and tool execution bindings to the only facts they own. A model binding maps one native request to its runtime session and job; a tool binding maps one typed intent to its runtime session and job. Provider identity, source worker, reasoning basis, and model-request ancestry are no longer copied into bindings or compared through timestamp-shaped API arguments. Validation, retention, public-source lookup, worker terminality, decision sealing, and tool continuation reload the exact native request or tool intent. Runtime writable state advances to v37. Core, epoch refusal, transcript-free decision audit, OpenAI tool continuation, and the release-owned tool runtime pass. The cut removes 67 net source lines and leaves runtime_spine.rs at 9,300 physical lines with 50 public functions and 25 public structs. Verification generated 12.713 GiB across 19,134 files; Cargo cleanup restored the single 1.78 MiB state inspector. Atlas is untouched; no live inter-swarm collaboration has run. provider_transport_boundary_cut: Exact ed7357a2 removes Codex transport from Epiphany's compiled body. The complete epiphany-openai-codex-spine package, codex-login/codex-client graph, CODEX_HOME/auth.json readiness, direct Codex HTTP/SSE, and Codex credential creation/argv are gone. Model and Persona entrypoints use the lean typed client from exact CodexConnector 54d8bc2525b7e7fa1b9dd26b95871247ff4c7566 over authenticated loopback MessagePack; Connector owns Codex auth, transport, replay, and exact native/provider digest receipts. Epiphany retains sealed native/provider requests, strict schema/call-ID projection, tool continuation, decision admission, and typed receipt evidence. OpenRouter remains one direct ureq/Rustls boundary with its own credential and terminal-tool dialect. Model receipts advance to v1 and runtime to v38; caller identity, both request digests, and cached-token usage survive transcript deletion. The maintained non-lock source shrinks by 857 lines and Cargo.lock drops 4,830 lines. Core 150/150, runtime 21/21, adapter 5/5, model edge 12/12, Persona 1/1, exact launch checks, and focused no-deps Clippy pass. Two focused build roots totaling 10.8 GiB were removed; only the exact 1,776,640-byte state inspector at SHA-256 DD38855C6F092C2C53D2212A938E737643F41130F4681708840BA6075320A04E remains. Atlas is untouched and no collaboration acceptance is claimed. runtime_session_authority_cut: Exact cabdd6c3 removes coordinator process incarnations from the generic model-session aggregate. EpiphanyRuntimeSession now contains only grouping identity plus active/completed admission state. Immutable EpiphanyCoordinatorRunBasis records exact thread, resident launch, objective, and start provenance. Exact completion/failure receipts and process-death recovery compete through one deterministic EpiphanyCoordinatorRunTerminality identity, so one full typed authority wins while unrelated document inserts merge. Objective prose, clocks, coordinator notes, four unused status variants, the one-field session-options wrapper, and the dead whole-snapshot append helper are deleted. Runtime advances to v40 with no compatibility reader. The focused Core, model-failure audit, Persona, coordinator terminality/conflict, release coordinator, and release model-runtime checks pass. The code cut removes 62 maintained lines net. Verification created 6.3 GiB across 7,017 Cargo files; cleanup restored exactly the 1,776,640-byte state inspector at SHA-256 DD38855C6F092C2C53D2212A938E737643F41130F4681708840BA6075320A04E. Atlas remains untouched and no live inter-swarm collaboration is claimed. + runtime_job_authority_cut: Exact a46725a1 removes timestamp causality and dead transition theater from EpiphanyRuntimeJob. The job is now the minimal mutable admission latch from Queued to Completed or Failed; Running, WaitingForReview, Cancelled, created_at, and updated_at are gone. Research no longer chooses a latest attempt by creation time: it derives the exact attempt set, refuses multiple live or multiple successful authorities, requires terminal evidence for failures, and otherwise projects launch, wait, or review deterministically. Runtime advances to v41 with no compatibility reader. Core, old-epoch refusal, model-failure audit, Persona replay, OpenAI runtime, release coordinator, and release model-runtime checks pass. The cut removes 67 maintained lines net. Verification created 3.2 GiB across 4,498 Cargo files; cleanup restored exactly the authenticated 1,776,640-byte state inspector. Atlas remains untouched and live inter-swarm collaboration remains unproven. standalone_codex_transport_target: Independent GameCult/CodexConnector exact 54d8bc2525b7e7fa1b9dd26b95871247ff4c7566 owns one Cargo package and one public daemon binary. Its default library is the lean encrypted client/contract ABI; the daemon feature adds the public service, bounded raw Responses transport, the private digest-pinned official codex app-server credential child, and keyed CultCache replay. Active identity is sealed before provider I/O; the exact encrypted completion is durable before reply; completed replay survives restart byte-identically; restart-era active work refuses as indeterminate without consuming current capacity. Callers own native/provider projection, prompts, tools, decisions, and admission. Redacted CultMesh/Odin readiness, the independent Idunn target, Yggdrasil service installation, and Ghostlight's consumer/deployment cut remain open. No live credential or deployment authority has moved. fixed_routing_and_retention_cargo_cut: Exact ffd91c20 deletes EyesEvidencePacket.source_role_id, PersonaSocialMention.target_agent_id, and ResidentSelfRetentionHead.retained_at_millis. Each producer supplied one fixed or non-causal value and no consumer read it; the request/context, Persona queue plus turn request, and retention chain remain the real owners. Eyes packet v2, Persona mention v2, Resident Self state v3/retention head v1, and runtime v27 form a hard cut. Core and the three consuming release entrypoints compile; consequential Persona, Research, and epoch-refusal proofs pass. The maintained source delta is 6 net deletions. Atlas is untouched; no live inter-swarm collaboration has run. provider_stream_authority_cut: Exact fe118e13 makes OpenAI/OpenRouter events and receipts transient transport values. The runtime immediately normalizes them into the single persisted native model event/receipt family used by tool continuation, assistant reconstruction, terminal validation, and bounded retention. Duplicate provider writes, registrations, archive requirements, schema IDs, two public schemas/index rows, and the include-only model-runtime shell are gone; the exact provider request remains durable. Runtime advances to v28 and the catalog drops to 18 schemas. The cut removes 270 net maintained lines. Adapter 1/1, provider spine 14/14, reasoning context 8/8, runtime 23/23, model entrypoint 11/11, swarm 4/4, epoch refusal 1/1, and release construction 15/15 pass. Atlas is untouched; live inter-swarm collaboration remains unproven. @@ -181,10 +182,10 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability; it still mixes immutable identity, model sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. The sealed launch solely owns live family identity and archived attempts own retained request identity. Exact cabdd6c3 removes coordinator runs from the generic session aggregate; model sessions now carry only grouping identity plus active/completed admission state, while immutable coordinator bases and deterministic typed terminality own process incarnation audit. The generic runtime job still copies role, session membership, two timestamps, and mutable status beside sealed launches, model bindings, process claims, terminal results, and archived attempts. Audit that aggregate before considering a split or abstraction. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path remains an earned privilege boundary and its Yggdrasil issuer/crossing route still requires owning-lane repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Continue source subtraction from exact cabdd6c3. Map every reader, writer, and transition of EpiphanyRuntimeJob. Decide whether role, session membership, created/updated timestamps, and mutable status protect an invariant not already owned by sealed worker launches, model bindings, process claims, terminal results, decision contexts, and archived attempts. Delete mirrors or reduce the aggregate to the smallest earned physiology; do not add a registry, adapter, compatibility reader, or derived latest head. Keep the standalone Connector readiness/Idunn/Yggdrasil/Ghostlight deployment sequence queued until the source body stabilizes. Preserve one refresh writer, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live credential transfer, Ox root, or Model Atlas Gate run. + unresolved_authority: `runtime_spine.rs` remains the largest central liability; it still mixes immutable identity, model sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. The sealed launch solely owns live family identity and archived attempts own retained request identity. Exact cabdd6c3 removes coordinator runs from the generic session aggregate; exact a46725a1 reduces generic jobs to role, session membership, and a Queued/Completed/Failed admission latch with no causal clocks. Role and session are still echoed beside immutable launches or model bindings and terminal job results still mirror role/session plus model-authored summaries already present in structured terminal decisions. Audit those remaining joins and cargo before considering a split or abstraction. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path remains an earned privilege boundary and its Yggdrasil issuer/crossing route still requires owning-lane repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Continue source subtraction from exact a46725a1. Map every producer and consumer of EpiphanyRuntimeJob.role/session_id and EpiphanyRuntimeJobResult role/session/summary cargo against sealed worker launches, model execution bindings, structured role results, typed pass failures, process claims, and archived attempts. Delete mirrors whose owner is already exact; retain only the minimal join or terminal latch required to prevent an invalid consequence. Do not add a registry, adapter, compatibility reader, or latest head. Keep the standalone Connector readiness/Idunn/Yggdrasil/Ghostlight deployment sequence queued until the source body stabilizes. Preserve one refresh writer, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live credential transfer, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, minimal model sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. The sealed typed launch document owns live pass-family identity. Terminal role results carry semantic outcome or typed failure, never duplicate family, route, or Body-basis routing fields. Archived worker attempts retain exact request kind/ID, deletion digest, decision context, structured result, and terminal job records after live launch deletion. Model sessions carry only grouping identity plus active/completed admission state. Coordinator incarnation launch provenance is an immutable typed basis; one deterministic typed terminality identity admits the exact full run receipt or death recovery and makes competing terminal outcomes conflict without fencing unrelated documents. Terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone. Mind/runtime writable epochs are v10/v40. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator basis admission are the only session/job creation owners. Continue subtraction by auditing whether the generic runtime job aggregate retains authority not already owned by sealed launches, bindings, process claims, terminal results, contexts, and retention tombstones; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, minimal model sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. The sealed typed launch document owns live pass-family identity. Terminal role results carry semantic outcome or typed failure, never duplicate family, route, or Body-basis routing fields. Archived worker attempts retain exact request kind/ID, deletion digest, decision context, structured result, and terminal job records after live launch deletion. Model sessions carry only grouping identity plus active/completed admission state. Coordinator incarnation launch provenance is an immutable typed basis; one deterministic typed terminality identity admits the exact full run receipt or death recovery and makes competing terminal outcomes conflict without fencing unrelated documents. Runtime jobs carry only job identity, session join, role, and the Queued/Completed/Failed admission latch. No job clock or intermediate status participates in causality; Research refuses ambiguous attempt sets instead of selecting a latest timestamp. Terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone. Mind/runtime writable epochs are v10/v41. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator basis admission are the only session/job creation owners. Continue subtraction by auditing the remaining role/session joins and terminal-result cargo against their exact sealed owners; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. diff --git a/state/scratch.md b/state/scratch.md index f090182e..5143ede3 100644 --- a/state/scratch.md +++ b/state/scratch.md @@ -232,14 +232,19 @@ and janitors may reduce the symptom but cannot substitute for deleting code. session options wrapper, duplicated prose/timestamps, four dead session states, and the dead snapshot-append helper are gone; 62 maintained lines are removed net. -41. Next: map every `EpiphanyRuntimeJob` field and transition. Determine whether - role, session membership, timestamps, and mutable status are already owned by - sealed worker launches, model bindings, process claims, terminal results, and - archived attempts. Preserve only lifecycle state that actually blocks an - invalid consequence. -42. Continue the public runtime-spine and test-liability audit by live owner +41. Done: exact `a46725a1` removes `EpiphanyRuntimeJob` creation/update clocks + and the unwritten Running, WaitingForReview, and Cancelled states. Jobs are + now only Queued/Completed/Failed admission latches. Frontier Research derives + authority from the exact attempt set and refuses multiple live or successful + authorities instead of choosing the newest timestamp. Runtime is v41; 67 + maintained lines are removed net. +42. Next: audit the remaining job `role`/`session_id` joins and generic terminal + job-result cargo against sealed worker launches, model bindings, structured + outcomes, typed failures, process claims, and archives. Preserve only facts + that prevent an invalid consequence. +43. Continue the public runtime-spine and test-liability audit by live owner and consequential invariant. Do not subtract the unrun Atlas vertical slice; no inter-swarm collaboration has yet been exercised. Streamline it only around its one end-to-end authority map. -42. Run focused tests after each cut. Only after source subtraction stabilizes +44. Run focused tests after each cut. Only after source subtraction stabilizes should Idunn's build scratch contract be reconsidered. From 10a70afcbd8767bbf11434cc50dba5b421b827ff Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 20:54:59 +0200 Subject: [PATCH 089/340] Derive runtime job ownership from sealed bindings --- epiphany-core/src/current_work.rs | 35 --- epiphany-core/src/reasoning_context.rs | 10 - epiphany-core/src/reorientation_work.rs | 5 - epiphany-core/src/runtime_spine.rs | 208 +++++++++--------- .../src/bin/epiphany-openai-runtime.rs | 11 - epiphany-openai-runtime/src/lib.rs | 7 - .../src/persona_executor.rs | 1 - 7 files changed, 102 insertions(+), 175 deletions(-) diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index df8350e0..b2a7cbbf 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -1192,10 +1192,6 @@ pub fn launch_current_frontier_planning_work( &cache, crate::RuntimeSpineHeartbeatJobOptions { runtime_id: identity.runtime_id.clone(), - session_id: crate::EPIPHANY_RUNTIME_ROOT_SESSION_ID.into(), - objective: "Propose one bounded plan for the exact frontier authority".into(), - coordinator_note: "Planning current-work launch transaction opened this session." - .into(), job_id: job_id.clone(), role: crate::EPIPHANY_IMAGINATION_OWNER_ROLE.into(), binding_id: crate::EPIPHANY_IMAGINATION_ROLE_BINDING_ID.into(), @@ -1353,10 +1349,6 @@ pub fn launch_current_frontier_plan_mind_work( &cache, crate::RuntimeSpineHeartbeatJobOptions { runtime_id: identity.runtime_id.clone(), - session_id: crate::EPIPHANY_RUNTIME_ROOT_SESSION_ID.into(), - objective: "Adjudicate one exact Imagination plan candidate".into(), - coordinator_note: "Plan Mind current-work launch transaction opened this session." - .into(), job_id: job_id.clone(), role: crate::EPIPHANY_MIND_OWNER_ROLE.into(), binding_id: crate::EPIPHANY_MIND_ROLE_BINDING_ID.into(), @@ -1496,10 +1488,6 @@ pub fn launch_current_frontier_verification_work( &cache, crate::RuntimeSpineHeartbeatJobOptions { runtime_id: identity.runtime_id, - session_id: crate::EPIPHANY_RUNTIME_ROOT_SESSION_ID.into(), - objective: "Audit one exact Hands consequence against its routed invariant".into(), - coordinator_note: - "Verification current-work launch transaction opened this session.".into(), job_id: job_id.clone(), role: crate::EPIPHANY_VERIFICATION_OWNER_ROLE.into(), binding_id: crate::EPIPHANY_VERIFICATION_ROLE_BINDING_ID.into(), @@ -1646,10 +1634,6 @@ pub fn launch_current_frontier_research_work( &cache, crate::RuntimeSpineHeartbeatJobOptions { runtime_id: identity.runtime_id, - session_id: crate::EPIPHANY_RUNTIME_ROOT_SESSION_ID.into(), - objective: "Gather evidence for one exact external-evidence obligation".into(), - coordinator_note: "Research current-work launch transaction opened this session." - .into(), job_id: job_id.clone(), role: crate::EPIPHANY_RESEARCH_OWNER_ROLE.into(), binding_id: crate::EPIPHANY_RESEARCH_ROLE_BINDING_ID.into(), @@ -2769,9 +2753,6 @@ fn launch_consideration_work( &cache, crate::RuntimeSpineHeartbeatJobOptions { runtime_id: identity.runtime_id, - session_id: crate::EPIPHANY_RUNTIME_ROOT_SESSION_ID.into(), - objective: "Consider one exact typed proposal-only obligation".into(), - coordinator_note: "Consideration current-work launch opened this attempt.".into(), job_id: job_id.clone(), role: crate::EPIPHANY_IMAGINATION_OWNER_ROLE.into(), binding_id: crate::EPIPHANY_IMAGINATION_ROLE_BINDING_ID.into(), @@ -2928,10 +2909,6 @@ pub fn launch_current_body_modeling_work( &cache, crate::RuntimeSpineHeartbeatJobOptions { runtime_id: work.runtime_id.clone(), - session_id: crate::EPIPHANY_RUNTIME_ROOT_SESSION_ID.into(), - objective: "Model the admitted repository Body".into(), - coordinator_note: "Keyed Mind current-work launch transaction opened this session." - .into(), job_id: job_id.clone(), role: crate::EPIPHANY_MODELING_OWNER_ROLE.into(), binding_id: crate::EPIPHANY_MODELING_ROLE_BINDING_ID.into(), @@ -3101,10 +3078,6 @@ pub fn launch_current_proposal_modeling_work( &cache, crate::RuntimeSpineHeartbeatJobOptions { runtime_id: identity.runtime_id.clone(), - session_id: crate::EPIPHANY_RUNTIME_ROOT_SESSION_ID.into(), - objective: "Model one admitted proposal against keyed Mind".into(), - coordinator_note: "Proposal current-work launch transaction opened this session." - .into(), job_id: job_id.clone(), role: crate::EPIPHANY_MODELING_OWNER_ROLE.into(), binding_id: crate::EPIPHANY_MODELING_ROLE_BINDING_ID.into(), @@ -3231,10 +3204,6 @@ pub fn launch_current_frontier_verdict_modeling_work( &cache, crate::RuntimeSpineHeartbeatJobOptions { runtime_id: identity.runtime_id, - session_id: crate::EPIPHANY_RUNTIME_ROOT_SESSION_ID.into(), - objective: "Incorporate one exact Soul verdict into its routed frontier".into(), - coordinator_note: - "Frontier verdict current-work launch transaction opened this session.".into(), job_id: job_id.clone(), role: crate::EPIPHANY_MODELING_OWNER_ROLE.into(), binding_id: crate::EPIPHANY_MODELING_ROLE_BINDING_ID.into(), @@ -3690,7 +3659,6 @@ mod tests { crate::RuntimeSpineJobOptions { job_id: "body-failed-model-job".into(), session_id: "body-failed-model-session".into(), - role: "openai-model".into(), }, &failed_native, )?; @@ -4663,7 +4631,6 @@ mod tests { crate::RuntimeSpineJobOptions { job_id: "verification-model-job".into(), session_id: "verification-model-session".into(), - role: "openai-model".into(), }, &verification_native, )?; @@ -5325,7 +5292,6 @@ mod tests { crate::RuntimeSpineJobOptions { job_id: "planning-model-job".into(), session_id: "planning-model-session".into(), - role: "openai-model".into(), }, &planning_native, )?; @@ -5453,7 +5419,6 @@ mod tests { crate::RuntimeSpineJobOptions { job_id: "plan-mind-model-job".into(), session_id: "plan-mind-model-session".into(), - role: "openai-model".into(), }, &mind_native, )?; diff --git a/epiphany-core/src/reasoning_context.rs b/epiphany-core/src/reasoning_context.rs index 96fa72bb..e2fd9595 100644 --- a/epiphany-core/src/reasoning_context.rs +++ b/epiphany-core/src/reasoning_context.rs @@ -2238,7 +2238,6 @@ mod tests { crate::RuntimeSpineJobOptions { job_id: "model-job-1".into(), session_id: "session-1".into(), - role: "model-adapter".into(), }, &initial_native, )?; @@ -2284,7 +2283,6 @@ mod tests { crate::RuntimeSpineJobOptions { job_id: "model-job-2".into(), session_id: "session-1".into(), - role: "model-adapter".into(), }, &terminal_native, )?; @@ -2351,7 +2349,6 @@ mod tests { crate::RuntimeSpineJobOptions { job_id: "failed-model-job".into(), session_id: "failed-pass-session".into(), - role: "model-adapter".into(), }, &native, )?; @@ -2435,15 +2432,12 @@ mod tests { let failure_runtime_result = crate::EpiphanyRuntimeJobResult { result_id: format!("result-runtime-{}", reasoning_basis.pass_id), job_id: reasoning_basis.pass_id.clone(), - session_id: "failed-pass-session".into(), - role: reasoning_basis.organ_id.clone(), verdict: "failed".into(), summary: failure_summary, completed_at: "2026-08-18T00:00:03Z".into(), next_safe_move: "Create a fresh work obligation and reasoning pass.".into(), evidence_refs: Vec::new(), artifact_refs: Vec::new(), - metadata: std::collections::BTreeMap::new(), decision_context_id: Some(context.context_id.clone()), }; let mut cache = runtime_spine_cache(&store)?; @@ -2569,7 +2563,6 @@ mod tests { crate::RuntimeSpineJobOptions { job_id: "model-job-1".into(), session_id: "session-1".into(), - role: "model-adapter".into(), }, &native, )?; @@ -2633,15 +2626,12 @@ mod tests { let terminal_result = crate::EpiphanyRuntimeJobResult { result_id: "worker-result-1".into(), job_id: "pass-1".into(), - session_id: "session-1".into(), - role: "Imagination".into(), verdict: "completed".into(), summary: "Structured Imagination decision".into(), completed_at: "2026-08-14T00:00:03Z".into(), next_safe_move: "Inspect the durable decision context".into(), evidence_refs: Vec::new(), artifact_refs: Vec::new(), - metadata: Default::default(), decision_context_id: Some(context.context_id.clone()), }; runtime_spine_cache(&store)?.put(&terminal_result.result_id, &terminal_result)?; diff --git a/epiphany-core/src/reorientation_work.rs b/epiphany-core/src/reorientation_work.rs index 19c74d33..5772a089 100644 --- a/epiphany-core/src/reorientation_work.rs +++ b/epiphany-core/src/reorientation_work.rs @@ -456,9 +456,6 @@ pub fn launch_current_reorientation_work( &cache, crate::RuntimeSpineHeartbeatJobOptions { runtime_id: work.request.runtime_id.clone(), - session_id: crate::EPIPHANY_RUNTIME_ROOT_SESSION_ID.into(), - objective: "Reorient from one exact keyed Mind projection".into(), - coordinator_note: "Reorientation current-work owner opened this pass.".into(), job_id: job_id.clone(), role: crate::EPIPHANY_REORIENT_OWNER_ROLE.into(), binding_id: crate::EPIPHANY_REORIENT_LAUNCH_BINDING_ID.into(), @@ -970,7 +967,6 @@ mod tests { crate::RuntimeSpineJobOptions { job_id: "reorientation-model-job".into(), session_id: "reorientation-model-session".into(), - role: "openai-model".into(), }, &native, )?; @@ -1093,7 +1089,6 @@ mod tests { crate::RuntimeSpineJobOptions { job_id: "failed-reorientation-model-job".into(), session_id: "failed-reorientation-model-session".into(), - role: "openai-model".into(), }, &failed_native, )?; diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index c8ddc6c8..56e453fc 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -55,7 +55,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v41"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v42"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache(type = "epiphany.runtime.identity", schema = "EpiphanyRuntimeIdentity")] @@ -127,10 +127,6 @@ pub struct EpiphanyRuntimeJob { #[cultcache(key = 1)] pub job_id: String, #[cultcache(key = 2)] - pub session_id: String, - #[cultcache(key = 3)] - pub role: String, - #[cultcache(key = 4)] pub status: EpiphanyRuntimeJobStatus, } @@ -527,24 +523,18 @@ pub struct EpiphanyRuntimeJobResult { #[cultcache(key = 2)] pub job_id: String, #[cultcache(key = 3)] - pub session_id: String, - #[cultcache(key = 4)] - pub role: String, - #[cultcache(key = 5)] pub verdict: String, - #[cultcache(key = 6)] + #[cultcache(key = 4)] pub summary: String, - #[cultcache(key = 7)] + #[cultcache(key = 5)] pub completed_at: String, - #[cultcache(key = 8, default)] + #[cultcache(key = 6, default)] pub next_safe_move: String, - #[cultcache(key = 9, default)] + #[cultcache(key = 7, default)] pub evidence_refs: Vec, - #[cultcache(key = 10, default)] + #[cultcache(key = 8, default)] pub artifact_refs: Vec, - #[cultcache(key = 11, default)] - pub metadata: BTreeMap, - #[cultcache(key = 12, default)] + #[cultcache(key = 9, default)] pub decision_context_id: Option, } @@ -647,7 +637,6 @@ pub struct ModelPassFailureTerminalOptions { pub struct RuntimeSpineJobOptions { pub job_id: String, pub session_id: String, - pub role: String, } #[derive(Clone, Debug, PartialEq, Eq)] @@ -666,9 +655,6 @@ pub struct RuntimeSpineJobResultOptions { #[derive(Clone, Debug, PartialEq)] pub struct RuntimeSpineHeartbeatJobOptions { pub runtime_id: String, - pub session_id: String, - pub objective: String, - pub coordinator_note: String, pub job_id: String, pub role: String, pub binding_id: String, @@ -943,11 +929,17 @@ pub fn close_runtime_session( if session.status == EpiphanyRuntimeSessionStatus::Completed { return Ok(session); } + let session_job_ids = cache + .get_all::()? + .into_iter() + .filter(|binding| binding.session_id == options.session_id) + .map(|binding| binding.job_id) + .collect::>(); let open_job_ids = cache .get_all::()? .into_iter() .filter(|job| { - job.session_id == options.session_id + session_job_ids.contains(&job.job_id) && matches!(job.status, EpiphanyRuntimeJobStatus::Queued) }) .map(|job| job.job_id) @@ -1034,11 +1026,6 @@ pub fn terminalize_model_pass_failure_session( let mut model_job = cache .get::(&binding.job_id)? .ok_or_else(|| anyhow!("model pass failure runtime job is absent"))?; - if model_job.session_id != binding.session_id { - return Err(anyhow!( - "model pass failure runtime job is outside its exact session" - )); - } let model_job_is_live = matches!(model_job.status, EpiphanyRuntimeJobStatus::Queued); let model_job_results = cache .get_all::()? @@ -1055,11 +1042,17 @@ pub fn terminalize_model_pass_failure_session( "terminal model transport job lost its non-authoritative result" )); } + let session_job_ids = cache + .get_all::()? + .into_iter() + .filter(|candidate| candidate.session_id == binding.session_id) + .map(|candidate| candidate.job_id) + .collect::>(); let open_job_ids = cache .get_all::()? .into_iter() .filter(|job| { - job.session_id == binding.session_id + session_job_ids.contains(&job.job_id) && (!model_job_is_live || job.job_id != binding.job_id) && matches!(job.status, EpiphanyRuntimeJobStatus::Queued) }) @@ -1082,8 +1075,6 @@ pub fn terminalize_model_pass_failure_session( let model_result = EpiphanyRuntimeJobResult { result_id: format!("result-model-pass-failure-{}", failure.failure_id), job_id: binding.job_id.clone(), - session_id: binding.session_id.clone(), - role: model_job.role.clone(), verdict: "failed".to_string(), summary: options.summary.clone(), completed_at: options.failed_at.clone(), @@ -1092,7 +1083,6 @@ pub fn terminalize_model_pass_failure_session( .to_string(), evidence_refs: Vec::new(), artifact_refs: Vec::new(), - metadata: BTreeMap::new(), decision_context_id: None, }; expected.push(model_job_envelope); @@ -1153,7 +1143,6 @@ pub fn open_runtime_model_execution( ) -> Result { validate_non_empty(&job_options.session_id, "model execution session id")?; validate_non_empty(&job_options.job_id, "model execution job id")?; - validate_non_empty(&job_options.role, "model execution job role")?; validate_non_empty(&model_request.request_id, "model execution request id")?; validate_non_empty(&model_request.provider, "model execution provider")?; let provider_request = epiphany_openai_adapter::request_from_native(model_request); @@ -1198,12 +1187,10 @@ pub fn open_runtime_model_execution( let worker_job = cache .get::(worker_job_id)? .ok_or_else(|| anyhow!("model execution source worker has no runtime job"))?; - if worker_job.role != launch.role - || matches!( - worker_job.status, - EpiphanyRuntimeJobStatus::Completed | EpiphanyRuntimeJobStatus::Failed - ) - { + if matches!( + worker_job.status, + EpiphanyRuntimeJobStatus::Completed | EpiphanyRuntimeJobStatus::Failed + ) { return Err(anyhow!( "model execution source worker job is foreign or terminal" )); @@ -1243,8 +1230,6 @@ pub fn open_runtime_model_execution( } let job = EpiphanyRuntimeJob { job_id: job_options.job_id.clone(), - session_id: session.session_id.clone(), - role: job_options.role, status: EpiphanyRuntimeJobStatus::Queued, }; let binding_id = model_request.request_id.clone(); @@ -1333,7 +1318,7 @@ pub fn put_runtime_tool_execution_intent( let job = cache .get::(job_id)? .ok_or_else(|| anyhow!("tool execution job {job_id:?} does not exist"))?; - if job.session_id != session_id + if !runtime_job_belongs_to_session(&cache, job_id, session_id)? || matches!( job.status, EpiphanyRuntimeJobStatus::Completed | EpiphanyRuntimeJobStatus::Failed @@ -1433,6 +1418,31 @@ pub fn put_runtime_tool_execution_intent( Ok(binding) } +fn runtime_job_belongs_to_session( + cache: &CultCache, + job_id: &str, + session_id: &str, +) -> Result { + if cache + .get::(job_id)? + .is_some() + { + return Ok(session_id == EPIPHANY_RUNTIME_ROOT_SESSION_ID); + } + let bindings = cache + .get_all::()? + .into_iter() + .filter(|binding| binding.job_id == job_id) + .collect::>(); + match bindings.as_slice() { + [binding] => Ok(binding.session_id == session_id), + [] => Ok(false), + _ => Err(anyhow!( + "runtime job has multiple model-session authorities" + )), + } +} + pub(crate) fn validate_runtime_model_execution_binding( cache: &CultCache, request_id: &str, @@ -1452,12 +1462,11 @@ pub(crate) fn validate_runtime_model_execution_binding( cache .get::(&binding.session_id)? .ok_or_else(|| anyhow!("model execution binding {request_id:?} lost its session"))?; - let job = cache + cache .get::(&binding.job_id)? .ok_or_else(|| anyhow!("model execution binding {request_id:?} lost its job"))?; if binding.request_id != request_id || provider != epiphany_openai_adapter::request_from_native(&native) - || job.session_id != binding.session_id { return Err(anyhow!( "model execution binding {request_id:?} is not one exact request family" @@ -1474,13 +1483,10 @@ pub(crate) fn validate_runtime_model_execution_binding( let launch = cache .get::(worker_job_id)? .ok_or_else(|| anyhow!("model execution binding lost its source worker launch"))?; - let worker_job = cache + cache .get::(worker_job_id)? .ok_or_else(|| anyhow!("model execution binding lost its source worker job"))?; - if basis.pass_id != worker_job_id - || launch.job_id != worker_job_id - || worker_job.role != launch.role - { + if basis.pass_id != worker_job_id || launch.job_id != worker_job_id { return Err(anyhow!( "model execution binding {request_id:?} has foreign worker authority" )); @@ -1527,7 +1533,7 @@ pub(crate) fn validate_runtime_tool_execution_binding( let job = cache .get::(&binding.job_id)? .ok_or_else(|| anyhow!("tool execution binding {intent_id:?} lost its job"))?; - if job.session_id != binding.session_id { + if !runtime_job_belongs_to_session(cache, &job.job_id, &binding.session_id)? { return Err(anyhow!( "tool execution binding {intent_id:?} has foreign or archived ownership" )); @@ -1636,15 +1642,15 @@ pub fn retain_completed_runtime_sessions( .into_iter() .filter(|session| session.status == EpiphanyRuntimeSessionStatus::Completed) .filter(|session| { - let session_jobs = jobs + let session_job_ids = bindings .iter() - .filter(|job| job.session_id == session.session_id) - .collect::>(); - !session_jobs.is_empty() - && session_jobs.iter().all(|job| { - job.role == "openai-model-adapter" - && bindings.iter().any(|binding| binding.job_id == job.job_id) - }) + .filter(|binding| binding.session_id == session.session_id) + .map(|binding| binding.job_id.as_str()) + .collect::>(); + !session_job_ids.is_empty() + && session_job_ids + .iter() + .all(|job_id| jobs.iter().any(|job| job.job_id == **job_id)) }) .collect::>(); candidates.sort_by(|left, right| right.session_id.cmp(&left.session_id)); @@ -1683,17 +1689,26 @@ fn archive_completed_model_session( if session.status != EpiphanyRuntimeSessionStatus::Completed { return Err(anyhow!("runtime session {session_id:?} is not completed")); } + let mut model_bindings = cache + .get_all::()? + .into_iter() + .filter(|binding| binding.session_id == session_id) + .collect::>(); + model_bindings.sort_by(|left, right| left.request_id.cmp(&right.request_id)); + let session_job_ids = model_bindings + .iter() + .map(|binding| binding.job_id.as_str()) + .collect::>(); let mut jobs = cache .get_all::()? .into_iter() - .filter(|job| job.session_id == session_id) + .filter(|job| session_job_ids.contains(job.job_id.as_str())) .collect::>(); jobs.sort_by(|left, right| left.job_id.cmp(&right.job_id)); if jobs.is_empty() - || jobs.iter().any(|job| { - job.role != "openai-model-adapter" - || matches!(job.status, EpiphanyRuntimeJobStatus::Queued) - }) + || jobs + .iter() + .any(|job| matches!(job.status, EpiphanyRuntimeJobStatus::Queued)) { return Err(anyhow!( "runtime session archive accepts only terminal model-adapter jobs" @@ -1706,7 +1721,7 @@ fn archive_completed_model_session( let mut job_results = cache .get_all::()? .into_iter() - .filter(|result| result.session_id == session_id) + .filter(|result| job_ids.contains(&result.job_id)) .collect::>(); job_results.sort_by(|left, right| left.result_id.cmp(&right.result_id)); if jobs.iter().any(|job| { @@ -1747,12 +1762,6 @@ fn archive_completed_model_session( )); } - let mut model_bindings = cache - .get_all::()? - .into_iter() - .filter(|binding| binding.session_id == session_id) - .collect::>(); - model_bindings.sort_by(|left, right| left.request_id.cmp(&right.request_id)); if jobs.iter().any(|job| { model_bindings .iter() @@ -2040,8 +2049,6 @@ pub fn prepare_runtime_spine_heartbeat_job( options: RuntimeSpineHeartbeatJobOptions, ) -> Result> { validate_non_empty(&options.runtime_id, "runtime id")?; - validate_non_empty(&options.session_id, "session id")?; - validate_non_empty(&options.objective, "objective")?; validate_non_empty(&options.job_id, "job id")?; validate_non_empty(&options.role, "role")?; validate_repository_body_launch_carrier(&options.role, &options.launch_document)?; @@ -2118,16 +2125,16 @@ pub fn prepare_runtime_spine_heartbeat_job( "runtime job preparation cannot substitute runtime identity" )); } - let session = match cache.get::(&options.session_id)? { + let session = match cache.get::(EPIPHANY_RUNTIME_ROOT_SESSION_ID)? { Some(existing) if existing.status == EpiphanyRuntimeSessionStatus::Completed => { return Err(anyhow!( "runtime session {:?} is terminal and cannot accept jobs", - options.session_id + EPIPHANY_RUNTIME_ROOT_SESSION_ID )); } Some(existing) => existing, None => EpiphanyRuntimeSession { - session_id: options.session_id.clone(), + session_id: EPIPHANY_RUNTIME_ROOT_SESSION_ID.into(), status: EpiphanyRuntimeSessionStatus::Active, }, }; @@ -2145,8 +2152,6 @@ pub fn prepare_runtime_spine_heartbeat_job( } let job = EpiphanyRuntimeJob { job_id: options.job_id.clone(), - session_id: options.session_id.clone(), - role: options.role.clone(), status: EpiphanyRuntimeJobStatus::Queued, }; let request = EpiphanyRuntimeWorkerLaunchRequest { @@ -2456,15 +2461,15 @@ pub fn runtime_job_snapshot( let Some(job) = cache.get::(job_id)? else { return Ok(None); }; - let result = cache + let mut results = cache .get_all::()? .into_iter() .filter(|result| result.job_id == job_id) - .max_by(|left, right| { - left.completed_at - .cmp(&right.completed_at) - .then_with(|| left.result_id.cmp(&right.result_id)) - }); + .collect::>(); + if results.len() > 1 { + return Err(anyhow!("runtime job has multiple terminal results")); + } + let result = results.pop(); Ok(Some(EpiphanyRuntimeJobSnapshot { job, result })) } @@ -2569,7 +2574,7 @@ pub fn put_runtime_requested_public_source_intents( .ok_or_else(|| anyhow!("requested public source worker has no launch request"))?; let request = frontier_research_request_for_launch(&cache, &launch)? .ok_or_else(|| anyhow!("requested public source worker has no typed Research request"))?; - let job = cache + cache .get::(worker_job_id)? .ok_or_else(|| anyhow!("requested public source worker has no runtime job"))?; drop(cache); @@ -2607,7 +2612,7 @@ pub fn put_runtime_requested_public_source_intents( || chrono::DateTime::parse_from_rfc3339(&existing_intent.created_at).is_err() || existing_binding.intent_id != intent_id || existing_binding.job_id != worker_job_id - || existing_binding.session_id != job.session_id + || existing_binding.session_id != EPIPHANY_RUNTIME_ROOT_SESSION_ID { return Err(anyhow!( "requested public source intent {intent_id:?} collides with foreign authority" @@ -2625,7 +2630,12 @@ pub fn put_runtime_requested_public_source_intents( )); } drop(cache); - put_runtime_tool_execution_intent(store_path, &job.session_id, worker_job_id, &intent)?; + put_runtime_tool_execution_intent( + store_path, + EPIPHANY_RUNTIME_ROOT_SESSION_ID, + worker_job_id, + &intent, + )?; intents.push(intent); } Ok(intents) @@ -2946,9 +2956,6 @@ fn governed_source_tool_authority( let launch = cache .get::(&source_worker_job_id)? .ok_or_else(|| anyhow!("governed source tool intent lost its source worker launch"))?; - let source_worker_job = cache - .get::(&source_worker_job_id)? - .ok_or_else(|| anyhow!("governed source tool intent lost its source worker job"))?; if !matches!( launch.binding_id.as_str(), crate::EPIPHANY_RESEARCH_ROLE_BINDING_ID @@ -2976,8 +2983,7 @@ fn governed_source_tool_authority( intent.intent_id ) })?; - if source_worker_job.role != launch.role - || grant.runtime_job_id != source_worker_job_id + if grant.runtime_job_id != source_worker_job_id || grant.binding_id != launch.binding_id || grant.role != launch.role || grant.authority_scope != launch.authority_scope @@ -3432,15 +3438,12 @@ fn commit_runtime_worker_process_death( let result = EpiphanyRuntimeJobResult { result_id: format!("result-worker-death-{job_id}"), job_id: job_id.to_string(), - session_id: job.session_id.clone(), - role: job.role.clone(), verdict: "failed".to_string(), summary: summary.clone(), completed_at: terminal_at.to_string(), next_safe_move: "Derive a fresh attempt from current typed work; never rebase the abandoned model output.".to_string(), evidence_refs: Vec::new(), artifact_refs: Vec::new(), - metadata: BTreeMap::new(), decision_context_id: decision_context_id.map(str::to_string), }; if cache @@ -8510,6 +8513,7 @@ pub fn open_coordinator_run( || cache .get::(session_id)? .is_some() + || cache.get::(session_id)?.is_some() { return Err(anyhow!( "coordinator run session or thread authority already exists" @@ -8544,10 +8548,7 @@ pub(crate) fn coordinator_run_incarnation_is_absent( && cache .get::(&session_id)? .is_none() - && !cache - .get_all::()? - .iter() - .any(|job| job.session_id == session_id)) + && cache.get::(&session_id)?.is_none()) } pub(crate) fn recover_coordinator_run_after_exact_process_death( @@ -8613,9 +8614,8 @@ pub(crate) fn recover_coordinator_run_after_exact_process_death( if (session_started_at.timestamp_millis().max(0) as u64) < recovery.resident_started_at_millis || recovered_at < session_started_at || cache - .get_all::()? - .iter() - .any(|job| job.session_id == recovery.session_id) + .get::(&recovery.session_id)? + .is_some() || cache .get::(&recovery.session_id)? .is_some() @@ -8685,9 +8685,8 @@ pub fn finalize_coordinator_run( return Err(anyhow!("coordinator run receipt substituted its run basis")); } if cache - .get_all::()? - .iter() - .any(|job| job.session_id == receipt.session_id) + .get::(&receipt.session_id)? + .is_some() { return Err(anyhow!( "coordinator run finalization refuses a session with runtime jobs" @@ -8763,15 +8762,12 @@ pub fn complete_runtime_job( let result = EpiphanyRuntimeJobResult { result_id: options.result_id.clone(), job_id: options.job_id.clone(), - session_id: job.session_id.clone(), - role: job.role.clone(), verdict: options.verdict, summary: options.summary, completed_at: options.completed_at.clone(), next_safe_move: options.next_safe_move, evidence_refs: options.evidence_refs, artifact_refs: options.artifact_refs, - metadata: BTreeMap::new(), decision_context_id: options.decision_context_id, }; let mut expected = vec![job_envelope]; diff --git a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs index 31a8010c..83e5b251 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs @@ -1144,7 +1144,6 @@ mod tests { epiphany_core::RuntimeSpineJobOptions { job_id: job_id.clone(), session_id: session_id.clone(), - role: OPENAI_RUNTIME_ROLE.to_string(), }, &model_request, )?; @@ -1242,9 +1241,6 @@ mod tests { &store, RuntimeSpineHeartbeatJobOptions { runtime_id: "epiphany-test".to_string(), - session_id: "epiphany-main".to_string(), - objective: "Run typed worker.".to_string(), - coordinator_note: "test".to_string(), job_id: "worker-job-loop".to_string(), role: "verification".to_string(), binding_id: "verification-review-worker".to_string(), @@ -1333,9 +1329,6 @@ mod tests { &store, RuntimeSpineHeartbeatJobOptions { runtime_id: "epiphany-test".to_string(), - session_id: "epiphany-main".to_string(), - objective: "Run typed worker.".to_string(), - coordinator_note: "test".to_string(), job_id: "worker-job-runtime-error".to_string(), role: "verification".to_string(), binding_id: "verification-review-worker".to_string(), @@ -1382,7 +1375,6 @@ mod tests { epiphany_core::RuntimeSpineJobOptions { job_id: "openai-job-runtime-error".into(), session_id: "openai-runtime-error".into(), - role: OPENAI_RUNTIME_ROLE.into(), }, &request, )?; @@ -1436,9 +1428,6 @@ mod tests { &store, RuntimeSpineHeartbeatJobOptions { runtime_id: "epiphany-test".to_string(), - session_id: "epiphany-main".to_string(), - objective: "Run typed worker.".to_string(), - coordinator_note: "test".to_string(), job_id: "worker-job-round-limit".to_string(), role: "verification".to_string(), binding_id: "verification-review-worker".to_string(), diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index a3cf7e06..3b0ff36e 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -117,7 +117,6 @@ pub fn open_model_turn( RuntimeSpineJobOptions { job_id: options.job_id.clone(), session_id: options.session_id.clone(), - role: OPENAI_RUNTIME_ROLE.to_string(), }, model_request, )?; @@ -2961,7 +2960,6 @@ mod tests { RuntimeSpineJobOptions { job_id: options.job_id.clone(), session_id: options.session_id.clone(), - role: OPENAI_RUNTIME_ROLE.to_string(), }, &native_request, )?; @@ -3057,7 +3055,6 @@ mod tests { RuntimeSpineJobOptions { job_id: "openai-worker-worker-job-1".into(), session_id: "openai-worker-session-modeling-checkpoint-worker".into(), - role: "openai-model-adapter".into(), }, &model_request, )?; @@ -3281,9 +3278,6 @@ mod tests { &store, RuntimeSpineHeartbeatJobOptions { runtime_id: "epiphany-test".to_string(), - session_id: "epiphany-main".to_string(), - objective: "Verify the machine.".to_string(), - coordinator_note: "test".to_string(), job_id: "verification-job-1".to_string(), role: "verification".to_string(), binding_id: epiphany_core::EPIPHANY_VERIFICATION_ROLE_BINDING_ID.to_string(), @@ -3422,7 +3416,6 @@ mod tests { RuntimeSpineJobOptions { job_id: options.job_id.clone(), session_id: options.session_id.clone(), - role: OPENAI_RUNTIME_ROLE.to_string(), }, &native_request, )?; diff --git a/epiphany-openai-runtime/src/persona_executor.rs b/epiphany-openai-runtime/src/persona_executor.rs index a312232a..70855da7 100644 --- a/epiphany-openai-runtime/src/persona_executor.rs +++ b/epiphany-openai-runtime/src/persona_executor.rs @@ -594,7 +594,6 @@ mod tests { epiphany_core::RuntimeSpineJobOptions { job_id: format!("persona-{stage}-{turn_id}"), session_id: format!("persona-turn-{turn_id}"), - role: "openai-model-adapter".into(), }, &request, )?; From 7189243fd985c77236bc753eb5d266282e752a80 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 20:58:36 +0200 Subject: [PATCH 090/340] Record runtime job binding cut --- notes/epiphany-current-algorithmic-map.md | 10 ++++++++ notes/epiphany-fork-implementation-plan.md | 9 +++++++ notes/fresh-workspace-handoff.md | 28 +++++++++++++++------ state/ledgers.msgpack | Bin 722658 -> 723447 bytes state/map.yaml | 11 ++++---- state/scratch.md | 19 +++++++++----- 6 files changed, 59 insertions(+), 18 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 009d848f..8f710fc2 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1087,6 +1087,16 @@ their exact job result before retry. Runtime writable state is v41. The next audit boundary is the remaining job role/session join and generic terminal-result cargo, not another lifecycle layer. +Exact `10a70afc` removes the remaining generic job ownership mirrors. +`EpiphanyRuntimeJob` now owns only its semantic identity and the mutable +Queued/Completed/Failed latch. The sealed outer-worker launch owns role; +`EpiphanyRuntimeModelExecutionBinding` owns model-session membership; outer +workers belong to the root session by construction. Session closure, retention, +and tool admission derive those exact joins. Generic job results no longer copy +role/session and lose their always-empty metadata map. A job snapshot requires +zero or one exact terminal result and refuses multiplicity rather than choosing +by completion time. Runtime writable state is v42. + The sealed typed launch owns exact live request association. The terminal role result owns only semantic decision cargo or typed failure. The archived attempt owns historical request kind/ID and typed terminal classification after the diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index a5445b80..85fbcd85 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -828,6 +828,15 @@ Cut in this order: successful authorities, and never selects work by timestamp order. Runtime is v41; the cut removes 67 maintained lines net. The remaining audit target is duplicated role/session identity and generic terminal-result cargo. +50. **Runtime job ownership is derived at `10a70afc`:** the generic job is only + job identity plus Queued/Completed/Failed status. Sealed launches own + outer-worker role, model bindings own model-session membership, and root + membership is structural. Jobs/results lose role/session mirrors, result + metadata disappears, launch options lose three unused fields, and duplicate + terminal results refuse instead of sorting by time. Runtime is v42; 73 + maintained lines are removed net. Next audit generic result cargo by terminal + family so structured mirrors disappear without deleting the only failure + account. Do not preserve the aggregate for compatibility, manufacture a bootstrap thread, release autonomous scheduling, register topology in `gamecult-ops`, diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 92fa64ae..2fcde1c3 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -152,6 +152,20 @@ model-runtime checks pass. The cut removes 67 maintained lines net. Verification generated 3.2 GiB across 4,498 files; cleanup restored only the authenticated 1,776,640-byte state inspector. +Exact `10a70afc` makes the generic runtime job an identity/status latch only. +The sealed worker launch owns outer-worker role; the model execution binding +owns model-session membership; outer workers belong structurally to the root +session. Jobs and generic results lose role/session mirrors, results lose their +empty metadata map, and heartbeat launch options lose constant root-session plus +unused objective/note cargo. Session closure, retention, and tool admission +derive exact joins. Job snapshots refuse multiple terminal results instead of +selecting one by completion time. Runtime advances to v42. Keyed lifecycle, +model-failure audit, transcript-free binding, tool continuation, Persona replay, +coordinator terminality, epoch refusal, OpenAI runtime, release coordinator, and +release model-runtime checks pass. The cut removes 73 maintained lines net. +Verification generated 3.7 GiB across 4,764 files; cleanup restored only the +authenticated 1,776,640-byte state inspector. + Exact `a6cf9383` quarantines concrete Codex/OpenRouter authentication, credential reading, and network transport at the two release entrypoints that perform inference. `epiphany-openai-runtime` now owns only exact native-request @@ -1237,13 +1251,13 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action The Ox17 deployment lane remains paused. Continue subtraction from exact -`a46725a1`: map every producer and consumer of `EpiphanyRuntimeJob.role` and -`session_id` plus generic terminal job-result role/session/summary cargo against -sealed worker launches, model bindings, structured role results, typed pass -failures, process claims, and archived attempts. Delete mirrors whose exact -owner already exists; preserve only the minimal join or terminal latch that -prevents an invalid consequence. Do not replace them with a registry, adapter, -compatibility reader, or latest head. The Connector CultMesh/Idunn/Yggdrasil proof and +`10a70afc`: partition `EpiphanyRuntimeJobResult` consumers by structured +role/reorientation success, typed model-pass failure, transport completion, and +process-death recovery. Delete summary, next-move, evidence, and artifact mirrors +where the exact structured owner already exists; preserve the minimal +verdict/time/context or failure account needed for physiology, audit, replay, +and retention. Do not replace removed cargo with metadata, a summary DTO, +compatibility reader, or latest selector. The Connector CultMesh/Idunn/Yggdrasil proof and Ghostlight adoption remain queued behind source stabilization. Preserve keyed Mind, direct Body-to-Modeling flow, consequence receipts, and the complete Model Atlas vertical slice; no live inter-swarm collaboration has run. diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 5c9d3c49e9b6da46108e1d9017e0b533a5b550e0..5c78a535cc02c2a5643c481387927fccad060416 100644 GIT binary patch delta 739 zcmX|8O=}cE5OtGHOm+}NhzcSW1U${|X7k~Ocv4YO5fwdo>*=Y@bnNLGyQ>rT6v2Zh z$w9)LJme3E;K7?me}TV1@RT3m)tc-kheyv;cfES=)t^u4zt8EntF2^Xb8B_*`q#N+ z;rI9D*4tLA_;5J$@o=UkXwF$dTQDb>7n~O?2o?pMABQu^({_Du+_^9}*xcIKtdEX6 z*O&g@f2TCVU_}jA)JTKJJnH&uJGrt?utOP`932}TLuF%t7ZD@o{d-ha7FoU?C}S~) zz=~t&!An%luT|0M0t3*V1B#5kyGQ;Fdhld1g_3f#kQtX7w>^1vQtAc_!H|Oz%l!;} zC`^@ta=G*oH`QqoOpuvAYK~sn9z3Qj^gV`XIe?{rCxiNDbjEw~A%$&p=uKm@c`Agg za>c5l6Ge@q6be+HGu&4URI#X;GDa7Jcx#lL>g-dtgPP4Q_8l>TR(_i%g7a8eqm>lJ zeQBJs)1g7mkuZT*Tu35ZC_!PjK7>YDTEX`YgNdNOF%}qGYdJ z(B4$s9eKplQ00Qi3ZE>`Md2cs!gEQKoDu<*RpYdNzr1*Pz~dCKB3(>$DVxHx3f-MY z;G;B`GD8!2*_2}PvW)uRXXjddv7NLpy(+|WWa%tvSJpjTtB+=rr5m?Fq$(Gy=}iu6 by&*g_cl+z<@YZ_$Wj?vtF)maR9{JvXK*t8v delta 77 zcmex9S?5u&&ISoaZet58V}qz;4BV{yH!Cw1GBTz&Pi1PK%ESo7AetG7S%8=oh}nRc T9f&!Am=lP(wohf^_GJM8xfvGq diff --git a/state/map.yaml b/state/map.yaml index 8d023c57..815cb6d7 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -75,14 +75,15 @@ current_status: semantic_cache_cut: Exact 856648de deletes the unused semantic-memory and workspace-coverage projection subsystem rather than preserving a second derived model of Mind. Four binaries, the local daemon supervisor, Qdrant/Ollama/Postgres configuration, projector policy/lifecycle/heartbeat/recovery state, semantic query/context packets, aggregate model revision/hash cargo, workspace file-cache reader, and Persona's always-empty semantic-recall fields are gone. No agent request builder or sealed reasoning projection consumed this cache. Modeling now reads the exact typed Body and keyed RepoModel projection directly; future retrieval evidence must enter through an earned typed provider receipt. Idunn remains the sole deployment and daemon-survival authority. Core 165/165, OpenAI runtime 25/25, and release construction 19/19 pass. repo_model_vocabulary_cut: Exact 6ea4ff3c deletes the redundant generic memory profile, dead SHA-1 ID factory, empty profile module, cache-only node/edge kinds, and impossible lifecycle variants. Exact 5218cf2c deletes the producerless RepoModel lifecycle-receipt family. Exact 8bb039af makes domains seed-owned and deletes the unreachable summary mutation/document/validation/registry path plus the test cargo that alone produced it. Exact ab1afc27 removes node salience/confidence and edge confidence because no owner read, validated, routed, or displayed those values. Modeling can author only the keyed repository operations advertised by its provider schema. Affected targets check cleanly; core remains 165/165, RepoModel 5/5, and reasoning-context 8/8. package_baseline: Exact d2ca66301fb6af4e7d2d27fff0b772b0f0fccdf4 remains the admitted production source and current symlink target. Its native serialized full-workspace gate passed with receipt SHA-256 de0fc6b360ce03493b13208d917dc8349801f03364617d966152c85846c47482. Idunn sealed 26 root-owned non-writable binaries plus release-witness.ccmp as release sha256-46407552b4a0937f63d2b7f2bd09a1dacb89d671a6e3807c97209159541aef06; witness-file SHA-256 is 348785ffb0fc3130d3b4538329870c6e6f8442a8da4a01b32fa9b7ffb1f01357. Source 9b9b5c85 also passed Idunn's native test gate under receipt SHA-256 6c6a71359f8c31297419665d2872f6982a89f84e197d71fc5b36a7fc86216093 and remains sealed as release sha256-30a910785a380224bbdbd56a7b742c8d058fa70cb72dab3562e3907903e0d191 with witness-file SHA-256 75bf52d31c56ea3b08e1a702273301c1db12a4b1ffae45e3d948ce8a29b50e1d. A foreign-target helper restarted Idunn during the Epiphany transaction; rollback restored d2ca, removed deployment.env, and left production Epiphany units inactive. OpenRouter model stealth/ox-alpha and its systemd-injected credential are readiness-proven. Idunn is active with zero restarts and its deployment brake is engaged. - summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. Exact edb5c3a3 deletes the launch, heartbeat, and terminal-result family identity mirrors: the sealed typed launch owns live pass identity and the archived attempt owns historical request identity. Exact cabdd6c3 separates immutable coordinator incarnation basis/terminality from minimal model-session admission and removes the remaining session prose, clocks, dead states, redundant options, and whole-store coordinator snapshot. Exact a46725a1 reduces runtime jobs to Queued/Completed/Failed admission latches and removes timestamp selection from Research. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. + summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. Exact edb5c3a3 deletes the launch, heartbeat, and terminal-result family identity mirrors: the sealed typed launch owns live pass identity and the archived attempt owns historical request identity. Exact cabdd6c3 separates immutable coordinator incarnation basis/terminality from minimal model-session admission and removes the remaining session prose, clocks, dead states, redundant options, and whole-store coordinator snapshot. Exact a46725a1 reduces runtime jobs to Queued/Completed/Failed admission latches and removes timestamp selection from Research. Exact 10a70afc derives job role/session ownership from sealed launches and model bindings, leaving the generic job as identity plus status. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. The pure OpenAI runtime library opens exact model execution and admits typed provider events. OpenRouter auth/networking remains a direct release-entrypoint boundary; Codex transport crosses the lean authenticated CodexConnector client ABI and no Codex auth, HTTP/SSE, Codex-home, or compiled Codex dependency remains in Epiphany. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Workers use one governed tool-capable route; no parallel no-tools mode survives. The sealed typed worker launch is the sole live owner of pass-family identity; terminal role results contain semantic decision cargo rather than routing echoes, and archived attempts retain historical request identity plus the structured decision. Runtime jobs are only mutable Queued-to-Completed-or-Failed admission latches; clocks and unowned intermediate states are absent, and Research derives attempt authority as an exact set rather than timestamp order. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v41. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. The pure OpenAI runtime library opens exact model execution and admits typed provider events. OpenRouter auth/networking remains a direct release-entrypoint boundary; Codex transport crosses the lean authenticated CodexConnector client ABI and no Codex auth, HTTP/SSE, Codex-home, or compiled Codex dependency remains in Epiphany. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Workers use one governed tool-capable route; no parallel no-tools mode survives. The sealed typed worker launch is the sole live owner of pass-family identity; terminal role results contain semantic decision cargo rather than routing echoes, and archived attempts retain historical request identity plus the structured decision. Runtime jobs are only mutable job-identity plus Queued/Completed/Failed admission latches; clocks, role/session mirrors, and unowned intermediate states are absent. Model bindings own model-session membership, sealed launches own outer-worker role, root membership is structural, and Research derives attempt authority as an exact set rather than timestamp order. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v42. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. execution_binding_authority_cut: Exact ce6bff12 reduces model and tool execution bindings to the only facts they own. A model binding maps one native request to its runtime session and job; a tool binding maps one typed intent to its runtime session and job. Provider identity, source worker, reasoning basis, and model-request ancestry are no longer copied into bindings or compared through timestamp-shaped API arguments. Validation, retention, public-source lookup, worker terminality, decision sealing, and tool continuation reload the exact native request or tool intent. Runtime writable state advances to v37. Core, epoch refusal, transcript-free decision audit, OpenAI tool continuation, and the release-owned tool runtime pass. The cut removes 67 net source lines and leaves runtime_spine.rs at 9,300 physical lines with 50 public functions and 25 public structs. Verification generated 12.713 GiB across 19,134 files; Cargo cleanup restored the single 1.78 MiB state inspector. Atlas is untouched; no live inter-swarm collaboration has run. provider_transport_boundary_cut: Exact ed7357a2 removes Codex transport from Epiphany's compiled body. The complete epiphany-openai-codex-spine package, codex-login/codex-client graph, CODEX_HOME/auth.json readiness, direct Codex HTTP/SSE, and Codex credential creation/argv are gone. Model and Persona entrypoints use the lean typed client from exact CodexConnector 54d8bc2525b7e7fa1b9dd26b95871247ff4c7566 over authenticated loopback MessagePack; Connector owns Codex auth, transport, replay, and exact native/provider digest receipts. Epiphany retains sealed native/provider requests, strict schema/call-ID projection, tool continuation, decision admission, and typed receipt evidence. OpenRouter remains one direct ureq/Rustls boundary with its own credential and terminal-tool dialect. Model receipts advance to v1 and runtime to v38; caller identity, both request digests, and cached-token usage survive transcript deletion. The maintained non-lock source shrinks by 857 lines and Cargo.lock drops 4,830 lines. Core 150/150, runtime 21/21, adapter 5/5, model edge 12/12, Persona 1/1, exact launch checks, and focused no-deps Clippy pass. Two focused build roots totaling 10.8 GiB were removed; only the exact 1,776,640-byte state inspector at SHA-256 DD38855C6F092C2C53D2212A938E737643F41130F4681708840BA6075320A04E remains. Atlas is untouched and no collaboration acceptance is claimed. runtime_session_authority_cut: Exact cabdd6c3 removes coordinator process incarnations from the generic model-session aggregate. EpiphanyRuntimeSession now contains only grouping identity plus active/completed admission state. Immutable EpiphanyCoordinatorRunBasis records exact thread, resident launch, objective, and start provenance. Exact completion/failure receipts and process-death recovery compete through one deterministic EpiphanyCoordinatorRunTerminality identity, so one full typed authority wins while unrelated document inserts merge. Objective prose, clocks, coordinator notes, four unused status variants, the one-field session-options wrapper, and the dead whole-snapshot append helper are deleted. Runtime advances to v40 with no compatibility reader. The focused Core, model-failure audit, Persona, coordinator terminality/conflict, release coordinator, and release model-runtime checks pass. The code cut removes 62 maintained lines net. Verification created 6.3 GiB across 7,017 Cargo files; cleanup restored exactly the 1,776,640-byte state inspector at SHA-256 DD38855C6F092C2C53D2212A938E737643F41130F4681708840BA6075320A04E. Atlas remains untouched and no live inter-swarm collaboration is claimed. runtime_job_authority_cut: Exact a46725a1 removes timestamp causality and dead transition theater from EpiphanyRuntimeJob. The job is now the minimal mutable admission latch from Queued to Completed or Failed; Running, WaitingForReview, Cancelled, created_at, and updated_at are gone. Research no longer chooses a latest attempt by creation time: it derives the exact attempt set, refuses multiple live or multiple successful authorities, requires terminal evidence for failures, and otherwise projects launch, wait, or review deterministically. Runtime advances to v41 with no compatibility reader. Core, old-epoch refusal, model-failure audit, Persona replay, OpenAI runtime, release coordinator, and release model-runtime checks pass. The cut removes 67 maintained lines net. Verification created 3.2 GiB across 4,498 Cargo files; cleanup restored exactly the authenticated 1,776,640-byte state inspector. Atlas remains untouched and live inter-swarm collaboration remains unproven. + runtime_job_binding_cut: Exact 10a70afc makes EpiphanyRuntimeJob a two-field identity/status latch. The sealed worker launch owns outer-worker role; EpiphanyRuntimeModelExecutionBinding owns model-session membership; outer workers belong to the root session by definition. Role and session disappear from jobs and generic job results, the result's always-empty metadata map is deleted, and heartbeat launch options lose constant root-session plus unused objective/note cargo. Session closure and retention derive their exact job set from model bindings; tool ownership derives from either the sealed launch or one exact model binding; duplicate terminal results refuse instead of sorting by completion time. Runtime advances to v42 without a compatibility reader. Keyed lifecycle, model-failure audit, transcript-free binding, tool continuation, Persona replay, coordinator terminality, epoch refusal, OpenAI runtime, release coordinator, and release model-runtime checks pass. The cut removes 73 maintained lines net. Verification created 3.7 GiB across 4,764 Cargo files; cleanup restored exactly the authenticated 1,776,640-byte state inspector. Atlas remains untouched and live inter-swarm collaboration remains unproven. standalone_codex_transport_target: Independent GameCult/CodexConnector exact 54d8bc2525b7e7fa1b9dd26b95871247ff4c7566 owns one Cargo package and one public daemon binary. Its default library is the lean encrypted client/contract ABI; the daemon feature adds the public service, bounded raw Responses transport, the private digest-pinned official codex app-server credential child, and keyed CultCache replay. Active identity is sealed before provider I/O; the exact encrypted completion is durable before reply; completed replay survives restart byte-identically; restart-era active work refuses as indeterminate without consuming current capacity. Callers own native/provider projection, prompts, tools, decisions, and admission. Redacted CultMesh/Odin readiness, the independent Idunn target, Yggdrasil service installation, and Ghostlight's consumer/deployment cut remain open. No live credential or deployment authority has moved. fixed_routing_and_retention_cargo_cut: Exact ffd91c20 deletes EyesEvidencePacket.source_role_id, PersonaSocialMention.target_agent_id, and ResidentSelfRetentionHead.retained_at_millis. Each producer supplied one fixed or non-causal value and no consumer read it; the request/context, Persona queue plus turn request, and retention chain remain the real owners. Eyes packet v2, Persona mention v2, Resident Self state v3/retention head v1, and runtime v27 form a hard cut. Core and the three consuming release entrypoints compile; consequential Persona, Research, and epoch-refusal proofs pass. The maintained source delta is 6 net deletions. Atlas is untouched; no live inter-swarm collaboration has run. provider_stream_authority_cut: Exact fe118e13 makes OpenAI/OpenRouter events and receipts transient transport values. The runtime immediately normalizes them into the single persisted native model event/receipt family used by tool continuation, assistant reconstruction, terminal validation, and bounded retention. Duplicate provider writes, registrations, archive requirements, schema IDs, two public schemas/index rows, and the include-only model-runtime shell are gone; the exact provider request remains durable. Runtime advances to v28 and the catalog drops to 18 schemas. The cut removes 270 net maintained lines. Adapter 1/1, provider spine 14/14, reasoning context 8/8, runtime 23/23, model entrypoint 11/11, swarm 4/4, epoch refusal 1/1, and release construction 15/15 pass. Atlas is untouched; live inter-swarm collaboration remains unproven. @@ -182,10 +183,10 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability; it still mixes immutable identity, model sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. The sealed launch solely owns live family identity and archived attempts own retained request identity. Exact cabdd6c3 removes coordinator runs from the generic session aggregate; exact a46725a1 reduces generic jobs to role, session membership, and a Queued/Completed/Failed admission latch with no causal clocks. Role and session are still echoed beside immutable launches or model bindings and terminal job results still mirror role/session plus model-authored summaries already present in structured terminal decisions. Audit those remaining joins and cargo before considering a split or abstraction. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path remains an earned privilege boundary and its Yggdrasil issuer/crossing route still requires owning-lane repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Continue source subtraction from exact a46725a1. Map every producer and consumer of EpiphanyRuntimeJob.role/session_id and EpiphanyRuntimeJobResult role/session/summary cargo against sealed worker launches, model execution bindings, structured role results, typed pass failures, process claims, and archived attempts. Delete mirrors whose owner is already exact; retain only the minimal join or terminal latch required to prevent an invalid consequence. Do not add a registry, adapter, compatibility reader, or latest head. Keep the standalone Connector readiness/Idunn/Yggdrasil/Ghostlight deployment sequence queued until the source body stabilizes. Preserve one refresh writer, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live credential transfer, Ox root, or Model Atlas Gate run. + unresolved_authority: `runtime_spine.rs` remains the largest central liability; it still mixes immutable identity, model sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. The sealed launch solely owns live family identity and archived attempts own retained request identity. Exact cabdd6c3 removes coordinator runs from the generic session aggregate; exact a46725a1 removes job clocks and dead states; exact 10a70afc reduces the job itself to identity plus Queued/Completed/Failed status while sealed launches and model bindings own role/session joins. Generic terminal job results still copy summary, next move, evidence, and artifact cargo from structured role/reorientation outcomes, but they are also the terminal physiology for model transport and process-death failures. Audit each field by terminal family before subtracting it; do not erase the only typed failure account. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path remains an earned privilege boundary and its Yggdrasil issuer/crossing route still requires owning-lane repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Continue source subtraction from exact 10a70afc. Partition EpiphanyRuntimeJobResult consumers by terminal family: structured role/reorientation success, typed model-pass failure, transport completion, and process-death recovery. Delete summary/next/evidence/artifact mirrors where an exact structured owner already exists; preserve the minimal verdict/time/context or failure account needed for physiology, audit, replay, and retention. Replace no field with metadata, a summary DTO, a compatibility reader, or a latest selector. Keep the standalone Connector readiness/Idunn/Yggdrasil/Ghostlight deployment sequence queued until the source body stabilizes. Preserve one refresh writer, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live credential transfer, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, minimal model sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. The sealed typed launch document owns live pass-family identity. Terminal role results carry semantic outcome or typed failure, never duplicate family, route, or Body-basis routing fields. Archived worker attempts retain exact request kind/ID, deletion digest, decision context, structured result, and terminal job records after live launch deletion. Model sessions carry only grouping identity plus active/completed admission state. Coordinator incarnation launch provenance is an immutable typed basis; one deterministic typed terminality identity admits the exact full run receipt or death recovery and makes competing terminal outcomes conflict without fencing unrelated documents. Runtime jobs carry only job identity, session join, role, and the Queued/Completed/Failed admission latch. No job clock or intermediate status participates in causality; Research refuses ambiguous attempt sets instead of selecting a latest timestamp. Terminal job results carry summaries, evidence, artifacts, and decision-context identity. Completed model-session retention writes one private resurrection tombstone. Mind/runtime writable epochs are v10/v41. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator basis admission are the only session/job creation owners. Continue subtraction by auditing the remaining role/session joins and terminal-result cargo against their exact sealed owners; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, minimal model sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. The sealed typed launch document owns live pass-family identity and outer-worker role. Model execution bindings own model-session membership; outer-worker root membership is structural. Archived worker attempts retain exact request kind/ID, deletion digest, decision context, structured result, and terminal job records after live launch deletion. Model sessions carry only grouping identity plus active/completed admission state. Coordinator incarnation launch provenance is an immutable typed basis; one deterministic typed terminality identity admits the exact full run receipt or death recovery and makes competing terminal outcomes conflict without fencing unrelated documents. Runtime jobs carry only job identity plus the Queued/Completed/Failed admission latch. No job clock, role/session mirror, intermediate status, or latest-result selector participates in causality. Terminal job results carry verdict, summary, completion time, next move, evidence, artifacts, and decision-context identity; role/session and the empty metadata map are gone. Completed model-session retention derives its exact jobs from model bindings and writes one private resurrection tombstone. Mind/runtime writable epochs are v10/v42. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator basis admission are the only session/job creation owners. Continue subtraction by auditing generic terminal-result cargo per terminal family; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. diff --git a/state/scratch.md b/state/scratch.md index 5143ede3..802b01f1 100644 --- a/state/scratch.md +++ b/state/scratch.md @@ -238,13 +238,20 @@ and janitors may reduce the symptom but cannot substitute for deleting code. authority from the exact attempt set and refuses multiple live or successful authorities instead of choosing the newest timestamp. Runtime is v41; 67 maintained lines are removed net. -42. Next: audit the remaining job `role`/`session_id` joins and generic terminal - job-result cargo against sealed worker launches, model bindings, structured - outcomes, typed failures, process claims, and archives. Preserve only facts - that prevent an invalid consequence. -43. Continue the public runtime-spine and test-liability audit by live owner +42. Done: exact `10a70afc` reduces `EpiphanyRuntimeJob` to identity plus status. + Sealed launches own outer-worker role, model bindings own model-session + membership, and outer workers belong structurally to the root session. Jobs + and generic results lose role/session mirrors; results also lose their empty + metadata map. Session closure, tool ownership, and retention derive exact + joins; duplicate results refuse instead of sorting by time. Runtime is v42; + 73 maintained lines are removed net. +43. Next: audit generic terminal-result summary, next-move, evidence, and + artifact cargo separately for structured outcomes, typed model failures, + transport completion, and process death. Preserve the only typed failure + account; delete mirrors where an exact owner already exists. +44. Continue the public runtime-spine and test-liability audit by live owner and consequential invariant. Do not subtract the unrun Atlas vertical slice; no inter-swarm collaboration has yet been exercised. Streamline it only around its one end-to-end authority map. -44. Run focused tests after each cut. Only after source subtraction stabilizes +45. Run focused tests after each cut. Only after source subtraction stabilizes should Idunn's build scratch contract be reconsidered. From 53e869c078985ad067153c2c9856e231dd5ea934 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 21:11:10 +0200 Subject: [PATCH 091/340] Remove generic job-result evidence mirrors --- epiphany-core/src/coordinator_results.rs | 4 ++-- epiphany-core/src/current_work.rs | 20 ------------------- epiphany-core/src/reasoning_context.rs | 4 ---- epiphany-core/src/reorientation_work.rs | 4 ---- epiphany-core/src/runtime_spine.rs | 18 +---------------- .../src/bin/epiphany-openai-runtime.rs | 2 -- epiphany-openai-runtime/src/lib.rs | 17 +++++++--------- .../src/persona_executor.rs | 2 -- 8 files changed, 10 insertions(+), 61 deletions(-) diff --git a/epiphany-core/src/coordinator_results.rs b/epiphany-core/src/coordinator_results.rs index d70a3740..44f89f96 100644 --- a/epiphany-core/src/coordinator_results.rs +++ b/epiphany-core/src/coordinator_results.rs @@ -107,8 +107,8 @@ fn interpret_reorient_lifecycle_failure( checkpoint_still_valid: None, files_inspected: Vec::new(), frontier_node_ids: Vec::new(), - evidence_ids: result.evidence_refs.clone(), - artifact_refs: result.artifact_refs.clone(), + evidence_ids: Vec::new(), + artifact_refs: Vec::new(), runtime_result_id: Some(result.result_id.clone()), runtime_job_id: Some(result.job_id.clone()), job_error: Some(result.summary.clone()), diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index b2a7cbbf..54144c4c 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -3933,8 +3933,6 @@ mod tests { verdict: "suggest".into(), summary: direction_result.summary, next_safe_move: "Promote through the exact proposal owner.".into(), - evidence_refs: Vec::new(), - artifact_refs: Vec::new(), decision_context_id: Some(direction_context.context_id), }, )?; @@ -4025,8 +4023,6 @@ mod tests { verdict: "failed".into(), summary: "provider returned no terminal decision".into(), next_safe_move: "retry from the same exact obligation".into(), - evidence_refs: Vec::new(), - artifact_refs: Vec::new(), decision_context_id: None, }, )?; @@ -4203,8 +4199,6 @@ mod tests { verdict: proposal_result.verdict.clone(), summary: proposal_result.summary.clone(), next_safe_move: proposal_result.next_safe_move.clone(), - evidence_refs: proposal_result.evidence_ids.clone(), - artifact_refs: Vec::new(), decision_context_id: Some(proposal_context.context_id.clone()), }, )?; @@ -4356,8 +4350,6 @@ mod tests { verdict: proposal_result.verdict.clone(), summary: proposal_result.summary.clone(), next_safe_move: proposal_result.next_safe_move.clone(), - evidence_refs: proposal_result.evidence_ids.clone(), - artifact_refs: Vec::new(), decision_context_id: Some(retry_context.context_id), }, )?; @@ -4697,8 +4689,6 @@ mod tests { verdict: verification_result.verdict.clone(), summary: verification_result.summary.clone(), next_safe_move: verification_result.next_safe_move.clone(), - evidence_refs: verification_result.evidence_ids.clone(), - artifact_refs: Vec::new(), decision_context_id: Some(verification_context.context_id.clone()), }, )?; @@ -5053,8 +5043,6 @@ mod tests { verdict: verdict_result.verdict.clone(), summary: verdict_result.summary.clone(), next_safe_move: verdict_result.next_safe_move.clone(), - evidence_refs: verdict_result.evidence_ids.clone(), - artifact_refs: Vec::new(), decision_context_id: Some(verdict_context.context_id.clone()), }, )?; @@ -5372,8 +5360,6 @@ mod tests { verdict: planning_result.verdict.clone(), summary: planning_result.summary.clone(), next_safe_move: planning_result.next_safe_move.clone(), - evidence_refs: planning_result.evidence_ids.clone(), - artifact_refs: Vec::new(), decision_context_id: Some(planning_context.context_id.clone()), }, )?; @@ -5492,8 +5478,6 @@ mod tests { verdict: mind_result.verdict.clone(), summary: mind_result.summary.clone(), next_safe_move: mind_result.next_safe_move.clone(), - evidence_refs: mind_result.evidence_ids.clone(), - artifact_refs: Vec::new(), decision_context_id: Some(mind_context.context_id.clone()), }, )?; @@ -5706,8 +5690,6 @@ mod tests { verdict: research_result.verdict.clone(), summary: research_result.summary.clone(), next_safe_move: research_result.next_safe_move.clone(), - evidence_refs: research_result.evidence_ids.clone(), - artifact_refs: Vec::new(), decision_context_id: Some(research_context.context_id.clone()), }, )?; @@ -5818,8 +5800,6 @@ mod tests { verdict: research_result.verdict.clone(), summary: research_result.summary.clone(), next_safe_move: research_result.next_safe_move.clone(), - evidence_refs: research_result.evidence_ids.clone(), - artifact_refs: Vec::new(), decision_context_id: Some(research_context.context_id.clone()), }, )?; diff --git a/epiphany-core/src/reasoning_context.rs b/epiphany-core/src/reasoning_context.rs index e2fd9595..98ae61bf 100644 --- a/epiphany-core/src/reasoning_context.rs +++ b/epiphany-core/src/reasoning_context.rs @@ -2436,8 +2436,6 @@ mod tests { summary: failure_summary, completed_at: "2026-08-18T00:00:03Z".into(), next_safe_move: "Create a fresh work obligation and reasoning pass.".into(), - evidence_refs: Vec::new(), - artifact_refs: Vec::new(), decision_context_id: Some(context.context_id.clone()), }; let mut cache = runtime_spine_cache(&store)?; @@ -2630,8 +2628,6 @@ mod tests { summary: "Structured Imagination decision".into(), completed_at: "2026-08-14T00:00:03Z".into(), next_safe_move: "Inspect the durable decision context".into(), - evidence_refs: Vec::new(), - artifact_refs: Vec::new(), decision_context_id: Some(context.context_id.clone()), }; runtime_spine_cache(&store)?.put(&terminal_result.result_id, &terminal_result)?; diff --git a/epiphany-core/src/reorientation_work.rs b/epiphany-core/src/reorientation_work.rs index 5772a089..7866665d 100644 --- a/epiphany-core/src/reorientation_work.rs +++ b/epiphany-core/src/reorientation_work.rs @@ -1020,8 +1020,6 @@ mod tests { verdict: "resume".into(), summary: result.summary.clone(), next_safe_move: result.next_safe_move.clone(), - evidence_refs: Vec::new(), - artifact_refs: Vec::new(), decision_context_id: Some(context.context_id.clone()), }, )?; @@ -1135,8 +1133,6 @@ mod tests { verdict: "failed".into(), summary: "Provider failed after the terminal request was sealed.".into(), next_safe_move: "Review the typed failure, then retry.".into(), - evidence_refs: Vec::new(), - artifact_refs: Vec::new(), decision_context_id: Some(failed_context.context_id.clone()), }, )?; diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index 56e453fc..b662bf1c 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -55,7 +55,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v42"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v43"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache(type = "epiphany.runtime.identity", schema = "EpiphanyRuntimeIdentity")] @@ -531,10 +531,6 @@ pub struct EpiphanyRuntimeJobResult { #[cultcache(key = 6, default)] pub next_safe_move: String, #[cultcache(key = 7, default)] - pub evidence_refs: Vec, - #[cultcache(key = 8, default)] - pub artifact_refs: Vec, - #[cultcache(key = 9, default)] pub decision_context_id: Option, } @@ -647,8 +643,6 @@ pub struct RuntimeSpineJobResultOptions { pub verdict: String, pub summary: String, pub next_safe_move: String, - pub evidence_refs: Vec, - pub artifact_refs: Vec, pub decision_context_id: Option, } @@ -1081,8 +1075,6 @@ pub fn terminalize_model_pass_failure_session( next_safe_move: "Inspect the sealed decision context and typed model-pass failure before retrying." .to_string(), - evidence_refs: Vec::new(), - artifact_refs: Vec::new(), decision_context_id: None, }; expected.push(model_job_envelope); @@ -3330,8 +3322,6 @@ fn complete_persisted_worker_outcome( verdict: result.verdict, summary: result.summary, next_safe_move: result.next_safe_move, - evidence_refs: result.evidence_ids, - artifact_refs: result.artifact_refs, decision_context_id: Some(result.decision_context_id), }, ) @@ -3345,8 +3335,6 @@ fn complete_persisted_worker_outcome( verdict: result.mode, summary: result.summary, next_safe_move: result.next_safe_move, - evidence_refs: result.evidence_ids, - artifact_refs: result.artifact_refs, decision_context_id: Some(result.decision_context_id), }, ) @@ -3442,8 +3430,6 @@ fn commit_runtime_worker_process_death( summary: summary.clone(), completed_at: terminal_at.to_string(), next_safe_move: "Derive a fresh attempt from current typed work; never rebase the abandoned model output.".to_string(), - evidence_refs: Vec::new(), - artifact_refs: Vec::new(), decision_context_id: decision_context_id.map(str::to_string), }; if cache @@ -8766,8 +8752,6 @@ pub fn complete_runtime_job( summary: options.summary, completed_at: options.completed_at.clone(), next_safe_move: options.next_safe_move, - evidence_refs: options.evidence_refs, - artifact_refs: options.artifact_refs, decision_context_id: options.decision_context_id, }; let mut expected = vec![job_envelope]; diff --git a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs index 83e5b251..2330e964 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs @@ -609,8 +609,6 @@ async fn run_worker_launch( "verdict": worker_result.verdict, "summary": worker_result.summary, "nextSafeMove": worker_result.next_safe_move, - "evidenceRefs": worker_result.evidence_refs, - "artifactRefs": worker_result.artifact_refs, "requestedPublicSourceRuns": requested_public_source_runs, "toolRounds": tool_rounds, })) diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index 3b0ff36e..026bdccc 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -203,8 +203,6 @@ pub fn record_model_turn_events( summary: summary.clone(), next_safe_move: "Review typed OpenAI receipt before accepting downstream state." .to_string(), - evidence_refs: Vec::new(), - artifact_refs: Vec::new(), decision_context_id: None, }, )?; @@ -530,8 +528,6 @@ pub fn complete_worker_job_from_assistant_text( verdict, summary, next_safe_move, - evidence_refs, - artifact_refs, decision_context_id: Some(decision_context.context_id), }, ) @@ -552,8 +548,6 @@ pub fn fail_worker_job( verdict: "failed".to_string(), summary, next_safe_move, - evidence_refs: Vec::new(), - artifact_refs: Vec::new(), decision_context_id: None, }, ) @@ -594,8 +588,6 @@ pub fn fail_model_backed_worker_job( verdict: "failed".to_string(), summary, next_safe_move, - evidence_refs: Vec::new(), - artifact_refs: Vec::new(), decision_context_id: Some(failure.decision_context_id), }, ) @@ -3250,7 +3242,6 @@ mod tests { "Review the runtime-owned Body model." ); let runtime_evidence_id = format!("openai-request:{}", model_request.request_id); - assert!(result.evidence_refs.contains(&runtime_evidence_id)); let typed_result = epiphany_core::runtime_role_worker_result(&store, &worker_job_id)? .expect("typed role worker result"); assert_eq!(typed_result.verdict, "checkpoint-ready"); @@ -3259,7 +3250,13 @@ mod tests { typed_result.evidence_ids, vec!["body-evidence".to_string(), runtime_evidence_id] ); - assert_eq!(typed_result.artifact_refs, result.artifact_refs); + assert_eq!( + typed_result.artifact_refs, + vec![ + "artifact:model".to_string(), + format!("openai-result:{}", openai_summary.result_id) + ] + ); assert!(typed_result.repo_model_mutation_proposal()?.is_none()); assert!( runtime_job_snapshot(&store, &worker_job_id)? diff --git a/epiphany-openai-runtime/src/persona_executor.rs b/epiphany-openai-runtime/src/persona_executor.rs index 70855da7..31e5ee76 100644 --- a/epiphany-openai-runtime/src/persona_executor.rs +++ b/epiphany-openai-runtime/src/persona_executor.rs @@ -612,8 +612,6 @@ mod tests { verdict: "completed".into(), summary: format!("Persona {stage} test transport completed"), next_safe_move: "Seal the stage decision context".into(), - evidence_refs: Vec::new(), - artifact_refs: Vec::new(), decision_context_id: None, }, )?; From c2be631ec1eee2d74d25b43d81677be8c88cbd2a Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 21:16:38 +0200 Subject: [PATCH 092/340] Record generic result cargo cut --- notes/epiphany-current-algorithmic-map.md | 6 ++++++ notes/epiphany-fork-implementation-plan.md | 7 +++++++ notes/fresh-workspace-handoff.md | 11 +++++++++++ state/ledgers.msgpack | Bin 723447 -> 724156 bytes state/map.yaml | 11 ++++++----- state/scratch.md | 13 +++++++++---- 6 files changed, 39 insertions(+), 9 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 8f710fc2..28c0f713 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1097,6 +1097,12 @@ role/session and lose their always-empty metadata map. A job snapshot requires zero or one exact terminal result and refuses multiplicity rather than choosing by completion time. Runtime writable state is v42. +Exact `53e869c0` removes evidence and artifact cargo from the generic terminal +job result. Those values belong only to the structured role or reorientation +outcome that authored them. Generic transport/process physiology retains +verdict, terse summary and next move, completion time, and optional exact +decision-context identity. Runtime writable state is v43. + The sealed typed launch owns exact live request association. The terminal role result owns only semantic decision cargo or typed failure. The archived attempt owns historical request kind/ID and typed terminal classification after the diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 85fbcd85..baa7dc7d 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -837,6 +837,13 @@ Cut in this order: maintained lines are removed net. Next audit generic result cargo by terminal family so structured mirrors disappear without deleting the only failure account. +51. **Generic job results do not own decision evidence at `53e869c0`:** evidence + and artifact mirrors are deleted from the result contract and completion + API. Typed role/reorientation outcomes remain their sole owners. The generic + result retains only terminal physiology and the terse failure/display account + needed where no structured outcome exists. Runtime is v43; 51 maintained + lines are removed net. Next audit remaining summary, next-move, time, and + context cargo by terminal family. Do not preserve the aggregate for compatibility, manufacture a bootstrap thread, release autonomous scheduling, register topology in `gamecult-ops`, diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 2fcde1c3..0fb77be8 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -166,6 +166,17 @@ release model-runtime checks pass. The cut removes 73 maintained lines net. Verification generated 3.7 GiB across 4,764 files; cleanup restored only the authenticated 1,776,640-byte state inspector. +Exact `53e869c0` removes generic terminal-result evidence and artifact mirrors. +Structured role and reorientation outcomes remain their sole typed owners; +transport and process-death physiology retain only verdict, terse summary/next +move, completion time, and optional decision-context identity. Reorientation +failure display no longer manufactures empty generic provenance. Runtime +advances to v43. Keyed lifecycle, auditable model failure, epoch refusal, +reorientation, typed worker admission, Persona replay, OpenAI runtime, release +coordinator, and release model-runtime checks pass. The cut removes 51 +maintained lines net. Verification generated 3.654 GiB across 4,759 files; +Cargo cleanup restored only the authenticated 1,776,640-byte state inspector. + Exact `a6cf9383` quarantines concrete Codex/OpenRouter authentication, credential reading, and network transport at the two release entrypoints that perform inference. `epiphany-openai-runtime` now owns only exact native-request diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 5c78a535cc02c2a5643c481387927fccad060416..c3737c29c949bd028bbadf99a9a7ab32b363e1f4 100644 GIT binary patch delta 559 zcmX|;ziSjh6vy53a=F}M5)do|;eiSko1B-sOT4oaf?y#MtgM{OzRQlz&Rb_@_p((A z!TbT?7*hHl1T1WTi>2y@nwF0zTfxe_gV7gJh`|P-Iz=VyVIS)tFPDM z`25q|=v@@4_lwr)q7|{4@j9!`T48lqtE?_-jn(_SXvK%C;Y~YUZ#Ss$@kj5@$zuOl zNDt#7KH8nghal2Q7>N#SX}ro2JV7-Yf-osq%&Fp|BQ$80g#AJlnK1Ri->c8)@Bm$@ zJz%9$WJ+IHuVxKDSJsks+wih3kV&L*i44C+o%Itcy`;P`#at)@K0|QL6`He?d;H(g zTVY&5*7plboYHNjD0~J*Ry#$Sj%r4DMmVU@rb_w*JQEmK=DDzS-{3K);W83n%R-}9 zbe|o$)MS~63f?h7LyA%{)NDyIo?nH_tF@cq!@RcVu}MDcm4oHhsACH delta 79 zcmdlpQ|J3+oeg4)ycSlb7FI@vQO6j#Ij(G0W-Mf6%xIp<)IODo5r{!FGZ3=?F)I+W V0Wmuea{w_X5OZyx%EX<-4glS~7k~f& diff --git a/state/map.yaml b/state/map.yaml index 815cb6d7..0df5f874 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -75,15 +75,16 @@ current_status: semantic_cache_cut: Exact 856648de deletes the unused semantic-memory and workspace-coverage projection subsystem rather than preserving a second derived model of Mind. Four binaries, the local daemon supervisor, Qdrant/Ollama/Postgres configuration, projector policy/lifecycle/heartbeat/recovery state, semantic query/context packets, aggregate model revision/hash cargo, workspace file-cache reader, and Persona's always-empty semantic-recall fields are gone. No agent request builder or sealed reasoning projection consumed this cache. Modeling now reads the exact typed Body and keyed RepoModel projection directly; future retrieval evidence must enter through an earned typed provider receipt. Idunn remains the sole deployment and daemon-survival authority. Core 165/165, OpenAI runtime 25/25, and release construction 19/19 pass. repo_model_vocabulary_cut: Exact 6ea4ff3c deletes the redundant generic memory profile, dead SHA-1 ID factory, empty profile module, cache-only node/edge kinds, and impossible lifecycle variants. Exact 5218cf2c deletes the producerless RepoModel lifecycle-receipt family. Exact 8bb039af makes domains seed-owned and deletes the unreachable summary mutation/document/validation/registry path plus the test cargo that alone produced it. Exact ab1afc27 removes node salience/confidence and edge confidence because no owner read, validated, routed, or displayed those values. Modeling can author only the keyed repository operations advertised by its provider schema. Affected targets check cleanly; core remains 165/165, RepoModel 5/5, and reasoning-context 8/8. package_baseline: Exact d2ca66301fb6af4e7d2d27fff0b772b0f0fccdf4 remains the admitted production source and current symlink target. Its native serialized full-workspace gate passed with receipt SHA-256 de0fc6b360ce03493b13208d917dc8349801f03364617d966152c85846c47482. Idunn sealed 26 root-owned non-writable binaries plus release-witness.ccmp as release sha256-46407552b4a0937f63d2b7f2bd09a1dacb89d671a6e3807c97209159541aef06; witness-file SHA-256 is 348785ffb0fc3130d3b4538329870c6e6f8442a8da4a01b32fa9b7ffb1f01357. Source 9b9b5c85 also passed Idunn's native test gate under receipt SHA-256 6c6a71359f8c31297419665d2872f6982a89f84e197d71fc5b36a7fc86216093 and remains sealed as release sha256-30a910785a380224bbdbd56a7b742c8d058fa70cb72dab3562e3907903e0d191 with witness-file SHA-256 75bf52d31c56ea3b08e1a702273301c1db12a4b1ffae45e3d948ce8a29b50e1d. A foreign-target helper restarted Idunn during the Epiphany transaction; rollback restored d2ca, removed deployment.env, and left production Epiphany units inactive. OpenRouter model stealth/ox-alpha and its systemd-injected credential are readiness-proven. Idunn is active with zero restarts and its deployment brake is engaged. - summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. Exact edb5c3a3 deletes the launch, heartbeat, and terminal-result family identity mirrors: the sealed typed launch owns live pass identity and the archived attempt owns historical request identity. Exact cabdd6c3 separates immutable coordinator incarnation basis/terminality from minimal model-session admission and removes the remaining session prose, clocks, dead states, redundant options, and whole-store coordinator snapshot. Exact a46725a1 reduces runtime jobs to Queued/Completed/Failed admission latches and removes timestamp selection from Research. Exact 10a70afc derives job role/session ownership from sealed launches and model bindings, leaving the generic job as identity plus status. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. + summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. Exact edb5c3a3 deletes the launch, heartbeat, and terminal-result family identity mirrors: the sealed typed launch owns live pass identity and the archived attempt owns historical request identity. Exact cabdd6c3 separates immutable coordinator incarnation basis/terminality from minimal model-session admission and removes the remaining session prose, clocks, dead states, redundant options, and whole-store coordinator snapshot. Exact a46725a1 reduces runtime jobs to Queued/Completed/Failed admission latches and removes timestamp selection from Research. Exact 10a70afc derives job role/session ownership from sealed launches and model bindings, leaving the generic job as identity plus status. Exact 53e869c0 removes generic job-result evidence/artifact mirrors; typed role and reorientation outcomes remain their sole owners. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. The pure OpenAI runtime library opens exact model execution and admits typed provider events. OpenRouter auth/networking remains a direct release-entrypoint boundary; Codex transport crosses the lean authenticated CodexConnector client ABI and no Codex auth, HTTP/SSE, Codex-home, or compiled Codex dependency remains in Epiphany. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Workers use one governed tool-capable route; no parallel no-tools mode survives. The sealed typed worker launch is the sole live owner of pass-family identity; terminal role results contain semantic decision cargo rather than routing echoes, and archived attempts retain historical request identity plus the structured decision. Runtime jobs are only mutable job-identity plus Queued/Completed/Failed admission latches; clocks, role/session mirrors, and unowned intermediate states are absent. Model bindings own model-session membership, sealed launches own outer-worker role, root membership is structural, and Research derives attempt authority as an exact set rather than timestamp order. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Mind/runtime writable epochs are v10/v42. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. The pure OpenAI runtime library opens exact model execution and admits typed provider events. OpenRouter auth/networking remains a direct release-entrypoint boundary; Codex transport crosses the lean authenticated CodexConnector client ABI and no Codex auth, HTTP/SSE, Codex-home, or compiled Codex dependency remains in Epiphany. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Workers use one governed tool-capable route; no parallel no-tools mode survives. The sealed typed worker launch is the sole live owner of pass-family identity; terminal role results contain semantic decision cargo rather than routing echoes, and archived attempts retain historical request identity plus the structured decision. Runtime jobs are only mutable job-identity plus Queued/Completed/Failed admission latches; clocks, role/session mirrors, and unowned intermediate states are absent. Model bindings own model-session membership, sealed launches own outer-worker role, root membership is structural, and Research derives attempt authority as an exact set rather than timestamp order. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Generic terminal results no longer mirror structured evidence or artifacts. Mind/runtime writable epochs are v10/v43. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. execution_binding_authority_cut: Exact ce6bff12 reduces model and tool execution bindings to the only facts they own. A model binding maps one native request to its runtime session and job; a tool binding maps one typed intent to its runtime session and job. Provider identity, source worker, reasoning basis, and model-request ancestry are no longer copied into bindings or compared through timestamp-shaped API arguments. Validation, retention, public-source lookup, worker terminality, decision sealing, and tool continuation reload the exact native request or tool intent. Runtime writable state advances to v37. Core, epoch refusal, transcript-free decision audit, OpenAI tool continuation, and the release-owned tool runtime pass. The cut removes 67 net source lines and leaves runtime_spine.rs at 9,300 physical lines with 50 public functions and 25 public structs. Verification generated 12.713 GiB across 19,134 files; Cargo cleanup restored the single 1.78 MiB state inspector. Atlas is untouched; no live inter-swarm collaboration has run. provider_transport_boundary_cut: Exact ed7357a2 removes Codex transport from Epiphany's compiled body. The complete epiphany-openai-codex-spine package, codex-login/codex-client graph, CODEX_HOME/auth.json readiness, direct Codex HTTP/SSE, and Codex credential creation/argv are gone. Model and Persona entrypoints use the lean typed client from exact CodexConnector 54d8bc2525b7e7fa1b9dd26b95871247ff4c7566 over authenticated loopback MessagePack; Connector owns Codex auth, transport, replay, and exact native/provider digest receipts. Epiphany retains sealed native/provider requests, strict schema/call-ID projection, tool continuation, decision admission, and typed receipt evidence. OpenRouter remains one direct ureq/Rustls boundary with its own credential and terminal-tool dialect. Model receipts advance to v1 and runtime to v38; caller identity, both request digests, and cached-token usage survive transcript deletion. The maintained non-lock source shrinks by 857 lines and Cargo.lock drops 4,830 lines. Core 150/150, runtime 21/21, adapter 5/5, model edge 12/12, Persona 1/1, exact launch checks, and focused no-deps Clippy pass. Two focused build roots totaling 10.8 GiB were removed; only the exact 1,776,640-byte state inspector at SHA-256 DD38855C6F092C2C53D2212A938E737643F41130F4681708840BA6075320A04E remains. Atlas is untouched and no collaboration acceptance is claimed. runtime_session_authority_cut: Exact cabdd6c3 removes coordinator process incarnations from the generic model-session aggregate. EpiphanyRuntimeSession now contains only grouping identity plus active/completed admission state. Immutable EpiphanyCoordinatorRunBasis records exact thread, resident launch, objective, and start provenance. Exact completion/failure receipts and process-death recovery compete through one deterministic EpiphanyCoordinatorRunTerminality identity, so one full typed authority wins while unrelated document inserts merge. Objective prose, clocks, coordinator notes, four unused status variants, the one-field session-options wrapper, and the dead whole-snapshot append helper are deleted. Runtime advances to v40 with no compatibility reader. The focused Core, model-failure audit, Persona, coordinator terminality/conflict, release coordinator, and release model-runtime checks pass. The code cut removes 62 maintained lines net. Verification created 6.3 GiB across 7,017 Cargo files; cleanup restored exactly the 1,776,640-byte state inspector at SHA-256 DD38855C6F092C2C53D2212A938E737643F41130F4681708840BA6075320A04E. Atlas remains untouched and no live inter-swarm collaboration is claimed. runtime_job_authority_cut: Exact a46725a1 removes timestamp causality and dead transition theater from EpiphanyRuntimeJob. The job is now the minimal mutable admission latch from Queued to Completed or Failed; Running, WaitingForReview, Cancelled, created_at, and updated_at are gone. Research no longer chooses a latest attempt by creation time: it derives the exact attempt set, refuses multiple live or multiple successful authorities, requires terminal evidence for failures, and otherwise projects launch, wait, or review deterministically. Runtime advances to v41 with no compatibility reader. Core, old-epoch refusal, model-failure audit, Persona replay, OpenAI runtime, release coordinator, and release model-runtime checks pass. The cut removes 67 maintained lines net. Verification created 3.2 GiB across 4,498 Cargo files; cleanup restored exactly the authenticated 1,776,640-byte state inspector. Atlas remains untouched and live inter-swarm collaboration remains unproven. runtime_job_binding_cut: Exact 10a70afc makes EpiphanyRuntimeJob a two-field identity/status latch. The sealed worker launch owns outer-worker role; EpiphanyRuntimeModelExecutionBinding owns model-session membership; outer workers belong to the root session by definition. Role and session disappear from jobs and generic job results, the result's always-empty metadata map is deleted, and heartbeat launch options lose constant root-session plus unused objective/note cargo. Session closure and retention derive their exact job set from model bindings; tool ownership derives from either the sealed launch or one exact model binding; duplicate terminal results refuse instead of sorting by completion time. Runtime advances to v42 without a compatibility reader. Keyed lifecycle, model-failure audit, transcript-free binding, tool continuation, Persona replay, coordinator terminality, epoch refusal, OpenAI runtime, release coordinator, and release model-runtime checks pass. The cut removes 73 maintained lines net. Verification created 3.7 GiB across 4,764 Cargo files; cleanup restored exactly the authenticated 1,776,640-byte state inspector. Atlas remains untouched and live inter-swarm collaboration remains unproven. + runtime_job_result_cargo_cut: Exact 53e869c0 deletes evidence and artifact mirrors from EpiphanyRuntimeJobResult and its completion API. Structured role/reorientation outcomes remain the sole evidence/artifact owners; the generic result retains only lifecycle verdict, terse summary/next-move account, completion time, and optional decision-context binding for transport and process-death physiology. Reorientation failure display no longer invents generic evidence. Runtime advances to v43 with no compatibility reader. Keyed lifecycle, auditable model failure, epoch refusal, reorientation, typed worker admission, Persona replay, OpenAI runtime, release coordinator, and release model-runtime checks pass. The cut removes 51 maintained lines net. Verification created 3.654 GiB across 4,759 Cargo files; Cargo cleanup restored exactly the authenticated 1,776,640-byte state inspector. Atlas remains untouched and live inter-swarm collaboration remains unproven. standalone_codex_transport_target: Independent GameCult/CodexConnector exact 54d8bc2525b7e7fa1b9dd26b95871247ff4c7566 owns one Cargo package and one public daemon binary. Its default library is the lean encrypted client/contract ABI; the daemon feature adds the public service, bounded raw Responses transport, the private digest-pinned official codex app-server credential child, and keyed CultCache replay. Active identity is sealed before provider I/O; the exact encrypted completion is durable before reply; completed replay survives restart byte-identically; restart-era active work refuses as indeterminate without consuming current capacity. Callers own native/provider projection, prompts, tools, decisions, and admission. Redacted CultMesh/Odin readiness, the independent Idunn target, Yggdrasil service installation, and Ghostlight's consumer/deployment cut remain open. No live credential or deployment authority has moved. fixed_routing_and_retention_cargo_cut: Exact ffd91c20 deletes EyesEvidencePacket.source_role_id, PersonaSocialMention.target_agent_id, and ResidentSelfRetentionHead.retained_at_millis. Each producer supplied one fixed or non-causal value and no consumer read it; the request/context, Persona queue plus turn request, and retention chain remain the real owners. Eyes packet v2, Persona mention v2, Resident Self state v3/retention head v1, and runtime v27 form a hard cut. Core and the three consuming release entrypoints compile; consequential Persona, Research, and epoch-refusal proofs pass. The maintained source delta is 6 net deletions. Atlas is untouched; no live inter-swarm collaboration has run. provider_stream_authority_cut: Exact fe118e13 makes OpenAI/OpenRouter events and receipts transient transport values. The runtime immediately normalizes them into the single persisted native model event/receipt family used by tool continuation, assistant reconstruction, terminal validation, and bounded retention. Duplicate provider writes, registrations, archive requirements, schema IDs, two public schemas/index rows, and the include-only model-runtime shell are gone; the exact provider request remains durable. Runtime advances to v28 and the catalog drops to 18 schemas. The cut removes 270 net maintained lines. Adapter 1/1, provider spine 14/14, reasoning context 8/8, runtime 23/23, model entrypoint 11/11, swarm 4/4, epoch refusal 1/1, and release construction 15/15 pass. Atlas is untouched; live inter-swarm collaboration remains unproven. @@ -183,10 +184,10 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability; it still mixes immutable identity, model sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. The sealed launch solely owns live family identity and archived attempts own retained request identity. Exact cabdd6c3 removes coordinator runs from the generic session aggregate; exact a46725a1 removes job clocks and dead states; exact 10a70afc reduces the job itself to identity plus Queued/Completed/Failed status while sealed launches and model bindings own role/session joins. Generic terminal job results still copy summary, next move, evidence, and artifact cargo from structured role/reorientation outcomes, but they are also the terminal physiology for model transport and process-death failures. Audit each field by terminal family before subtracting it; do not erase the only typed failure account. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path remains an earned privilege boundary and its Yggdrasil issuer/crossing route still requires owning-lane repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Continue source subtraction from exact 10a70afc. Partition EpiphanyRuntimeJobResult consumers by terminal family: structured role/reorientation success, typed model-pass failure, transport completion, and process-death recovery. Delete summary/next/evidence/artifact mirrors where an exact structured owner already exists; preserve the minimal verdict/time/context or failure account needed for physiology, audit, replay, and retention. Replace no field with metadata, a summary DTO, a compatibility reader, or a latest selector. Keep the standalone Connector readiness/Idunn/Yggdrasil/Ghostlight deployment sequence queued until the source body stabilizes. Preserve one refresh writer, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live credential transfer, Ox root, or Model Atlas Gate run. + unresolved_authority: `runtime_spine.rs` remains the largest central liability; it still mixes immutable identity, model sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. The sealed launch solely owns live family identity and archived attempts own retained request identity. Exact cabdd6c3 removes coordinator runs from the generic session aggregate; exact a46725a1 removes job clocks and dead states; exact 10a70afc reduces the job itself to identity plus Queued/Completed/Failed status while sealed launches and model bindings own role/session joins; exact 53e869c0 removes generic evidence/artifact mirrors. Generic terminal job results still carry summary, next move, completion time, and optional decision context for both structured outcomes and transport/process-death physiology. Audit each remaining field by terminal family before subtracting it; do not erase the only typed failure account. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path remains an earned privilege boundary and its Yggdrasil issuer/crossing route still requires owning-lane repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Continue source subtraction from exact 53e869c0. Partition the remaining EpiphanyRuntimeJobResult summary, next-move, completion-time, and decision-context consumers by structured role/reorientation outcome, typed model-pass failure, transport completion, and process-death recovery. Delete only mirrors whose exact owner is already durable; preserve the minimal terminal physiology and typed failure account needed for audit, replay, retention, and re-entry. Replace no field with metadata, a summary DTO, a compatibility reader, or a latest selector. Keep the standalone Connector readiness/Idunn/Yggdrasil/Ghostlight deployment sequence queued until the source body stabilizes. Preserve one refresh writer, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live credential transfer, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, minimal model sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. The sealed typed launch document owns live pass-family identity and outer-worker role. Model execution bindings own model-session membership; outer-worker root membership is structural. Archived worker attempts retain exact request kind/ID, deletion digest, decision context, structured result, and terminal job records after live launch deletion. Model sessions carry only grouping identity plus active/completed admission state. Coordinator incarnation launch provenance is an immutable typed basis; one deterministic typed terminality identity admits the exact full run receipt or death recovery and makes competing terminal outcomes conflict without fencing unrelated documents. Runtime jobs carry only job identity plus the Queued/Completed/Failed admission latch. No job clock, role/session mirror, intermediate status, or latest-result selector participates in causality. Terminal job results carry verdict, summary, completion time, next move, evidence, artifacts, and decision-context identity; role/session and the empty metadata map are gone. Completed model-session retention derives its exact jobs from model bindings and writes one private resurrection tombstone. Mind/runtime writable epochs are v10/v42. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator basis admission are the only session/job creation owners. Continue subtraction by auditing generic terminal-result cargo per terminal family; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, minimal model sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. The sealed typed launch document owns live pass-family identity and outer-worker role. Model execution bindings own model-session membership; outer-worker root membership is structural. Archived worker attempts retain exact request kind/ID, deletion digest, decision context, structured result, and terminal job records after live launch deletion. Model sessions carry only grouping identity plus active/completed admission state. Coordinator incarnation launch provenance is an immutable typed basis; one deterministic typed terminality identity admits the exact full run receipt or death recovery and makes competing terminal outcomes conflict without fencing unrelated documents. Runtime jobs carry only job identity plus the Queued/Completed/Failed admission latch. No job clock, role/session mirror, intermediate status, or latest-result selector participates in causality. Terminal job results carry verdict, summary, completion time, next move, and optional decision-context identity; structured role/reorientation outcomes solely own evidence and artifacts. Completed model-session retention derives its exact jobs from model bindings and writes one private resurrection tombstone. Mind/runtime writable epochs are v10/v43. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator basis admission are the only session/job creation owners. Continue subtraction by auditing remaining generic terminal-result prose/time/context per terminal family; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. diff --git a/state/scratch.md b/state/scratch.md index 802b01f1..ced1b2bc 100644 --- a/state/scratch.md +++ b/state/scratch.md @@ -245,13 +245,18 @@ and janitors may reduce the symptom but cannot substitute for deleting code. metadata map. Session closure, tool ownership, and retention derive exact joins; duplicate results refuse instead of sorting by time. Runtime is v42; 73 maintained lines are removed net. -43. Next: audit generic terminal-result summary, next-move, evidence, and - artifact cargo separately for structured outcomes, typed model failures, +43. Done: exact `53e869c0` removes evidence/artifact mirrors from generic + runtime job results and completion options. Structured role/reorientation + outcomes remain their sole owners; failure physiology retains its terse + summary, next move, completion time, verdict, and optional context. Runtime + is v43; 51 maintained lines are removed net. +44. Next: audit the remaining generic summary, next-move, completion-time, and + context cargo separately for structured outcomes, typed model failures, transport completion, and process death. Preserve the only typed failure account; delete mirrors where an exact owner already exists. -44. Continue the public runtime-spine and test-liability audit by live owner +45. Continue the public runtime-spine and test-liability audit by live owner and consequential invariant. Do not subtract the unrun Atlas vertical slice; no inter-swarm collaboration has yet been exercised. Streamline it only around its one end-to-end authority map. -45. Run focused tests after each cut. Only after source subtraction stabilizes +46. Run focused tests after each cut. Only after source subtraction stabilizes should Idunn's build scratch contract be reconsidered. From 8eaa96c5d6edae4a907562c7ddcd6695c5ed2641 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 21:31:42 +0200 Subject: [PATCH 093/340] Stop duplicating structured worker decisions --- epiphany-core/src/coordinator_results.rs | 11 ++- epiphany-core/src/reasoning_context.rs | 1 - epiphany-core/src/reorientation_work.rs | 7 ++ epiphany-core/src/runtime_spine.rs | 69 ++++++++++--------- .../src/bin/epiphany-openai-runtime.rs | 2 - epiphany-openai-runtime/src/lib.rs | 3 +- 6 files changed, 50 insertions(+), 43 deletions(-) diff --git a/epiphany-core/src/coordinator_results.rs b/epiphany-core/src/coordinator_results.rs index 44f89f96..b377b484 100644 --- a/epiphany-core/src/coordinator_results.rs +++ b/epiphany-core/src/coordinator_results.rs @@ -42,7 +42,7 @@ pub fn read_runtime_reorient_result( ); } }; - let status = reorient_result_status(&snapshot); + let status = reorient_result_status(&snapshot.job.status); let finding = match status { EpiphanyCrrcResultStatus::Completed => { match runtime_reorient_worker_result(runtime_store_path, job_id) { @@ -116,13 +116,10 @@ fn interpret_reorient_lifecycle_failure( } } -fn reorient_result_status(snapshot: &EpiphanyRuntimeJobSnapshot) -> EpiphanyCrrcResultStatus { - match snapshot.job.status { +fn reorient_result_status(status: &EpiphanyRuntimeJobStatus) -> EpiphanyCrrcResultStatus { + match status { EpiphanyRuntimeJobStatus::Queued => EpiphanyCrrcResultStatus::Pending, - EpiphanyRuntimeJobStatus::Completed if snapshot.result.is_some() => { - EpiphanyCrrcResultStatus::Completed - } - EpiphanyRuntimeJobStatus::Completed => EpiphanyCrrcResultStatus::Pending, + EpiphanyRuntimeJobStatus::Completed => EpiphanyCrrcResultStatus::Completed, EpiphanyRuntimeJobStatus::Failed => EpiphanyCrrcResultStatus::Failed, } } diff --git a/epiphany-core/src/reasoning_context.rs b/epiphany-core/src/reasoning_context.rs index 98ae61bf..8179bd98 100644 --- a/epiphany-core/src/reasoning_context.rs +++ b/epiphany-core/src/reasoning_context.rs @@ -2658,7 +2658,6 @@ mod tests { decision: Some(crate::EpiphanyArchivedRuntimeWorkerDecision { decision_context_id: context.context_id.clone(), role_result: None, - job_results: vec![terminal_result], }), }; archive_cache.put(&archived.job_id, &archived)?; diff --git a/epiphany-core/src/reorientation_work.rs b/epiphany-core/src/reorientation_work.rs index 7866665d..f4016b1f 100644 --- a/epiphany-core/src/reorientation_work.rs +++ b/epiphany-core/src/reorientation_work.rs @@ -1023,6 +1023,13 @@ mod tests { decision_context_id: Some(context.context_id.clone()), }, )?; + assert!( + crate::runtime_job_snapshot(&store, &job_id)? + .expect("reorientation job snapshot") + .result + .is_none(), + "typed reorientation decisions must not persist a generic result mirror" + ); cache.pull_all_backing_stores()?; cache.put( diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index b662bf1c..a627f467 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -55,7 +55,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v43"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v44"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache(type = "epiphany.runtime.identity", schema = "EpiphanyRuntimeIdentity")] @@ -234,7 +234,7 @@ pub struct EpiphanyRuntimeWorkerProcessClaim { #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache( - type = "epiphany.runtime.archived_worker_attempt.v2", + type = "epiphany.runtime.archived_worker_attempt.v3", schema = "EpiphanyArchivedRuntimeWorkerAttempt" )] pub struct EpiphanyArchivedRuntimeWorkerAttempt { @@ -256,7 +256,6 @@ pub struct EpiphanyArchivedRuntimeWorkerAttempt { pub struct EpiphanyArchivedRuntimeWorkerDecision { pub decision_context_id: String, pub role_result: Option, - pub job_results: Vec, } impl EpiphanyArchivedRuntimeWorkerAttempt { @@ -286,17 +285,6 @@ impl EpiphanyArchivedRuntimeWorkerAttempt { &decision.decision_context_id, "archived worker decision context id", )?; - if decision.job_results.is_empty() - || decision.job_results.iter().any(|result| { - result.job_id != self.job_id - || result.decision_context_id.as_deref() - != Some(decision.decision_context_id.as_str()) - }) - { - return Err(anyhow!( - "archived worker decision lost its exact generic result family" - )); - } match &decision.role_result { Some(result) if fulfilled @@ -8210,12 +8198,9 @@ fn archive_runtime_worker_attempt( if let Some(context_id) = decision_context_id.as_deref() { require_worker_decision_context(&cache, context_id, job_id)?; } - let mut archived_job_results = worker_job_results.clone(); - archived_job_results.sort_by(|left, right| left.result_id.cmp(&right.result_id)); let decision = decision_context_id.map(|context_id| EpiphanyArchivedRuntimeWorkerDecision { decision_context_id: context_id, role_result: role_result.clone(), - job_results: archived_job_results, }); let mut deletions = snapshot .iter() @@ -8754,11 +8739,41 @@ pub fn complete_runtime_job( next_safe_move: options.next_safe_move, decision_context_id: options.decision_context_id, }; + let role = cache.get::(&result.job_id)?; + let reorient = cache.get::(&result.job_id)?; + let (structured_result_id, structured_result_envelope) = match (&role, &reorient) { + (Some(_), Some(_)) => { + return Err(anyhow!( + "runtime worker job has both role and reorientation terminal outcomes" + )); + } + (Some(result), None) => ( + Some(result.result_id.clone()), + Some( + cache + .get_envelope::(&result.job_id)? + .ok_or_else(|| anyhow!("runtime worker completion lost its role result"))?, + ), + ), + (None, Some(result)) => ( + Some(result.result_id.clone()), + Some( + cache + .get_envelope::(&result.job_id)? + .ok_or_else(|| anyhow!("runtime worker completion lost its reorient result"))?, + ), + ), + (None, None) => (None, None), + }; let mut expected = vec![job_envelope]; - let mut writes = vec![ - cache.prepare_entry(&job.job_id, &job)?.0, - cache.prepare_entry(&result.result_id, &result)?.0, - ]; + let mut writes = vec![cache.prepare_entry(&job.job_id, &job)?.0]; + if let Some(envelope) = structured_result_envelope { + expected.push(envelope.clone()); + writes.push(envelope); + } + if structured_result_id.is_none() { + writes.push(cache.prepare_entry(&result.result_id, &result)?.0); + } let claim_id = worker_process_claim_id(&result.job_id); if let Some(claim) = cache.get::(&claim_id)? { match crate::WorkerProcessStatus::parse(&claim.status)? { @@ -8772,17 +8787,7 @@ pub fn complete_runtime_job( .cloned() .ok_or_else(|| anyhow!("runtime worker completion lost its claim envelope"))?; let mut terminal = claim; - let role = cache.get::(&result.job_id)?; - let reorient = cache.get::(&result.job_id)?; - if role.is_some() && reorient.is_some() { - return Err(anyhow!( - "runtime worker job has both role and reorientation terminal outcomes" - )); - } - if let Some(terminal_result_id) = role - .map(|result| result.result_id) - .or_else(|| reorient.map(|result| result.result_id)) - { + if let Some(terminal_result_id) = structured_result_id { terminal.status = crate::WorkerProcessStatus::TerminalResult.as_str().into(); terminal.terminal_authority_id = Some(terminal_result_id); } else { diff --git a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs index 2330e964..c7dd6819 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs @@ -24,8 +24,6 @@ use epiphany_openai_adapter::{ use epiphany_openai_runtime::DEFAULT_CODEX_CONNECTOR_ENDPOINT; use epiphany_openai_runtime::DEFAULT_PROVIDER_REQUEST_TIMEOUT; use epiphany_openai_runtime::EpiphanyOpenAiRuntimeOptions; -#[cfg(test)] -use epiphany_openai_runtime::OPENAI_RUNTIME_ROLE; use epiphany_openai_runtime::append_requested_public_source_receipts; use epiphany_openai_runtime::assistant_text_from_model_events; use epiphany_openai_runtime::build_tool_followup_model_request; diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index 026bdccc..fea970ec 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -3262,7 +3262,8 @@ mod tests { runtime_job_snapshot(&store, &worker_job_id)? .expect("snapshot") .result - .is_some() + .is_none(), + "structured worker decisions must not persist a generic result mirror" ); Ok(()) } From 7e5ea3e733856a81da0a1b9898dacbfb0d1e4957 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 21:34:30 +0200 Subject: [PATCH 094/340] Record structured worker result cut --- notes/epiphany-current-algorithmic-map.md | 7 +++++++ notes/epiphany-fork-implementation-plan.md | 8 ++++++++ notes/fresh-workspace-handoff.md | 13 +++++++++++++ state/ledgers.msgpack | Bin 724156 -> 724992 bytes state/map.yaml | 11 ++++++----- state/scratch.md | 18 ++++++++++++------ 6 files changed, 46 insertions(+), 11 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 28c0f713..9906507c 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1103,6 +1103,13 @@ outcome that authored them. Generic transport/process physiology retains verdict, terse summary and next move, completion time, and optional exact decision-context identity. Runtime writable state is v43. +Exact `8eaa96c5` removes the generic terminal document itself from structured +worker completion. A typed role/reorientation outcome is strong-read and +byte-identically replayed in the same CAS that terminalizes its job and process +claim. Fulfilled archives carry context plus the full typed role result, not a +generic companion. Generic results now exist only where no structured outcome +exists. Runtime writable state is v44; archived worker attempts are v3. + The sealed typed launch owns exact live request association. The terminal role result owns only semantic decision cargo or typed failure. The archived attempt owns historical request kind/ID and typed terminal classification after the diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index baa7dc7d..a9df641e 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -844,6 +844,14 @@ Cut in this order: needed where no structured outcome exists. Runtime is v43; 51 maintained lines are removed net. Next audit remaining summary, next-move, time, and context cargo by terminal family. +52. **Structured decisions have one durable owner at `8eaa96c5`:** completing a + typed role/reorientation outcome no longer persists a generic result copy. + The exact typed envelope is a byte-identical strong dependency in the atomic + job/process terminalization CAS. Fulfilled archives retain the context and + full typed role result only. Runtime is v44; archived attempts are v3. The + source delta is +7 lines for the CAS fence while one durable duplicate family + disappears. Next determine whether the residual failure/transport result + contract can be deleted entirely. Do not preserve the aggregate for compatibility, manufacture a bootstrap thread, release autonomous scheduling, register topology in `gamecult-ops`, diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 0fb77be8..f3dddd10 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -177,6 +177,19 @@ coordinator, and release model-runtime checks pass. The cut removes 51 maintained lines net. Verification generated 3.654 GiB across 4,759 files; Cargo cleanup restored only the authenticated 1,776,640-byte state inspector. +Exact `8eaa96c5` stops persisting generic job-result documents for structured +role/reorientation outcomes. Runtime completion includes the exact structured +envelope as a byte-identical strong dependency in the same job/process CAS. +Fulfilled worker archives retain decision context plus the full typed role +result, without a generic companion; coordinator reorientation success requires +the typed reorientation result. Runtime advances to v44 and archived worker +attempts to v3. Keyed lifecycle, decision audit, model-failure audit, +reorientation, typed role admission, Persona replay, runtime-error/tool-loop +failure, release coordinator, and release model-runtime checks pass. The source +delta is +7 maintained lines because the exact CAS fence replaces a larger +durable duplication. Verification generated 5.632 GiB across 6,826 files; +Cargo cleanup restored only the authenticated 1,776,640-byte state inspector. + Exact `a6cf9383` quarantines concrete Codex/OpenRouter authentication, credential reading, and network transport at the two release entrypoints that perform inference. `epiphany-openai-runtime` now owns only exact native-request diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index c3737c29c949bd028bbadf99a9a7ab32b363e1f4..56497fcd5c8758373d99b005f781d1761b4e42c0 100644 GIT binary patch delta 681 zcmYjPyN(k<5X8P0czFdN5g=%ZfB-*qoNauUolcMtIwKp;_S$ndp5E*2vCkw%A|NC{ z)`|!|0f_(!5tH))WMupVZJ#X>lqT5f>ZGh{F#IL@V5aSoc$7mijUD}%{n zi;>u25F?HPP!vmJRW^(eXbLjIITT8SG_o1!yVgz7xQr+mR@qPx3xi>SN93kK;r_O9FVwm9EQ;v1WkqcL7kU%iR zfb6W!7SRig9W!x#rJqHgIqx;zx(RIw#kc^Lg5ZTf?&IY)rFxKAzOG`UM#0aT@PceC z^vfBRK1puvtn!w Date: Mon, 24 Aug 2026 22:20:55 +0200 Subject: [PATCH 095/340] Delete generic runtime job results --- .../src/bin/epiphany-mvp-coordinator.rs | 4 +- epiphany-core/src/coordinator_results.rs | 42 +- epiphany-core/src/current_work.rs | 140 +--- epiphany-core/src/lib.rs | 9 +- epiphany-core/src/mind_documents.rs | 2 +- epiphany-core/src/reasoning_context.rs | 83 +-- epiphany-core/src/reorientation_work.rs | 140 ++-- epiphany-core/src/runtime_spine.rs | 672 ++++++++---------- epiphany-core/src/surfaces/role_result.rs | 8 +- .../src/bin/epiphany-openai-runtime.rs | 160 ++--- epiphany-openai-runtime/src/lib.rs | 216 ++---- .../src/persona_executor.rs | 15 +- 12 files changed, 565 insertions(+), 926 deletions(-) diff --git a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs index 26d41178..0acca96c 100644 --- a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs +++ b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs @@ -1636,9 +1636,9 @@ fn accept_reorient(runtime_store: &Path) -> Result { .attempt .job_id .ok_or_else(|| anyhow!("reorientation review lost its runtime job"))?; - let snapshot = epiphany_core::runtime_job_snapshot(runtime_store, &job_id)? + let job = epiphany_core::runtime_job(runtime_store, &job_id)? .ok_or_else(|| anyhow!("reorientation review lost its runtime job"))?; - let accepted = match snapshot.job.status { + let accepted = match job.status { epiphany_core::EpiphanyRuntimeJobStatus::Completed => { epiphany_core::accept_reorientation_result(runtime_store, &job_id, &now())? } diff --git a/epiphany-core/src/coordinator_results.rs b/epiphany-core/src/coordinator_results.rs index b377b484..ec31db23 100644 --- a/epiphany-core/src/coordinator_results.rs +++ b/epiphany-core/src/coordinator_results.rs @@ -7,7 +7,6 @@ pub struct EpiphanyCoordinatorReorientResultSnapshot { pub finding: Option, pub note: String, } - pub fn read_runtime_reorient_result( runtime_store_path: Option<&Path>, job_id: &str, @@ -21,8 +20,8 @@ pub fn read_runtime_reorient_result( ), ); }; - let snapshot = match runtime_job_snapshot(runtime_store_path, job_id) { - Ok(Some(snapshot)) => snapshot, + let job = match runtime_job(runtime_store_path, job_id) { + Ok(Some(job)) => job, Ok(None) => { return reorient_snapshot( EpiphanyCrrcResultStatus::Pending, @@ -42,7 +41,7 @@ pub fn read_runtime_reorient_result( ); } }; - let status = reorient_result_status(&snapshot.job.status); + let status = reorient_result_status(&job.status); let finding = match status { EpiphanyCrrcResultStatus::Completed => { match runtime_reorient_worker_result(runtime_store_path, job_id) { @@ -67,10 +66,14 @@ pub fn read_runtime_reorient_result( } } } - EpiphanyCrrcResultStatus::Failed | EpiphanyCrrcResultStatus::Cancelled => snapshot - .result - .as_ref() - .map(interpret_reorient_lifecycle_failure), + EpiphanyCrrcResultStatus::Failed | EpiphanyCrrcResultStatus::Cancelled => { + match runtime_reorient_worker_result(runtime_store_path, job_id) { + Ok(result) => result + .as_ref() + .map(interpret_runtime_reorient_worker_result), + Err(_) => None, + } + } _ => None, }; reorient_snapshot(status, finding, None) @@ -97,25 +100,6 @@ fn reorient_snapshot( } } -fn interpret_reorient_lifecycle_failure( - result: &EpiphanyRuntimeJobResult, -) -> EpiphanyReorientFindingInterpretation { - EpiphanyReorientFindingInterpretation { - mode: None, - summary: Some(result.summary.clone()), - next_safe_move: nonempty(&result.next_safe_move), - checkpoint_still_valid: None, - files_inspected: Vec::new(), - frontier_node_ids: Vec::new(), - evidence_ids: Vec::new(), - artifact_refs: Vec::new(), - runtime_result_id: Some(result.result_id.clone()), - runtime_job_id: Some(result.job_id.clone()), - job_error: Some(result.summary.clone()), - item_error: None, - } -} - fn reorient_result_status(status: &EpiphanyRuntimeJobStatus) -> EpiphanyCrrcResultStatus { match status { EpiphanyRuntimeJobStatus::Queued => EpiphanyCrrcResultStatus::Pending, @@ -163,7 +147,3 @@ fn render_reorient_result_note( } } } - -fn nonempty(value: &str) -> Option { - (!value.trim().is_empty()).then(|| value.to_string()) -} diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index 54144c4c..d1520c22 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -3689,14 +3689,15 @@ mod tests { ); let mut death_cache = crate::runtime_spine_cache(&store)?; death_cache.pull_all_backing_stores()?; - let death = death_cache - .get::(&format!("result-worker-death-{scheduled}"))? - .expect("worker death emits its terminal runtime result"); - assert_eq!(death.verdict, "failed"); - let death_context = death - .decision_context_id - .as_deref() - .expect("model-backed death preserves its decision context"); + let death_failures = death_cache + .get_all::()? + .into_iter() + .filter(|failure| failure.pass_id == scheduled) + .collect::>(); + let [death_failure] = death_failures.as_slice() else { + panic!("worker death emits one typed model-pass failure") + }; + let death_context = death_failure.decision_context_id.as_str(); assert!(crate::audit_decision_context(&store, death_context).is_ok()); assert_eq!( crate::runtime_worker_process_claim(&store, &failed_launch.job_id)? @@ -3924,18 +3925,6 @@ mod tests { decision_context_id: direction_context.context_id.clone(), }; crate::put_runtime_role_worker_result(&store, &direction_worker_result)?; - crate::complete_runtime_job( - &store, - crate::RuntimeSpineJobResultOptions { - result_id: "direction-runtime-result".into(), - job_id: direction_job_id, - completed_at: "2026-08-17T00:00:05.500Z".into(), - verdict: "suggest".into(), - summary: direction_result.summary, - next_safe_move: "Promote through the exact proposal owner.".into(), - decision_context_id: Some(direction_context.context_id), - }, - )?; let mut promoted = crate::promote_autonomous_direction_options_for_modeling( &store, "GameCult/Epiphany", @@ -4014,17 +4003,12 @@ mod tests { ) .is_err() ); - crate::complete_runtime_job( + crate::terminalize_runtime_job( &store, - crate::RuntimeSpineJobResultOptions { - result_id: format!("runtime-result-failed-{proposal_job_id}"), - job_id: proposal_job_id.clone(), - completed_at: "2026-08-17T00:00:09.100Z".into(), - verdict: "failed".into(), - summary: "provider returned no terminal decision".into(), - next_safe_move: "retry from the same exact obligation".into(), - decision_context_id: None, - }, + &proposal_job_id, + crate::EpiphanyRuntimeJobStatus::Failed, + "2026-08-17T00:00:09.100Z", + &format!("worker-runtime-failure-{proposal_job_id}"), )?; let proposal_retry_projection = project_current_work(&store)?; assert_eq!( @@ -4190,18 +4174,6 @@ mod tests { "2026-08-17T00:00:11Z", )?; crate::put_runtime_role_worker_result(&store, &proposal_result)?; - crate::complete_runtime_job( - &store, - crate::RuntimeSpineJobResultOptions { - result_id: format!("runtime-result-{proposal_job_id}"), - job_id: proposal_job_id.clone(), - completed_at: "2026-08-17T00:00:12Z".into(), - verdict: proposal_result.verdict.clone(), - summary: proposal_result.summary.clone(), - next_safe_move: proposal_result.next_safe_move.clone(), - decision_context_id: Some(proposal_context.context_id.clone()), - }, - )?; assert_eq!( crate::runtime_worker_process_claim(&store, &proposal_job_id)? .expect("structured Modeling result terminalizes its process claim") @@ -4341,18 +4313,6 @@ mod tests { "2026-08-17T00:00:13.300Z", )?; crate::put_runtime_role_worker_result(&store, &proposal_result)?; - crate::complete_runtime_job( - &store, - crate::RuntimeSpineJobResultOptions { - result_id: format!("runtime-result-{proposal_job_id}"), - job_id: proposal_job_id.clone(), - completed_at: "2026-08-17T00:00:13.400Z".into(), - verdict: proposal_result.verdict.clone(), - summary: proposal_result.summary.clone(), - next_safe_move: proposal_result.next_safe_move.clone(), - decision_context_id: Some(retry_context.context_id), - }, - )?; assert_eq!( project_current_work(&store)? .proposal_modeling @@ -4680,18 +4640,6 @@ mod tests { decision_context_id: verification_context.context_id.clone(), }; crate::put_runtime_role_worker_result(&store, &verification_result)?; - crate::complete_runtime_job( - &store, - crate::RuntimeSpineJobResultOptions { - result_id: format!("runtime-result-{verification_job_id}"), - job_id: verification_job_id.clone(), - completed_at: "2026-08-17T00:00:15Z".into(), - verdict: verification_result.verdict.clone(), - summary: verification_result.summary.clone(), - next_safe_move: verification_result.next_safe_move.clone(), - decision_context_id: Some(verification_context.context_id.clone()), - }, - )?; assert_eq!( project_current_work(&store)? .verification @@ -5034,18 +4982,6 @@ mod tests { "2026-08-17T00:00:19Z", )?; crate::put_runtime_role_worker_result(&store, &verdict_result)?; - crate::complete_runtime_job( - &store, - crate::RuntimeSpineJobResultOptions { - result_id: format!("runtime-result-{verdict_job_id}"), - job_id: verdict_job_id.clone(), - completed_at: "2026-08-17T00:00:20Z".into(), - verdict: verdict_result.verdict.clone(), - summary: verdict_result.summary.clone(), - next_safe_move: verdict_result.next_safe_move.clone(), - decision_context_id: Some(verdict_context.context_id.clone()), - }, - )?; assert_eq!( project_current_work(&store)? .frontier_verdict_modeling @@ -5351,18 +5287,6 @@ mod tests { "2026-08-17T00:00:21.950Z", )?; crate::put_runtime_role_worker_result(&store, &planning_result)?; - crate::complete_runtime_job( - &store, - crate::RuntimeSpineJobResultOptions { - result_id: format!("runtime-result-{planning_job}"), - job_id: planning_job.clone(), - completed_at: "2026-08-17T00:00:22Z".into(), - verdict: planning_result.verdict.clone(), - summary: planning_result.summary.clone(), - next_safe_move: planning_result.next_safe_move.clone(), - decision_context_id: Some(planning_context.context_id.clone()), - }, - )?; let mind_request = crate::commit_repo_frontier_plan_mind_request( &store, &planning_result.result_id, @@ -5469,18 +5393,6 @@ mod tests { "2026-08-17T00:00:22.450Z", )?; crate::put_runtime_role_worker_result(&store, &mind_result)?; - crate::complete_runtime_job( - &store, - crate::RuntimeSpineJobResultOptions { - result_id: format!("runtime-result-{mind_job}"), - job_id: mind_job.clone(), - completed_at: "2026-08-17T00:00:22.500Z".into(), - verdict: mind_result.verdict.clone(), - summary: mind_result.summary.clone(), - next_safe_move: mind_result.next_safe_move.clone(), - decision_context_id: Some(mind_context.context_id.clone()), - }, - )?; let plan_decision = crate::commit_repo_frontier_plan_decision(&store, &mind_result.result_id)?; assert_eq!( @@ -5681,18 +5593,6 @@ mod tests { "2026-08-17T00:00:25Z", )?; crate::put_runtime_role_worker_result(&store, &research_result)?; - crate::complete_runtime_job( - &store, - crate::RuntimeSpineJobResultOptions { - result_id: format!("runtime-result-{research_job}"), - job_id: research_job.clone(), - completed_at: "2026-08-17T00:00:26Z".into(), - verdict: research_result.verdict.clone(), - summary: research_result.summary.clone(), - next_safe_move: research_result.next_safe_move.clone(), - decision_context_id: Some(research_context.context_id.clone()), - }, - )?; assert_eq!( project_current_work(&store)?.research.continuation_action(), Some(RepoFrontierResearchContinuationAction::ReviewResearchResult) @@ -5791,18 +5691,6 @@ mod tests { "2026-08-17T00:00:27.100Z", )?; crate::put_runtime_role_worker_result(&stale_research_store, &research_result)?; - crate::complete_runtime_job( - &stale_research_store, - crate::RuntimeSpineJobResultOptions { - result_id: format!("runtime-result-{research_job}"), - job_id: research_job.clone(), - completed_at: "2026-08-17T00:00:27.200Z".into(), - verdict: research_result.verdict.clone(), - summary: research_result.summary.clone(), - next_safe_move: research_result.next_safe_move.clone(), - decision_context_id: Some(research_context.context_id.clone()), - }, - )?; assert_eq!( crate::runtime_role_worker_result(&stale_research_store, &research_job)? .expect("stale output remains a durable decision") diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index fc5a61f5..1f92ae1e 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -205,8 +205,6 @@ pub use runtime_spine::EpiphanyCoordinatorRunReceipt; pub use runtime_spine::EpiphanyCoordinatorRunTerminality; pub use runtime_spine::EpiphanyRuntimeIdentity; pub use runtime_spine::EpiphanyRuntimeJob; -pub use runtime_spine::EpiphanyRuntimeJobResult; -pub use runtime_spine::EpiphanyRuntimeJobSnapshot; pub use runtime_spine::EpiphanyRuntimeJobStatus; pub use runtime_spine::EpiphanyRuntimeModelExecutionBinding; pub use runtime_spine::EpiphanyRuntimeReorientWorkerResult; @@ -230,7 +228,6 @@ pub use runtime_spine::RepoFrontierVerdictModelingLaunchAuthority; pub use runtime_spine::RuntimeSpineHeartbeatJobOptions; pub use runtime_spine::RuntimeSpineInitOptions; pub use runtime_spine::RuntimeSpineJobOptions; -pub use runtime_spine::RuntimeSpineJobResultOptions; pub use runtime_spine::RuntimeSpineSessionClosureOptions; pub use runtime_spine::abandon_unactivated_runtime_worker_process; pub use runtime_spine::activate_runtime_worker_process; @@ -241,7 +238,6 @@ pub use runtime_spine::claim_runtime_worker_process; pub use runtime_spine::close_runtime_session; pub use runtime_spine::commit_repo_frontier_plan_decision; pub use runtime_spine::commit_repo_frontier_plan_mind_request; -pub use runtime_spine::complete_runtime_job; pub use runtime_spine::coordinator_run_receipts; pub use runtime_spine::coordinator_run_session_id; pub use runtime_spine::finalize_coordinator_run; @@ -274,8 +270,8 @@ pub use runtime_spine::runtime_hands_commit_receipt; pub use runtime_spine::runtime_hands_patch_receipt; pub(crate) use runtime_spine::runtime_has_actionable_hands_frontier; pub use runtime_spine::runtime_identity; -pub use runtime_spine::runtime_job_snapshot; -pub(crate) use runtime_spine::runtime_reorient_worker_result; +pub use runtime_spine::runtime_job; +pub use runtime_spine::runtime_reorient_worker_result; pub use runtime_spine::runtime_repo_frontier_planning_lifecycle; pub(crate) use runtime_spine::runtime_repo_frontier_research_lifecycle; pub use runtime_spine::runtime_requested_public_source_refs_for_worker; @@ -290,6 +286,7 @@ pub use runtime_spine::select_and_commit_repo_frontier_planning_request; pub(crate) use runtime_spine::select_and_commit_repo_frontier_research_request; pub use runtime_spine::select_and_commit_repo_frontier_route; pub use runtime_spine::terminalize_model_pass_failure_session; +pub use runtime_spine::terminalize_runtime_job; pub(crate) use runtime_worker_attempt::{RuntimeTypedRequestRef, WorkerProcessStatus}; pub use soul_gateway::*; pub use state_model::*; diff --git a/epiphany-core/src/mind_documents.rs b/epiphany-core/src/mind_documents.rs index 63857eed..d1a3af86 100644 --- a/epiphany-core/src/mind_documents.rs +++ b/epiphany-core/src/mind_documents.rs @@ -11,7 +11,7 @@ use sha2::{Digest, Sha256}; use crate::{EpiphanyMindDocumentVersion, runtime_spine_cache}; -pub const MIND_SCHEMA_EPOCH: &str = "epiphany.mind.epoch.v10"; +pub const MIND_SCHEMA_EPOCH: &str = "epiphany.mind.epoch.v11"; pub const MIND_OBJECTIVE_KEY: &str = "objective"; pub const MIND_FOCUS_KEY: &str = "focus"; pub const MIND_MODE_KEY: &str = "mode"; diff --git a/epiphany-core/src/reasoning_context.rs b/epiphany-core/src/reasoning_context.rs index 8179bd98..781b1b20 100644 --- a/epiphany-core/src/reasoning_context.rs +++ b/epiphany-core/src/reasoning_context.rs @@ -668,7 +668,6 @@ pub struct EpiphanyDecisionAuditIndexEntry { pub struct EpiphanyDecisionTerminalRecords { pub role_worker_results: Vec, pub reorient_worker_results: Vec, - pub runtime_job_results: Vec, pub model_pass_failures: Vec, pub archived_worker_attempts: Vec, pub persona_stage_receipts: Vec, @@ -683,7 +682,6 @@ impl EpiphanyDecisionTerminalRecords { fn len(&self) -> usize { self.role_worker_results.len() + self.reorient_worker_results.len() - + self.runtime_job_results.len() + self.model_pass_failures.len() + self.archived_worker_attempts.len() + self.persona_stage_receipts.len() @@ -699,8 +697,6 @@ impl EpiphanyDecisionTerminalRecords { .sort_by(|left, right| left.result_id.cmp(&right.result_id)); self.reorient_worker_results .sort_by(|left, right| left.result_id.cmp(&right.result_id)); - self.runtime_job_results - .sort_by(|left, right| left.result_id.cmp(&right.result_id)); self.model_pass_failures .sort_by(|left, right| left.failure_id.cmp(&right.failure_id)); self.archived_worker_attempts @@ -792,11 +788,6 @@ fn audit_decision_context_from_cache( .into_iter() .filter(|record| record.decision_context_id == context_id) .collect(), - runtime_job_results: cache - .get_all::()? - .into_iter() - .filter(|record| record.decision_context_id.as_deref() == Some(context_id)) - .collect(), model_pass_failures: cache .get_all::()? .into_iter() @@ -895,10 +886,6 @@ fn validate_decision_terminal_records( .reorient_worker_results .iter() .any(|record| record.job_id != basis.pass_id) - || records - .runtime_job_results - .iter() - .any(|record| record.job_id != basis.pass_id) || records .archived_worker_attempts .iter() @@ -1005,12 +992,6 @@ fn validate_model_failure_companions(records: &EpiphanyDecisionTerminalRecords) .admitted_model_direction_consideration_result_msgpack .is_none() }; - let runtime_result_is_failure_projection = |record: &crate::EpiphanyRuntimeJobResult| { - matches!( - record.verdict.as_str(), - "failed" | "fail" | "runtime-error" | "error" | "blocked" | "cancelled" | "canceled" - ) - }; let archived_attempt_is_failure = |record: &crate::EpiphanyArchivedRuntimeWorkerAttempt| { crate::WorkerProcessStatus::parse(&record.terminal_process_status) .map(|status| !status.is_fulfilled_terminal()) @@ -1021,10 +1002,6 @@ fn validate_model_failure_companions(records: &EpiphanyDecisionTerminalRecords) .role_worker_results .iter() .any(|record| !role_result_is_failure_projection(record)) - || records - .runtime_job_results - .iter() - .any(|record| !runtime_result_is_failure_projection(record)) || records .archived_worker_attempts .iter() @@ -2374,19 +2351,8 @@ mod tests { Some(failure.clone()) ); let model_job = - crate::runtime_job_snapshot(&store, "failed-model-job")?.expect("model job snapshot"); - assert_eq!( - model_job.job.status, - crate::EpiphanyRuntimeJobStatus::Failed - ); - assert!( - model_job - .result - .expect("model transport failure result") - .decision_context_id - .is_none(), - "generic model transport must not own decision authority" - ); + crate::runtime_job(&store, "failed-model-job")?.expect("failed model runtime job"); + assert_eq!(model_job.status, crate::EpiphanyRuntimeJobStatus::Failed); let audit = audit_decision_context(&store, &context.context_id)?; assert_eq!( audit.terminal_records.model_pass_failures, @@ -2429,25 +2395,14 @@ mod tests { admitted_model_direction_consideration_result_msgpack: None, decision_context_id: context.context_id.clone(), }; - let failure_runtime_result = crate::EpiphanyRuntimeJobResult { - result_id: format!("result-runtime-{}", reasoning_basis.pass_id), - job_id: reasoning_basis.pass_id.clone(), - verdict: "failed".into(), - summary: failure_summary, - completed_at: "2026-08-18T00:00:03Z".into(), - next_safe_move: "Create a fresh work obligation and reasoning pass.".into(), - decision_context_id: Some(context.context_id.clone()), - }; let mut cache = runtime_spine_cache(&store)?; cache.put(&failure_role_result.job_id, &failure_role_result)?; - cache.put(&failure_runtime_result.result_id, &failure_runtime_result)?; let audit = audit_decision_context(&store, &context.context_id)?; assert_eq!(audit.terminal_records.role_worker_results.len(), 1); - assert_eq!(audit.terminal_records.runtime_job_results.len(), 1); assert_eq!(audit.terminal_records.model_pass_failures.len(), 1); assert_eq!( list_auditable_decision_contexts(&store)?.decisions[0].terminal_record_count, - 3 + 2 ); let mut false_success = failure_role_result.clone(); false_success.verdict = "completed".into(); @@ -2621,16 +2576,33 @@ mod tests { let before_unterminal_audit = backing.pull_all()?; assert!(audit_decision_context(&store, &context.context_id).is_err()); assert_eq!(backing.pull_all()?, before_unterminal_audit); - let terminal_result = crate::EpiphanyRuntimeJobResult { + let terminal_result = crate::EpiphanyRuntimeRoleWorkerResult { result_id: "worker-result-1".into(), job_id: "pass-1".into(), + role_id: role_terminal_semantic_role(&basis)?.expect("role pass"), verdict: "completed".into(), summary: "Structured Imagination decision".into(), - completed_at: "2026-08-14T00:00:03Z".into(), next_safe_move: "Inspect the durable decision context".into(), - decision_context_id: Some(context.context_id.clone()), + checkpoint_summary: None, + scratch_summary: None, + files_inspected: Vec::new(), + frontier_node_ids: Vec::new(), + evidence_ids: Vec::new(), + artifact_refs: Vec::new(), + open_questions: Vec::new(), + evidence_gaps: Vec::new(), + risks: Vec::new(), + research_decision_msgpack: None, + item_error: None, + metadata: Default::default(), + repo_model_mutation_proposal_msgpack: None, + frontier_plan_candidate_msgpack: None, + frontier_plan_mind_decision_msgpack: None, + imagination_consideration_candidate_msgpack: None, + admitted_model_direction_consideration_result_msgpack: None, + decision_context_id: context.context_id.clone(), }; - runtime_spine_cache(&store)?.put(&terminal_result.result_id, &terminal_result)?; + runtime_spine_cache(&store)?.put(&terminal_result.job_id, &terminal_result)?; let before_audit = backing.pull_all()?; let audit = audit_decision_context(&store, &context.context_id)?; assert_eq!(audit.context_id, context.context_id); @@ -2638,7 +2610,7 @@ mod tests { assert_eq!(audit.terminal_native_request.request_id, "request-1"); assert_eq!(audit.terminal_provider_request.request_id, "request-1"); assert_eq!( - audit.terminal_records.runtime_job_results, + audit.terminal_records.role_worker_results, vec![terminal_result.clone()] ); assert_eq!(audit.mind_commit_receipts.len(), 2); @@ -2647,7 +2619,8 @@ mod tests { let mut archive_cache = runtime_spine_cache(&store)?; archive_cache.pull_all_backing_stores()?; assert!( - archive_cache.delete::(&terminal_result.result_id)? + archive_cache + .delete::(&terminal_result.job_id)? ); let archived = crate::EpiphanyArchivedRuntimeWorkerAttempt { job_id: "pass-1".into(), @@ -2666,7 +2639,7 @@ mod tests { assert!( archived_audit .terminal_records - .runtime_job_results + .role_worker_results .is_empty() ); assert_eq!( diff --git a/epiphany-core/src/reorientation_work.rs b/epiphany-core/src/reorientation_work.rs index f4016b1f..8eccece1 100644 --- a/epiphany-core/src/reorientation_work.rs +++ b/epiphany-core/src/reorientation_work.rs @@ -12,7 +12,7 @@ pub const REORIENTATION_REQUEST_SCHEMA_VERSION: &str = "epiphany.self.reorientat pub const MIND_REORIENTATION_DECISION_SCHEMA_VERSION: &str = "epiphany.mind.reorientation_decision.v1"; pub const MIND_REORIENTATION_PASS_FAILURE_SCHEMA_VERSION: &str = - "epiphany.mind.reorientation_pass_failure.v1"; + "epiphany.mind.reorientation_pass_failure.v2"; #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct EpiphanyReorientationStateProjection { @@ -78,7 +78,7 @@ pub struct EpiphanyMindReorientationDecisionDocument { #[derive(Clone, Debug, PartialEq, Eq, DatabaseEntry)] #[cultcache( - type = "epiphany.mind.reorientation_pass_failure.v1", + type = "epiphany.mind.reorientation_pass_failure.v2", schema = "EpiphanyMindReorientationPassFailureDocument" )] pub struct EpiphanyMindReorientationPassFailureDocument { @@ -91,14 +91,12 @@ pub struct EpiphanyMindReorientationPassFailureDocument { #[cultcache(key = 3)] pub job_id: String, #[cultcache(key = 4)] - pub runtime_result_id: String, + pub model_pass_failure_id: String, #[cultcache(key = 5)] pub decision_context_id: String, #[cultcache(key = 6)] - pub verdict: String, - #[cultcache(key = 7)] pub summary: String, - #[cultcache(key = 8)] + #[cultcache(key = 7)] pub failed_at: String, } @@ -283,20 +281,29 @@ pub(crate) fn current_reorientation_work( EpiphanyAgentPassContinuationAction::Review } EpiphanyRuntimeJobStatus::Failed => { - let terminal = exact_runtime_job_result(cache, &launch.job_id)?; - match terminal.decision_context_id.as_deref() { - Some(context_id) + let model_failures = cache + .get_all::()? + .into_iter() + .filter(|failure| failure.pass_id == launch.job_id) + .collect::>(); + match model_failures.as_slice() { + [] => EpiphanyAgentPassContinuationAction::Launch, + [model_failure] if failures.iter().any(|failure| { failure.request_id == request.request_id && failure.job_id == launch.job_id - && failure.runtime_result_id == terminal.result_id - && failure.decision_context_id == context_id + && failure.model_pass_failure_id == model_failure.failure_id + && failure.decision_context_id == model_failure.decision_context_id }) => { EpiphanyAgentPassContinuationAction::Launch } - Some(_) => EpiphanyAgentPassContinuationAction::Review, - None => EpiphanyAgentPassContinuationAction::Launch, + [_] => EpiphanyAgentPassContinuationAction::Review, + _ => { + return Err(anyhow!( + "reorientation pass has multiple model-failure authorities" + )); + } } } _ => EpiphanyAgentPassContinuationAction::Wait, @@ -333,21 +340,24 @@ pub fn record_reorientation_pass_failure( if job.status != EpiphanyRuntimeJobStatus::Failed { return Err(anyhow!("reorientation pass is not a failed model pass")); } - let terminal = exact_runtime_job_result(&cache, job_id)?; - let decision_context_id = terminal - .decision_context_id - .as_deref() - .ok_or_else(|| anyhow!("model-backed reorientation failure has no decision context"))?; + let model_failures = cache + .get_all::()? + .into_iter() + .filter(|failure| failure.pass_id == job_id) + .collect::>(); + let [model_failure] = model_failures.as_slice() else { + return Err(anyhow!( + "reorientation failure requires one exact model-pass failure" + )); + }; let context = cache - .get::(decision_context_id)? + .get::(&model_failure.decision_context_id)? .ok_or_else(|| anyhow!("reorientation failure lost its decision context"))?; let basis = cache .get::(&context.basis_id)? .ok_or_else(|| anyhow!("reorientation failure lost its reasoning basis"))?; context.validate(&basis)?; - let model_failure = - crate::model_pass_failure_for_request(store_path, &context.terminal_request_id)? - .ok_or_else(|| anyhow!("reorientation failure has no exact model-pass failure"))?; + model_failure.validate(&basis, &context)?; if model_failure.decision_context_id != context.context_id { return Err(anyhow!( "reorientation failure crossed its model-pass failure context" @@ -360,14 +370,13 @@ pub fn record_reorientation_pass_failure( } let failure = EpiphanyMindReorientationPassFailureDocument { schema_version: MIND_REORIENTATION_PASS_FAILURE_SCHEMA_VERSION.into(), - failure_id: format!("reorientation-pass-failure-{}", terminal.result_id), + failure_id: format!("reorientation-pass-failure-{}", model_failure.failure_id), request_id: request.request_id.clone(), job_id: job_id.into(), - runtime_result_id: terminal.result_id.clone(), - decision_context_id: decision_context_id.into(), - verdict: terminal.verdict.clone(), - summary: terminal.summary.clone(), - failed_at: terminal.completed_at.clone(), + model_pass_failure_id: model_failure.failure_id.clone(), + decision_context_id: context.context_id.clone(), + summary: model_failure.summary.clone(), + failed_at: model_failure.failed_at.clone(), }; if let Some(existing) = cache.get::(&failure.failure_id)? @@ -375,7 +384,7 @@ pub fn record_reorientation_pass_failure( if existing != failure { return Err(anyhow!("reorientation failure replay was substituted")); } - return mind_receipt_for_failure_context(&cache, decision_context_id); + return mind_receipt_for_failure_context(&cache, &context.context_id); } let snapshot = cache.snapshot_envelopes(); let mut strong_reads = Vec::new(); @@ -387,10 +396,9 @@ pub fn record_reorientation_pass_failure( (crate::EpiphanyRuntimeWorkerLaunchRequest::TYPE, job_id), (crate::EpiphanyRuntimeJob::TYPE, job_id), ( - crate::EpiphanyRuntimeJobResult::TYPE, - terminal.result_id.as_str(), + crate::EpiphanyDecisionContext::TYPE, + context.context_id.as_str(), ), - (crate::EpiphanyDecisionContext::TYPE, decision_context_id), ( crate::EpiphanyModelPassFailure::TYPE, model_failure.failure_id.as_str(), @@ -408,11 +416,11 @@ pub fn record_reorientation_pass_failure( crate::mind_documents::prepare_mind_document(&cache, &failure.failure_id, &failure)?; match crate::reasoning_context::commit_mind_mutation( store_path, - decision_context_id, + &context.context_id, "Continuity.reorientation_failure", strong_reads, vec![write], - &terminal.completed_at, + &model_failure.failed_at, )? { crate::EpiphanyMindCommitOutcome::Committed(receipt) => Ok(receipt), crate::EpiphanyMindCommitOutcome::Conflict { @@ -503,9 +511,11 @@ pub fn launch_current_reorientation_work( ); expected.push( cache - .get_envelope::(&failure.runtime_result_id)? + .get_envelope::( + &failure.model_pass_failure_id, + )? .ok_or_else(|| { - anyhow!("reorientation retry lost its terminal result envelope") + anyhow!("reorientation retry lost its model-failure envelope") })?, ); } @@ -856,26 +866,6 @@ fn mind_receipt_for_failure_context( } } -fn exact_runtime_job_result( - cache: &CultCache, - job_id: &str, -) -> Result { - let mut results = cache - .get_all::()? - .into_iter() - .filter(|result| result.job_id == job_id) - .collect::>(); - match results.len() { - 1 => Ok(results.remove(0)), - 0 => Err(anyhow!( - "reorientation attempt lost its terminal runtime result" - )), - _ => Err(anyhow!( - "reorientation attempt has multiple terminal runtime results" - )), - } -} - #[cfg(test)] mod tests { use super::*; @@ -1011,24 +1001,11 @@ mod tests { decision_context_id: context.context_id.clone(), }; crate::put_runtime_reorient_worker_result(&store, &result)?; - crate::complete_runtime_job( - &store, - crate::RuntimeSpineJobResultOptions { - result_id: format!("runtime-result-{job_id}"), - job_id: job_id.clone(), - completed_at: "2026-08-18T10:00:06Z".into(), - verdict: "resume".into(), - summary: result.summary.clone(), - next_safe_move: result.next_safe_move.clone(), - decision_context_id: Some(context.context_id.clone()), - }, - )?; - assert!( - crate::runtime_job_snapshot(&store, &job_id)? - .expect("reorientation job snapshot") - .result - .is_none(), - "typed reorientation decisions must not persist a generic result mirror" + assert_eq!( + crate::runtime_job(&store, &job_id)? + .expect("reorientation runtime job") + .status, + EpiphanyRuntimeJobStatus::Completed ); cache.pull_all_backing_stores()?; @@ -1131,17 +1108,12 @@ mod tests { failed_activation, "2026-08-18T10:00:12Z", )?; - crate::complete_runtime_job( + crate::terminalize_runtime_job( &store, - crate::RuntimeSpineJobResultOptions { - result_id: format!("runtime-result-{failed_job}"), - job_id: failed_job.clone(), - completed_at: "2026-08-18T10:00:14Z".into(), - verdict: "failed".into(), - summary: "Provider failed after the terminal request was sealed.".into(), - next_safe_move: "Review the typed failure, then retry.".into(), - decision_context_id: Some(failed_context.context_id.clone()), - }, + &failed_job, + EpiphanyRuntimeJobStatus::Failed, + "2026-08-18T10:00:14Z", + &model_failure.failure_id, )?; assert_eq!( crate::project_current_work(&store)? diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index a627f467..35c422b5 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -55,7 +55,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v44"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v45"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache(type = "epiphany.runtime.identity", schema = "EpiphanyRuntimeIdentity")] @@ -287,9 +287,9 @@ impl EpiphanyArchivedRuntimeWorkerAttempt { )?; match &decision.role_result { Some(result) - if fulfilled - && result.job_id == self.job_id - && result.decision_context_id == decision.decision_context_id => + if result.job_id == self.job_id + && result.decision_context_id == decision.decision_context_id + && (fulfilled == result.item_error.is_none()) => { Ok(()) } @@ -305,6 +305,36 @@ fn worker_process_claim_id(job_id: &str) -> String { format!("runtime-worker-process-{job_id}") } +fn worker_outcome_status( + item_error: Option<&str>, +) -> Result<(EpiphanyRuntimeJobStatus, WorkerProcessStatus)> { + match item_error { + Some(error) if error.trim().is_empty() => { + Err(anyhow!("typed worker failure requires a nonempty error")) + } + Some(_) => Ok(( + EpiphanyRuntimeJobStatus::Failed, + WorkerProcessStatus::TerminalFailure, + )), + None => Ok(( + EpiphanyRuntimeJobStatus::Completed, + WorkerProcessStatus::TerminalResult, + )), + } +} + +fn process_status_for_terminal_job( + status: &EpiphanyRuntimeJobStatus, +) -> Result { + match status { + EpiphanyRuntimeJobStatus::Completed => Ok(WorkerProcessStatus::TerminalResult), + EpiphanyRuntimeJobStatus::Failed => Ok(WorkerProcessStatus::TerminalFailure), + EpiphanyRuntimeJobStatus::Queued => { + Err(anyhow!("runtime job terminal status cannot be queued")) + } + } +} + #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct RepoFrontierVerdictModelingLaunchAuthority { pub request: RepoFrontierModelingRequest, @@ -500,28 +530,6 @@ pub struct EpiphanyRuntimeReorientWorkerResult { pub decision_context_id: String, } -#[derive(Clone, Debug, PartialEq, DatabaseEntry)] -#[cultcache( - type = "epiphany.runtime.job_result", - schema = "EpiphanyRuntimeJobResult" -)] -pub struct EpiphanyRuntimeJobResult { - #[cultcache(key = 1)] - pub result_id: String, - #[cultcache(key = 2)] - pub job_id: String, - #[cultcache(key = 3)] - pub verdict: String, - #[cultcache(key = 4)] - pub summary: String, - #[cultcache(key = 5)] - pub completed_at: String, - #[cultcache(key = 6, default)] - pub next_safe_move: String, - #[cultcache(key = 7, default)] - pub decision_context_id: Option, -} - #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache( type = "epiphany.coordinator_run_receipt.v1", @@ -623,17 +631,6 @@ pub struct RuntimeSpineJobOptions { pub session_id: String, } -#[derive(Clone, Debug, PartialEq, Eq)] -pub struct RuntimeSpineJobResultOptions { - pub result_id: String, - pub job_id: String, - pub completed_at: String, - pub verdict: String, - pub summary: String, - pub next_safe_move: String, - pub decision_context_id: Option, -} - #[derive(Clone, Debug, PartialEq)] pub struct RuntimeSpineHeartbeatJobOptions { pub runtime_id: String, @@ -647,12 +644,6 @@ pub struct RuntimeSpineHeartbeatJobOptions { pub created_at: String, } -#[derive(Clone, Debug, PartialEq)] -pub struct EpiphanyRuntimeJobSnapshot { - pub job: EpiphanyRuntimeJob, - pub result: Option, -} - pub fn runtime_spine_cache(store_path: impl AsRef) -> Result { let store_path = store_path.as_ref(); let backing_store = runtime_spine_backing_store(store_path)?; @@ -706,7 +697,6 @@ fn runtime_spine_schema_cache() -> Result { cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; - cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; @@ -1009,21 +999,6 @@ pub fn terminalize_model_pass_failure_session( .get::(&binding.job_id)? .ok_or_else(|| anyhow!("model pass failure runtime job is absent"))?; let model_job_is_live = matches!(model_job.status, EpiphanyRuntimeJobStatus::Queued); - let model_job_results = cache - .get_all::()? - .into_iter() - .filter(|result| result.job_id == binding.job_id) - .collect::>(); - if model_job_is_live && !model_job_results.is_empty() { - return Err(anyhow!("live model pass job already has a terminal result")); - } - if !model_job_is_live - && (model_job_results.len() != 1 || model_job_results[0].decision_context_id.is_some()) - { - return Err(anyhow!( - "terminal model transport job lost its non-authoritative result" - )); - } let session_job_ids = cache .get_all::()? .into_iter() @@ -1054,24 +1029,8 @@ pub fn terminalize_model_pass_failure_session( ]; if model_job_is_live { model_job.status = EpiphanyRuntimeJobStatus::Failed; - let model_result = EpiphanyRuntimeJobResult { - result_id: format!("result-model-pass-failure-{}", failure.failure_id), - job_id: binding.job_id.clone(), - verdict: "failed".to_string(), - summary: options.summary.clone(), - completed_at: options.failed_at.clone(), - next_safe_move: - "Inspect the sealed decision context and typed model-pass failure before retrying." - .to_string(), - decision_context_id: None, - }; expected.push(model_job_envelope); replacements.push(cache.prepare_entry(&model_job.job_id, &model_job)?.0); - replacements.push( - cache - .prepare_entry(&model_result.result_id, &model_result)? - .0, - ); } if !runtime_spine_backing_store(store_path)?.compare_and_swap_batch(&expected, replacements)? { return terminalize_model_pass_failure_session(store_path, options); @@ -1698,26 +1657,6 @@ fn archive_completed_model_session( .iter() .map(|job| job.job_id.clone()) .collect::>(); - let mut job_results = cache - .get_all::()? - .into_iter() - .filter(|result| job_ids.contains(&result.job_id)) - .collect::>(); - job_results.sort_by(|left, right| left.result_id.cmp(&right.result_id)); - if jobs.iter().any(|job| { - job_results - .iter() - .filter(|result| result.job_id == job.job_id) - .count() - != 1 - }) || job_results - .iter() - .any(|result| !job_ids.contains(&result.job_id)) - { - return Err(anyhow!( - "runtime session archive requires exactly one terminal result per job" - )); - } if cache .get_all::()? .iter() @@ -1922,12 +1861,6 @@ fn archive_completed_model_session( for job in &jobs { retired_identities.insert((EpiphanyRuntimeJob::TYPE.to_string(), job.job_id.clone())); } - for result in &job_results { - retired_identities.insert(( - EpiphanyRuntimeJobResult::TYPE.to_string(), - result.result_id.clone(), - )); - } for binding in &model_bindings { retired_identities.insert(( EpiphanyRuntimeModelExecutionBinding::TYPE.to_string(), @@ -2427,10 +2360,10 @@ fn validate_admitted_model_direction_launch_carrier( Ok(()) } -pub fn runtime_job_snapshot( +pub fn runtime_job( store_path: impl AsRef, job_id: &str, -) -> Result> { +) -> Result> { validate_non_empty(job_id, "job id")?; let store_path = store_path.as_ref(); if !store_path.exists() { @@ -2438,19 +2371,7 @@ pub fn runtime_job_snapshot( } let mut cache = runtime_spine_cache(store_path)?; cache.pull_all_backing_stores()?; - let Some(job) = cache.get::(job_id)? else { - return Ok(None); - }; - let mut results = cache - .get_all::()? - .into_iter() - .filter(|result| result.job_id == job_id) - .collect::>(); - if results.len() > 1 { - return Err(anyhow!("runtime job has multiple terminal results")); - } - let result = results.pop(); - Ok(Some(EpiphanyRuntimeJobSnapshot { job, result })) + cache.get::(job_id) } pub fn runtime_worker_launch_request( @@ -3288,56 +3209,13 @@ fn terminal_worker_request_id(cache: &CultCache, worker_job_id: &str) -> Result< } } -fn complete_persisted_worker_outcome( - store_path: &Path, - job_id: &str, - completed_at: &str, -) -> Result> { - let mut cache = runtime_spine_cache(store_path)?; - cache.pull_all_backing_stores()?; - let role = cache.get::(job_id)?; - let reorient = cache.get::(job_id)?; - match (role, reorient) { - (Some(_), Some(_)) => Err(anyhow!( - "worker attempt has both role and reorientation terminal outcomes" - )), - (Some(result), None) => complete_runtime_job( - store_path, - RuntimeSpineJobResultOptions { - result_id: result.result_id, - job_id: job_id.to_string(), - completed_at: completed_at.to_string(), - verdict: result.verdict, - summary: result.summary, - next_safe_move: result.next_safe_move, - decision_context_id: Some(result.decision_context_id), - }, - ) - .map(Some), - (None, Some(result)) => complete_runtime_job( - store_path, - RuntimeSpineJobResultOptions { - result_id: result.result_id, - job_id: job_id.to_string(), - completed_at: completed_at.to_string(), - verdict: result.mode, - summary: result.summary, - next_safe_move: result.next_safe_move, - decision_context_id: Some(result.decision_context_id), - }, - ) - .map(Some), - (None, None) => Ok(None), - } -} - fn commit_runtime_worker_process_death( store_path: impl AsRef, job_id: &str, terminal_authority_id: &str, terminal_at: &str, decision_context_id: Option<&str>, -) -> Result { +) -> Result { let store_path = store_path.as_ref(); validate_non_empty(terminal_authority_id, "worker death terminal authority")?; chrono::DateTime::parse_from_rfc3339(terminal_at) @@ -3352,22 +3230,15 @@ fn commit_runtime_worker_process_death( if status == WorkerProcessStatus::TerminalDeath && current.terminal_authority_id.as_deref() == Some(terminal_authority_id) { - let result_id = format!("result-worker-death-{job_id}"); - let result = cache - .get::(&result_id)? - .ok_or_else(|| anyhow!("worker death claim lost its terminal job result"))?; let job = cache .get::(job_id)? .ok_or_else(|| anyhow!("worker death claim lost its runtime job"))?; - if job.status != EpiphanyRuntimeJobStatus::Failed - || result.job_id != job_id - || result.decision_context_id.as_deref() != decision_context_id - { + if job.status != EpiphanyRuntimeJobStatus::Failed { return Err(anyhow!( "worker death replay found split terminal authority" )); } - return Ok(result); + return Ok(job); } if !status.is_live() { return Err(anyhow!( @@ -3391,14 +3262,6 @@ fn commit_runtime_worker_process_death( "worker death recovery found a terminal runtime job" )); } - let existing_results = cache - .get_all::()? - .into_iter() - .filter(|result| result.job_id == job_id) - .collect::>(); - if !existing_results.is_empty() { - return Err(anyhow!("live worker death recovery found a job result")); - } let job_envelope = cache .get_envelope::(job_id)? .ok_or_else(|| anyhow!("worker death recovery lost its job envelope"))?; @@ -3409,23 +3272,7 @@ fn commit_runtime_worker_process_death( next.status = WorkerProcessStatus::TerminalDeath.as_str().into(); next.terminal_at = Some(terminal_at.into()); next.terminal_authority_id = Some(terminal_authority_id.into()); - let summary = "Runtime Continuity proved the exact worker process terminal before a structured outcome was admitted.".to_string(); job.status = EpiphanyRuntimeJobStatus::Failed; - let result = EpiphanyRuntimeJobResult { - result_id: format!("result-worker-death-{job_id}"), - job_id: job_id.to_string(), - verdict: "failed".to_string(), - summary: summary.clone(), - completed_at: terminal_at.to_string(), - next_safe_move: "Derive a fresh attempt from current typed work; never rebase the abandoned model output.".to_string(), - decision_context_id: decision_context_id.map(str::to_string), - }; - if cache - .get::(&result.result_id)? - .is_some() - { - return Err(anyhow!("worker death terminal identities already exist")); - } let mut expected = vec![current_envelope, job_envelope]; let mut unchanged_strong_reads = Vec::new(); if let Some(context_id) = decision_context_id { @@ -3469,7 +3316,6 @@ fn commit_runtime_worker_process_death( let mut writes = vec![ cache.prepare_entry(&claim_id, &next)?.0, cache.prepare_entry(job_id, &job)?.0, - cache.prepare_entry(&result.result_id, &result)?.0, ]; writes.extend(unchanged_strong_reads); if !SingleFileMessagePackBackingStore::new(store_path) @@ -3483,7 +3329,7 @@ fn commit_runtime_worker_process_death( decision_context_id, ); } - Ok(result) + Ok(job) } pub(crate) fn terminalize_dead_runtime_worker_attempt( @@ -3491,13 +3337,44 @@ pub(crate) fn terminalize_dead_runtime_worker_attempt( job_id: &str, terminal_authority_id: &str, terminal_at: &str, -) -> Result { +) -> Result { let store_path = store_path.as_ref(); - if let Some(result) = complete_persisted_worker_outcome(store_path, job_id, terminal_at)? { - return Ok(result); - } let mut cache = runtime_spine_cache(store_path)?; cache.pull_all_backing_stores()?; + let role = cache.get::(job_id)?; + let reorient = cache.get::(job_id)?; + if role.is_some() && reorient.is_some() { + return Err(anyhow!( + "worker attempt has both role and reorientation terminal outcomes" + )); + } + if role.is_some() || reorient.is_some() { + let job = cache + .get::(job_id)? + .ok_or_else(|| anyhow!("structured worker outcome lost its runtime job"))?; + let claim = cache + .get::(&worker_process_claim_id(job_id))? + .ok_or_else(|| anyhow!("structured worker outcome lost its process claim"))?; + let result = role + .as_ref() + .map(|result| (&result.result_id, result.item_error.as_deref())) + .or_else(|| { + reorient + .as_ref() + .map(|result| (&result.result_id, result.item_error.as_deref())) + }) + .expect("one structured outcome checked above"); + let (expected_job_status, expected_process_status) = worker_outcome_status(result.1)?; + if job.status != expected_job_status + || WorkerProcessStatus::parse(&claim.status)? != expected_process_status + || claim.terminal_authority_id.as_deref() != Some(result.0.as_str()) + { + return Err(anyhow!( + "structured worker outcome did not atomically terminalize its physiology" + )); + } + return Ok(job); + } let terminal_request_id = terminal_worker_request_id(&cache, job_id)?; drop(cache); let decision_context_id = if let Some(request_id) = terminal_request_id { @@ -3557,15 +3434,9 @@ pub fn put_runtime_role_worker_result( "role worker result cannot substitute its sealed launch role" )); } - let is_failure = match result.item_error.as_deref() { - Some(error) if error.trim().is_empty() => { - return Err(anyhow!( - "typed role worker failure requires a nonempty error" - )); - } - Some(_) => true, - None => false, - }; + let (terminal_job_status, terminal_process_status) = + worker_outcome_status(result.item_error.as_deref())?; + let is_failure = terminal_job_status == EpiphanyRuntimeJobStatus::Failed; let carries_semantic_success = result.research_decision_msgpack.is_some() || result.repo_model_mutation_proposal_msgpack.is_some() || result.frontier_plan_candidate_msgpack.is_some() @@ -3907,14 +3778,22 @@ pub fn put_runtime_role_worker_result( } let process_claim_id = worker_process_claim_id(&result.job_id); let process_claim = cache.get::(&process_claim_id)?; + let mut job = cache + .get::(&result.job_id)? + .ok_or_else(|| anyhow!("role worker result requires its runtime job"))?; if let Some(existing) = cache.get::(&result.job_id)? { if existing != *result { return Err(anyhow!( "role worker result is immutable for its runtime job" )); } + if job.status != terminal_job_status { + return Err(anyhow!( + "role worker result is not terminal authority for its runtime job" + )); + } if let Some(claim) = process_claim.as_ref() - && (!crate::WorkerProcessStatus::parse(&claim.status)?.is_fulfilled_terminal() + && (crate::WorkerProcessStatus::parse(&claim.status)? != terminal_process_status || claim.terminal_authority_id.as_deref() != Some(result.result_id.as_str())) { return Err(anyhow!( @@ -3945,9 +3824,18 @@ pub fn put_runtime_role_worker_result( } return Ok(()); } + if job.status != EpiphanyRuntimeJobStatus::Queued { + return Err(anyhow!( + "role worker result requires its queued runtime job" + )); + } + let job_envelope = cache + .get_envelope::(&result.job_id)? + .ok_or_else(|| anyhow!("role worker result lost its job envelope"))?; + job.status = terminal_job_status.clone(); let (envelope, _) = cache.prepare_entry(&result.job_id, result)?; - let mut writes = vec![envelope]; - let mut expected = Vec::new(); + let mut writes = vec![envelope, cache.prepare_entry(&result.job_id, &job)?.0]; + let mut expected = vec![job_envelope]; if let Some(claim) = process_claim.as_ref() { if crate::WorkerProcessStatus::parse(&claim.status)? != crate::WorkerProcessStatus::Active { return Err(anyhow!( @@ -3958,7 +3846,7 @@ pub fn put_runtime_role_worker_result( .get_envelope::(&process_claim_id)? .ok_or_else(|| anyhow!("role worker result lost its process claim envelope"))?; let mut terminal_claim = claim.clone(); - terminal_claim.status = crate::WorkerProcessStatus::TerminalResult.as_str().into(); + terminal_claim.status = terminal_process_status.as_str().into(); terminal_claim.terminal_at = Some(chrono::Utc::now().to_rfc3339()); terminal_claim.terminal_authority_id = Some(result.result_id.clone()); expected.push(current_envelope); @@ -4014,12 +3902,16 @@ pub fn put_runtime_role_worker_result( .get::(&process_claim_id)? .is_some_and(|claim| { crate::WorkerProcessStatus::parse(&claim.status) - .is_ok_and(|status| status.is_fulfilled_terminal()) + .is_ok_and(|status| status == terminal_process_status) && claim.terminal_authority_id.as_deref() == Some(result.result_id.as_str()) }), None => true, }; + let job_matches = reloaded + .get::(&result.job_id)? + .is_some_and(|job| job.status == terminal_job_status); if worker_matches + && job_matches && model_direction_companion_matches && imagination_candidate_companion_matches && claim_matches @@ -6067,7 +5959,6 @@ pub(crate) fn runtime_repo_frontier_research_lifecycle( require_identity(&cache)?; let launches = cache.get_all::()?; let jobs = cache.get_all::()?; - let job_results = cache.get_all::()?; let role_results = cache.get_all::()?; let (view, _basis) = current_keyed_repo_model(&cache)?; let model = view.memory_context_projection(); @@ -6165,13 +6056,23 @@ pub(crate) fn runtime_repo_frontier_research_lifecycle( } } EpiphanyRuntimeJobStatus::Failed => { - let terminal = job_results - .iter() - .filter(|result| result.job_id == job.job_id) - .count(); - if terminal != 1 { + let claim = cache + .get::(&worker_process_claim_id( + &job.job_id, + ))? + .ok_or_else(|| { + anyhow!("failed frontier Research attempt lost its process claim") + })?; + let claim_status = WorkerProcessStatus::parse(&claim.status)?; + if !matches!( + claim_status, + WorkerProcessStatus::TerminalResult + | WorkerProcessStatus::TerminalFailure + | WorkerProcessStatus::TerminalDeath + ) || claim.terminal_authority_id.is_none() + { return Err(anyhow!( - "failed frontier Research attempt lost its exact terminal result" + "failed frontier Research attempt lost its exact terminal authority" )); } } @@ -6733,6 +6634,7 @@ pub fn put_runtime_reorient_worker_result( store_path: impl AsRef, result: &EpiphanyRuntimeReorientWorkerResult, ) -> Result<()> { + let store_path = store_path.as_ref(); validate_non_empty(&result.job_id, "reorient worker result job id")?; validate_non_empty(&result.result_id, "reorient worker result id")?; validate_non_empty(&result.mode, "reorient worker result mode")?; @@ -6743,8 +6645,91 @@ pub fn put_runtime_reorient_worker_result( let mut cache = runtime_spine_cache(store_path)?; cache.pull_all_backing_stores()?; require_worker_decision_context(&cache, &result.decision_context_id, &result.job_id)?; - cache.put(&result.job_id, result)?; - Ok(()) + let launch = cache + .get::(&result.job_id)? + .ok_or_else(|| anyhow!("reorientation result requires its immutable launch"))?; + if !matches!( + launch.launch_document()?, + EpiphanyWorkerLaunchDocument::Reorient(_) + ) { + return Err(anyhow!("reorientation result crossed a role launch")); + } + let (terminal_job_status, terminal_process_status) = + worker_outcome_status(result.item_error.as_deref())?; + let mut job = cache + .get::(&result.job_id)? + .ok_or_else(|| anyhow!("reorientation result requires its runtime job"))?; + let claim_id = worker_process_claim_id(&result.job_id); + let claim = cache.get::(&claim_id)?; + if let Some(existing) = cache.get::(&result.job_id)? { + if existing != *result + || job.status != terminal_job_status + || claim.as_ref().is_some_and(|claim| { + WorkerProcessStatus::parse(&claim.status).ok() != Some(terminal_process_status) + || claim.terminal_authority_id.as_deref() != Some(result.result_id.as_str()) + }) + { + return Err(anyhow!("reorientation result replay was substituted")); + } + return Ok(()); + } + if job.status != EpiphanyRuntimeJobStatus::Queued { + return Err(anyhow!( + "reorientation result requires its queued runtime job" + )); + } + let job_envelope = cache + .get_envelope::(&result.job_id)? + .ok_or_else(|| anyhow!("reorientation result lost its job envelope"))?; + job.status = terminal_job_status.clone(); + let mut expected = vec![job_envelope]; + let mut writes = vec![ + cache.prepare_entry(&result.job_id, result)?.0, + cache.prepare_entry(&result.job_id, &job)?.0, + ]; + if let Some(claim) = claim { + if WorkerProcessStatus::parse(&claim.status)? != WorkerProcessStatus::Active { + return Err(anyhow!( + "reorientation result requires its active process claim" + )); + } + let claim_envelope = cache + .get_envelope::(&claim_id)? + .ok_or_else(|| anyhow!("reorientation result lost its claim envelope"))?; + let mut terminal = claim; + terminal.status = terminal_process_status.as_str().into(); + terminal.terminal_at = Some(chrono::Utc::now().to_rfc3339()); + terminal.terminal_authority_id = Some(result.result_id.clone()); + expected.push(claim_envelope); + writes.push(cache.prepare_entry(&claim_id, &terminal)?.0); + } + if SingleFileMessagePackBackingStore::new(store_path) + .compare_and_swap_batch(&expected, writes)? + { + return Ok(()); + } + let mut reloaded = runtime_spine_cache(store_path)?; + reloaded.pull_all_backing_stores()?; + if reloaded + .get::(&result.job_id)? + .is_some_and(|existing| existing == *result) + && reloaded + .get::(&result.job_id)? + .is_some_and(|job| job.status == terminal_job_status) + && reloaded + .get::(&claim_id)? + .is_none_or(|claim| { + WorkerProcessStatus::parse(&claim.status) + .is_ok_and(|status| status == terminal_process_status) + && claim.terminal_authority_id.as_deref() == Some(result.result_id.as_str()) + }) + { + Ok(()) + } else { + Err(anyhow!( + "reorientation result lost immutable insertion to a different outcome" + )) + } } fn require_worker_decision_context( @@ -6767,7 +6752,7 @@ fn require_worker_decision_context( Ok(()) } -pub(crate) fn runtime_reorient_worker_result( +pub fn runtime_reorient_worker_result( store_path: impl AsRef, job_id: &str, ) -> Result> { @@ -8089,11 +8074,19 @@ fn archive_runtime_worker_attempt( )); } let role_result = cache.get::(job_id)?; - if fulfilled != role_result.is_some() { + if fulfilled && role_result.is_none() { return Err(anyhow!( "worker attempt archive terminal result shape disagrees with requested archive kind" )); } + if role_result + .as_ref() + .is_some_and(|result| fulfilled == result.item_error.is_some()) + { + return Err(anyhow!( + "worker attempt archive structured result disagrees with process terminality" + )); + } let claim_id = worker_process_claim_id(job_id); let claim = cache .get::(&claim_id)? @@ -8167,21 +8160,14 @@ fn archive_runtime_worker_attempt( } } let snapshot = cache.snapshot_envelopes(); - let worker_job_results = cache - .get_all::()? - .into_iter() - .filter(|item| item.job_id == job_id) - .collect::>(); - let job_results = worker_job_results - .iter() - .map(|item| item.result_id.clone()) - .collect::>(); let role_decision_context_id = role_result .as_ref() .map(|result| result.decision_context_id.clone()); - let mut decision_context_ids = worker_job_results + let mut decision_context_ids = cache + .get_all::()? .iter() - .filter_map(|result| result.decision_context_id.clone()) + .filter(|failure| failure.pass_id == job_id) + .map(|failure| failure.decision_context_id.clone()) .chain(role_decision_context_id) .collect::>(); if decision_context_ids.len() > 1 { @@ -8208,12 +8194,8 @@ fn archive_runtime_worker_attempt( (entry.r#type == EpiphanyRuntimeWorkerLaunchRequest::TYPE && entry.key == job_id) || (entry.r#type == EpiphanyRuntimeWorkerProcessClaim::TYPE && entry.key == claim_id) - || (entry.r#type == EpiphanyRuntimeRoleWorkerResult::TYPE - && fulfilled - && entry.key == job_id) + || (entry.r#type == EpiphanyRuntimeRoleWorkerResult::TYPE && entry.key == job_id) || (entry.r#type == EpiphanyRuntimeJob::TYPE && entry.key == job_id) - || (entry.r#type == EpiphanyRuntimeJobResult::TYPE - && job_results.contains(&entry.key)) }) .cloned() .collect::>(); @@ -8689,135 +8671,86 @@ pub fn coordinator_run_receipts( cache.get_all::() } -pub fn complete_runtime_job( +pub fn terminalize_runtime_job( store_path: impl AsRef, - options: RuntimeSpineJobResultOptions, -) -> Result { - validate_non_empty(&options.result_id, "result id")?; - validate_non_empty(&options.job_id, "job id")?; - validate_non_empty(&options.completed_at, "completed at")?; - validate_non_empty(&options.verdict, "verdict")?; - validate_non_empty(&options.summary, "summary")?; - let mut cache = runtime_spine_cache(store_path.as_ref())?; + job_id: &str, + status: EpiphanyRuntimeJobStatus, + terminal_at: &str, + terminal_authority_id: &str, +) -> Result { + validate_non_empty(job_id, "job id")?; + validate_non_empty(terminal_authority_id, "terminal authority id")?; + chrono::DateTime::parse_from_rfc3339(terminal_at) + .map_err(|error| anyhow!("runtime job terminal time is invalid: {error}"))?; + if status == EpiphanyRuntimeJobStatus::Queued { + return Err(anyhow!("runtime job terminal status cannot be queued")); + } + let store_path = store_path.as_ref(); + let mut cache = runtime_spine_cache(store_path)?; cache.pull_all_backing_stores()?; require_identity(&cache)?; - let mut job = cache - .get::(&options.job_id)? - .ok_or_else(|| anyhow!("runtime job {:?} does not exist", options.job_id))?; - if matches!( - job.status, - EpiphanyRuntimeJobStatus::Completed | EpiphanyRuntimeJobStatus::Failed - ) { - return Err(anyhow!( - "runtime job {:?} is already terminal", - options.job_id - )); - } if cache - .get::(&options.result_id)? + .get::(job_id)? .is_some() + || cache + .get::(job_id)? + .is_some() { return Err(anyhow!( - "runtime job result {:?} already exists", - options.result_id + "structured worker outcomes terminalize their own runtime job" )); } - let snapshot = cache.snapshot_envelopes(); - let job_envelope = snapshot - .iter() - .find(|entry| entry.r#type == EpiphanyRuntimeJob::TYPE && entry.key == options.job_id) - .cloned() + let mut job = cache + .get::(job_id)? + .ok_or_else(|| anyhow!("runtime job {job_id:?} does not exist"))?; + let claim_id = worker_process_claim_id(job_id); + let claim = cache.get::(&claim_id)?; + if job.status != EpiphanyRuntimeJobStatus::Queued { + if job.status != status { + return Err(anyhow!("runtime job terminal status was substituted")); + } + if let Some(claim) = claim { + let expected_claim_status = process_status_for_terminal_job(&status)?; + if WorkerProcessStatus::parse(&claim.status)? != expected_claim_status + || claim.terminal_authority_id.as_deref() != Some(terminal_authority_id) + { + return Err(anyhow!("runtime job replay crossed its process authority")); + } + } + return Ok(job); + } + let job_envelope = cache + .get_envelope::(job_id)? .ok_or_else(|| anyhow!("runtime job lost its exact envelope"))?; - let terminal_status = terminal_status_for_verdict(&options.verdict); - job.status = terminal_status; - let result = EpiphanyRuntimeJobResult { - result_id: options.result_id.clone(), - job_id: options.job_id.clone(), - verdict: options.verdict, - summary: options.summary, - completed_at: options.completed_at.clone(), - next_safe_move: options.next_safe_move, - decision_context_id: options.decision_context_id, - }; - let role = cache.get::(&result.job_id)?; - let reorient = cache.get::(&result.job_id)?; - let (structured_result_id, structured_result_envelope) = match (&role, &reorient) { - (Some(_), Some(_)) => { + job.status = status.clone(); + let mut expected = vec![job_envelope]; + let mut writes = vec![cache.prepare_entry(job_id, &job)?.0]; + if let Some(claim) = claim { + if WorkerProcessStatus::parse(&claim.status)? != WorkerProcessStatus::Active { return Err(anyhow!( - "runtime worker job has both role and reorientation terminal outcomes" + "runtime worker job cannot terminalize without its active process claim" )); } - (Some(result), None) => ( - Some(result.result_id.clone()), - Some( - cache - .get_envelope::(&result.job_id)? - .ok_or_else(|| anyhow!("runtime worker completion lost its role result"))?, - ), - ), - (None, Some(result)) => ( - Some(result.result_id.clone()), - Some( - cache - .get_envelope::(&result.job_id)? - .ok_or_else(|| anyhow!("runtime worker completion lost its reorient result"))?, - ), - ), - (None, None) => (None, None), - }; - let mut expected = vec![job_envelope]; - let mut writes = vec![cache.prepare_entry(&job.job_id, &job)?.0]; - if let Some(envelope) = structured_result_envelope { - expected.push(envelope.clone()); - writes.push(envelope); + let claim_envelope = cache + .get_envelope::(&claim_id)? + .ok_or_else(|| anyhow!("runtime worker terminality lost its claim envelope"))?; + let mut terminal = claim; + terminal.status = process_status_for_terminal_job(&status)?.as_str().into(); + terminal.terminal_at = Some(terminal_at.to_string()); + terminal.terminal_authority_id = Some(terminal_authority_id.to_string()); + expected.push(claim_envelope); + writes.push(cache.prepare_entry(&claim_id, &terminal)?.0); } - if structured_result_id.is_none() { - writes.push(cache.prepare_entry(&result.result_id, &result)?.0); + if runtime_spine_backing_store(store_path)?.compare_and_swap_batch(&expected, writes)? { + return Ok(job); } - let claim_id = worker_process_claim_id(&result.job_id); - if let Some(claim) = cache.get::(&claim_id)? { - match crate::WorkerProcessStatus::parse(&claim.status)? { - crate::WorkerProcessStatus::Active => { - let claim_envelope = snapshot - .iter() - .find(|entry| { - entry.r#type == EpiphanyRuntimeWorkerProcessClaim::TYPE - && entry.key == claim_id - }) - .cloned() - .ok_or_else(|| anyhow!("runtime worker completion lost its claim envelope"))?; - let mut terminal = claim; - if let Some(terminal_result_id) = structured_result_id { - terminal.status = crate::WorkerProcessStatus::TerminalResult.as_str().into(); - terminal.terminal_authority_id = Some(terminal_result_id); - } else { - terminal.status = crate::WorkerProcessStatus::TerminalFailure.as_str().into(); - terminal.terminal_authority_id = Some(result.result_id.clone()); - } - terminal.terminal_at = Some(result.completed_at.clone()); - expected.push(claim_envelope); - writes.push(cache.prepare_entry(&claim_id, &terminal)?.0); - } - crate::WorkerProcessStatus::TerminalResult => {} - crate::WorkerProcessStatus::Claimed => { - return Err(anyhow!( - "runtime worker job cannot complete before activation" - )); - } - status => { - return Err(anyhow!( - "runtime worker job completion found process status {:?}", - status.as_str() - )); - } - } - } - if !runtime_spine_backing_store(store_path.as_ref())? - .compare_and_swap_batch(&expected, writes)? - { - return Err(anyhow!("runtime job completion lost its exact snapshot")); - } - Ok(result) + terminalize_runtime_job( + store_path, + job_id, + status, + terminal_at, + terminal_authority_id, + ) } pub fn runtime_identity(store_path: impl AsRef) -> Result> { @@ -8891,17 +8824,6 @@ where .transpose() } -fn terminal_status_for_verdict(verdict: &str) -> EpiphanyRuntimeJobStatus { - if matches!( - verdict, - "failed" | "fail" | "error" | "blocked" | "cancelled" | "canceled" - ) { - EpiphanyRuntimeJobStatus::Failed - } else { - EpiphanyRuntimeJobStatus::Completed - } -} - #[cfg(test)] pub(crate) mod tests { use super::*; @@ -8937,6 +8859,26 @@ pub(crate) mod tests { Ok(()) } + #[test] + fn structured_worker_failure_cannot_claim_fulfillment() -> Result<()> { + assert_eq!( + worker_outcome_status(None)?, + ( + EpiphanyRuntimeJobStatus::Completed, + WorkerProcessStatus::TerminalResult, + ) + ); + assert_eq!( + worker_outcome_status(Some("provider refused"))?, + ( + EpiphanyRuntimeJobStatus::Failed, + WorkerProcessStatus::TerminalFailure, + ) + ); + assert!(worker_outcome_status(Some(" ")).is_err()); + Ok(()) + } + #[test] fn current_runtime_refuses_old_writable_epoch_without_mutation() -> Result<()> { let temp = tempfile::tempdir()?; diff --git a/epiphany-core/src/surfaces/role_result.rs b/epiphany-core/src/surfaces/role_result.rs index 86dfe00a..fc700c16 100644 --- a/epiphany-core/src/surfaces/role_result.rs +++ b/epiphany-core/src/surfaces/role_result.rs @@ -23,7 +23,7 @@ pub struct EpiphanyRoleFindingInterpretation { pub frontier_node_ids: Vec, pub evidence_ids: Vec, pub artifact_refs: Vec, - pub runtime_result_id: Option, + pub result_id: Option, pub runtime_job_id: Option, pub open_questions: Vec, pub evidence_gaps: Vec, @@ -45,7 +45,7 @@ pub struct EpiphanyReorientFindingInterpretation { pub frontier_node_ids: Vec, pub evidence_ids: Vec, pub artifact_refs: Vec, - pub runtime_result_id: Option, + pub result_id: Option, pub runtime_job_id: Option, pub job_error: Option, pub item_error: Option, @@ -89,7 +89,7 @@ pub fn interpret_runtime_role_worker_result( frontier_node_ids: result.frontier_node_ids.clone(), evidence_ids: result.evidence_ids.clone(), artifact_refs: result.artifact_refs.clone(), - runtime_result_id: Some(result.result_id.clone()), + result_id: Some(result.result_id.clone()), runtime_job_id: Some(result.job_id.clone()), open_questions: result.open_questions.clone(), evidence_gaps: result.evidence_gaps.clone(), @@ -134,7 +134,7 @@ pub fn interpret_runtime_reorient_worker_result( frontier_node_ids: result.frontier_node_ids.clone(), evidence_ids: result.evidence_ids.clone(), artifact_refs: result.artifact_refs.clone(), - runtime_result_id: Some(result.result_id.clone()), + result_id: Some(result.result_id.clone()), runtime_job_id: Some(result.job_id.clone()), job_error: None, item_error: result.item_error.clone(), diff --git a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs index c7dd6819..cbdbfe73 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs @@ -139,22 +139,19 @@ async fn main() -> Result<()> { )?, Err(_) => { let summary = format!("Worker runtime timed out after {seconds} seconds."); - let result = fail_worker_and_openai_jobs( + fail_worker_and_openai_jobs( &timeout_store, &timeout_job_id, "runtime_timeout", summary.clone(), - "Inspect provider/tool transport before relaunching the worker." - .to_string(), pass_progress.terminal_request_id().as_deref(), )?; json!({ "status": "timeout", "jobId": timeout_job_id, - "workerResultId": result.result_id, - "verdict": result.verdict, + "verdict": "failed", "summary": summary, - "nextSafeMove": result.next_safe_move, + "nextSafeMove": "Inspect provider/tool transport before relaunching the worker.", }) } } @@ -301,13 +298,7 @@ fn claim_and_wait_for_worker_activation(options: &RunWorkerCliOptions) -> Result &process, &chrono::Utc::now().to_rfc3339(), )?; - fail_worker_job( - &options.store_path, - &options.job_id, - "Worker activation expired before provider/tool work.".into(), - "Runtime Continuity may supersede only from the terminal unactivated process claim." - .into(), - )?; + fail_worker_job(&options.store_path, &options.job_id)?; return Err(anyhow!( "worker activation gate expired before model/tool work" )); @@ -368,7 +359,6 @@ fn start_run_worker_timeout_watchdog( &job_id, "runtime_timeout", summary.clone(), - "Inspect provider/tool transport before relaunching the worker.".to_string(), pass_progress.terminal_request_id().as_deref(), ); process::exit(124); @@ -381,24 +371,16 @@ fn fail_worker_and_openai_jobs( job_id: &str, failure_kind: &str, summary: String, - next_safe_move: String, terminal_request_id: Option<&str>, -) -> Result { - let result = if let Some(request_id) = terminal_request_id +) -> Result<()> { + if let Some(request_id) = terminal_request_id && persisted_model_request_exists(store_path, request_id)? { - fail_model_backed_worker_job( - store_path, - job_id, - request_id, - failure_kind, - summary.clone(), - next_safe_move, - )? + fail_model_backed_worker_job(store_path, job_id, request_id, failure_kind, summary)?; } else { - fail_worker_job(store_path, job_id, summary.clone(), next_safe_move)? - }; - Ok(result) + fail_worker_job(store_path, job_id)?; + } + Ok(()) } fn persisted_model_request_exists(store_path: &Path, request_id: &str) -> Result { @@ -414,22 +396,19 @@ fn fail_worker_for_runtime_error( terminal_request_id: Option<&str>, ) -> Result { let summary = format!("Worker runtime failed before producing usable output: {error}"); - let result = fail_worker_and_openai_jobs( + fail_worker_and_openai_jobs( store_path, job_id, "worker_runtime_error", summary.clone(), - "Inspect provider/tool transport and runtime adapter errors before relaunching the worker." - .to_string(), terminal_request_id, )?; Ok(json!({ "status": "runtime-error", "jobId": job_id, - "workerResultId": result.result_id, - "verdict": result.verdict, + "verdict": "failed", "summary": summary, - "nextSafeMove": result.next_safe_move, + "nextSafeMove": "Inspect provider/tool transport and runtime adapter errors before relaunching the worker.", })) } @@ -580,13 +559,42 @@ async fn run_worker_launch( let assistant_text = assistant_text_from_model_events(&options.store_path, ¤t_request_id)?; - let worker_result = complete_worker_job_from_assistant_text( + complete_worker_job_from_assistant_text( &options.store_path, &launch_request, ¤t_request_id, &openai_summary, &assistant_text, )?; + let (worker_result_id, verdict, summary, next_safe_move) = + match launch_request.launch_document()? { + epiphany_core::EpiphanyWorkerLaunchDocument::Role(_) => { + let result = epiphany_core::runtime_role_worker_result( + &options.store_path, + &launch_request.job_id, + )? + .ok_or_else(|| anyhow!("worker completion lost its typed role result"))?; + ( + result.result_id, + result.verdict, + result.summary, + result.next_safe_move, + ) + } + epiphany_core::EpiphanyWorkerLaunchDocument::Reorient(_) => { + let result = epiphany_core::runtime_reorient_worker_result( + &options.store_path, + &launch_request.job_id, + )? + .ok_or_else(|| anyhow!("worker completion lost its typed reorientation result"))?; + ( + result.result_id, + result.mode, + result.summary, + result.next_safe_move, + ) + } + }; epiphany_core::close_runtime_session( &options.store_path, epiphany_core::RuntimeSpineSessionClosureOptions { @@ -600,13 +608,12 @@ async fn run_worker_launch( "bindingId": launch_request.binding_id, "role": launch_request.role, "requestId": current_request_id, - "openaiResultId": openai_summary.result_id, "openaiVerdict": openai_summary.verdict, "openaiSummary": openai_summary.summary, - "workerResultId": worker_result.result_id, - "verdict": worker_result.verdict, - "summary": worker_result.summary, - "nextSafeMove": worker_result.next_safe_move, + "workerResultId": worker_result_id, + "verdict": verdict, + "summary": summary, + "nextSafeMove": next_safe_move, "requestedPublicSourceRuns": requested_public_source_runs, "toolRounds": tool_rounds, })) @@ -661,14 +668,12 @@ fn fail_worker_for_tool_round_limit( &openai_summary.tool_intent_ids, "worker tool round limit closed this intent before execution", )?; - let result = fail_model_backed_worker_job( + let failure = fail_model_backed_worker_job( store_path, &launch_request.job_id, current_request_id, "tool_round_limit", summary.clone(), - "Inspect the worker request, tool receipts, and model/tool loop before relaunching." - .to_string(), )?; Ok(json!({ "status": "tool-round-limit", @@ -677,13 +682,12 @@ fn fail_worker_for_tool_round_limit( "bindingId": launch_request.binding_id, "role": launch_request.role, "requestId": current_request_id, - "openaiResultId": openai_summary.result_id, "openaiVerdict": openai_summary.verdict, "openaiSummary": openai_summary.summary, - "workerResultId": result.result_id, - "verdict": result.verdict, + "modelPassFailureId": failure.failure_id, + "verdict": "failed", "summary": summary, - "nextSafeMove": result.next_safe_move, + "nextSafeMove": "Inspect the worker request, tool receipts, and model/tool loop before relaunching.", "pendingToolIntentIds": openai_summary.tool_intent_ids, "toolRounds": tool_rounds, })) @@ -707,14 +711,12 @@ fn fail_worker_for_repeated_tool_loop( &openai_summary.tool_intent_ids, "worker repeated an identical tool round; intent closed before execution", )?; - let result = fail_model_backed_worker_job( + let failure = fail_model_backed_worker_job( store_path, &launch_request.job_id, current_request_id, "repeated_tool_loop", summary.clone(), - "Inspect the repeated tool fingerprints and decide whether the worker needs a narrower evidence bundle, a repaired tool, or a higher explicit limit." - .to_string(), )?; Ok(json!({ "status": "tool-loop-stalled", @@ -723,13 +725,12 @@ fn fail_worker_for_repeated_tool_loop( "bindingId": launch_request.binding_id, "role": launch_request.role, "requestId": current_request_id, - "openaiResultId": openai_summary.result_id, "openaiVerdict": openai_summary.verdict, "openaiSummary": openai_summary.summary, - "workerResultId": result.result_id, - "verdict": result.verdict, + "modelPassFailureId": failure.failure_id, + "verdict": "failed", "summary": summary, - "nextSafeMove": result.next_safe_move, + "nextSafeMove": "Inspect the repeated tool fingerprints and decide whether the worker needs a narrower evidence bundle, a repaired tool, or a higher explicit limit.", "pendingToolIntentIds": openai_summary.tool_intent_ids, "pendingToolFingerprints": tool_fingerprints, "toolRounds": tool_rounds, @@ -805,7 +806,7 @@ mod tests { use epiphany_core::EpiphanyRuntimeJobStatus; use epiphany_core::EpiphanyWorkerLaunchDocument; use epiphany_core::RuntimeSpineHeartbeatJobOptions; - use epiphany_core::runtime_job_snapshot; + use epiphany_core::runtime_job; use epiphany_core::runtime_worker_launch_request; use epiphany_tool_adapter::EpiphanyToolInvocationIntent; use tempfile::tempdir; @@ -836,29 +837,13 @@ mod tests { .expect("typed model-pass failure"); assert_eq!(failure.failure_kind, failure_kind); assert_eq!(failure.model_request_id, request_id); - let outer = runtime_job_snapshot(store, outer_job_id)?.expect("outer worker snapshot"); - assert_eq!( - outer - .result - .expect("outer worker result") - .decision_context_id - .as_deref(), - Some(failure.decision_context_id.as_str()) - ); - let transport = runtime_job_snapshot(store, &failure.runtime_job_id)? - .expect("model transport snapshot"); + let outer = runtime_job(store, outer_job_id)?.expect("outer worker job"); + assert_eq!(outer.status, EpiphanyRuntimeJobStatus::Failed); + let transport = runtime_job(store, &failure.runtime_job_id)?.expect("model transport job"); assert!(matches!( - transport.job.status, + transport.status, EpiphanyRuntimeJobStatus::Completed | EpiphanyRuntimeJobStatus::Failed )); - assert!( - transport - .result - .expect("model transport result") - .decision_context_id - .is_none(), - "generic model transport cannot own decision authority" - ); let mut cache = epiphany_core::runtime_spine_cache(store)?; cache.pull_all_backing_stores()?; assert_eq!( @@ -1285,9 +1270,8 @@ mod tests { )?; assert_eq!(status["status"], "tool-loop-stalled"); - let snapshot = runtime_job_snapshot(&store, "worker-job-loop")?.expect("worker snapshot"); - assert_eq!(snapshot.job.status, EpiphanyRuntimeJobStatus::Failed); - assert_eq!(snapshot.result.expect("worker result").verdict, "failed"); + let job = runtime_job(&store, "worker-job-loop")?.expect("worker job"); + assert_eq!(job.status, EpiphanyRuntimeJobStatus::Failed); let mut cache = epiphany_core::runtime_spine_cache(&store)?; cache.pull_all_backing_stores()?; assert_eq!( @@ -1390,14 +1374,12 @@ mod tests { .as_str() .is_some_and(|summary| summary.contains("tool adapter exploded")) ); - let snapshot = - runtime_job_snapshot(&store, "worker-job-runtime-error")?.expect("worker snapshot"); - assert_eq!(snapshot.job.status, EpiphanyRuntimeJobStatus::Failed); - let result = snapshot.result.expect("worker result"); - assert_eq!(result.verdict, "failed"); - let context_id = result - .decision_context_id - .expect("model-backed runtime failure must retain its context"); + let job = runtime_job(&store, "worker-job-runtime-error")?.expect("worker job"); + assert_eq!(job.status, EpiphanyRuntimeJobStatus::Failed); + let failure = + epiphany_core::model_pass_failure_for_request(&store, "request-runtime-error")? + .expect("model-backed runtime failure must retain its typed owner"); + let context_id = failure.decision_context_id; let mut cache = epiphany_core::runtime_spine_cache(&store)?; cache.pull_all_backing_stores()?; assert_eq!( @@ -1478,10 +1460,8 @@ mod tests { assert_eq!(status["status"], "tool-round-limit"); assert_eq!(status["pendingToolIntentIds"][0], pending_intent_id); assert_ne!(status["status"], "tool-loop-stalled"); - let snapshot = - runtime_job_snapshot(&store, "worker-job-round-limit")?.expect("worker snapshot"); - assert_eq!(snapshot.job.status, EpiphanyRuntimeJobStatus::Failed); - assert_eq!(snapshot.result.expect("worker result").verdict, "failed"); + let job = runtime_job(&store, "worker-job-round-limit")?.expect("worker job"); + assert_eq!(job.status, EpiphanyRuntimeJobStatus::Failed); let mut cache = epiphany_core::runtime_spine_cache(&store)?; cache.pull_all_backing_stores()?; assert_eq!( diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index fea970ec..ee851b06 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -8,14 +8,13 @@ use anyhow::Context; use anyhow::Result; use anyhow::anyhow; use chrono::SecondsFormat; +use epiphany_core::EpiphanyRuntimeJobStatus; use epiphany_core::EpiphanyRuntimeReorientWorkerResult; use epiphany_core::EpiphanyRuntimeRoleWorkerResult; use epiphany_core::EpiphanyRuntimeWorkerLaunchRequest; use epiphany_core::EpiphanyWorkerLaunchDocument; use epiphany_core::RuntimeSpineInitOptions; use epiphany_core::RuntimeSpineJobOptions; -use epiphany_core::RuntimeSpineJobResultOptions; -use epiphany_core::complete_runtime_job; use epiphany_core::initialize_runtime_spine; use epiphany_core::open_runtime_model_execution; use epiphany_core::put_runtime_reorient_worker_result; @@ -23,6 +22,7 @@ use epiphany_core::put_runtime_role_worker_result; use epiphany_core::put_runtime_tool_execution_intent; use epiphany_core::runtime_identity; use epiphany_core::runtime_spine_cache; +use epiphany_core::terminalize_runtime_job; use epiphany_model_adapter::EpiphanyModelInputItem; use epiphany_model_adapter::EpiphanyModelReceipt; use epiphany_model_adapter::EpiphanyModelRequest; @@ -93,7 +93,6 @@ pub struct EpiphanyOpenAiRuntimeRunSummary { pub event_count: usize, pub verdict: String, pub summary: String, - pub result_id: String, pub receipt_id: Option, pub tool_intent_ids: Vec, } @@ -192,19 +191,16 @@ pub fn record_model_turn_events( provider_request.request_id ) }; - let result_id = format!("result-openai-{}", options.job_id); - complete_runtime_job( + terminalize_runtime_job( store_path, - RuntimeSpineJobResultOptions { - result_id: result_id.clone(), - job_id: options.job_id.clone(), - completed_at: now(), - verdict: verdict.to_string(), - summary: summary.clone(), - next_safe_move: "Review typed OpenAI receipt before accepting downstream state." - .to_string(), - decision_context_id: None, + &options.job_id, + if verdict == "pass" { + EpiphanyRuntimeJobStatus::Completed + } else { + EpiphanyRuntimeJobStatus::Failed }, + &now(), + &provider_request.request_id, )?; Ok(EpiphanyOpenAiRuntimeRunSummary { @@ -215,7 +211,6 @@ pub fn record_model_turn_events( event_count: events.len(), verdict: verdict.to_string(), summary, - result_id, receipt_id: receipt.map(|item| item.request_id), tool_intent_ids: tool_intents .into_iter() @@ -388,7 +383,7 @@ pub fn complete_worker_job_from_assistant_text( openai_request_id: &str, openai_summary: &EpiphanyOpenAiRuntimeRunSummary, assistant_text: &str, -) -> Result { +) -> Result<()> { let decision_context = epiphany_core::seal_model_decision_context(store_path.as_ref(), openai_request_id)?; let launch_document = launch_request.launch_document()?; @@ -414,14 +409,7 @@ pub fn complete_worker_job_from_assistant_text( .unwrap_or("structured output was absent") ) }; - let next_safe_move = if contract_failed { - "Repair the worker prompt/output-schema boundary before relaunching; no typed role result was admitted." - .to_string() - } else { - "Inspect provider/tool transport and the sealed model-pass failure before relaunching." - .to_string() - }; - return fail_model_backed_worker_job( + fail_model_backed_worker_job( store_path, &launch_request.job_id, openai_request_id, @@ -431,51 +419,18 @@ pub fn complete_worker_job_from_assistant_text( "output_contract_failure" }, summary, - next_safe_move, - ); + )?; + return Ok(()); } - let verdict = if openai_failed || contract_failed { - "failed".to_string() - } else { - parsed - .as_ref() - .and_then(WorkerResultIngress::verdict) - .unwrap_or_else(|| "completed".to_string()) - }; - let summary = if openai_failed { - format!("Worker model request {openai_request_id} failed before producing usable output.") - } else if let Some(error) = parse_error.as_deref() { - format!( - "Worker model response failed declared output contract {}: {error}", - launch_request.output_contract_id - ) - } else { - parsed - .as_ref() - .and_then(WorkerResultIngress::summary) - .unwrap_or_else(|| "Worker completed without a structured summary.".to_string()) - }; - let next_safe_move = if contract_failed { - "Repair the worker prompt/output-schema boundary before relaunching; no typed role result was admitted." - .to_string() - } else { - parsed - .as_ref() - .and_then(WorkerResultIngress::next_safe_move) - .unwrap_or_else(|| { - "Review the typed worker runtime result before accepting state.".to_string() - }) - }; let mut evidence_refs = parsed .as_ref() .map(WorkerResultIngress::evidence_ids) .unwrap_or_default(); evidence_refs.push(format!("openai-request:{openai_request_id}")); - let mut artifact_refs = parsed + let artifact_refs = parsed .as_ref() .map(WorkerResultIngress::artifact_refs) .unwrap_or_default(); - artifact_refs.push(format!("openai-result:{}", openai_summary.result_id)); let result_id = format!("result-worker-{}", launch_request.job_id); let completed_at = now(); if let Some(parsed) = parsed.as_ref() { @@ -519,37 +474,19 @@ pub fn complete_worker_job_from_assistant_text( } } } - complete_runtime_job( - store_path, - RuntimeSpineJobResultOptions { - result_id, - job_id: launch_request.job_id.clone(), - completed_at, - verdict, - summary, - next_safe_move, - decision_context_id: Some(decision_context.context_id), - }, - ) + Ok(()) } pub fn fail_worker_job( store_path: impl AsRef, job_id: &str, - summary: String, - next_safe_move: String, -) -> Result { - complete_runtime_job( +) -> Result { + terminalize_runtime_job( store_path, - RuntimeSpineJobResultOptions { - result_id: format!("result-worker-{job_id}"), - job_id: job_id.to_string(), - completed_at: now(), - verdict: "failed".to_string(), - summary, - next_safe_move, - decision_context_id: None, - }, + job_id, + EpiphanyRuntimeJobStatus::Failed, + &now(), + &format!("worker-runtime-failure-{job_id}"), ) } @@ -559,8 +496,7 @@ pub fn fail_model_backed_worker_job( terminal_request_id: &str, failure_kind: &str, summary: String, - next_safe_move: String, -) -> Result { +) -> Result { let context = epiphany_core::seal_model_decision_context(store_path.as_ref(), terminal_request_id)?; let failure = epiphany_core::terminalize_model_pass_failure_session( @@ -573,24 +509,30 @@ pub fn fail_model_backed_worker_job( }, )?; let launch = load_worker_launch_request(store_path.as_ref(), job_id)?; - if epiphany_core::runtime_role_worker_result(store_path.as_ref(), job_id)?.is_none() + let role_result = epiphany_core::runtime_role_worker_result(store_path.as_ref(), job_id)?; + if role_result.is_none() && let Some(role_failure) = failed_frontier_planning_role_result(&launch, &summary, &context.context_id)? { epiphany_core::put_runtime_role_worker_result(store_path.as_ref(), &role_failure)?; + return Ok(failure); } - complete_runtime_job( - store_path, - RuntimeSpineJobResultOptions { - result_id: format!("result-worker-{job_id}"), - job_id: job_id.to_string(), - completed_at: now(), - verdict: "failed".to_string(), - summary, - next_safe_move, - decision_context_id: Some(failure.decision_context_id), - }, - ) + if role_result.is_none() { + terminalize_runtime_job( + store_path.as_ref(), + job_id, + EpiphanyRuntimeJobStatus::Failed, + &failure.failed_at, + &failure.failure_id, + )?; + } else if epiphany_core::runtime_job(store_path.as_ref(), job_id)? + .is_none_or(|job| job.status != EpiphanyRuntimeJobStatus::Failed) + { + return Err(anyhow!( + "model-backed worker failure lost typed result terminality" + )); + } + Ok(failure) } pub fn ensure_openai_runtime_ready(options: &EpiphanyOpenAiRuntimeOptions) -> Result<()> { @@ -1293,33 +1235,6 @@ enum WorkerResultIngress { } impl WorkerResultIngress { - fn verdict(&self) -> Option { - match self { - WorkerResultIngress::Role(result) => clean_optional_string(result.verdict.as_deref()), - WorkerResultIngress::Reorient(result) => clean_optional_string(result.mode.as_deref()), - } - } - - fn summary(&self) -> Option { - match self { - WorkerResultIngress::Role(result) => clean_optional_string(result.summary.as_deref()), - WorkerResultIngress::Reorient(result) => { - clean_optional_string(result.summary.as_deref()) - } - } - } - - fn next_safe_move(&self) -> Option { - match self { - WorkerResultIngress::Role(result) => { - clean_optional_string(result.next_safe_move.as_deref()) - } - WorkerResultIngress::Reorient(result) => { - clean_optional_string(result.next_safe_move.as_deref()) - } - } - } - fn evidence_ids(&self) -> Vec { match self { WorkerResultIngress::Role(result) => clean_string_vec(&result.evidence_ids), @@ -2039,7 +1954,7 @@ mod tests { use super::*; use epiphany_core::EpiphanyWorkerLaunchDocument; use epiphany_core::RuntimeSpineHeartbeatJobOptions; - use epiphany_core::runtime_job_snapshot; + use epiphany_core::runtime_job; use epiphany_openai_adapter::EpiphanyOpenAiModelReceipt; use sha2::{Digest, Sha256}; use tempfile::tempdir; @@ -2981,9 +2896,8 @@ mod tests { assert!(cache.get::("req-1")?.is_some()); assert!(cache.get::("req-1")?.is_some()); assert_eq!( - runtime_job_snapshot(&store, &options.job_id)? + runtime_job(&store, &options.job_id)? .expect("snapshot") - .job .status, epiphany_core::EpiphanyRuntimeJobStatus::Completed ); @@ -3146,18 +3060,22 @@ mod tests { event_count: 1, verdict: "failed".to_string(), summary: "Provider refused the model pass.".to_string(), - result_id: "result-openai-worker-worker-job-1".to_string(), receipt_id: None, tool_intent_ids: Vec::new(), }; - let provider_failure = complete_worker_job_from_assistant_text( + complete_worker_job_from_assistant_text( &provider_failure_store, &launch_request, &model_request.request_id, &provider_failure_summary, "", )?; - assert_eq!(provider_failure.verdict, "failed"); + assert_eq!( + runtime_job(&provider_failure_store, &worker_job_id)? + .expect("provider failure worker job") + .status, + EpiphanyRuntimeJobStatus::Failed + ); assert_eq!( epiphany_core::model_pass_failure_for_request( &provider_failure_store, @@ -3180,14 +3098,19 @@ mod tests { receipt_id: Some(model_request.request_id.clone()), ..provider_failure_summary.clone() }; - let contract_failure = complete_worker_job_from_assistant_text( + complete_worker_job_from_assistant_text( &contract_failure_store, &launch_request, &model_request.request_id, &contract_failure_summary, "not the declared structured contract", )?; - assert_eq!(contract_failure.verdict, "failed"); + assert_eq!( + runtime_job(&contract_failure_store, &worker_job_id)? + .expect("contract failure worker job") + .status, + EpiphanyRuntimeJobStatus::Failed + ); assert_eq!( epiphany_core::model_pass_failure_for_request( &contract_failure_store, @@ -3210,7 +3133,6 @@ mod tests { event_count: 2, verdict: "pass".to_string(), summary: "OpenAI model request completed.".to_string(), - result_id: "result-openai-worker-worker-job-1".to_string(), receipt_id: Some(model_request.request_id.clone()), tool_intent_ids: Vec::new(), }; @@ -3226,7 +3148,7 @@ mod tests { "repoModelOperations": [] }) .to_string(); - let result = complete_worker_job_from_assistant_text( + complete_worker_job_from_assistant_text( &store, &launch_request, &model_request.request_id, @@ -3234,13 +3156,6 @@ mod tests { &assistant_text, )?; - assert_eq!(result.job_id, worker_job_id); - assert_eq!(result.verdict, "checkpoint-ready"); - assert_eq!(result.summary, "Mapped."); - assert_eq!( - result.next_safe_move, - "Review the runtime-owned Body model." - ); let runtime_evidence_id = format!("openai-request:{}", model_request.request_id); let typed_result = epiphany_core::runtime_role_worker_result(&store, &worker_job_id)? .expect("typed role worker result"); @@ -3252,18 +3167,15 @@ mod tests { ); assert_eq!( typed_result.artifact_refs, - vec![ - "artifact:model".to_string(), - format!("openai-result:{}", openai_summary.result_id) - ] + vec!["artifact:model".to_string()] ); assert!(typed_result.repo_model_mutation_proposal()?.is_none()); assert!( - runtime_job_snapshot(&store, &worker_job_id)? + runtime_job(&store, &worker_job_id)? .expect("snapshot") - .result - .is_none(), - "structured worker decisions must not persist a generic result mirror" + .status + == EpiphanyRuntimeJobStatus::Completed, + "typed worker admission must atomically terminalize its runtime job" ); Ok(()) } diff --git a/epiphany-openai-runtime/src/persona_executor.rs b/epiphany-openai-runtime/src/persona_executor.rs index 31e5ee76..8d6903b2 100644 --- a/epiphany-openai-runtime/src/persona_executor.rs +++ b/epiphany-openai-runtime/src/persona_executor.rs @@ -603,17 +603,12 @@ mod tests { "interpreter" => r#"{"schemaVersion":"epiphany.persona_interpreter_effect_set.v0","effects":[{"kind":"say","channel_id":"aquarium","reply_to_message_id":"m1","content":"The native conversational nerve is being connected, and I can show the receipts.","speech_act":"status","register":"concise","target_audience":"the addressed Discord room","safety_notes":[]}]}"#.to_string(), _ => unreachable!(), }; - epiphany_core::complete_runtime_job( + epiphany_core::terminalize_runtime_job( store_path, - epiphany_core::RuntimeSpineJobResultOptions { - result_id: format!("persona-{stage}-{turn_id}-transport-result"), - job_id: format!("persona-{stage}-{turn_id}"), - completed_at: "2026-08-14T00:00:01Z".into(), - verdict: "completed".into(), - summary: format!("Persona {stage} test transport completed"), - next_safe_move: "Seal the stage decision context".into(), - decision_context_id: None, - }, + &format!("persona-{stage}-{turn_id}"), + epiphany_core::EpiphanyRuntimeJobStatus::Completed, + "2026-08-14T00:00:01Z", + &request.request_id, )?; Ok(output) }) From ab9cad4462c36782b22505903aab759b4f4f8949 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 22:26:17 +0200 Subject: [PATCH 096/340] Record generic result deletion --- notes/epiphany-current-algorithmic-map.md | 52 ++++++++-------- notes/epiphany-fork-implementation-plan.md | 10 +++ notes/fresh-workspace-handoff.md | 68 +++++++++++++++------ state/ledgers.msgpack | Bin 724992 -> 725804 bytes state/map.yaml | 27 ++++++-- 5 files changed, 107 insertions(+), 50 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 9906507c..bd0b01f4 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -210,7 +210,7 @@ social, memory, and Body inputs without that fiction. The operator surface has no unconsumed view-lens registry, legacy acceptance bundle builder, test-only raw-JSON result interpreter, or second CRRC -recommendation algorithm. Typed runtime-result interpretation remains shared by +recommendation algorithm. Typed outcome interpretation remains shared by current work and reorientation. The keyed status composer is the sole CRRC recommendation projection; its DTO does not confer routing authority. @@ -423,14 +423,12 @@ contract instead of rejecting the live resident fields it omitted. Runtime writable state is v20. Runtime session and job documents are lifecycle state, not duplicate result -records. Exact `196222d9` removes their unread arbitrary metadata, and removes -job summary and artifact refs plus the corresponding launch-option inputs. -Every producer had emitted empty metadata and launch artifact lists; no reader -consumed any of the four fields. The terminal `EpiphanyRuntimeJobResult` -remains the sole owner of consequential summary, evidence, artifacts, and -decision-context identity. Sessions retain objective and coordinator note; -jobs retain exact session, role, status, and time identity. Runtime writable -state is v21 and the closed session/job catalog schemas are v1. +records. Sessions retain only grouping identity plus active/completed state; +jobs retain only identity plus Queued/Completed/Failed state. Exact structured +role/reorientation outcomes own semantic decision cargo, native model receipts +or typed pass failures own model terminality, and worker process claims own +process death. There is no generic terminal-result document or summary-bearing +lifecycle record. Runtime physiology is created only by its real owners. Exact `cd2177e8` first deleted `ensure_runtime_session`, whose only consumers were fixtures and whose @@ -990,12 +988,14 @@ Coordinator priority is a pure projection: No default Modeling job, latest lane, accepted-at comparison, runtime event, or generic interrupt can manufacture work. -There is no persisted generic runtime-event document. A runtime session or job -owns its own lifecycle state; `EpiphanyRuntimeJobResult`, -`EpiphanyModelPassFailure`, `EpiphanyCoordinatorRunReceipt`, and -`EpiphanyCoordinatorDeathRecovery` own their exact terminal facts. CultNet and -operator views derive display from those documents. No paired event may become -a second terminality, archival, replay, or recovery authority. +There is no persisted generic runtime-event or generic job-result document. A +runtime session or job owns only its lifecycle latch; +`EpiphanyModelPassFailure`, typed role/reorientation outcomes, +`EpiphanyCoordinatorRunReceipt`, exact process claims, and +`EpiphanyCoordinatorDeathRecovery` own their respective terminal facts. +CultNet and operator views derive display from those documents. No paired event +or summary record may become a second terminality, archival, replay, or +recovery authority. ```mermaid flowchart TD @@ -1106,16 +1106,18 @@ decision-context identity. Runtime writable state is v43. Exact `8eaa96c5` removes the generic terminal document itself from structured worker completion. A typed role/reorientation outcome is strong-read and byte-identically replayed in the same CAS that terminalizes its job and process -claim. Fulfilled archives carry context plus the full typed role result, not a -generic companion. Generic results now exist only where no structured outcome -exists. Runtime writable state is v44; archived worker attempts are v3. +claim. Failed typed outcomes close as `Failed`/`TerminalFailure`; successful +outcomes close as `Completed`/`TerminalResult`. Archives carry context plus the +full typed role result, including typed failures. The generic result family is +deleted. Runtime/Mind writable state is v45/v11; archived worker attempts are +v3. The sealed typed launch owns exact live request association. The terminal role result owns only semantic decision cargo or typed failure. The archived attempt owns historical request kind/ID and typed terminal classification after the -live launch is deleted. Archived fulfilled attempts retain the structured role -result, exact generic result family, and decision context—not an ID/digest -tombstone. +live launch is deleted. Archived attempts retain the structured role result +and decision context—not an ID/digest tombstone—and preserve typed failure +cargo when the terminal process status is failure. The heartbeat scheduler does not exist. Resident Self directly selects the oldest pending pressure when no grant, prepared launch, or active lease exists. @@ -1181,10 +1183,10 @@ receipts, and their direct context links. Runtime retention may remove SSE frames, deltas, intermediate requests, provider events, and tool scaffolding only after the terminal context is sealed and the retained decision can still reach its basis/context without them. -The v1 worker-attempt archive embeds exact request kind/ID, the typed role -result, and its context-bound generic result family. The read-only decision -audit consumes the same durable records before and after archival; it never -reconstructs family identity from terminal-result echoes. +The v3 worker-attempt archive embeds exact request kind/ID, decision context, +and the full typed role outcome when one exists. The read-only decision audit +consumes the same durable records before and after archival; it never +reconstructs family identity from terminal-result echoes or prose summaries. ## Verification and open gates diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index a9df641e..121a5a19 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -852,6 +852,16 @@ Cut in this order: source delta is +7 lines for the CAS fence while one durable duplicate family disappears. Next determine whether the residual failure/transport result contract can be deleted entirely. +53. **Generic job results are deleted at `2c3335dc`:** typed role and + reorientation outcomes atomically close their own job/process physiology; + native model receipts or typed model-pass failures own model terminality; + exact process claims own process death. Reorientation failure admission and + decision audit bind the typed failure directly. One shared outcome rule + prevents typed failures from claiming successful process fulfillment, and + failed archives retain the full typed failure. Runtime/Mind advance to + v45/v11 with no compatibility reader. The cut removes 361 maintained lines + net. Next audit whether live plus archived model-session aggregates are an + irreducible lifecycle pair or another derived grouping preserved by inertia. Do not preserve the aggregate for compatibility, manufacture a bootstrap thread, release autonomous scheduling, register topology in `gamecult-ops`, diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index f3dddd10..bda9cd6f 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,11 +2,11 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed Epiphany source cut: `edb5c3a3` +Latest committed Epiphany source cut: `2c3335dc` Current connector source: `54d8bc2525b7e7fa1b9dd26b95871247ff4c7566` -Current pass: source subtraction continues after making the sealed typed worker -launch the sole live owner of pass-family identity; the generic runtime session -aggregate is next; Ox17 and Atlas Gate 1 remain paused +Current pass: source subtraction continues after deleting the generic runtime +job-result family; completed model-session retention is next; Ox17 and Atlas +Gate 1 remain paused ## Orientation @@ -17,7 +17,7 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `edb5c3a3` is the current +production symlink body and is inactive. Exact `2c3335dc` is the current build-affecting source. Historical live proofs remain evidence; they do not authorize the next capstone or Gate 1. @@ -190,6 +190,28 @@ delta is +7 maintained lines because the exact CAS fence replaces a larger durable duplication. Verification generated 5.632 GiB across 6,826 files; Cargo cleanup restored only the authenticated 1,776,640-byte state inspector. +Exact `2c3335dc` deletes the generic runtime job-result family completely: the +durable type, completion DTO, result-bearing snapshot wrapper, schema +registration, archive/session cargo, audit branch, and every +summary/next-move/result-ID projection are gone. Typed role and reorientation +outcomes atomically terminalize their own job and process claim. Native model +receipts or `EpiphanyModelPassFailure` own model-pass terminality; the exact +worker process claim owns process death. Reorientation failure admission binds +the typed model failure directly. + +The review caught and removed a split terminality scar before commit. One +shared worker-outcome rule now maps success to `Completed` plus +`TerminalResult`, and a nonempty typed failure to `Failed` plus +`TerminalFailure`. Failed-attempt archives may retain their full typed failure +instead of erasing it as though only successful decisions were structured. +Runtime and Mind writable epochs advance to v45 and v11 with no compatibility +reader. Core passes 152/152; OpenAI runtime passes 21/21; the release-owned +model runtime passes 12/12; coordinator and Persona entrypoints compile. The +cut removes 361 maintained lines net. Verification generated 6.349 GiB across +7,376 files; cleanup restored only the exact 1,776,640-byte authenticated state +inspector at SHA-256 +`DD38855C6F092C2C53D2212A938E737643F41130F4681708840BA6075320A04E`. + Exact `a6cf9383` quarantines concrete Codex/OpenRouter authentication, credential reading, and network transport at the two release entrypoints that perform inference. `epiphany-openai-runtime` now owns only exact native-request @@ -576,8 +598,10 @@ unproven. Exact `196222d9` removes session metadata plus job summary, artifact refs, and metadata from the live lifecycle documents. No reader consumed them, every -metadata map and launch artifact list was empty, and terminal -`EpiphanyRuntimeJobResult` already owns the summary and artifacts that matter. +metadata map and launch artifact list was empty. At that cut, +`EpiphanyRuntimeJobResult` still owned the terminal summary and artifacts; +exact `2c3335dc` later deleted that family after moving each terminal fact to +its exact typed owner. Sessions retain objective/coordinator note; jobs retain exact session, role, status, and time identity. The corresponding launch-option cargo, completion merge, and caller literals are gone. Runtime writable state advances to v21; @@ -949,9 +973,11 @@ The global thread-state authority is gone. basis, decoded typed projection, exact terminal native/provider requests, governed tool observations, structured terminal records, and exact Mind commit receipts without consulting streams, events, or current Mind state. - Worker archival now retains the complete typed role/generic result family; - the digest-only archive shape is deleted. Runtime schema v2 refuses the - prior writable archive epoch. + Worker archival at that point retained the complete typed role/generic + result family; exact `2c3335dc` later deleted the generic companion while + preserving typed success and failure decisions. The digest-only archive + shape remains deleted. Runtime schema v2 refused the prior writable archive + epoch. - `553f79d9` makes the OpenAI Responses schema projector one explicit dialect compiler shared by every model pass. It types literal-only schemas, removes parent-relative and unsupported conditional validation from provider cargo, @@ -1275,16 +1301,18 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action The Ox17 deployment lane remains paused. Continue subtraction from exact -`10a70afc`: partition `EpiphanyRuntimeJobResult` consumers by structured -role/reorientation success, typed model-pass failure, transport completion, and -process-death recovery. Delete summary, next-move, evidence, and artifact mirrors -where the exact structured owner already exists; preserve the minimal -verdict/time/context or failure account needed for physiology, audit, replay, -and retention. Do not replace removed cargo with metadata, a summary DTO, -compatibility reader, or latest selector. The Connector CultMesh/Idunn/Yggdrasil proof and -Ghostlight adoption remain queued behind source stabilization. Preserve keyed -Mind, direct Body-to-Modeling flow, consequence receipts, and the complete -Model Atlas vertical slice; no live inter-swarm collaboration has run. +`2c3335dc` by mapping completed model-session retention end to end: the live +session latch, binding-derived membership, terminal receipt/failure reachability, +tool-family deletion, the private archived-session resurrection fence, and each +identity-collision reader. Decide whether `EpiphanyRuntimeSession` plus +`EpiphanyArchivedRuntimeSession` are one necessary lifecycle pair or a +redundant aggregate that can collapse into binding-derived state and one +minimal retirement authority. Do not replace them with a registry, retention +head, metadata map, compatibility reader, or summary DTO. The remaining +Connector publication/Yggdrasil caller-admission work stays queued behind +source stabilization. Preserve keyed Mind, direct Body-to-Modeling flow, +consequence receipts, and the complete Model Atlas vertical slice; no live +inter-swarm collaboration has run. Yggdrasil previously exposed 96 GiB of dead native Cargo targets after interrupted full-workspace builds; exact cleanup returned the builder target diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 56497fcd5c8758373d99b005f781d1761b4e42c0..523149a153a677c24e10921c77a58cfd683d037e 100644 GIT binary patch delta 763 zcmY*WJ#Q015XB}CVk<;KLL#X~q5;YA-R*tY4h1+)0tg`xK@@b$-WYFkw|m^~8C(TK zK}ls@OGQP2M8Q9xkpkzA3L8fH!d=Nhs8Tl{Pf$I z_NBEiR~s)HjpMiT=DT^bL2&=GgcZU$!g<0f;R0ce(E2)WwvX5A_rF@}t4po=&G*LE zmFDmLS6o=$8tP^fPdZR4dRJuvq3&@l4v;4N%-Vom`UvC{ds+ ztT*N|t4efivwZrG^jAq_T;^ucBt>o~T{xWZ5>Hall_m3}%Zoy)=hPdgsAwcRD=>w> z4aTL;VWHxROeLJbag_mKEVC>p&ceGR5N|oQA*Ys0wNy({NOQV^N0qYjBuDSQq=~W6 zVq%DeFpXkw8U$S!X*vZl^9UVyP@o##h0@W;E(<&sbVxlzZvJg$`4|v~C_?KprTtl5 zF04Jo(rCp&Oi&yfD7d*rSsd!B6zF2L9HfCbiGimSo%87pSaO=UJHfRu2|%HxzPX-a zdc9UZTbmn6H;e{wTkd+jPS{K8?H{ep`rb-=V;;9Ro=9a1O5T~UaCm39&Ef?1_QHNY zjz`IXKVTy^io-p|0yZ3k{rw(kMBzac1fhQrCHD`{GG;YTWon- + Exact 2c3335dc deletes EpiphanyRuntimeJobResult, its completion DTO, + snapshot wrapper, schema registration, archive cargo, audit branch, and + every summary/next-move/result-ID projection. Typed role and reorientation + outcomes now atomically terminalize their own job and process claim; native + model receipts or EpiphanyModelPassFailure own model-pass terminality; the + exact process claim owns process death. Reorientation failure admission + binds the typed model failure directly. One shared worker-outcome rule maps + success to Completed/TerminalResult and typed failure to + Failed/TerminalFailure, and failed archives may retain the full typed + failure rather than erasing it. Runtime/Mind writable epochs advance to + v45/v11 with no compatibility reader. Core 152/152, OpenAI runtime 21/21, + release model runtime 12/12, coordinator and Persona entrypoint checks + pass. The cut removes 361 maintained lines net. Verification generated + 6.349 GiB across 7,376 files; cleanup restored only the exact 1,776,640-byte + authenticated state inspector. Atlas remains intact and operationally + unaccepted. worker_launch_authority_cut: >- Exact edb5c3a3 makes the sealed typed worker launch document the sole live owner of pass-family identity. Eight optional request-ID fields disappear @@ -75,10 +92,10 @@ current_status: semantic_cache_cut: Exact 856648de deletes the unused semantic-memory and workspace-coverage projection subsystem rather than preserving a second derived model of Mind. Four binaries, the local daemon supervisor, Qdrant/Ollama/Postgres configuration, projector policy/lifecycle/heartbeat/recovery state, semantic query/context packets, aggregate model revision/hash cargo, workspace file-cache reader, and Persona's always-empty semantic-recall fields are gone. No agent request builder or sealed reasoning projection consumed this cache. Modeling now reads the exact typed Body and keyed RepoModel projection directly; future retrieval evidence must enter through an earned typed provider receipt. Idunn remains the sole deployment and daemon-survival authority. Core 165/165, OpenAI runtime 25/25, and release construction 19/19 pass. repo_model_vocabulary_cut: Exact 6ea4ff3c deletes the redundant generic memory profile, dead SHA-1 ID factory, empty profile module, cache-only node/edge kinds, and impossible lifecycle variants. Exact 5218cf2c deletes the producerless RepoModel lifecycle-receipt family. Exact 8bb039af makes domains seed-owned and deletes the unreachable summary mutation/document/validation/registry path plus the test cargo that alone produced it. Exact ab1afc27 removes node salience/confidence and edge confidence because no owner read, validated, routed, or displayed those values. Modeling can author only the keyed repository operations advertised by its provider schema. Affected targets check cleanly; core remains 165/165, RepoModel 5/5, and reasoning-context 8/8. package_baseline: Exact d2ca66301fb6af4e7d2d27fff0b772b0f0fccdf4 remains the admitted production source and current symlink target. Its native serialized full-workspace gate passed with receipt SHA-256 de0fc6b360ce03493b13208d917dc8349801f03364617d966152c85846c47482. Idunn sealed 26 root-owned non-writable binaries plus release-witness.ccmp as release sha256-46407552b4a0937f63d2b7f2bd09a1dacb89d671a6e3807c97209159541aef06; witness-file SHA-256 is 348785ffb0fc3130d3b4538329870c6e6f8442a8da4a01b32fa9b7ffb1f01357. Source 9b9b5c85 also passed Idunn's native test gate under receipt SHA-256 6c6a71359f8c31297419665d2872f6982a89f84e197d71fc5b36a7fc86216093 and remains sealed as release sha256-30a910785a380224bbdbd56a7b742c8d058fa70cb72dab3562e3907903e0d191 with witness-file SHA-256 75bf52d31c56ea3b08e1a702273301c1db12a4b1ffae45e3d948ce8a29b50e1d. A foreign-target helper restarted Idunn during the Epiphany transaction; rollback restored d2ca, removed deployment.env, and left production Epiphany units inactive. OpenRouter model stealth/ox-alpha and its systemd-injected credential are readiness-proven. Idunn is active with zero restarts and its deployment brake is engaged. - summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure plus generic job result to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. Exact edb5c3a3 deletes the launch, heartbeat, and terminal-result family identity mirrors: the sealed typed launch owns live pass identity and the archived attempt owns historical request identity. Exact cabdd6c3 separates immutable coordinator incarnation basis/terminality from minimal model-session admission and removes the remaining session prose, clocks, dead states, redundant options, and whole-store coordinator snapshot. Exact a46725a1 reduces runtime jobs to Queued/Completed/Failed admission latches and removes timestamp selection from Research. Exact 10a70afc derives job role/session ownership from sealed launches and model bindings, leaving the generic job as identity plus status. Exact 53e869c0 removes generic job-result evidence/artifact mirrors; typed role and reorientation outcomes remain their sole owners. Exact 8eaa96c5 stops persisting generic result documents for structured worker decisions and removes them from fulfilled archives. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. + summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. Exact edb5c3a3 deletes the launch, heartbeat, and terminal-result family identity mirrors: the sealed typed launch owns live pass identity and the archived attempt owns historical request identity. Exact cabdd6c3 separates immutable coordinator incarnation basis/terminality from minimal model-session admission and removes the remaining session prose, clocks, dead states, redundant options, and whole-store coordinator snapshot. Exact a46725a1 reduces runtime jobs to Queued/Completed/Failed admission latches and removes timestamp selection from Research. Exact 10a70afc derives job role/session ownership from sealed launches and model bindings, leaving the generic job as identity plus status. Exact 53e869c0 removes generic job-result evidence/artifact mirrors; exact 8eaa96c5 stops persisting generic result documents for structured worker decisions; exact 2c3335dc deletes the generic result family entirely and makes typed decisions, model receipts/failures, job status, and process claims own their respective terminal facts. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. The pure OpenAI runtime library opens exact model execution and admits typed provider events. OpenRouter auth/networking remains a direct release-entrypoint boundary; Codex transport crosses the lean authenticated CodexConnector client ABI and no Codex auth, HTTP/SSE, Codex-home, or compiled Codex dependency remains in Epiphany. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Workers use one governed tool-capable route; no parallel no-tools mode survives. The sealed typed worker launch is the sole live owner of pass-family identity; terminal role results contain semantic decision cargo rather than routing echoes, and archived attempts retain historical request identity plus the structured decision. Runtime jobs are only mutable job-identity plus Queued/Completed/Failed admission latches; clocks, role/session mirrors, and unowned intermediate states are absent. Model bindings own model-session membership, sealed launches own outer-worker role, root membership is structural, and Research derives attempt authority as an exact set rather than timestamp order. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Structured role/reorientation outcomes terminalize jobs and process claims through exact-envelope CAS without persisting a generic result copy; fulfilled archives retain the typed decision and context only. Mind/runtime writable epochs are v10/v44. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. The pure OpenAI runtime library opens exact model execution and admits typed provider events. OpenRouter auth/networking remains a direct release-entrypoint boundary; Codex transport crosses the lean authenticated CodexConnector client ABI and no Codex auth, HTTP/SSE, Codex-home, or compiled Codex dependency remains in Epiphany. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Workers use one governed tool-capable route; no parallel no-tools mode survives. The sealed typed worker launch is the sole live owner of pass-family identity; terminal role results contain semantic decision cargo rather than routing echoes, and archived attempts retain historical request identity plus the structured decision. Runtime jobs are only mutable job-identity plus Queued/Completed/Failed admission latches; clocks, role/session mirrors, unowned intermediate states, and generic terminal-result documents are absent. Model bindings own model-session membership, sealed launches own outer-worker role, root membership is structural, and Research derives attempt authority as an exact set rather than timestamp order. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Structured role/reorientation outcomes terminalize jobs and process claims through exact-envelope CAS; native model receipt/failure records own model terminality, process claims own process death, and archives retain typed decisions including typed failures. Mind/runtime writable epochs are v11/v45. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. execution_binding_authority_cut: Exact ce6bff12 reduces model and tool execution bindings to the only facts they own. A model binding maps one native request to its runtime session and job; a tool binding maps one typed intent to its runtime session and job. Provider identity, source worker, reasoning basis, and model-request ancestry are no longer copied into bindings or compared through timestamp-shaped API arguments. Validation, retention, public-source lookup, worker terminality, decision sealing, and tool continuation reload the exact native request or tool intent. Runtime writable state advances to v37. Core, epoch refusal, transcript-free decision audit, OpenAI tool continuation, and the release-owned tool runtime pass. The cut removes 67 net source lines and leaves runtime_spine.rs at 9,300 physical lines with 50 public functions and 25 public structs. Verification generated 12.713 GiB across 19,134 files; Cargo cleanup restored the single 1.78 MiB state inspector. Atlas is untouched; no live inter-swarm collaboration has run. provider_transport_boundary_cut: Exact ed7357a2 removes Codex transport from Epiphany's compiled body. The complete epiphany-openai-codex-spine package, codex-login/codex-client graph, CODEX_HOME/auth.json readiness, direct Codex HTTP/SSE, and Codex credential creation/argv are gone. Model and Persona entrypoints use the lean typed client from exact CodexConnector 54d8bc2525b7e7fa1b9dd26b95871247ff4c7566 over authenticated loopback MessagePack; Connector owns Codex auth, transport, replay, and exact native/provider digest receipts. Epiphany retains sealed native/provider requests, strict schema/call-ID projection, tool continuation, decision admission, and typed receipt evidence. OpenRouter remains one direct ureq/Rustls boundary with its own credential and terminal-tool dialect. Model receipts advance to v1 and runtime to v38; caller identity, both request digests, and cached-token usage survive transcript deletion. The maintained non-lock source shrinks by 857 lines and Cargo.lock drops 4,830 lines. Core 150/150, runtime 21/21, adapter 5/5, model edge 12/12, Persona 1/1, exact launch checks, and focused no-deps Clippy pass. Two focused build roots totaling 10.8 GiB were removed; only the exact 1,776,640-byte state inspector at SHA-256 DD38855C6F092C2C53D2212A938E737643F41130F4681708840BA6075320A04E remains. Atlas is untouched and no collaboration acceptance is claimed. runtime_session_authority_cut: Exact cabdd6c3 removes coordinator process incarnations from the generic model-session aggregate. EpiphanyRuntimeSession now contains only grouping identity plus active/completed admission state. Immutable EpiphanyCoordinatorRunBasis records exact thread, resident launch, objective, and start provenance. Exact completion/failure receipts and process-death recovery compete through one deterministic EpiphanyCoordinatorRunTerminality identity, so one full typed authority wins while unrelated document inserts merge. Objective prose, clocks, coordinator notes, four unused status variants, the one-field session-options wrapper, and the dead whole-snapshot append helper are deleted. Runtime advances to v40 with no compatibility reader. The focused Core, model-failure audit, Persona, coordinator terminality/conflict, release coordinator, and release model-runtime checks pass. The code cut removes 62 maintained lines net. Verification created 6.3 GiB across 7,017 Cargo files; cleanup restored exactly the 1,776,640-byte state inspector at SHA-256 DD38855C6F092C2C53D2212A938E737643F41130F4681708840BA6075320A04E. Atlas remains untouched and no live inter-swarm collaboration is claimed. @@ -185,10 +202,10 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability; it still mixes immutable identity, model sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. The sealed launch solely owns live family identity and archived attempts own retained request identity. Exact cabdd6c3 removes coordinator runs from the generic session aggregate; exact a46725a1 removes job clocks and dead states; exact 10a70afc reduces the job itself to identity plus Queued/Completed/Failed status while sealed launches and model bindings own role/session joins; exact 53e869c0 removes generic evidence/artifact mirrors. Generic terminal job results now exist only when no typed role/reorientation outcome exists: model transport terminality, model-backed runtime failure, or process death. Audit whether that residual contract can disappear entirely by deriving transport terminality from the native model receipt/failure plus job status, model-backed failure from EpiphanyModelPassFailure, and process death from its exact process claim. Do not erase the only typed failure account before its surviving owner is explicit. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path remains an earned privilege boundary and its Yggdrasil issuer/crossing route still requires owning-lane repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Continue source subtraction from exact 8eaa96c5. Determine whether EpiphanyRuntimeJobResult can be deleted rather than further dieted: map model transport completion to native model receipt/stream plus job status, model-backed outer failure to EpiphanyModelPassFailure, process death to EpiphanyRuntimeWorkerProcessClaim, and reorientation failure admission to its exact decision context/model failure. If every consumer has an exact owner, delete the generic result type, snapshot result field, archive/session cargo, and completion DTO; otherwise retain only the irreducible failure record and name its invariant. Add no replacement summary DTO, metadata map, compatibility reader, or latest selector. Keep the standalone Connector readiness/Idunn/Yggdrasil/Ghostlight deployment sequence queued until the source body stabilizes. Preserve one refresh writer, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live credential transfer, Ox root, or Model Atlas Gate run. + unresolved_authority: `runtime_spine.rs` remains the largest central liability; it still mixes immutable identity, model sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. The sealed launch solely owns live family identity and archived attempts own retained request identity. Exact cabdd6c3 removes coordinator runs from the generic session aggregate; exact a46725a1 removes job clocks and dead states; exact 10a70afc reduces the job itself to identity plus Queued/Completed/Failed status; exact 2c3335dc deletes generic terminal results. The private archived-model-session aggregate is now the narrowest suspicious owner: it groups retired job/request/tool identities and a deletion digest to prevent resurrection, while the live session is only an active/completed grouping latch. Audit whether both are irreducible lifecycle authority or whether binding-derived membership plus one content-addressed retirement marker can collapse them without weakening exact replay, terminal context reachability, or resurrection refusal. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path remains an earned privilege boundary and its Yggdrasil issuer/crossing route still requires owning-lane repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Continue source subtraction from exact 2c3335dc. Map completed model-session retention end to end: live session owner, model-binding membership, terminal receipt/failure reachability, tool-family deletion, archived-session resurrection fence, and every identity-collision reader. Determine whether EpiphanyRuntimeSession plus the private EpiphanyArchivedRuntimeSession are one necessary lifecycle pair or a redundant aggregate that can collapse into binding-derived state and one minimal retirement authority. Cut before adding; do not replace either with a registry, retention head, metadata map, compatibility reader, or summary DTO. Keep the standalone Connector readiness/Idunn/Yggdrasil/Ghostlight deployment sequence queued until the source body stabilizes. Preserve one refresh writer, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live credential transfer, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, minimal model sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. The sealed typed launch document owns live pass-family identity and outer-worker role. Model execution bindings own model-session membership; outer-worker root membership is structural. Archived worker attempts retain exact request kind/ID, deletion digest, decision context, structured result, and terminal job records after live launch deletion. Model sessions carry only grouping identity plus active/completed admission state. Coordinator incarnation launch provenance is an immutable typed basis; one deterministic typed terminality identity admits the exact full run receipt or death recovery and makes competing terminal outcomes conflict without fencing unrelated documents. Runtime jobs carry only job identity plus the Queued/Completed/Failed admission latch. No job clock, role/session mirror, intermediate status, or latest-result selector participates in causality. Terminal job results exist only when no structured role/reorientation outcome exists; typed outcomes are the sole durable structured decisions and are exact CAS dependencies of job/process terminalization. Completed model-session retention derives its exact jobs from model bindings and writes one private resurrection tombstone. Fulfilled archives retain decision context plus the full typed role result and no generic companion. Mind/runtime writable epochs are v10/v44; archived worker attempts are v3. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator basis admission are the only session/job creation owners. Continue subtraction by determining whether the residual generic terminal-result contract can be deleted entirely; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, minimal model sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. The sealed typed launch document owns live pass-family identity and outer-worker role. Model execution bindings own model-session membership; outer-worker root membership is structural. Archived worker attempts retain exact request kind/ID, deletion digest, decision context, and full typed structured outcome after live launch deletion, including typed failures. Model sessions carry only grouping identity plus active/completed admission state. Coordinator incarnation launch provenance is an immutable typed basis; one deterministic typed terminality identity admits the exact full run receipt or death recovery and makes competing terminal outcomes conflict without fencing unrelated documents. Runtime jobs carry only job identity plus the Queued/Completed/Failed admission latch. No job clock, role/session mirror, intermediate status, generic terminal-result document, or latest-result selector participates in causality. Typed role/reorientation outcomes own structured terminal decisions and atomically close their job/process physiology; native model receipt/failure records own model-pass terminality; process claims own process death. Completed model-session retention derives its exact jobs from model bindings and writes one private resurrection tombstone. Mind/runtime writable epochs are v11/v45; archived worker attempts are v3. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator basis admission are the only session/job creation owners. Continue subtraction by auditing the model-session lifecycle/retirement pair; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. From dbb00c2bf91abba29ddaf51902396d3f0c08b4f9 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 22:34:43 +0200 Subject: [PATCH 097/340] Cut model-turn display cargo --- epiphany-core/src/lib.rs | 1 - epiphany-core/src/runtime_spine.rs | 21 ++++++--------- .../src/bin/epiphany-openai-runtime.rs | 7 +---- epiphany-openai-runtime/src/lib.rs | 26 ------------------- .../src/persona_executor.rs | 7 +++-- 5 files changed, 12 insertions(+), 50 deletions(-) diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index 1f92ae1e..10ed30bf 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -228,7 +228,6 @@ pub use runtime_spine::RepoFrontierVerdictModelingLaunchAuthority; pub use runtime_spine::RuntimeSpineHeartbeatJobOptions; pub use runtime_spine::RuntimeSpineInitOptions; pub use runtime_spine::RuntimeSpineJobOptions; -pub use runtime_spine::RuntimeSpineSessionClosureOptions; pub use runtime_spine::abandon_unactivated_runtime_worker_process; pub use runtime_spine::activate_runtime_worker_process; pub use runtime_spine::bind_runtime_repository_domain; diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index 35c422b5..ce163413 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -612,11 +612,6 @@ pub struct RuntimeSpineInitOptions { pub created_at: String, } -#[derive(Clone, Debug, PartialEq, Eq)] -pub struct RuntimeSpineSessionClosureOptions { - pub session_id: String, -} - #[derive(Clone, Debug, PartialEq, Eq)] pub struct ModelPassFailureTerminalOptions { pub decision_context_id: String, @@ -883,28 +878,28 @@ pub fn bind_runtime_to_swarm( pub fn close_runtime_session( store_path: impl AsRef, - options: RuntimeSpineSessionClosureOptions, + session_id: &str, ) -> Result { - validate_non_empty(&options.session_id, "session id")?; - if options.session_id == EPIPHANY_RUNTIME_ROOT_SESSION_ID { + validate_non_empty(session_id, "session id")?; + if session_id == EPIPHANY_RUNTIME_ROOT_SESSION_ID { return Err(anyhow!( "runtime root session {:?} is long-lived and cannot be generically completed", - options.session_id + session_id )); } let mut cache = runtime_spine_cache(store_path.as_ref())?; cache.pull_all_backing_stores()?; require_identity(&cache)?; let mut session = cache - .get::(&options.session_id)? - .ok_or_else(|| anyhow!("runtime session {:?} does not exist", options.session_id))?; + .get::(session_id)? + .ok_or_else(|| anyhow!("runtime session {session_id:?} does not exist"))?; if session.status == EpiphanyRuntimeSessionStatus::Completed { return Ok(session); } let session_job_ids = cache .get_all::()? .into_iter() - .filter(|binding| binding.session_id == options.session_id) + .filter(|binding| binding.session_id == session_id) .map(|binding| binding.job_id) .collect::>(); let open_job_ids = cache @@ -919,7 +914,7 @@ pub fn close_runtime_session( if !open_job_ids.is_empty() { return Err(anyhow!( "runtime session {:?} has open jobs: {}", - options.session_id, + session_id, open_job_ids.join(", ") )); } diff --git a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs index cbdbfe73..fcf84953 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs @@ -595,12 +595,7 @@ async fn run_worker_launch( ) } }; - epiphany_core::close_runtime_session( - &options.store_path, - epiphany_core::RuntimeSpineSessionClosureOptions { - session_id: openai_options.session_id.clone(), - }, - )?; + epiphany_core::close_runtime_session(&options.store_path, &openai_options.session_id)?; Ok(json!({ "store": options.store_path, diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index ee851b06..2783bc2a 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -86,14 +86,8 @@ pub struct EpiphanyOpenAiRuntimeOptions { #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize)] #[serde(rename_all = "camelCase")] pub struct EpiphanyOpenAiRuntimeRunSummary { - pub store: String, - pub session_id: String, - pub job_id: String, - pub request_id: String, - pub event_count: usize, pub verdict: String, pub summary: String, - pub receipt_id: Option, pub tool_intent_ids: Vec, } @@ -204,14 +198,8 @@ pub fn record_model_turn_events( )?; Ok(EpiphanyOpenAiRuntimeRunSummary { - store: store_path.display().to_string(), - session_id: options.session_id.clone(), - job_id: options.job_id.clone(), - request_id: provider_request.request_id, - event_count: events.len(), verdict: verdict.to_string(), summary, - receipt_id: receipt.map(|item| item.request_id), tool_intent_ids: tool_intents .into_iter() .map(|intent| intent.intent_id) @@ -3053,14 +3041,8 @@ mod tests { let provider_failure_store = temp.path().join("provider-failure.cc"); std::fs::copy(&store, &provider_failure_store)?; let provider_failure_summary = EpiphanyOpenAiRuntimeRunSummary { - store: provider_failure_store.display().to_string(), - session_id: "openai-worker-session-modeling-checkpoint-worker".to_string(), - job_id: "openai-worker-worker-job-1".to_string(), - request_id: model_request.request_id.clone(), - event_count: 1, verdict: "failed".to_string(), summary: "Provider refused the model pass.".to_string(), - receipt_id: None, tool_intent_ids: Vec::new(), }; complete_worker_job_from_assistant_text( @@ -3093,9 +3075,7 @@ mod tests { let contract_failure_store = temp.path().join("contract-failure.cc"); std::fs::copy(&store, &contract_failure_store)?; let contract_failure_summary = EpiphanyOpenAiRuntimeRunSummary { - store: contract_failure_store.display().to_string(), verdict: "pass".to_string(), - receipt_id: Some(model_request.request_id.clone()), ..provider_failure_summary.clone() }; complete_worker_job_from_assistant_text( @@ -3126,14 +3106,8 @@ mod tests { ); let openai_summary = EpiphanyOpenAiRuntimeRunSummary { - store: store.display().to_string(), - session_id: "openai-worker-session-modeling-checkpoint-worker".to_string(), - job_id: "openai-worker-worker-job-1".to_string(), - request_id: model_request.request_id.clone(), - event_count: 2, verdict: "pass".to_string(), summary: "OpenAI model request completed.".to_string(), - receipt_id: Some(model_request.request_id.clone()), tool_intent_ids: Vec::new(), }; let assistant_text = serde_json::json!({ diff --git a/epiphany-openai-runtime/src/persona_executor.rs b/epiphany-openai-runtime/src/persona_executor.rs index 8d6903b2..f956e343 100644 --- a/epiphany-openai-runtime/src/persona_executor.rs +++ b/epiphany-openai-runtime/src/persona_executor.rs @@ -10,9 +10,8 @@ use epiphany_core::{ PERSONA_MODEL_STAGE_RECEIPT_SCHEMA_VERSION, PERSONA_MODEL_TERMINAL_RECEIPT_SCHEMA_VERSION, PersonaInterpreterEffectDocument, PersonaInterpreterInput, PersonaModelStageReceipt, PersonaModelTerminalReceipt, PersonaProjectorInput, PersonaTranscriptMessage, PersonaTurnInput, - RuntimeSpineSessionClosureOptions, build_persona_interpreter_prompt, - build_persona_projector_prompt_with_transcript, build_persona_turn_prompt, - close_runtime_session, model_pass_failure_for_request, + build_persona_interpreter_prompt, build_persona_projector_prompt_with_transcript, + build_persona_turn_prompt, close_runtime_session, model_pass_failure_for_request, parse_and_validate_persona_interpreter_effect_set, persona_interpreter_effect_set_json_schema, runtime_spine_cache, terminalize_model_pass_failure_session, }; @@ -117,7 +116,7 @@ fn close_persona_session_if_active( session.status == epiphany_core::EpiphanyRuntimeSessionStatus::Active }) { - close_runtime_session(store_path, RuntimeSpineSessionClosureOptions { session_id })?; + close_runtime_session(store_path, &session_id)?; } Ok(()) } From 24023265f4dd067ffd132c09232088aaf0591353 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 22:50:59 +0200 Subject: [PATCH 098/340] Remove live Hands receipt rereads --- epiphany-core/src/lib.rs | 3 -- epiphany-core/src/runtime_spine.rs | 30 ------------------- epiphany-core/src/substrate_gate.rs | 2 +- epiphany-openai-runtime/src/lib.rs | 17 +---------- epiphany-tool-mcp-runtime/src/main.rs | 2 +- .../src/native_source.rs | 30 ------------------- 6 files changed, 3 insertions(+), 81 deletions(-) diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index 10ed30bf..449ed15a 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -264,9 +264,6 @@ pub use runtime_spine::retain_failed_runtime_worker_attempts; pub use runtime_spine::retain_fulfilled_runtime_worker_attempts; pub use runtime_spine::review_repo_frontier_planning_failure; pub(crate) use runtime_spine::runtime_authenticated_public_source_lookups_for_worker; -pub use runtime_spine::runtime_hands_command_receipt; -pub use runtime_spine::runtime_hands_commit_receipt; -pub use runtime_spine::runtime_hands_patch_receipt; pub(crate) use runtime_spine::runtime_has_actionable_hands_frontier; pub use runtime_spine::runtime_identity; pub use runtime_spine::runtime_job; diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index ce163413..f054e495 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -7596,16 +7596,6 @@ pub fn put_hands_patch_receipt( } } -pub fn runtime_hands_patch_receipt( - store_path: impl AsRef, - receipt_id: &str, -) -> Result> { - validate_non_empty(receipt_id, "Hands patch receipt id")?; - let mut cache = runtime_spine_cache(store_path)?; - cache.pull_all_backing_stores()?; - cache.get::(receipt_id) -} - pub fn put_hands_command_receipt( store_path: impl AsRef, receipt: &HandsCommandReceipt, @@ -7649,16 +7639,6 @@ pub fn put_hands_command_receipt( } } -pub fn runtime_hands_command_receipt( - store_path: impl AsRef, - receipt_id: &str, -) -> Result> { - validate_non_empty(receipt_id, "Hands command receipt id")?; - let mut cache = runtime_spine_cache(store_path)?; - cache.pull_all_backing_stores()?; - cache.get::(receipt_id) -} - pub fn put_hands_commit_receipt( store_path: impl AsRef, receipt: &HandsCommitReceipt, @@ -7768,16 +7748,6 @@ pub fn put_hands_commit_receipt( } } -pub fn runtime_hands_commit_receipt( - store_path: impl AsRef, - receipt_id: &str, -) -> Result> { - validate_non_empty(receipt_id, "Hands commit receipt id")?; - let mut cache = runtime_spine_cache(store_path)?; - cache.pull_all_backing_stores()?; - cache.get::(receipt_id) -} - fn validate_coordinator_run_receipt(receipt: &EpiphanyCoordinatorRunReceipt) -> Result<()> { validate_non_empty(&receipt.receipt_id, "coordinator run receipt id")?; validate_non_empty(&receipt.session_id, "coordinator run receipt session id")?; diff --git a/epiphany-core/src/substrate_gate.rs b/epiphany-core/src/substrate_gate.rs index 76adb335..7892a007 100644 --- a/epiphany-core/src/substrate_gate.rs +++ b/epiphany-core/src/substrate_gate.rs @@ -71,7 +71,7 @@ pub fn substrate_gate_operation_for_governed_tool( match (server, tool_name) { ( "epiphany_source", - "read_file" | "directory_inventory" | "git_show" | "read_hands_receipt", + "read_file" | "directory_inventory" | "git_show", ) | ("epiphany_state", "resident_grant_lifecycle") => { Some(SUBSTRATE_GATE_SOURCE_READ_OPERATION) diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index 2783bc2a..bf00b08c 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -330,7 +330,7 @@ pub fn build_worker_model_request( .context("failed to render sealed worker reasoning projection for model input")?; let mut instructions = worker_instructions(launch_request, &launch_document); if launch_request.binding_id == epiphany_core::EPIPHANY_VERIFICATION_ROLE_BINDING_ID { - instructions.push_str("\n\nTool mandate: before returning `needs-evidence` because source files, artifact directories, command artifacts, commit diffs, Hands receipt bodies, or resident grant lifecycle are not inspectable, call the governed read-only tools available on this request. Use `mcp__epiphany_source__read_file` for cited source/artifact files, `mcp__epiphany_source__directory_inventory` for bounded workspace directory counts and bytes, `mcp__epiphany_source__git_show` for commit diffs, `mcp__epiphany_source__read_hands_receipt` for Hands patch/command/commit receipts, and `mcp__epiphany_state__resident_grant_lifecycle` for exact or bounded recent grant-owned lifecycle state. Directory totals are authoritative only when the tool reports `complete=true`. Grant launchability is authoritative only from the typed state projection, never artifact names or acknowledgement presence. If a tool fails, cite that failed tool result and the exact remaining blocker."); + instructions.push_str("\n\nTool mandate: before returning `needs-evidence` because source files, artifact directories, command artifacts, commit diffs, or resident grant lifecycle are not inspectable, call the governed read-only tools available on this request. Use `mcp__epiphany_source__read_file` for cited source/artifact files, `mcp__epiphany_source__directory_inventory` for bounded workspace directory counts and bytes, `mcp__epiphany_source__git_show` for commit diffs, and `mcp__epiphany_state__resident_grant_lifecycle` for exact or bounded recent grant-owned lifecycle state. The sealed Verification projection already contains the exact Hands patch, command, and commit receipts. Directory totals are authoritative only when the tool reports `complete=true`. Grant launchability is authoritative only from the typed state projection, never artifact names or acknowledgement presence. If a tool fails, cite that failed tool result and the exact remaining blocker."); } else if launch_request.binding_id == epiphany_core::EPIPHANY_RESEARCH_ROLE_BINDING_ID { instructions.push_str("\n\nEvidence mandate: the runtime obtains every immutable public GitHub source named by the typed Research request before this model turn and supplies the exact tool calls and receipts in the input. Cite each requested sourceRef in filesInspected and its evidenceReceiptId in evidence, preserve its contentSha256 in the finding, and report a source gap if any supplied lookup failed. Use the remaining bounded tools only for additional repository or resident-state inspection appropriate to the claim. Never substitute a branch, tag, arbitrary URL, or model memory for immutable public evidence. Directory totals are authoritative only when the inventory reports `complete=true`; grant launchability is authoritative only from the typed lifecycle projection."); } else if launch_request.binding_id == epiphany_core::EPIPHANY_MODELING_ROLE_BINDING_ID { @@ -821,20 +821,6 @@ fn repository_source_tools() -> Vec { }) .to_string(), }, - EpiphanyModelToolDefinition { - name: "mcp__epiphany_source__read_hands_receipt".to_string(), - description: "Read a typed Hands patch, command, or commit receipt body from the runtime-spine store for Soul verification.".to_string(), - parameters_json: serde_json::json!({ - "type": "object", - "additionalProperties": false, - "properties": { - "receiptId": {"type": "string"}, - "kind": {"type": "string", "enum": ["patch", "command", "commit"]} - }, - "required": ["receiptId", "kind"] - }) - .to_string(), - }, EpiphanyModelToolDefinition { name: "mcp__epiphany_state__resident_grant_lifecycle".to_string(), description: "Read grant-owned resident Self lifecycle state from the explicitly launch-bound resident store. Use an exact grantId when known or a bounded recent limit. This is observation only; terminal and launchable fields remain derived from the typed grant/state owner.".to_string(), @@ -3207,7 +3193,6 @@ mod tests { assert!(tool_names.contains(&"mcp__epiphany_source__read_file")); assert!(tool_names.contains(&"mcp__epiphany_source__directory_inventory")); assert!(tool_names.contains(&"mcp__epiphany_source__git_show")); - assert!(tool_names.contains(&"mcp__epiphany_source__read_hands_receipt")); assert!(tool_names.contains(&"mcp__epiphany_state__resident_grant_lifecycle")); assert!(!tool_names.contains(&"mcp__epiphany_public__github_file")); assert!( diff --git a/epiphany-tool-mcp-runtime/src/main.rs b/epiphany-tool-mcp-runtime/src/main.rs index 18688293..d748e402 100644 --- a/epiphany-tool-mcp-runtime/src/main.rs +++ b/epiphany-tool-mcp-runtime/src/main.rs @@ -78,7 +78,7 @@ async fn execute_to_receipt( Some(path) => path.clone(), None => std::env::current_dir()?, }; - execute_epiphany_source(intent, &options.store, &cwd) + execute_epiphany_source(intent, &cwd) } else if intent.server == "epiphany_public" { execute_epiphany_public(intent).await } else if intent.server == "epiphany_state" { diff --git a/epiphany-tool-mcp-runtime/src/native_source.rs b/epiphany-tool-mcp-runtime/src/native_source.rs index 70c19957..42bfaecf 100644 --- a/epiphany-tool-mcp-runtime/src/native_source.rs +++ b/epiphany-tool-mcp-runtime/src/native_source.rs @@ -9,7 +9,6 @@ use std::thread; pub fn execute_epiphany_source( intent: &EpiphanyToolInvocationIntent, - store: &Path, cwd: &Path, ) -> Result { let arguments: Value = @@ -21,7 +20,6 @@ pub fn execute_epiphany_source( "read_file" => read_file(cwd, &arguments), "directory_inventory" => directory_inventory(cwd, &arguments), "git_show" => git_show(cwd, &arguments), - "read_hands_receipt" => read_hands_receipt(store, &arguments), other => Err(anyhow!("unknown epiphany_source tool {other:?}")), } } @@ -220,28 +218,6 @@ fn read_retained(mut input: impl Read, limit: usize) -> Result { Ok(text) } -fn read_hands_receipt(store: &Path, arguments: &Value) -> Result { - let id = required_string(arguments, "receiptId")?; - match required_string(arguments, "kind")? { - "patch" => { - let r = epiphany_core::runtime_hands_patch_receipt(store, id)? - .ok_or_else(|| anyhow!("Hands patch receipt {id:?} not found"))?; - serde_json::to_value(r).context("encoding Hands patch receipt") - } - "command" => { - let r = epiphany_core::runtime_hands_command_receipt(store, id)? - .ok_or_else(|| anyhow!("Hands command receipt {id:?} not found"))?; - serde_json::to_value(r).context("encoding Hands command receipt") - } - "commit" => { - let r = epiphany_core::runtime_hands_commit_receipt(store, id)? - .ok_or_else(|| anyhow!("Hands commit receipt {id:?} not found"))?; - serde_json::to_value(r).context("encoding Hands commit receipt") - } - other => Err(anyhow!("unsupported Hands receipt kind {other:?}")), - } -} - fn confined_path(cwd: &Path, requested: &str) -> Result { let root = cwd .canonicalize() @@ -313,13 +289,11 @@ mod tests { r#"{"path":"body.txt","startLine":2,"maxLines":2}"#, ), dir.path(), - dir.path(), )?; assert_eq!(value["content"], "2: two\n3: three"); assert!( execute_epiphany_source( &intent("read_file", r#"{"path":"../escape"}"#), - dir.path(), dir.path() ) .is_err() @@ -347,7 +321,6 @@ mod tests { r#"{"path":"artifacts","maxDepth":2,"maxEntries":10,"maxSamples":10}"#, ), dir.path(), - dir.path(), )?; assert_eq!(value["complete"], true); assert_eq!(value["entryCount"], 4); @@ -359,7 +332,6 @@ mod tests { execute_epiphany_source( &intent("directory_inventory", r#"{"path":"../escape"}"#), dir.path(), - dir.path(), ) .is_err() ); @@ -379,7 +351,6 @@ mod tests { r#"{"path":"artifacts","maxEntries":2}"#, ), dir.path(), - dir.path(), )?; assert_eq!(value["complete"], false); assert_eq!(value["entryCount"], 2); @@ -393,7 +364,6 @@ mod tests { r#"{"path":"nested","maxDepth":0,"maxEntries":10}"#, ), dir.path(), - dir.path(), )?; assert_eq!(depth_limited["complete"], false); assert_eq!(depth_limited["depthLimitHit"], true); From 08588a6d3f24d053ffc4da9e3f17223f1e368663 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 22:53:46 +0200 Subject: [PATCH 099/340] Record sealed Hands verification input --- notes/epiphany-current-algorithmic-map.md | 22 ++++++++- notes/epiphany-fork-implementation-plan.md | 15 +++++- notes/fresh-workspace-handoff.md | 53 +++++++++++++++------ state/ledgers.msgpack | Bin 725804 -> 726885 bytes state/map.yaml | 28 +++++++++-- 5 files changed, 95 insertions(+), 23 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index bd0b01f4..19b24ce6 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -1,8 +1,8 @@ # Epiphany current algorithmic map Updated: 2026-08-24 -Latest committed implementation cut: `3b991e40` on `codex/epiphany-shakedown-live` -Current pass: model-runtime diagnostic wrappers collapsed; +Latest committed implementation cut: `24023265` on `codex/epiphany-shakedown-live` +Current pass: duplicate live Hands receipt rereads deleted; Ox17 remains paused This document describes the live machine. Historical cuts, rejected paths, and @@ -1076,6 +1076,15 @@ byte-identically. Unrelated document commits do not participate. Timestamp ordering, coordinator notes, whole-store snapshots, and generic archived status do not own terminality. +Exact `dbb00c2b` finishes the model-session audit without deleting a real phase +boundary. A model session can have terminal jobs between tool rounds, so +binding-derived job terminality cannot say that the session has been explicitly +closed. The live active/completed latch owns that decision. Retention later +deletes the bindings and exact tool/model documents; the private archived +session therefore owns the retired identity set and deletion-chain digest that +prevents resurrection. Six echo-only fields leave the in-memory model-turn +summary, and the one-field closure options wrapper is gone: 38 net lines. + Exact `a46725a1` reduces the generic runtime job to the only transition it actually performs. A job is inserted `Queued` and terminalizes as `Completed` or `Failed`; no writer ever produced `Running`, `WaitingForReview`, or @@ -1119,6 +1128,15 @@ live launch is deleted. Archived attempts retain the structured role result and decision context—not an ID/digest tombstone—and preserve typed failure cargo when the terminal process status is failure. +Verification receives its complete Hands consequence chain in the sealed typed +projection: route, authority, intent, review, patch, command, and commit. Exact +`24023265` deletes the second input path that exposed a governed tool for live +runtime-store rereads of the same three receipts. The MCP schema/dispatch, +prompt mandate, three public readers and exports, source executor store +argument, stale Substrate Gate allowance, and advertisement assertion are gone. +Tool observations remain for facts genuinely outside the sealed basis. The +durable receipt chain and atomic commit-to-Verification admission are unchanged. + The heartbeat scheduler does not exist. Resident Self directly selects the oldest pending pressure when no grant, prepared launch, or active lease exists. Grant creation consumes that exact pressure through one batch CAS. Terminal diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 121a5a19..405f0d5b 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -860,8 +860,19 @@ Cut in this order: prevents typed failures from claiming successful process fulfillment, and failed archives retain the full typed failure. Runtime/Mind advance to v45/v11 with no compatibility reader. The cut removes 361 maintained lines - net. Next audit whether live plus archived model-session aggregates are an - irreducible lifecycle pair or another derived grouping preserved by inertia. + net. +54. **Model-session retirement is retained but stripped at `dbb00c2b`:** the + live session latch owns explicit closure between tool rounds; the private + archive owns retired identity collision refusal after bindings are deleted. + Six model-turn display echoes and the one-field closure wrapper are gone: + 38 net lines. No registry or replacement aggregate is added. +55. **Verification has one exact Hands input at `24023265`:** its sealed typed + projection already carries the complete consequence chain. The live + `read_hands_receipt` tool, three runtime readers, exports, tool/prompt/gate + cargo, duplicate source-store argument, and advertisement assertion are + deleted: 78 net lines. The consequence receipts and atomic Hands-to- + Verification admission remain. Next map the missing production Hands + actuator as an ABI boundary and demote only speculative public mouths. Do not preserve the aggregate for compatibility, manufacture a bootstrap thread, release autonomous scheduling, register topology in `gamecult-ops`, diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index bda9cd6f..704889c0 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,10 +2,10 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed Epiphany source cut: `2c3335dc` +Latest committed Epiphany source cut: `24023265` Current connector source: `54d8bc2525b7e7fa1b9dd26b95871247ff4c7566` -Current pass: source subtraction continues after deleting the generic runtime -job-result family; completed model-session retention is next; Ox17 and Atlas +Current pass: source subtraction continues after deleting duplicate live Hands +receipt rereads; the Hands actuator ABI boundary is next; Ox17 and Atlas Gate 1 remain paused ## Orientation @@ -212,6 +212,29 @@ cut removes 361 maintained lines net. Verification generated 6.349 GiB across inspector at SHA-256 `DD38855C6F092C2C53D2212A938E737643F41130F4681708840BA6075320A04E`. +Exact `dbb00c2b` removes six echo-only fields from the in-memory model-turn +summary and deletes the one-field session-closure options wrapper: 38 net +lines. The completed session audit retains the live and archived documents for +different reasons. The active/completed session latch is the explicit boundary +that forbids new model/tool work after a pass with otherwise-terminal jobs is +closed. The private archive retains retired session, job, model-request, and +tool-intent identities plus the exact deletion-chain digest after their live +bindings are deleted, so those identities cannot resurrect. Neither document +duplicates a decision or transcript. + +Exact `24023265` deletes Verification's live Hands-receipt reread path. The +sealed Verification projection already contains the full intent, review, +authority, patch, command, and commit records. The extra MCP tool reopened the +mutable runtime store for decision-bearing input already fixed in the basis. +Its tool schema, prompt mandate, dispatcher, source-store argument, three public +read wrappers and exports, stale Substrate Gate allowlist entry, and one +advertisement assertion are gone: 78 net lines. The consequence documents, +writers, and atomic commit-to-Verification admission remain. Tool runtime passes +8/8, OpenAI runtime 21/21, the release-owned tool daemon compiles, and the full +keyed lifecycle proof still commits concurrent Persona/Hands consequences and +creates exact Verification work. Focused verification generated 4.909 GiB over +7,687 files; cleanup restored only the authenticated 1,776,640-byte state tool. + Exact `a6cf9383` quarantines concrete Codex/OpenRouter authentication, credential reading, and network transport at the two release entrypoints that perform inference. `epiphany-openai-runtime` now owns only exact native-request @@ -1301,18 +1324,18 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action The Ox17 deployment lane remains paused. Continue subtraction from exact -`2c3335dc` by mapping completed model-session retention end to end: the live -session latch, binding-derived membership, terminal receipt/failure reachability, -tool-family deletion, the private archived-session resurrection fence, and each -identity-collision reader. Decide whether `EpiphanyRuntimeSession` plus -`EpiphanyArchivedRuntimeSession` are one necessary lifecycle pair or a -redundant aggregate that can collapse into binding-derived state and one -minimal retirement authority. Do not replace them with a registry, retention -head, metadata map, compatibility reader, or summary DTO. The remaining -Connector publication/Yggdrasil caller-admission work stays queued behind -source stabilization. Preserve keyed Mind, direct Body-to-Modeling flow, -consequence receipts, and the complete Model Atlas vertical slice; no live -inter-swarm collaboration has run. +`24023265` by mapping the remaining Hands consequence surface as an ABI +boundary: the coordinator's truthful `awaitingHandsExecutor` stop, exact +intent/review/grant, receipt constructors and writers, atomic commit-to- +Verification admission, sealed Verification projection, and the absent +production actuator. Preserve the consequence contract; do not fabricate a +daemon during the audit or keep speculative public mouths merely because a +future actuator may exist. Delete or demote only surfaces that no live or +explicitly adopted actuator contract requires, then resume the single-caller +runtime-spine/status/retention audit. Connector publication and Yggdrasil +caller admission remain queued behind source stabilization. Preserve keyed +Mind, direct Body-to-Modeling flow, and the complete Model Atlas vertical slice; +no live inter-swarm collaboration has run. Yggdrasil previously exposed 96 GiB of dead native Cargo targets after interrupted full-workspace builds; exact cleanup returned the builder target diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 523149a153a677c24e10921c77a58cfd683d037e..5fca31a0a7beaad21763daf79bcbf2e86c6989e3 100644 GIT binary patch delta 893 zcmX|aFtX;_;WHm#oCSL7eor zlO7c;KYm@fy*Jl*e8jj1F&y@KJQ;$;%#6{2lShC&HL=lZ0+|u0VqaJduE;WGCoqzz zgaf7p_!PltjH@MZ=$te<=E}IjA{<(l=V;4sv&QwQl4Cs20L45{s|vZ5W9AW<AciLoTtoTJT!$C0Vi-sLHW{8VvBULMed0Mq#iRXnf9&& z(^K1|-%B1OE6YGu=*c!1h$2^#2Z{>PA`?3)m32E*31#kK^U)UM%%>6MTSUl`GZScC1bCDi>**!8Cd+--8>70rq4Jb7yK5qFrm!4i(xL{@QV~p}N`i?oS})zH zJaaC5k;V`?D;!p+4w<4Ry+A8R0Xh7qv-Zx6nF=Tqpu?;@v%_l4^Us1%sZZ+nZgpUr zthvz+4+_+r-cu%ZfGB?*H}90Mie~c~4S^OZmmJPb%k`hl_H?P6EJY-(Fbu*RY9b1z zAQ;^tP1TU^pE`{SrC=W?l(9t}GMaTO5bE>@`GhO#r8Q- + Exact dbb00c2b removes six echo-only fields from the in-memory model-turn + summary and deletes the one-field session-closure options wrapper: 38 net + lines. The accompanying lifecycle audit retains EpiphanyRuntimeSession plus + the private EpiphanyArchivedRuntimeSession for two distinct invariants. The + live active/completed latch is the explicit phase boundary between tool + rounds; the archived identity sets and deletion digest prevent retired + session, job, model-request, and tool-intent identities from resurrecting + after their bindings are deleted. Exact 24023265 then deletes the live + read_hands_receipt tool, three public runtime-store readers, their exports, + prompt mandate, tool schema/test, source-dispatch store argument, and stale + Substrate Gate allowlist entry. Verification already receives the exact + patch, command, and commit receipts inside its sealed typed projection, so + reopening mutable runtime state duplicated decision input and weakened + replayability. The receipt chain and its atomic Hands-to-Verification + admission remain intact. Tool runtime 8/8, OpenAI runtime 21/21, the + release-owned tool daemon, and the full keyed Persona/Hands lifecycle proof + pass. The second cut removes 78 maintained lines net. Verification generated + 4.909 GiB across 7,687 files; cleanup restored only the exact 1,776,640-byte + authenticated state inspector. No schema epoch changes; Atlas is untouched. generic_runtime_result_cut: >- Exact 2c3335dc deletes EpiphanyRuntimeJobResult, its completion DTO, snapshot wrapper, schema registration, archive cargo, audit branch, and @@ -92,7 +112,7 @@ current_status: semantic_cache_cut: Exact 856648de deletes the unused semantic-memory and workspace-coverage projection subsystem rather than preserving a second derived model of Mind. Four binaries, the local daemon supervisor, Qdrant/Ollama/Postgres configuration, projector policy/lifecycle/heartbeat/recovery state, semantic query/context packets, aggregate model revision/hash cargo, workspace file-cache reader, and Persona's always-empty semantic-recall fields are gone. No agent request builder or sealed reasoning projection consumed this cache. Modeling now reads the exact typed Body and keyed RepoModel projection directly; future retrieval evidence must enter through an earned typed provider receipt. Idunn remains the sole deployment and daemon-survival authority. Core 165/165, OpenAI runtime 25/25, and release construction 19/19 pass. repo_model_vocabulary_cut: Exact 6ea4ff3c deletes the redundant generic memory profile, dead SHA-1 ID factory, empty profile module, cache-only node/edge kinds, and impossible lifecycle variants. Exact 5218cf2c deletes the producerless RepoModel lifecycle-receipt family. Exact 8bb039af makes domains seed-owned and deletes the unreachable summary mutation/document/validation/registry path plus the test cargo that alone produced it. Exact ab1afc27 removes node salience/confidence and edge confidence because no owner read, validated, routed, or displayed those values. Modeling can author only the keyed repository operations advertised by its provider schema. Affected targets check cleanly; core remains 165/165, RepoModel 5/5, and reasoning-context 8/8. package_baseline: Exact d2ca66301fb6af4e7d2d27fff0b772b0f0fccdf4 remains the admitted production source and current symlink target. Its native serialized full-workspace gate passed with receipt SHA-256 de0fc6b360ce03493b13208d917dc8349801f03364617d966152c85846c47482. Idunn sealed 26 root-owned non-writable binaries plus release-witness.ccmp as release sha256-46407552b4a0937f63d2b7f2bd09a1dacb89d671a6e3807c97209159541aef06; witness-file SHA-256 is 348785ffb0fc3130d3b4538329870c6e6f8442a8da4a01b32fa9b7ffb1f01357. Source 9b9b5c85 also passed Idunn's native test gate under receipt SHA-256 6c6a71359f8c31297419665d2872f6982a89f84e197d71fc5b36a7fc86216093 and remains sealed as release sha256-30a910785a380224bbdbd56a7b742c8d058fa70cb72dab3562e3907903e0d191 with witness-file SHA-256 75bf52d31c56ea3b08e1a702273301c1db12a4b1ffae45e3d948ce8a29b50e1d. A foreign-target helper restarted Idunn during the Epiphany transaction; rollback restored d2ca, removed deployment.env, and left production Epiphany units inactive. OpenRouter model stealth/ox-alpha and its systemd-injected credential are readiness-proven. Idunn is active with zero restarts and its deployment brake is engaged. - summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. Exact edb5c3a3 deletes the launch, heartbeat, and terminal-result family identity mirrors: the sealed typed launch owns live pass identity and the archived attempt owns historical request identity. Exact cabdd6c3 separates immutable coordinator incarnation basis/terminality from minimal model-session admission and removes the remaining session prose, clocks, dead states, redundant options, and whole-store coordinator snapshot. Exact a46725a1 reduces runtime jobs to Queued/Completed/Failed admission latches and removes timestamp selection from Research. Exact 10a70afc derives job role/session ownership from sealed launches and model bindings, leaving the generic job as identity plus status. Exact 53e869c0 removes generic job-result evidence/artifact mirrors; exact 8eaa96c5 stops persisting generic result documents for structured worker decisions; exact 2c3335dc deletes the generic result family entirely and makes typed decisions, model receipts/failures, job status, and process claims own their respective terminal facts. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. + summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. Exact edb5c3a3 deletes the launch, heartbeat, and terminal-result family identity mirrors: the sealed typed launch owns live pass identity and the archived attempt owns historical request identity. Exact cabdd6c3 separates immutable coordinator incarnation basis/terminality from minimal model-session admission and removes the remaining session prose, clocks, dead states, redundant options, and whole-store coordinator snapshot. Exact a46725a1 reduces runtime jobs to Queued/Completed/Failed admission latches and removes timestamp selection from Research. Exact 10a70afc derives job role/session ownership from sealed launches and model bindings, leaving the generic job as identity plus status. Exact 53e869c0 removes generic job-result evidence/artifact mirrors; exact 8eaa96c5 stops persisting generic result documents for structured worker decisions; exact 2c3335dc deletes the generic result family entirely and makes typed decisions, model receipts/failures, job status, and process claims own their respective terminal facts. Exact dbb00c2b retains the minimal live/archive session pair for explicit phase closure and retired-identity refusal while deleting display echoes and a wrapper. Exact 24023265 makes the sealed Verification projection the sole Hands receipt input and deletes the duplicate live reread path. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. The pure OpenAI runtime library opens exact model execution and admits typed provider events. OpenRouter auth/networking remains a direct release-entrypoint boundary; Codex transport crosses the lean authenticated CodexConnector client ABI and no Codex auth, HTTP/SSE, Codex-home, or compiled Codex dependency remains in Epiphany. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Workers use one governed tool-capable route; no parallel no-tools mode survives. The sealed typed worker launch is the sole live owner of pass-family identity; terminal role results contain semantic decision cargo rather than routing echoes, and archived attempts retain historical request identity plus the structured decision. Runtime jobs are only mutable job-identity plus Queued/Completed/Failed admission latches; clocks, role/session mirrors, unowned intermediate states, and generic terminal-result documents are absent. Model bindings own model-session membership, sealed launches own outer-worker role, root membership is structural, and Research derives attempt authority as an exact set rather than timestamp order. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Structured role/reorientation outcomes terminalize jobs and process claims through exact-envelope CAS; native model receipt/failure records own model terminality, process claims own process death, and archives retain typed decisions including typed failures. Mind/runtime writable epochs are v11/v45. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. @@ -202,10 +222,10 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability; it still mixes immutable identity, model sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. The sealed launch solely owns live family identity and archived attempts own retained request identity. Exact cabdd6c3 removes coordinator runs from the generic session aggregate; exact a46725a1 removes job clocks and dead states; exact 10a70afc reduces the job itself to identity plus Queued/Completed/Failed status; exact 2c3335dc deletes generic terminal results. The private archived-model-session aggregate is now the narrowest suspicious owner: it groups retired job/request/tool identities and a deletion digest to prevent resurrection, while the live session is only an active/completed grouping latch. Audit whether both are irreducible lifecycle authority or whether binding-derived membership plus one content-addressed retirement marker can collapse them without weakening exact replay, terminal context reachability, or resurrection refusal. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path remains an earned privilege boundary and its Yggdrasil issuer/crossing route still requires owning-lane repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Continue source subtraction from exact 2c3335dc. Map completed model-session retention end to end: live session owner, model-binding membership, terminal receipt/failure reachability, tool-family deletion, archived-session resurrection fence, and every identity-collision reader. Determine whether EpiphanyRuntimeSession plus the private EpiphanyArchivedRuntimeSession are one necessary lifecycle pair or a redundant aggregate that can collapse into binding-derived state and one minimal retirement authority. Cut before adding; do not replace either with a registry, retention head, metadata map, compatibility reader, or summary DTO. Keep the standalone Connector readiness/Idunn/Yggdrasil/Ghostlight deployment sequence queued until the source body stabilizes. Preserve one refresh writer, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live credential transfer, Ox root, or Model Atlas Gate run. + unresolved_authority: `runtime_spine.rs` remains the largest central liability; it still mixes immutable identity, model sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. The sealed launch solely owns live family identity and archived attempts own retained request identity. Exact cabdd6c3 removes coordinator runs from the generic session aggregate; exact a46725a1 removes job clocks and dead states; exact 10a70afc reduces the job itself to identity plus Queued/Completed/Failed status; exact 2c3335dc deletes generic terminal results. The completed model-session audit retains the live latch and private retirement tombstone for separate phase-boundary and resurrection-fence invariants; neither is a display aggregate. The sharper open boundary is Hands: the exact intent/review/grant and patch/command/commit-to-Verification contracts are consequential and proven, but no production actuator currently authors those consequence receipts. The coordinator therefore stops truthfully at awaitingHandsExecutor. Do not delete the consequence contract to make the absence look smaller, and do not preserve speculative public writers without mapping the future daemon/ABI owner. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path remains an earned privilege boundary and its Yggdrasil issuer/crossing route still requires owning-lane repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Continue source subtraction from exact 24023265. Map the remaining Hands consequence surface as an ABI boundary: coordinator stop state, exact intent/review/grant, receipt constructors and writers, atomic commit-to-Verification admission, sealed Verification projection, and the missing production actuator. Preserve the typed consequence chain and refuse to fabricate a daemon during this audit; delete or demote only public writers, constructors, tests, or prompt/tool cargo that no live or explicitly adopted actuator contract requires. Then resume the single-caller runtime-spine/status/retention audit. Keep the standalone Connector readiness/Idunn/Yggdrasil/Ghostlight deployment sequence queued until the source body stabilizes. Preserve one refresh writer, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live credential transfer, Ox root, or Model Atlas Gate run. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, minimal model sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. The sealed typed launch document owns live pass-family identity and outer-worker role. Model execution bindings own model-session membership; outer-worker root membership is structural. Archived worker attempts retain exact request kind/ID, deletion digest, decision context, and full typed structured outcome after live launch deletion, including typed failures. Model sessions carry only grouping identity plus active/completed admission state. Coordinator incarnation launch provenance is an immutable typed basis; one deterministic typed terminality identity admits the exact full run receipt or death recovery and makes competing terminal outcomes conflict without fencing unrelated documents. Runtime jobs carry only job identity plus the Queued/Completed/Failed admission latch. No job clock, role/session mirror, intermediate status, generic terminal-result document, or latest-result selector participates in causality. Typed role/reorientation outcomes own structured terminal decisions and atomically close their job/process physiology; native model receipt/failure records own model-pass terminality; process claims own process death. Completed model-session retention derives its exact jobs from model bindings and writes one private resurrection tombstone. Mind/runtime writable epochs are v11/v45; archived worker attempts are v3. Runtime identity and swarm binding retain explicit epoch fields; their child physiology, Hands consequence, and repository-frontier documents rely on CultCache type/schema identity rather than carrying fixed duplicate metadata. Sealed worker contexts keep exact model-input schema and contract. Autonomous proposal promotion commits one proposal/request pair; the request owns its exact origin identities. Research coverage derives from the exact structured result and `Eyes.frontier_research` commit receipt, not a companion packet. Persona delivery consequence identity belongs to the social terminal while Bifrost retains the signed crossing request/receipt. Family launch CAS, model execution, and coordinator basis admission are the only session/job creation owners. Continue subtraction by auditing the model-session lifecycle/retirement pair; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, minimal model sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. The sealed typed worker launch owns live pass-family identity and outer-worker role. Model execution bindings own model-session membership; outer-worker root membership is structural. Archived worker attempts retain exact request kind/ID, deletion digest, decision context, and full typed structured outcome after live launch deletion, including typed failures. Model sessions carry only grouping identity plus the active/completed phase latch; completed-session retention derives its exact jobs from model bindings and writes one private tombstone containing retired identities plus the deletion-chain digest. The live and archived documents protect distinct admission and resurrection invariants and do not duplicate decision cargo. Runtime jobs carry only job identity plus the Queued/Completed/Failed latch. No job clock, role/session mirror, intermediate status, generic terminal-result document, latest-result selector, or model-turn identity echo participates in causality. Typed role/reorientation outcomes own structured terminal decisions and atomically close their job/process physiology; native model receipt/failure records own model-pass terminality; process claims own process death. Verification reasons from the exact Hands receipt bodies sealed in its basis and has no live receipt-reread tool. Mind/runtime writable epochs remain v11/v45; archived worker attempts are v3. Family launch CAS, model execution, and coordinator basis admission are the only session/job creation owners. Continue subtraction at the Hands actuator ABI and then the remaining single-caller runtime-spine surfaces; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. From a01c684262e19fe0712c81d786d44b2901e09eaa Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 23:21:26 +0200 Subject: [PATCH 100/340] Delete counterfeit Hands review authority --- .../src/bin/epiphany-mvp-coordinator.rs | 60 +--- epiphany-core/src/current_work.rs | 59 +--- epiphany-core/src/hands_gateway.rs | 128 ++------ epiphany-core/src/lib.rs | 1 - epiphany-core/src/repo_model_gateway.rs | 16 +- epiphany-core/src/runtime_spine.rs | 279 +++--------------- epiphany-core/src/soul_gateway.rs | 10 +- epiphany-core/src/surfaces/worker_launch.rs | 5 +- notes/hands-cultnet-contracts.md | 35 ++- 9 files changed, 106 insertions(+), 487 deletions(-) diff --git a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs index 0acca96c..3f4a8b70 100644 --- a/epiphany-core/src/bin/epiphany-mvp-coordinator.rs +++ b/epiphany-core/src/bin/epiphany-mvp-coordinator.rs @@ -4,7 +4,6 @@ use anyhow::anyhow; use chrono::SecondsFormat; use epiphany_core::COORDINATOR_RUN_RECEIPT_TYPE; use epiphany_core::EpiphanyCoordinatorRunReceipt; -use epiphany_core::HANDS_ACTION_INTENT_SCHEMA_VERSION; use epiphany_core::HANDS_COMMAND_RECEIPT_TYPE; use epiphany_core::HANDS_COMMIT_RECEIPT_TYPE; use epiphany_core::HANDS_PATCH_RECEIPT_TYPE; @@ -13,12 +12,10 @@ use epiphany_core::RepoFrontierHandsAuthority; use epiphany_core::RuntimeSpineInitOptions; use epiphany_core::coordinator_status as status_projection; use epiphany_core::finalize_coordinator_run; -use epiphany_core::hands_action_review_for_intent; use epiphany_core::initialize_runtime_spine; use epiphany_core::load_epiphany_cultmesh_swarm_brake; use epiphany_core::open_coordinator_run; use epiphany_core::put_hands_action_intent; -use epiphany_core::put_hands_action_review; use epiphany_core::put_repo_frontier_hands_authority; use epiphany_core::put_substrate_gate_repo_access_grant_receipt; use epiphany_core::select_and_commit_repo_frontier_route; @@ -1533,71 +1530,17 @@ fn record_hands_implementation_gate( put_substrate_gate_repo_access_grant_receipt(runtime_store, &substrate_grant)?; let intent = HandsActionIntent { - schema_version: HANDS_ACTION_INTENT_SCHEMA_VERSION.to_string(), intent_id: format!("hands-intent-{suffix}"), runtime_job_id: runtime_job_id.clone(), - binding_id: "implementation-worker".to_string(), - role: "epiphany-hands".to_string(), - authority_scope: "epiphany.role.implementation".to_string(), - requested_action: "continueImplementation".to_string(), requested_paths: requested_paths.clone(), substrate_gate_grant_receipt_id: grant_id.clone(), - requested_at: requested_at.clone(), - contract: "Coordinator continuation becomes a typed Hands action intent before any file edit, command, or commit may count as implementation evidence." - .to_string(), - frontier_route_id: route - .adopted_plan - .as_ref() - .map(|_| route.route_id.clone()) - .unwrap_or_default(), - plan_candidate_sha256: route - .adopted_plan - .as_ref() - .map(|plan| plan.candidate_sha256.clone()) - .unwrap_or_default(), - plan_action: route - .adopted_plan - .as_ref() - .map(|plan| plan.effective_action().to_string()) - .unwrap_or_default(), }; put_hands_action_intent(runtime_store, &intent)?; - - let mut review = hands_action_review_for_intent( - format!("hands-review-{suffix}"), - &intent, - "approved".to_string(), - vec![ - "patch".to_string(), - "command".to_string(), - "commit".to_string(), - ], - vec![ - "Coordinator selected continueImplementation for the current thread state." - .to_string(), - "Hands remains the action owner; Mind and Soul still own state admission and verification." - .to_string(), - ], - requested_at, - ); - review.required_receipts = vec![ - HANDS_PATCH_RECEIPT_TYPE.to_string(), - HANDS_COMMAND_RECEIPT_TYPE.to_string(), - HANDS_COMMIT_RECEIPT_TYPE.to_string(), - ]; - put_hands_action_review(runtime_store, &review)?; let authority = RepoFrontierHandsAuthority { authority_id: format!("repo-frontier-hands-authority-{}", intent.intent_id), route_id: route.route_id.clone(), - model_projection_digest: route.model_projection_digest.clone(), - model_source_documents: route.model_source_documents.clone(), - frontier_item_id: route.frontier_item_id.clone(), - frontier_item_hash: route.frontier_item_hash.clone(), hands_intent_id: intent.intent_id.clone(), - hands_review_id: review.review_id.clone(), substrate_grant_receipt_id: grant_id.clone(), - requested_paths: requested_paths.clone(), - granted_at: review.reviewed_at.clone(), }; put_repo_frontier_hands_authority(runtime_store, &authority)?; @@ -1606,13 +1549,12 @@ fn record_hands_implementation_gate( "runtimeJobId": runtime_job_id, "substrateGateGrantReceiptId": grant_id, "intentId": intent.intent_id, - "reviewId": review.review_id, "routeId": route.route_id, "modelProjectionDigest": route.model_projection_digest, "modelSourceDocuments": route.model_source_documents, "frontierItemId": route.frontier_item_id, "requestedPaths": requested_paths, - "requiredReceipts": review.required_receipts, + "requiredReceipts": [HANDS_PATCH_RECEIPT_TYPE, HANDS_COMMAND_RECEIPT_TYPE, HANDS_COMMIT_RECEIPT_TYPE], "plannedAction": route.adopted_plan.as_ref().map(|plan| plan.effective_action()), "plannedCommand": route.adopted_plan.as_ref().map(|plan| plan.effective_command()), "originalPlannedAction": route.adopted_plan.as_ref().map(|plan| plan.action.as_str()), diff --git a/epiphany-core/src/current_work.rs b/epiphany-core/src/current_work.rs index d1520c22..182e4a5a 100644 --- a/epiphany-core/src/current_work.rs +++ b/epiphany-core/src/current_work.rs @@ -1523,10 +1523,6 @@ pub fn launch_current_frontier_verification_work( crate::HandsActionIntent::TYPE, request.hands_intent_id.as_str(), ), - ( - crate::HandsActionReview::TYPE, - request.hands_review_id.as_str(), - ), ( crate::HandsPatchReceipt::TYPE, request.hands_patch_receipt_id.as_str(), @@ -2026,10 +2022,6 @@ pub fn accept_frontier_verification_result( crate::HandsActionIntent::TYPE, request.hands_intent_id.as_str(), ), - ( - crate::HandsActionReview::TYPE, - request.hands_review_id.as_str(), - ), ( crate::HandsPatchReceipt::TYPE, request.hands_patch_receipt_id.as_str(), @@ -4377,63 +4369,30 @@ mod tests { ); crate::put_substrate_gate_repo_access_grant_receipt(&store, &grant)?; let intent = crate::HandsActionIntent { - schema_version: crate::HANDS_ACTION_INTENT_SCHEMA_VERSION.into(), intent_id: "hands-intent-verification-fixture".into(), runtime_job_id: hands_job_id.into(), - binding_id: "implementation-worker".into(), - role: "epiphany-hands".into(), - authority_scope: "epiphany.role.implementation".into(), - requested_action: "continueImplementation".into(), requested_paths: route.authorized_paths.clone(), substrate_gate_grant_receipt_id: grant.receipt_id.clone(), - requested_at: "2026-08-17T00:00:14.200Z".into(), - contract: "The exact Hands consequence under Verification.".into(), - frontier_route_id: String::new(), - plan_candidate_sha256: String::new(), - plan_action: String::new(), }; crate::put_hands_action_intent(&store, &intent)?; - let mut hands_review = crate::hands_action_review_for_intent( - "hands-review-verification-fixture".into(), - &intent, - "approved".into(), - vec!["patch".into(), "command".into(), "commit".into()], - vec!["Bounded fixture consequence is authorized.".into()], - "2026-08-17T00:00:14.300Z".into(), - ); - hands_review.required_receipts = vec![ - crate::HANDS_PATCH_RECEIPT_TYPE.into(), - crate::HANDS_COMMAND_RECEIPT_TYPE.into(), - crate::HANDS_COMMIT_RECEIPT_TYPE.into(), - ]; - crate::put_hands_action_review(&store, &hands_review)?; let hands_authority = crate::RepoFrontierHandsAuthority { authority_id: "repo-frontier-hands-authority-verification-fixture".into(), route_id: route.route_id.clone(), - model_projection_digest: route.model_projection_digest.clone(), - model_source_documents: route.model_source_documents.clone(), - frontier_item_id: route.frontier_item_id.clone(), - frontier_item_hash: route.frontier_item_hash.clone(), hands_intent_id: intent.intent_id.clone(), - hands_review_id: hands_review.review_id.clone(), substrate_grant_receipt_id: grant.receipt_id.clone(), - requested_paths: route.authorized_paths.clone(), - granted_at: hands_review.reviewed_at.clone(), }; crate::put_repo_frontier_hands_authority(&store, &hands_authority)?; - let hands_patch = crate::hands_patch_receipt_for_review( + let hands_patch = crate::hands_patch_receipt_for_intent( "hands-patch-verification-fixture".into(), &intent, - &hands_review, route.authorized_paths.clone(), "Applied the exact bounded change.".into(), "2026-08-17T00:00:14.400Z".into(), ); crate::put_hands_patch_receipt(&store, &hands_patch)?; - let hands_command = crate::hands_command_receipt_for_review( + let hands_command = crate::hands_command_receipt_for_intent( "hands-command-verification-fixture".into(), &intent, - &hands_review, "cargo test exact-verification-fixture".into(), "0".into(), "verification.stdout".into(), @@ -4442,16 +4401,26 @@ mod tests { "2026-08-17T00:00:14.500Z".into(), ); crate::put_hands_command_receipt(&store, &hands_command)?; - let hands_commit = crate::hands_commit_receipt_for_review( + let hands_commit = crate::hands_commit_receipt_for_intent( "hands-commit-verification-fixture".into(), &intent, - &hands_review, "0123456789abcdef0123456789abcdef01234567".into(), "codex/verification-fixture".into(), route.authorized_paths.clone(), "Committed the exact bounded consequence.".into(), "2026-08-17T00:00:14.600Z".into(), ); + let ambiguous_hands_store = temp.path().join("ambiguous-hands.cc"); + std::fs::copy(&store, &ambiguous_hands_store)?; + let mut duplicate_patch = hands_patch.clone(); + duplicate_patch.receipt_id = "hands-patch-verification-fixture-duplicate".into(); + crate::put_hands_patch_receipt(&ambiguous_hands_store, &duplicate_patch)?; + assert!( + crate::put_hands_commit_receipt(&ambiguous_hands_store, &hands_commit) + .unwrap_err() + .to_string() + .contains("one exact patch receipt") + ); let persona_cultmesh = temp.path().join("persona-concurrency-cultmesh.cc"); crate::write_epiphany_cultmesh_swarm_brake( &persona_cultmesh, diff --git a/epiphany-core/src/hands_gateway.rs b/epiphany-core/src/hands_gateway.rs index eea8c087..d4bf0e12 100644 --- a/epiphany-core/src/hands_gateway.rs +++ b/epiphany-core/src/hands_gateway.rs @@ -3,63 +3,17 @@ use cultcache_rs::DatabaseEntry; pub const HANDS_COMMAND_RECEIPT_TYPE: &str = "epiphany.hands.command_receipt"; pub const HANDS_PATCH_RECEIPT_TYPE: &str = "epiphany.hands.patch_receipt"; pub const HANDS_COMMIT_RECEIPT_TYPE: &str = "epiphany.hands.commit_receipt"; -pub const HANDS_ACTION_INTENT_SCHEMA_VERSION: &str = "epiphany.hands.action_intent.v1"; -pub const HANDS_ACTION_REVIEW_SCHEMA_VERSION: &str = "epiphany.hands.action_review.v0"; - #[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] #[cultcache(type = "epiphany.hands.action_intent", schema = "HandsActionIntent")] pub struct HandsActionIntent { #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] pub intent_id: String, - #[cultcache(key = 2)] + #[cultcache(key = 1)] pub runtime_job_id: String, - #[cultcache(key = 3)] - pub binding_id: String, - #[cultcache(key = 4)] - pub role: String, - #[cultcache(key = 5)] - pub authority_scope: String, - #[cultcache(key = 6)] - pub requested_action: String, - #[cultcache(key = 7)] - pub requested_paths: Vec, - #[cultcache(key = 8)] - pub substrate_gate_grant_receipt_id: String, - #[cultcache(key = 9)] - pub requested_at: String, - #[cultcache(key = 10)] - pub contract: String, - #[cultcache(key = 11, default)] - pub frontier_route_id: String, - #[cultcache(key = 12, default)] - pub plan_candidate_sha256: String, - #[cultcache(key = 13, default)] - pub plan_action: String, -} - -#[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] -#[cultcache(type = "epiphany.hands.action_review", schema = "HandsActionReview")] -pub struct HandsActionReview { - #[cultcache(key = 0)] - pub schema_version: String, - #[cultcache(key = 1)] - pub review_id: String, #[cultcache(key = 2)] - pub intent_id: String, + pub requested_paths: Vec, #[cultcache(key = 3)] - pub decision: String, - #[cultcache(key = 4)] - pub allowed_operations: Vec, - #[cultcache(key = 5)] - pub required_receipts: Vec, - #[cultcache(key = 6)] - pub reasons: Vec, - #[cultcache(key = 7)] - pub reviewed_at: String, - #[cultcache(key = 8)] - pub contract: String, + pub substrate_gate_grant_receipt_id: String, } #[derive(Debug, Clone, PartialEq, Eq, DatabaseEntry)] @@ -70,16 +24,10 @@ pub struct HandsPatchReceipt { #[cultcache(key = 1)] pub intent_id: String, #[cultcache(key = 2)] - pub review_id: String, - #[cultcache(key = 3)] - pub substrate_gate_grant_receipt_id: String, - #[cultcache(key = 4)] - pub runtime_job_id: String, - #[cultcache(key = 5)] pub changed_paths: Vec, - #[cultcache(key = 6)] + #[cultcache(key = 3)] pub summary: String, - #[cultcache(key = 7)] + #[cultcache(key = 4)] pub emitted_at: String, } @@ -94,22 +42,16 @@ pub struct HandsCommandReceipt { #[cultcache(key = 1)] pub intent_id: String, #[cultcache(key = 2)] - pub review_id: String, - #[cultcache(key = 3)] - pub substrate_gate_grant_receipt_id: String, - #[cultcache(key = 4)] - pub runtime_job_id: String, - #[cultcache(key = 5)] pub command: String, - #[cultcache(key = 6)] + #[cultcache(key = 3)] pub exit_code: String, - #[cultcache(key = 7)] + #[cultcache(key = 4)] pub stdout_artifact: String, - #[cultcache(key = 8)] + #[cultcache(key = 5)] pub stderr_artifact: String, - #[cultcache(key = 9)] + #[cultcache(key = 6)] pub summary: String, - #[cultcache(key = 10)] + #[cultcache(key = 7)] pub emitted_at: String, } @@ -121,46 +63,20 @@ pub struct HandsCommitReceipt { #[cultcache(key = 1)] pub intent_id: String, #[cultcache(key = 2)] - pub review_id: String, - #[cultcache(key = 3)] - pub runtime_job_id: String, - #[cultcache(key = 4)] pub commit_sha: String, - #[cultcache(key = 5)] + #[cultcache(key = 3)] pub branch: String, - #[cultcache(key = 6)] + #[cultcache(key = 4)] pub changed_paths: Vec, - #[cultcache(key = 7)] + #[cultcache(key = 5)] pub summary: String, - #[cultcache(key = 8)] + #[cultcache(key = 6)] pub emitted_at: String, } -pub fn hands_action_review_for_intent( - review_id: String, - intent: &HandsActionIntent, - decision: String, - allowed_operations: Vec, - reasons: Vec, - reviewed_at: String, -) -> HandsActionReview { - HandsActionReview { - schema_version: HANDS_ACTION_REVIEW_SCHEMA_VERSION.to_string(), - review_id, - intent_id: intent.intent_id.clone(), - decision, - allowed_operations, - required_receipts: vec![HANDS_PATCH_RECEIPT_TYPE.to_string()], - reasons, - reviewed_at, - contract: "Hands review is the execution decision for a bounded action intent; it depends on Substrate Gate access and does not admit durable Mind state.".to_string(), - } -} - -pub fn hands_patch_receipt_for_review( +pub fn hands_patch_receipt_for_intent( receipt_id: String, intent: &HandsActionIntent, - review: &HandsActionReview, changed_paths: Vec, summary: String, emitted_at: String, @@ -168,9 +84,6 @@ pub fn hands_patch_receipt_for_review( HandsPatchReceipt { receipt_id, intent_id: intent.intent_id.clone(), - review_id: review.review_id.clone(), - substrate_gate_grant_receipt_id: intent.substrate_gate_grant_receipt_id.clone(), - runtime_job_id: intent.runtime_job_id.clone(), changed_paths, summary, emitted_at, @@ -178,10 +91,9 @@ pub fn hands_patch_receipt_for_review( } #[allow(clippy::too_many_arguments)] -pub fn hands_command_receipt_for_review( +pub fn hands_command_receipt_for_intent( receipt_id: String, intent: &HandsActionIntent, - review: &HandsActionReview, command: String, exit_code: String, stdout_artifact: String, @@ -192,9 +104,6 @@ pub fn hands_command_receipt_for_review( HandsCommandReceipt { receipt_id, intent_id: intent.intent_id.clone(), - review_id: review.review_id.clone(), - substrate_gate_grant_receipt_id: intent.substrate_gate_grant_receipt_id.clone(), - runtime_job_id: intent.runtime_job_id.clone(), command, exit_code, stdout_artifact, @@ -204,10 +113,9 @@ pub fn hands_command_receipt_for_review( } } -pub fn hands_commit_receipt_for_review( +pub fn hands_commit_receipt_for_intent( receipt_id: String, intent: &HandsActionIntent, - review: &HandsActionReview, commit_sha: String, branch: String, changed_paths: Vec, @@ -217,8 +125,6 @@ pub fn hands_commit_receipt_for_review( HandsCommitReceipt { receipt_id, intent_id: intent.intent_id.clone(), - review_id: review.review_id.clone(), - runtime_job_id: intent.runtime_job_id.clone(), commit_sha, branch, changed_paths, diff --git a/epiphany-core/src/lib.rs b/epiphany-core/src/lib.rs index 449ed15a..2762108a 100644 --- a/epiphany-core/src/lib.rs +++ b/epiphany-core/src/lib.rs @@ -247,7 +247,6 @@ pub use runtime_spine::open_runtime_model_execution; pub use runtime_spine::prepare_runtime_spine_heartbeat_job; pub(crate) use runtime_spine::promote_autonomous_direction_options_for_modeling; pub use runtime_spine::put_hands_action_intent; -pub use runtime_spine::put_hands_action_review; pub use runtime_spine::put_hands_command_receipt; pub use runtime_spine::put_hands_commit_receipt; pub use runtime_spine::put_hands_patch_receipt; diff --git a/epiphany-core/src/repo_model_gateway.rs b/epiphany-core/src/repo_model_gateway.rs index 9193d843..35f77608 100644 --- a/epiphany-core/src/repo_model_gateway.rs +++ b/epiphany-core/src/repo_model_gateway.rs @@ -434,21 +434,7 @@ pub struct RepoFrontierHandsAuthority { #[cultcache(key = 2)] pub route_id: String, #[cultcache(key = 3)] - pub model_projection_digest: String, - #[cultcache(key = 4)] - pub model_source_documents: Vec, - #[cultcache(key = 5)] - pub frontier_item_id: String, - #[cultcache(key = 6)] - pub frontier_item_hash: String, - #[cultcache(key = 7)] pub hands_intent_id: String, - #[cultcache(key = 8)] - pub hands_review_id: String, - #[cultcache(key = 9)] + #[cultcache(key = 4)] pub substrate_grant_receipt_id: String, - #[cultcache(key = 10)] - pub requested_paths: Vec, - #[cultcache(key = 11)] - pub granted_at: String, } diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index f054e495..023a21ff 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -55,7 +55,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v45"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v46"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache(type = "epiphany.runtime.identity", schema = "EpiphanyRuntimeIdentity")] @@ -696,7 +696,6 @@ fn runtime_spine_schema_cache() -> Result { cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; - cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; @@ -2610,9 +2609,7 @@ pub(crate) fn frontier_verification_request_for_launch( || carried.route.route_id != request.route_id || carried.hands_authority.route_id != request.route_id || carried.hands_authority.hands_intent_id != request.hands_intent_id - || carried.hands_authority.hands_review_id != request.hands_review_id || carried.hands_intent.intent_id != request.hands_intent_id - || carried.hands_review.review_id != request.hands_review_id || carried.patch_receipt.receipt_id != request.hands_patch_receipt_id || carried.command_receipt.receipt_id != request.hands_command_receipt_id || carried.commit_receipt.receipt_id != request.hands_commit_receipt_id @@ -6810,24 +6807,13 @@ pub fn put_hands_action_intent( ) -> Result<()> { validate_non_empty(&intent.intent_id, "Hands action intent id")?; validate_non_empty(&intent.runtime_job_id, "Hands action runtime job")?; - validate_non_empty(&intent.binding_id, "Hands action binding")?; - validate_non_empty(&intent.role, "Hands action role")?; - validate_non_empty(&intent.authority_scope, "Hands action authority scope")?; - validate_non_empty(&intent.requested_action, "Hands requested action")?; validate_non_empty( &intent.substrate_gate_grant_receipt_id, "Hands Substrate Gate grant receipt", )?; - validate_non_empty(&intent.requested_at, "Hands action requested timestamp")?; if intent.requested_paths.is_empty() { return Err(anyhow!("Hands action intent must name requested paths")); } - if intent.schema_version != HANDS_ACTION_INTENT_SCHEMA_VERSION - || chrono::DateTime::parse_from_rfc3339(&intent.requested_at).is_err() - || intent.contract.trim().is_empty() - { - return Err(anyhow!("invalid Hands action intent contract")); - } let store_path = store_path.as_ref(); let mut cache = runtime_spine_cache(store_path)?; cache.pull_all_backing_stores()?; @@ -6838,9 +6824,6 @@ pub fn put_hands_action_intent( anyhow!("Hands action intent requires its persisted Substrate Gate grant") })?; if grant.runtime_job_id != intent.runtime_job_id - || grant.binding_id != intent.binding_id - || grant.role != intent.role - || grant.authority_scope != intent.authority_scope || !grant .granted_operations .iter() @@ -6870,40 +6853,6 @@ pub fn put_hands_action_intent( } } -pub fn put_hands_action_review( - store_path: impl AsRef, - review: &HandsActionReview, -) -> Result<()> { - validate_non_empty(&review.review_id, "Hands action review id")?; - validate_non_empty(&review.intent_id, "Hands action review intent")?; - validate_non_empty(&review.decision, "Hands action review decision")?; - validate_non_empty(&review.reviewed_at, "Hands action review timestamp")?; - if review.allowed_operations.is_empty() { - return Err(anyhow!("Hands action review must name allowed operations")); - } - if review.schema_version != HANDS_ACTION_REVIEW_SCHEMA_VERSION - || chrono::DateTime::parse_from_rfc3339(&review.reviewed_at).is_err() - || review.contract.trim().is_empty() - { - return Err(anyhow!("invalid Hands action review contract")); - } - let store_path = store_path.as_ref(); - let mut cache = runtime_spine_cache(store_path)?; - cache.pull_all_backing_stores()?; - require_identity(&cache)?; - let (envelope, _) = cache.prepare_entry(&review.review_id, review)?; - let backing = SingleFileMessagePackBackingStore::new(store_path); - if backing.compare_and_swap_batch(&[], vec![envelope])? { - return Ok(()); - } - let mut reloaded = runtime_spine_cache(store_path)?; - reloaded.pull_all_backing_stores()?; - match reloaded.get::(&review.review_id)? { - Some(existing) if existing == *review => Ok(()), - _ => Err(anyhow!("Hands action review ids are immutable")), - } -} - fn validate_repo_frontier_hands_authority_chain( cache: &CultCache, authority: &RepoFrontierHandsAuthority, @@ -6937,80 +6886,28 @@ fn validate_repo_frontier_hands_authority_chain( let intent = cache .get::(&authority.hands_intent_id)? .ok_or_else(|| anyhow!("Hands authority requires its persisted intent"))?; - let review = cache - .get::(&authority.hands_review_id)? - .ok_or_else(|| anyhow!("Hands authority requires its persisted review"))?; let grant = cache .get::(&authority.substrate_grant_receipt_id)? .ok_or_else(|| anyhow!("Hands authority requires its persisted Substrate grant"))?; - let within_scope = authority.requested_paths.iter().all(|path| { - route.authorized_paths.iter().any(|scope| { - path == scope || path.starts_with(&format!("{}/", scope.trim_end_matches(['/', '\\']))) - }) - }); - let requested_operations: &[&str] = match intent.requested_action.as_str() { - "patch" => &["patch"], - "continueImplementation" => &["patch", "command", "commit"], - _ => { - return Err(anyhow!( - "Hands authority names an unsupported requested action" - )); - } - }; - let adopted_plan_binding_is_exact = match route.adopted_plan.as_ref() { - Some(plan) => { - intent.frontier_route_id == route.route_id - && intent.plan_candidate_sha256 == plan.candidate_sha256 - && intent.plan_action == plan.effective_action() - } - None => { - intent.frontier_route_id.is_empty() - && intent.plan_candidate_sha256.is_empty() - && intent.plan_action.is_empty() - } - }; - if intent.schema_version != HANDS_ACTION_INTENT_SCHEMA_VERSION - || review.schema_version != HANDS_ACTION_REVIEW_SCHEMA_VERSION - || grant.schema_version != SUBSTRATE_GATE_REPO_ACCESS_GRANT_RECEIPT_SCHEMA_VERSION - || intent.contract.trim().is_empty() - || review.contract.trim().is_empty() + if grant.schema_version != SUBSTRATE_GATE_REPO_ACCESS_GRANT_RECEIPT_SCHEMA_VERSION || grant.contract.trim().is_empty() - || chrono::DateTime::parse_from_rfc3339(&intent.requested_at).is_err() - || chrono::DateTime::parse_from_rfc3339(&review.reviewed_at).is_err() || chrono::DateTime::parse_from_rfc3339(&grant.granted_at).is_err() || route.next_organ != RepoFrontierNextOrgan::Hands - || authority.model_projection_digest != route.model_projection_digest - || authority.model_source_documents != route.model_source_documents - || authority.frontier_item_id != route.frontier_item_id - || authority.frontier_item_hash != route.frontier_item_hash || current_item.adopted_plan != route.adopted_plan || route .adopted_plan .as_ref() .is_some_and(|plan| route.authorized_paths != plan.safe_paths) - || !adopted_plan_binding_is_exact - || review.intent_id != intent.intent_id - || review.decision != "approved" - || !requested_operations.iter().all(|required| { - review - .allowed_operations - .iter() - .any(|operation| operation == required) - }) || intent.substrate_gate_grant_receipt_id != grant.receipt_id || grant.runtime_job_id != intent.runtime_job_id - || grant.binding_id != intent.binding_id - || grant.role != intent.role - || grant.authority_scope != intent.authority_scope - || !requested_operations.iter().all(|required| { + || !["patch", "command", "commit"].iter().all(|required| { grant .granted_operations .iter() .any(|operation| operation == required) }) - || authority.requested_paths != intent.requested_paths - || authority.requested_paths != grant.granted_paths - || !within_scope + || intent.requested_paths != grant.granted_paths + || intent.requested_paths != route.authorized_paths { return Err(anyhow!( "repo frontier Hands authority chain violates its full authority contract" @@ -7024,9 +6921,14 @@ pub fn put_repo_frontier_hands_authority( authority: &RepoFrontierHandsAuthority, ) -> Result<()> { let store_path = store_path.as_ref(); - if chrono::DateTime::parse_from_rfc3339(&authority.granted_at).is_err() - || !crate::memory_graph::repo_paths_are_canonical_and_safe(&authority.requested_paths) - || authority.requested_paths.is_empty() + if [ + authority.authority_id.as_str(), + authority.route_id.as_str(), + authority.hands_intent_id.as_str(), + authority.substrate_grant_receipt_id.as_str(), + ] + .into_iter() + .any(str::is_empty) { return Err(anyhow!("invalid repo frontier Hands authority contract")); } @@ -7040,40 +6942,11 @@ pub fn put_repo_frontier_hands_authority( let intent = cache .get::(&authority.hands_intent_id)? .ok_or_else(|| anyhow!("repo frontier Hands authority requires its persisted intent"))?; - let review = cache - .get::(&authority.hands_review_id)? - .ok_or_else(|| anyhow!("repo frontier Hands authority requires its persisted review"))?; let grant = cache .get::(&authority.substrate_grant_receipt_id)? .ok_or_else(|| { anyhow!("repo frontier Hands authority requires its persisted Substrate grant") })?; - let within_scope = authority.requested_paths.iter().all(|path| { - route.authorized_paths.iter().any(|scope| { - path == scope || path.starts_with(&format!("{}/", scope.trim_end_matches(['/', '\\']))) - }) - }); - if route.next_organ != RepoFrontierNextOrgan::Hands - || authority.route_id != route.route_id - || authority.model_projection_digest != route.model_projection_digest - || authority.model_source_documents != route.model_source_documents - || authority.frontier_item_id != route.frontier_item_id - || authority.frontier_item_hash != route.frontier_item_hash - || review.intent_id != intent.intent_id - || review.decision != "approved" - || intent.substrate_gate_grant_receipt_id != grant.receipt_id - || grant.runtime_job_id != intent.runtime_job_id - || grant.binding_id != intent.binding_id - || grant.role != intent.role - || grant.authority_scope != intent.authority_scope - || authority.requested_paths != intent.requested_paths - || authority.requested_paths != grant.granted_paths - || !within_scope - { - return Err(anyhow!( - "repo frontier Hands authority does not exactly bind route, model, intent, review, grant, and scope" - )); - } let (envelope, _) = cache.prepare_entry(&authority.authority_id, authority)?; let backing = SingleFileMessagePackBackingStore::new(store_path); let expected = vec![ @@ -7083,14 +6956,11 @@ pub fn put_repo_frontier_hands_authority( cache .get_envelope::(&intent.intent_id)? .ok_or_else(|| anyhow!("repo frontier Hands authority lost its intent envelope"))?, - cache - .get_envelope::(&review.review_id)? - .ok_or_else(|| anyhow!("repo frontier Hands authority lost its review envelope"))?, cache .get_envelope::(&grant.receipt_id)? .ok_or_else(|| anyhow!("repo frontier Hands authority lost its grant envelope"))?, cache - .get_envelope::(&authority.frontier_item_id)? + .get_envelope::(&route.frontier_item_id)? .ok_or_else(|| anyhow!("repo frontier Hands authority lost its frontier envelope"))?, ]; let mut writes = expected.clone(); @@ -7157,7 +7027,6 @@ pub(crate) fn validate_repo_frontier_verification_request_intrinsic( request.frontier_item_id.as_str(), request.frontier_item_hash.as_str(), request.hands_intent_id.as_str(), - request.hands_review_id.as_str(), request.hands_patch_receipt_id.as_str(), request.hands_command_receipt_id.as_str(), request.hands_commit_receipt_id.as_str(), @@ -7244,7 +7113,6 @@ fn repo_frontier_verification_context_with_commit( .filter(|authority| { authority.route_id == request.route_id && authority.hands_intent_id == request.hands_intent_id - && authority.hands_review_id == request.hands_review_id }) .collect::>(); let [hands_authority] = authorities.as_slice() else { @@ -7256,9 +7124,6 @@ fn repo_frontier_verification_context_with_commit( let hands_intent = cache .get::(&request.hands_intent_id)? .ok_or_else(|| anyhow!("Verification context lost its Hands intent"))?; - let hands_review = cache - .get::(&request.hands_review_id)? - .ok_or_else(|| anyhow!("Verification context lost its Hands review"))?; let patch_receipt = cache .get::(&request.hands_patch_receipt_id)? .ok_or_else(|| anyhow!("Verification context lost its patch receipt"))?; @@ -7268,8 +7133,7 @@ fn repo_frontier_verification_context_with_commit( let commit_receipt = match prospective_commit { Some(receipt) if receipt.receipt_id == request.hands_commit_receipt_id - && receipt.intent_id == request.hands_intent_id - && receipt.review_id == request.hands_review_id => + && receipt.intent_id == request.hands_intent_id => { receipt.clone() } @@ -7288,7 +7152,6 @@ fn repo_frontier_verification_context_with_commit( route, hands_authority: hands_authority.clone(), hands_intent, - hands_review, patch_receipt, command_receipt, commit_receipt, @@ -7415,9 +7278,7 @@ fn derive_repo_frontier_verification_request_for_chain( let authorities = cache .get_all::()? .into_iter() - .filter(|value| { - value.hands_intent_id == commit.intent_id && value.hands_review_id == commit.review_id - }) + .filter(|value| value.hands_intent_id == commit.intent_id) .collect::>(); if authorities.len() != 1 { return Err(anyhow!( @@ -7425,8 +7286,11 @@ fn derive_repo_frontier_verification_request_for_chain( )); } let authority = &authorities[0]; + let route = cache + .get::(&authority.route_id)? + .ok_or_else(|| anyhow!("Hands authority lost its exact route"))?; let frontier_envelope = cache - .get_envelope::(&authority.frontier_item_id)? + .get_envelope::(&route.frontier_item_id)? .ok_or_else(|| anyhow!("Hands authority lost its exact frontier document"))?; let frontier_authority_documents = vec![crate::EpiphanyMindDocumentVersion::from_envelope( "epiphany-mind", @@ -7443,12 +7307,11 @@ fn derive_repo_frontier_verification_request_for_chain( let request = RepoFrontierVerificationRequest { request_id, route_id: authority.route_id.clone(), - model_projection_digest: authority.model_projection_digest.clone(), - model_source_documents: authority.model_source_documents.clone(), - frontier_item_id: authority.frontier_item_id.clone(), - frontier_item_hash: authority.frontier_item_hash.clone(), + model_projection_digest: route.model_projection_digest.clone(), + model_source_documents: route.model_source_documents.clone(), + frontier_item_id: route.frontier_item_id.clone(), + frontier_item_hash: route.frontier_item_hash.clone(), hands_intent_id: commit.intent_id.clone(), - hands_review_id: commit.review_id.clone(), hands_patch_receipt_id: patch.receipt_id.clone(), hands_command_receipt_id: command.receipt_id.clone(), hands_commit_receipt_id: commit.receipt_id.clone(), @@ -7461,11 +7324,8 @@ fn derive_repo_frontier_verification_request_for_chain( fn validate_hands_consequence_grant( store_path: &Path, intent_id: &str, - review_id: &str, - runtime_job_id: &str, operation: &str, changed_paths: &[String], - stated_grant_id: Option<&str>, stated_command: Option<&str>, ) -> Result<()> { let mut cache = runtime_spine_cache(store_path)?; @@ -7474,9 +7334,6 @@ fn validate_hands_consequence_grant( let intent = cache .get::(intent_id)? .ok_or_else(|| anyhow!("Hands consequence requires its persisted intent"))?; - let review = cache - .get::(review_id)? - .ok_or_else(|| anyhow!("Hands consequence requires its persisted review"))?; let grant = cache .get::(&intent.substrate_gate_grant_receipt_id)? .ok_or_else(|| anyhow!("Hands consequence requires its persisted Substrate Gate grant"))?; @@ -7496,8 +7353,8 @@ fn validate_hands_consequence_grant( .ok_or_else(|| anyhow!("Hands consequence requires its persisted repo frontier route"))?; require_keyed_repo_model_basis( &cache, - &authority.model_projection_digest, - &authority.model_source_documents, + &route.model_projection_digest, + &route.model_source_documents, )?; let paths_covered = changed_paths.iter().all(|path| { grant.granted_paths.iter().any(|granted| { @@ -7506,22 +7363,11 @@ fn validate_hands_consequence_grant( || path.starts_with(&format!("{}/", granted.trim_end_matches(['/', '\\']))) }) }); - if intent.runtime_job_id != runtime_job_id - || review.intent_id != intent.intent_id - || review.decision != "approved" - || !review - .allowed_operations - .iter() - .any(|allowed| allowed == operation) - || grant.runtime_job_id != intent.runtime_job_id - || grant.binding_id != intent.binding_id - || grant.role != intent.role - || grant.authority_scope != intent.authority_scope + if grant.runtime_job_id != intent.runtime_job_id || !grant .granted_operations .iter() .any(|allowed| allowed == operation) - || stated_grant_id.is_some_and(|id| id != grant.receipt_id) || stated_command.is_some_and(|command| { route .adopted_plan @@ -7529,23 +7375,19 @@ fn validate_hands_consequence_grant( .is_some_and(|plan| command != plan.effective_command()) }) || !paths_covered - || authority.hands_review_id != review.review_id || authority.substrate_grant_receipt_id != grant.receipt_id - || authority.requested_paths != intent.requested_paths || authority.route_id != route.route_id - || authority.model_projection_digest != route.model_projection_digest - || authority.model_source_documents != route.model_source_documents - || authority.frontier_item_id != route.frontier_item_id - || authority.frontier_item_hash != route.frontier_item_hash + || authority.hands_intent_id != intent.intent_id + || intent.requested_paths != route.authorized_paths || !changed_paths.iter().all(|path| { - authority.requested_paths.iter().any(|scope| { + intent.requested_paths.iter().any(|scope| { path == scope || path.starts_with(&format!("{}/", scope.trim_end_matches(['/', '\\']))) }) }) { return Err(anyhow!( - "Hands consequence does not match its approved review and Substrate Gate grant" + "Hands consequence does not match its route, intent, and Substrate Gate grant" )); } Ok(()) @@ -7558,12 +7400,6 @@ pub fn put_hands_patch_receipt( let store_path = store_path.as_ref(); validate_non_empty(&receipt.receipt_id, "Hands patch receipt id")?; validate_non_empty(&receipt.intent_id, "Hands patch intent")?; - validate_non_empty(&receipt.review_id, "Hands patch review")?; - validate_non_empty( - &receipt.substrate_gate_grant_receipt_id, - "Hands patch Substrate Gate grant receipt", - )?; - validate_non_empty(&receipt.runtime_job_id, "Hands patch runtime job")?; validate_non_empty(&receipt.summary, "Hands patch summary")?; validate_non_empty(&receipt.emitted_at, "Hands patch timestamp")?; if receipt.changed_paths.is_empty() { @@ -7572,11 +7408,8 @@ pub fn put_hands_patch_receipt( validate_hands_consequence_grant( store_path.as_ref(), &receipt.intent_id, - &receipt.review_id, - &receipt.runtime_job_id, "patch", &receipt.changed_paths, - Some(&receipt.substrate_gate_grant_receipt_id), None, )?; let mut cache = runtime_spine_cache(store_path)?; @@ -7603,23 +7436,14 @@ pub fn put_hands_command_receipt( let store_path = store_path.as_ref(); validate_non_empty(&receipt.receipt_id, "Hands command receipt id")?; validate_non_empty(&receipt.intent_id, "Hands command intent")?; - validate_non_empty(&receipt.review_id, "Hands command review")?; - validate_non_empty( - &receipt.substrate_gate_grant_receipt_id, - "Hands command Substrate Gate grant receipt", - )?; - validate_non_empty(&receipt.runtime_job_id, "Hands command runtime job")?; validate_non_empty(&receipt.command, "Hands command")?; validate_non_empty(&receipt.exit_code, "Hands command exit code")?; validate_non_empty(&receipt.emitted_at, "Hands command timestamp")?; validate_hands_consequence_grant( store_path.as_ref(), &receipt.intent_id, - &receipt.review_id, - &receipt.runtime_job_id, "command", &[], - Some(&receipt.substrate_gate_grant_receipt_id), Some(&receipt.command), )?; let mut cache = runtime_spine_cache(store_path)?; @@ -7646,8 +7470,6 @@ pub fn put_hands_commit_receipt( let store_path = store_path.as_ref(); validate_non_empty(&receipt.receipt_id, "Hands commit receipt id")?; validate_non_empty(&receipt.intent_id, "Hands commit intent")?; - validate_non_empty(&receipt.review_id, "Hands commit review")?; - validate_non_empty(&receipt.runtime_job_id, "Hands commit runtime job")?; validate_non_empty(&receipt.commit_sha, "Hands commit sha")?; validate_non_empty(&receipt.branch, "Hands commit branch")?; validate_non_empty(&receipt.summary, "Hands commit summary")?; @@ -7658,41 +7480,33 @@ pub fn put_hands_commit_receipt( validate_hands_consequence_grant( store_path.as_ref(), &receipt.intent_id, - &receipt.review_id, - &receipt.runtime_job_id, "commit", &receipt.changed_paths, None, - None, )?; let mut cache = runtime_spine_cache(store_path)?; cache.pull_all_backing_stores()?; require_identity(&cache)?; - let patch = cache + let patches = cache .get_all::()? .into_iter() - .filter(|patch| { - patch.intent_id == receipt.intent_id - && patch.review_id == receipt.review_id - && patch.runtime_job_id == receipt.runtime_job_id - && patch.emitted_at <= receipt.emitted_at - }) - .max_by(|left, right| left.emitted_at.cmp(&right.emitted_at)) - .ok_or_else(|| anyhow!("Hands commit requires its exact patch receipt"))?; - let command = cache + .filter(|patch| patch.intent_id == receipt.intent_id) + .collect::>(); + let [patch] = patches.as_slice() else { + return Err(anyhow!("Hands commit requires one exact patch receipt")); + }; + let commands = cache .get_all::()? .into_iter() - .filter(|command| { - command.intent_id == receipt.intent_id - && command.review_id == receipt.review_id - && command.runtime_job_id == receipt.runtime_job_id - && command.exit_code == "0" - && command.emitted_at <= receipt.emitted_at - }) - .max_by(|left, right| left.emitted_at.cmp(&right.emitted_at)) - .ok_or_else(|| anyhow!("Hands commit requires its successful command receipt"))?; + .filter(|command| command.intent_id == receipt.intent_id && command.exit_code == "0") + .collect::>(); + let [command] = commands.as_slice() else { + return Err(anyhow!( + "Hands commit requires one exact successful command receipt" + )); + }; let request = - derive_repo_frontier_verification_request_for_chain(&cache, &patch, &command, receipt)?; + derive_repo_frontier_verification_request_for_chain(&cache, patch, command, receipt)?; let context = repo_frontier_verification_context_with_commit(&cache, &request, Some(receipt))?; let snapshot = cache.snapshot_envelopes(); let mut expected = Vec::new(); @@ -7703,7 +7517,6 @@ pub fn put_hands_commit_receipt( context.hands_authority.authority_id.as_str(), ), (HandsActionIntent::TYPE, request.hands_intent_id.as_str()), - (HandsActionReview::TYPE, request.hands_review_id.as_str()), ( HandsPatchReceipt::TYPE, request.hands_patch_receipt_id.as_str(), diff --git a/epiphany-core/src/soul_gateway.rs b/epiphany-core/src/soul_gateway.rs index 09a093cf..93613a37 100644 --- a/epiphany-core/src/soul_gateway.rs +++ b/epiphany-core/src/soul_gateway.rs @@ -46,15 +46,13 @@ pub struct RepoFrontierVerificationRequest { #[cultcache(key = 7)] pub hands_intent_id: String, #[cultcache(key = 8)] - pub hands_review_id: String, - #[cultcache(key = 9)] pub hands_patch_receipt_id: String, - #[cultcache(key = 10)] + #[cultcache(key = 9)] pub hands_command_receipt_id: String, - #[cultcache(key = 11)] + #[cultcache(key = 10)] pub hands_commit_receipt_id: String, - #[cultcache(key = 12)] + #[cultcache(key = 11)] pub requested_at: String, - #[cultcache(key = 14)] + #[cultcache(key = 12)] pub frontier_authority_documents: Vec, } diff --git a/epiphany-core/src/surfaces/worker_launch.rs b/epiphany-core/src/surfaces/worker_launch.rs index af709e3b..e8a8adce 100644 --- a/epiphany-core/src/surfaces/worker_launch.rs +++ b/epiphany-core/src/surfaces/worker_launch.rs @@ -16,9 +16,9 @@ pub const REPO_FRONTIER_RESEARCH_CONTEXT_SCHEMA_VERSION: &str = pub const REPO_FRONTIER_RESEARCH_CONTEXT_CONTRACT: &str = "epiphany.repo_frontier_research_context.v3"; pub const REPO_FRONTIER_VERIFICATION_CONTEXT_SCHEMA_VERSION: &str = - "epiphany.worker.repo_frontier_verification_context.v1"; + "epiphany.worker.repo_frontier_verification_context.v2"; pub const REPO_FRONTIER_VERIFICATION_CONTEXT_CONTRACT: &str = - "epiphany.repo_frontier_verification_context.v1"; + "epiphany.repo_frontier_verification_context.v2"; pub const REPO_FRONTIER_PLAN_MIND_CONTEXT_SCHEMA_VERSION: &str = "epiphany.worker.repo_frontier_plan_mind_context.v0"; pub const REPO_FRONTIER_PLAN_MIND_CONTEXT_CONTRACT: &str = @@ -241,7 +241,6 @@ pub struct RepoFrontierVerificationContextProjection { pub route: crate::RepoFrontierRoute, pub hands_authority: crate::RepoFrontierHandsAuthority, pub hands_intent: crate::HandsActionIntent, - pub hands_review: crate::HandsActionReview, pub patch_receipt: crate::HandsPatchReceipt, pub command_receipt: crate::HandsCommandReceipt, pub commit_receipt: crate::HandsCommitReceipt, diff --git a/notes/hands-cultnet-contracts.md b/notes/hands-cultnet-contracts.md index 2eb01938..e0ad3f6b 100644 --- a/notes/hands-cultnet-contracts.md +++ b/notes/hands-cultnet-contracts.md @@ -10,27 +10,27 @@ receipts that can be verified or admitted into Mind state. - Inputs: typed action intents, Substrate Gate access grants, requested commands or patches, current repo policy, Soul verification requirements, and coordinator authority. -- Outputs: Hands action reviews, command receipts, patch receipts, commit - receipts, and action refusal receipts. +- Outputs: observed patch, command, and commit receipts. - Derived state: diffs, command logs, and commits are action receipts. They are not durable Mind state until Mind admits them. - Forbidden writers: raw workers, Persona, Eyes, Imagination, Self, compatibility JSON-RPC routes, and bridge tools must not execute repo-affecting commands, edit files, commit, or publish without the Hands path after Body access. -- Shared path: file edits, shell commands, and commits share Hands action - intent/review/receipt semantics. +- Shared path: file edits, shell commands, and commits share the exact adopted + route, action intent, Substrate Gate grant, frontier authority, and receipt + admission path. - Deletion line: Substrate Gate grants access; it does not execute. Soul verifies; it does not execute. Mind records durable state; it does not execute. ## Contract Families - `epiphany.hands.action_intent`: request for bounded action. -- `epiphany.hands.action_review`: Hands decision and execution plan. +- `epiphany.hands.repo_frontier_authority`: exact binding among the adopted + route, action intent, and Substrate Gate grant. - `epiphany.hands.command_receipt`: proof of command execution. - `epiphany.hands.patch_receipt`: proof of file mutation. - `epiphany.hands.commit_receipt`: proof of commit creation. -- `epiphany.hands.action_refusal_receipt`: proof that Hands refused to act. ## Neighboring Gates @@ -52,21 +52,28 @@ Epiphany may consume that provider-owned receipt after the local commit exists. The first runtime-spine proof chain now exists: ```text -HandsActionIntent --> HandsActionReview +RepoFrontierRoute + SubstrateGateRepoAccessGrantReceipt +-> HandsActionIntent + RepoFrontierHandsAuthority -> HandsPatchReceipt -> HandsCommandReceipt -> HandsCommitReceipt +-> RepoFrontierVerificationRequest ``` `epiphany-core::hands_gateway` owns the typed document bodies and constructors. -`epiphany-core::runtime_spine` can persist and reread the intent, review, patch, -command, and commit receipts from the runtime-spine CultCache store. -The launch organ contract's repo-action proof profile now requires the full -Hands chain, not only the final patch receipt. +`epiphany-core::runtime_spine` admits the intent and consequence receipts into +the runtime-spine CultCache store and atomically creates Verification work with +the commit. The typed CultCache documents are the process boundary; public Rust +helper functions are not a substitute ABI. `epiphany-mvp-coordinator` turns `continueImplementation` into a persisted -Substrate Gate grant plus Hands intent/review gate and exposes the exact receipt -identities required by downstream Verification. +Substrate Gate grant, Hands intent, and frontier authority, then exposes the +exact receipt families required by downstream Verification. + +There is no separate Hands review document. The coordinator formerly authored +the grant, intent, review, and authority in one function, and the review could +only repeat `approved` plus the grant operations. It was a paper authority, not +an independent decision. Consequences now validate directly against the route, +intent, grant, and authority. Epiphany currently has no admitted repository actuator. The former `epiphany-hands-action` executable only accepted operator-authored descriptions From 4177e186bbc4736772f53c93dee4633aa80c7adf Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 23:24:29 +0200 Subject: [PATCH 101/340] Record singular Hands authority chain --- notes/epiphany-current-algorithmic-map.md | 28 ++++++++++---- notes/epiphany-fork-implementation-plan.md | 10 +++++ notes/fresh-workspace-handoff.md | 42 ++++++++++++++------- state/ledgers.msgpack | Bin 726885 -> 727528 bytes state/map.yaml | 15 ++++---- 5 files changed, 66 insertions(+), 29 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 19b24ce6..ed69f419 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -104,10 +104,11 @@ artifacts without removing the prebuilt state tool. Atlas is untouched. Hands consequence receipts carry consequence, not doctrine commentary. Exact `65bf044f` removes fixed schema-version strings and unread contract prose from the patch, command, and commit documents. CultCache owns their type/schema -identity; admission still proves exact intent, review, Substrate Gate grant, -runtime job, affected paths or command, immutable receipt identity, and the -resulting consequence. Fourteen unused shadow type constants and one callerless -reorient display enum are also gone. Runtime advances to v29; old writable +identity; admission at that cut still proved the then-live intent, review, +Substrate Gate grant, runtime job, affected paths or command, immutable receipt +identity, and the resulting consequence. Fourteen unused shadow type constants +and one callerless reorient display enum are also gone. Runtime advances to +v29; old writable state refuses. The existing lifecycle proof carries Hands concurrently with a Persona admission and creates exact Verification work, while package cleanup removes the 678.6 MiB it generated. The cut removes 67 net maintained lines. @@ -554,9 +555,9 @@ Epiphany-authored facsimile. Exact `25d4d1fa` deletes a second fictional Hands branch: the callerless route- relinquishment writer, its refusal receipt, its Mind receipt, and both schema registrations. No scheduler, coordinator, actuator, admission owner, or test -consumed it. The live path is narrower: exact intent/review/grant authority, -then patch/command/commit receipts, with the commit atomically creating the -Verification request. Epiphany has no durable Hands-relinquishment lifecycle +consumed it. That intermediate path was narrower: exact intent/review/grant +authority, then patch/command/commit receipts, with the commit atomically +creating the Verification request. Epiphany has no durable Hands-relinquishment lifecycle until a real consequence owner requires and verifies one. Hands also does not record operator-authored descriptions as if they were @@ -568,6 +569,17 @@ receipt-chain admission and Verification projection remain ready for a future actuator that performs the operation and emits receipts from its own observed effects. +Exact `a01c6842` removes the remaining counterfeit review. The coordinator +created `HandsActionReview` as approved in the same function and instant as its +intent and grant; no independent reviewer or refusal producer existed. The +live chain is now adopted route plus Substrate Gate grant, minimal intent, and +`RepoFrontierHandsAuthority`, followed by exact patch, command, and commit +receipts. Receipt cargo derives job, grant, and route identity through the +intent and authority rather than copying them. Commit admission requires one +exact patch and one successful command receipt for the intent; a competing +receipt refuses instead of winning a timestamp race. Runtime is v46 and the +sealed Verification projection contract is v2. + The handoff from Hands to Soul has no transient aggregate. Exact `6ccc7dd2` deletes the 20-field receipt-chain summary and derives the Verification request directly from the persisted patch, command, and commit receipts plus the @@ -1129,7 +1141,7 @@ and decision context—not an ID/digest tombstone—and preserve typed failure cargo when the terminal process status is failure. Verification receives its complete Hands consequence chain in the sealed typed -projection: route, authority, intent, review, patch, command, and commit. Exact +projection: route, authority, intent, patch, command, and commit. Exact `24023265` deletes the second input path that exposed a governed tool for live runtime-store rereads of the same three receipts. The MCP schema/dispatch, prompt mandate, three public readers and exports, source executor store diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 405f0d5b..3f9afc0b 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -873,6 +873,16 @@ Cut in this order: deleted: 78 net lines. The consequence receipts and atomic Hands-to- Verification admission remain. Next map the missing production Hands actuator as an ABI boundary and demote only speculative public mouths. +56. **Hands review authority is deleted at `a01c6842`:** the coordinator's + same-function always-approved `HandsActionReview` had no independent reviewer + or refusal producer. Adopted route, Substrate Gate grant, minimal intent, + and frontier authority now form the complete authorization chain. Patch, + command, and commit consequences cite the intent and derive the remaining + identities. Commit admission requires exactly one patch and one successful + command; ambiguous competing receipts refuse instead of being ordered by + timestamp. Runtime advances to v46 and the sealed Verification projection + to v2. The cut removes 381 maintained lines net; core 152/152, coordinator + 4/4, and OpenAI runtime 21/21 pass. Do not preserve the aggregate for compatibility, manufacture a bootstrap thread, release autonomous scheduling, register topology in `gamecult-ops`, diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 704889c0..21918cde 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -223,8 +223,8 @@ bindings are deleted, so those identities cannot resurrect. Neither document duplicates a decision or transcript. Exact `24023265` deletes Verification's live Hands-receipt reread path. The -sealed Verification projection already contains the full intent, review, -authority, patch, command, and commit records. The extra MCP tool reopened the +sealed Verification projection already contains the full intent, authority, +patch, command, and commit records. The extra MCP tool reopened the mutable runtime store for decision-bearing input already fixed in the basis. Its tool schema, prompt mandate, dispatcher, source-store argument, three public read wrappers and exports, stale Substrate Gate allowlist entry, and one @@ -235,6 +235,21 @@ keyed lifecycle proof still commits concurrent Persona/Hands consequences and creates exact Verification work. Focused verification generated 4.909 GiB over 7,687 files; cleanup restored only the authenticated 1,776,640-byte state tool. +Exact `a01c6842` deletes `HandsActionReview`, which the coordinator created as +approved beside its own intent and grant. It had no independent reviewer or +refusal producer, so it was paperwork impersonating authority. The adopted +route owns the write ceiling, the Substrate Gate grant owns permitted +operations and paths, the minimal intent binds the runtime job to that grant, +and `RepoFrontierHandsAuthority` binds the exact route, intent, and grant. +Patch, command, and commit receipts cite the intent; their other causal facts +derive through that chain. Commit admission now requires exactly one patch and +one successful command receipt for the intent instead of selecting a latest +receipt by timestamp. Ambiguity refuses. Runtime advances to v46 and the sealed +Verification context to v2 with no compatibility reader. The cut removes 381 +maintained lines net. Core passes 152/152, the coordinator 4/4, and the OpenAI +runtime 21/21. Verification generated 5.8 GiB across 6,583 target files; +cleanup again restored only the authenticated state inspector. + Exact `a6cf9383` quarantines concrete Codex/OpenRouter authentication, credential reading, and network transport at the two release entrypoints that perform inference. `epiphany-openai-runtime` now owns only exact native-request @@ -1324,18 +1339,17 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action The Ox17 deployment lane remains paused. Continue subtraction from exact -`24023265` by mapping the remaining Hands consequence surface as an ABI -boundary: the coordinator's truthful `awaitingHandsExecutor` stop, exact -intent/review/grant, receipt constructors and writers, atomic commit-to- -Verification admission, sealed Verification projection, and the absent -production actuator. Preserve the consequence contract; do not fabricate a -daemon during the audit or keep speculative public mouths merely because a -future actuator may exist. Delete or demote only surfaces that no live or -explicitly adopted actuator contract requires, then resume the single-caller -runtime-spine/status/retention audit. Connector publication and Yggdrasil -caller admission remain queued behind source stabilization. Preserve keyed -Mind, direct Body-to-Modeling flow, and the complete Model Atlas vertical slice; -no live inter-swarm collaboration has run. +`a01c6842`. Map the remaining Codex provider boundary before changing it: the +decision context currently seals `EpiphanyOpenAiModelRequest`, then the release +edge derives the final `CodexProviderRequest` that crosses the standalone +daemon boundary. Collapse that two-request seam without moving prompts, tools, +retry, interpretation, or Mind admission into CodexConnector. Then reconcile +the consumer protocol pins and stale deployment maps. The 3,592-file vendored +Codex tree is excluded from every production build and has no nonhistorical +source consumer; preserve its current uncommitted edits before deciding its +deletion. Resume the single-caller runtime-spine audit after this boundary is +watertight. Preserve keyed Mind, direct Body-to-Modeling flow, OpenRouter as a +separate temporary provider edge, and the complete unrun Model Atlas slice. Yggdrasil previously exposed 96 GiB of dead native Cargo targets after interrupted full-workspace builds; exact cleanup returned the builder target diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 5fca31a0a7beaad21763daf79bcbf2e86c6989e3..9d2285177a3d1e58b58cb4f144973f2ebf326443 100644 GIT binary patch delta 558 zcmYk2v5wO~5Qecij=LBNbeGdLh(TOw$MNEX=%@f8kmwF7x@A2i3*KF4cb$;x3JM+o zBA2`YLOLNtjiBZwkSJ;B89N0O-;QQ>_Md;}=ZE;$S^V)JxSSoc{CIfl>GyNd;kUCJ z!8{1m>vi~M9R@@j&l6k31!9}HNbC^1MDO!DjDGB2dH014**F)L=HA%EEHxIu%OzjAgjba{3(6mIUAQ~KOQTP4 zA#oXlMMYPR9#@h&Y*$XFmTRBBFwa2n+VPTtotpTR=2^LE*AC}3YJtFOKQmVP6}hmc zp3Z<5rt+^HiqxsZ5MO45FEVm<5PgftU@5 T*@2h?h&h3nYx`6t?h7IS*K`-a diff --git a/state/map.yaml b/state/map.yaml index 357db201..d44b5bb0 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -112,10 +112,10 @@ current_status: semantic_cache_cut: Exact 856648de deletes the unused semantic-memory and workspace-coverage projection subsystem rather than preserving a second derived model of Mind. Four binaries, the local daemon supervisor, Qdrant/Ollama/Postgres configuration, projector policy/lifecycle/heartbeat/recovery state, semantic query/context packets, aggregate model revision/hash cargo, workspace file-cache reader, and Persona's always-empty semantic-recall fields are gone. No agent request builder or sealed reasoning projection consumed this cache. Modeling now reads the exact typed Body and keyed RepoModel projection directly; future retrieval evidence must enter through an earned typed provider receipt. Idunn remains the sole deployment and daemon-survival authority. Core 165/165, OpenAI runtime 25/25, and release construction 19/19 pass. repo_model_vocabulary_cut: Exact 6ea4ff3c deletes the redundant generic memory profile, dead SHA-1 ID factory, empty profile module, cache-only node/edge kinds, and impossible lifecycle variants. Exact 5218cf2c deletes the producerless RepoModel lifecycle-receipt family. Exact 8bb039af makes domains seed-owned and deletes the unreachable summary mutation/document/validation/registry path plus the test cargo that alone produced it. Exact ab1afc27 removes node salience/confidence and edge confidence because no owner read, validated, routed, or displayed those values. Modeling can author only the keyed repository operations advertised by its provider schema. Affected targets check cleanly; core remains 165/165, RepoModel 5/5, and reasoning-context 8/8. package_baseline: Exact d2ca66301fb6af4e7d2d27fff0b772b0f0fccdf4 remains the admitted production source and current symlink target. Its native serialized full-workspace gate passed with receipt SHA-256 de0fc6b360ce03493b13208d917dc8349801f03364617d966152c85846c47482. Idunn sealed 26 root-owned non-writable binaries plus release-witness.ccmp as release sha256-46407552b4a0937f63d2b7f2bd09a1dacb89d671a6e3807c97209159541aef06; witness-file SHA-256 is 348785ffb0fc3130d3b4538329870c6e6f8442a8da4a01b32fa9b7ffb1f01357. Source 9b9b5c85 also passed Idunn's native test gate under receipt SHA-256 6c6a71359f8c31297419665d2872f6982a89f84e197d71fc5b36a7fc86216093 and remains sealed as release sha256-30a910785a380224bbdbd56a7b742c8d058fa70cb72dab3562e3907903e0d191 with witness-file SHA-256 75bf52d31c56ea3b08e1a702273301c1db12a4b1ffae45e3d948ce8a29b50e1d. A foreign-target helper restarted Idunn during the Epiphany transaction; rollback restored d2ca, removed deployment.env, and left production Epiphany units inactive. OpenRouter model stealth/ox-alpha and its systemd-injected credential are readiness-proven. Idunn is active with zero restarts and its deployment brake is engaged. - summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. Exact edb5c3a3 deletes the launch, heartbeat, and terminal-result family identity mirrors: the sealed typed launch owns live pass identity and the archived attempt owns historical request identity. Exact cabdd6c3 separates immutable coordinator incarnation basis/terminality from minimal model-session admission and removes the remaining session prose, clocks, dead states, redundant options, and whole-store coordinator snapshot. Exact a46725a1 reduces runtime jobs to Queued/Completed/Failed admission latches and removes timestamp selection from Research. Exact 10a70afc derives job role/session ownership from sealed launches and model bindings, leaving the generic job as identity plus status. Exact 53e869c0 removes generic job-result evidence/artifact mirrors; exact 8eaa96c5 stops persisting generic result documents for structured worker decisions; exact 2c3335dc deletes the generic result family entirely and makes typed decisions, model receipts/failures, job status, and process claims own their respective terminal facts. Exact dbb00c2b retains the minimal live/archive session pair for explicit phase closure and retired-identity refusal while deleting display echoes and a wrapper. Exact 24023265 makes the sealed Verification projection the sole Hands receipt input and deletes the duplicate live reread path. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. + summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. Exact edb5c3a3 deletes the launch, heartbeat, and terminal-result family identity mirrors: the sealed typed launch owns live pass identity and the archived attempt owns historical request identity. Exact cabdd6c3 separates immutable coordinator incarnation basis/terminality from minimal model-session admission and removes the remaining session prose, clocks, dead states, redundant options, and whole-store coordinator snapshot. Exact a46725a1 reduces runtime jobs to Queued/Completed/Failed admission latches and removes timestamp selection from Research. Exact 10a70afc derives job role/session ownership from sealed launches and model bindings, leaving the generic job as identity plus status. Exact 53e869c0 removes generic job-result evidence/artifact mirrors; exact 8eaa96c5 stops persisting generic result documents for structured worker decisions; exact 2c3335dc deletes the generic result family entirely and makes typed decisions, model receipts/failures, job status, and process claims own their respective terminal facts. Exact dbb00c2b retains the minimal live/archive session pair for explicit phase closure and retired-identity refusal while deleting display echoes and a wrapper. Exact 24023265 makes the sealed Verification projection the sole Hands receipt input and deletes the duplicate live reread path. Exact a01c6842 deletes the coordinator's same-function always-approved Hands review, derives consequence authority through route/intent/grant identities, and refuses ambiguous receipt sets instead of selecting by timestamp. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. The pure OpenAI runtime library opens exact model execution and admits typed provider events. OpenRouter auth/networking remains a direct release-entrypoint boundary; Codex transport crosses the lean authenticated CodexConnector client ABI and no Codex auth, HTTP/SSE, Codex-home, or compiled Codex dependency remains in Epiphany. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Workers use one governed tool-capable route; no parallel no-tools mode survives. The sealed typed worker launch is the sole live owner of pass-family identity; terminal role results contain semantic decision cargo rather than routing echoes, and archived attempts retain historical request identity plus the structured decision. Runtime jobs are only mutable job-identity plus Queued/Completed/Failed admission latches; clocks, role/session mirrors, unowned intermediate states, and generic terminal-result documents are absent. Model bindings own model-session membership, sealed launches own outer-worker role, root membership is structural, and Research derives attempt authority as an exact set rather than timestamp order. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Structured role/reorientation outcomes terminalize jobs and process claims through exact-envelope CAS; native model receipt/failure records own model terminality, process claims own process death, and archives retain typed decisions including typed failures. Mind/runtime writable epochs are v11/v45. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. The pure OpenAI runtime library opens exact model execution and admits typed provider events. OpenRouter auth/networking remains a direct release-entrypoint boundary; Codex transport crosses the lean authenticated CodexConnector client ABI and no Codex auth, HTTP/SSE, Codex-home, or compiled Codex dependency remains in Epiphany. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Workers use one governed tool-capable route; no parallel no-tools mode survives. The sealed typed worker launch is the sole live owner of pass-family identity; terminal role results contain semantic decision cargo rather than routing echoes, and archived attempts retain historical request identity plus the structured decision. Runtime jobs are only mutable job-identity plus Queued/Completed/Failed admission latches; clocks, role/session mirrors, unowned intermediate states, and generic terminal-result documents are absent. Model bindings own model-session membership, sealed launches own outer-worker role, root membership is structural, and Research derives attempt authority as an exact set rather than timestamp order. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Structured role/reorientation outcomes terminalize jobs and process claims through exact-envelope CAS; native model receipt/failure records own model terminality, process claims own process death, and archives retain typed decisions including typed failures. Mind/runtime writable epochs are v11/v46. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. execution_binding_authority_cut: Exact ce6bff12 reduces model and tool execution bindings to the only facts they own. A model binding maps one native request to its runtime session and job; a tool binding maps one typed intent to its runtime session and job. Provider identity, source worker, reasoning basis, and model-request ancestry are no longer copied into bindings or compared through timestamp-shaped API arguments. Validation, retention, public-source lookup, worker terminality, decision sealing, and tool continuation reload the exact native request or tool intent. Runtime writable state advances to v37. Core, epoch refusal, transcript-free decision audit, OpenAI tool continuation, and the release-owned tool runtime pass. The cut removes 67 net source lines and leaves runtime_spine.rs at 9,300 physical lines with 50 public functions and 25 public structs. Verification generated 12.713 GiB across 19,134 files; Cargo cleanup restored the single 1.78 MiB state inspector. Atlas is untouched; no live inter-swarm collaboration has run. provider_transport_boundary_cut: Exact ed7357a2 removes Codex transport from Epiphany's compiled body. The complete epiphany-openai-codex-spine package, codex-login/codex-client graph, CODEX_HOME/auth.json readiness, direct Codex HTTP/SSE, and Codex credential creation/argv are gone. Model and Persona entrypoints use the lean typed client from exact CodexConnector 54d8bc2525b7e7fa1b9dd26b95871247ff4c7566 over authenticated loopback MessagePack; Connector owns Codex auth, transport, replay, and exact native/provider digest receipts. Epiphany retains sealed native/provider requests, strict schema/call-ID projection, tool continuation, decision admission, and typed receipt evidence. OpenRouter remains one direct ureq/Rustls boundary with its own credential and terminal-tool dialect. Model receipts advance to v1 and runtime to v38; caller identity, both request digests, and cached-token usage survive transcript deletion. The maintained non-lock source shrinks by 857 lines and Cargo.lock drops 4,830 lines. Core 150/150, runtime 21/21, adapter 5/5, model edge 12/12, Persona 1/1, exact launch checks, and focused no-deps Clippy pass. Two focused build roots totaling 10.8 GiB were removed; only the exact 1,776,640-byte state inspector at SHA-256 DD38855C6F092C2C53D2212A938E737643F41130F4681708840BA6075320A04E remains. Atlas is untouched and no collaboration acceptance is claimed. runtime_session_authority_cut: Exact cabdd6c3 removes coordinator process incarnations from the generic model-session aggregate. EpiphanyRuntimeSession now contains only grouping identity plus active/completed admission state. Immutable EpiphanyCoordinatorRunBasis records exact thread, resident launch, objective, and start provenance. Exact completion/failure receipts and process-death recovery compete through one deterministic EpiphanyCoordinatorRunTerminality identity, so one full typed authority wins while unrelated document inserts merge. Objective prose, clocks, coordinator notes, four unused status variants, the one-field session-options wrapper, and the dead whole-snapshot append helper are deleted. Runtime advances to v40 with no compatibility reader. The focused Core, model-failure audit, Persona, coordinator terminality/conflict, release coordinator, and release model-runtime checks pass. The code cut removes 62 maintained lines net. Verification created 6.3 GiB across 7,017 Cargo files; cleanup restored exactly the 1,776,640-byte state inspector at SHA-256 DD38855C6F092C2C53D2212A938E737643F41130F4681708840BA6075320A04E. Atlas remains untouched and no live inter-swarm collaboration is claimed. @@ -128,7 +128,8 @@ current_status: provider_stream_authority_cut: Exact fe118e13 makes OpenAI/OpenRouter events and receipts transient transport values. The runtime immediately normalizes them into the single persisted native model event/receipt family used by tool continuation, assistant reconstruction, terminal validation, and bounded retention. Duplicate provider writes, registrations, archive requirements, schema IDs, two public schemas/index rows, and the include-only model-runtime shell are gone; the exact provider request remains durable. Runtime advances to v28 and the catalog drops to 18 schemas. The cut removes 270 net maintained lines. Adapter 1/1, provider spine 14/14, reasoning context 8/8, runtime 23/23, model entrypoint 11/11, swarm 4/4, epoch refusal 1/1, and release construction 15/15 pass. Atlas is untouched; live inter-swarm collaboration remains unproven. cultnet_catalog_authority_cut: Exact dbed11b3 and 8bb0719b delete the hand-maintained JSON shadow registry. The nonexistent runtime-event contract and obsolete public archived-session tombstone schema disappear first. Runtime-local identity, session, job, binding, coordinator, native model/tool, and state-ledger schemas then disappear because no live CultNet provider carries them and several contradicted their Rust owners. Typed CultCache registration and owner-projected CultMesh state remain authoritative. The catalog has exactly three earned boundaries: the exact OpenAI-compatible provider request, gamecult.persona_state.v0, and epiphany.work_organ_state.v0. Parse/path/unindexed/forbidden-contract checks pass at 3/3/0/0/0. The cuts remove 850 net maintained lines. Atlas is untouched; live inter-swarm collaboration remains unproven. release_dependency_ownership_cut: Exact 695af6c6 deletes thirteen unowned Cargo dependency declarations, the last tracked marker for the extinct epiphany-openai-auth-spine crate, and one production-only unused import. The root release package no longer claims nine libraries absent from every executable source; affected leaf/dev manifests drop four more dead edges. The lock graph contracts from 757 to 732 packages and the source/manifest/lock delta is 284 net deletions. All nine production entrypoints, both affected libraries, and both affected library test targets compile individually. Package-scoped cleanup removes 56,581 disposable files and 124.2 GiB from the five compiled package caches; the shared target is 108.42 GiB and the prebuilt state tool remains healthy. Atlas is untouched; live inter-swarm collaboration remains unproven. - hands_receipt_authority_cut: Exact 65bf044f removes fixed schema-version strings and unread contract prose from Hands patch, command, and commit receipts. Their CultCache envelope owns type/schema identity; the exact intent, review, Substrate Gate grant, runtime job, consequence, and immutable receipt envelope remain the admission proof. Fourteen definition-only shadow type constants and one callerless reorient display enum are also gone. Runtime advances to v29 and old writable state refuses. The existing keyed lifecycle proof passes exact Hands through concurrent Persona admission into Verification, and package cleanup removes its 678.6 MiB compiler footprint. The cut removes 67 net maintained lines. Atlas is untouched; no live inter-swarm collaboration has run. + hands_receipt_authority_cut: Exact 65bf044f removes fixed schema-version strings and unread contract prose from Hands patch, command, and commit receipts. Their CultCache envelope owns type/schema identity; at that cut the exact intent, review, Substrate Gate grant, runtime job, consequence, and immutable receipt envelope remained the admission proof; exact a01c6842 subsequently removed the review and copied causal cargo. Fourteen definition-only shadow type constants and one callerless reorient display enum are also gone. Runtime advances to v29 and old writable state refuses. The existing keyed lifecycle proof passes exact Hands through concurrent Persona admission into Verification, and package cleanup removes its 678.6 MiB compiler footprint. The cut removes 67 net maintained lines. Atlas is untouched; no live inter-swarm collaboration has run. + hands_review_authority_cut: Exact a01c6842 deletes the same-function always-approved HandsActionReview and its public writer, review ID copies, and sealed Verification copy. The adopted route owns the write ceiling; the Substrate Gate grant owns permitted operations and paths; the minimal intent binds the runtime job to the grant; RepoFrontierHandsAuthority binds route, intent, and grant. Consequence receipts cite the intent and derive other causal identity through that chain. Commit admission requires exactly one patch and one successful command receipt and refuses ambiguity rather than selecting by timestamp. Runtime advances to v46 and the sealed Verification context to v2 with no legacy reader. The cut removes 381 maintained lines net; core 152/152, coordinator 4/4, and OpenAI runtime 21/21 pass. Verification generated 5.8 GiB across 6,583 target files; cleanup restored the single 1,776,640-byte inspector. autonomous_proposal_origin_authority_cut: Exact d9a196a0 makes RepoFrontierProposalModelingRequest the sole durable owner of autonomous proposal origin. It carries the exact direction result, option ordinal, and worker job identities. The separate binding type, schema constant, registry entry, third CAS envelope, replay collision branch, and worker-result/launch hash echoes are gone. The referenced launch and result remain immutable typed documents and promotion strongly reads them atomically with the proposal/request pair. Runtime advances to v30. The full keyed lifecycle passes promotion, concurrent launch, retry ancestry, Modeling admission, concurrent Persona/Hands, and Verification; package cleanup removes 677.6 MiB. The cut removes 53 net maintained lines. Atlas is untouched; live inter-swarm collaboration remains unproven. repository_domain_binding_cut: Exact 6f5d6600 keeps the immutable typed repository-domain receipt but reduces it to its two causal facts, the canonical organizational repository name and exact authenticated Body hash. CultCache owns envelope type, key, and schema; the authenticated Body route owns runtime, swarm, and workspace; binding time and fixed prose own no decision. Binding still validates the live Body and atomically strong-reads runtime identity plus Body route, while promotion and fulfillment refuse repository or Body-hash substitution. Runtime advances to v31. The full keyed lifecycle and old-store refusal pass; package cleanup removes 677.2 MiB. The cut removes 50 net maintained lines. Atlas remains protected until a real inter-swarm collaboration trial exercises the complete crossing. operator_objective_intake_cut: Exact 952dcd9f preserves the typed human assertion and atomic singleton Mind-objective commit while deleting four persisted echoes: fixed schema prose, key identity, objective digest, and contract text. The public outcome now returns only the Mind projection digest, exact commit receipt, and whether the commit changed state; it no longer carries a full intake or over-broad Mind view. The coordinator-binary test that merely replayed the library seed/idempotency/refusal proof is gone; the library proof is strengthened to require byte-identical replay and the wrapper-specific resident-grant provenance proof remains. Runtime advances to v32. All three focused proofs pass. The maintained cut removes 54 net lines. Package cleanup removed 18.5 GiB, then the 1.7 MiB state tool was preserved across cleanup of 961.1 MiB regenerated artifacts. Atlas is untouched. @@ -222,10 +223,10 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability; it still mixes immutable identity, model sessions/jobs, process claims, model/tool execution binding, family request admission, consequence receipts, retention, and narrow identity/schema reads. The sealed launch solely owns live family identity and archived attempts own retained request identity. Exact cabdd6c3 removes coordinator runs from the generic session aggregate; exact a46725a1 removes job clocks and dead states; exact 10a70afc reduces the job itself to identity plus Queued/Completed/Failed status; exact 2c3335dc deletes generic terminal results. The completed model-session audit retains the live latch and private retirement tombstone for separate phase-boundary and resurrection-fence invariants; neither is a display aggregate. The sharper open boundary is Hands: the exact intent/review/grant and patch/command/commit-to-Verification contracts are consequential and proven, but no production actuator currently authors those consequence receipts. The coordinator therefore stops truthfully at awaitingHandsExecutor. Do not delete the consequence contract to make the absence look smaller, and do not preserve speculative public writers without mapping the future daemon/ABI owner. The current gamecult-ops Epiphany unit has retired agent-store and daemon-id argv that its owning lane must fix before deployment. Bifrost's Discord delivery path remains an earned privilege boundary and its Yggdrasil issuer/crossing route still requires owning-lane repair before Persona consequence readiness. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Continue source subtraction from exact 24023265. Map the remaining Hands consequence surface as an ABI boundary: coordinator stop state, exact intent/review/grant, receipt constructors and writers, atomic commit-to-Verification admission, sealed Verification projection, and the missing production actuator. Preserve the typed consequence chain and refuse to fabricate a daemon during this audit; delete or demote only public writers, constructors, tests, or prompt/tool cargo that no live or explicitly adopted actuator contract requires. Then resume the single-caller runtime-spine/status/retention audit. Keep the standalone Connector readiness/Idunn/Yggdrasil/Ghostlight deployment sequence queued until the source body stabilizes. Preserve one refresh writer, consumer-owned prompts/tools/admission, and the complete unrun Model Atlas vertical slice. Do not run a local full-workspace compile, package, live credential transfer, Ox root, or Model Atlas Gate run. + unresolved_authority: `runtime_spine.rs` remains the largest central liability; it still mixes immutable identity, minimal model sessions/jobs, process claims, model/tool execution binding, family admission, consequence receipts, retention, and resurrection fences. Exact a01c6842 removes the counterfeit Hands review; route, Substrate Gate grant, minimal intent, frontier authority, and exact consequences now own that chain. No production actuator authors those receipts, so the coordinator truthfully stops at `awaitingHandsExecutor`. The sharper provider seam is now Codex: Mind seals `EpiphanyOpenAiModelRequest`, while the release edge derives the final `CodexProviderRequest` sent to the standalone daemon. That second derivation must be collapsed or sealed exactly without moving consumer cognition into CodexConnector. The 3,592-file vendored Codex tree has no production build consumer but contains uncommitted edits that must be preserved before deletion. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Continue source subtraction from exact a01c6842. Map the two-stage Codex request lowering and make the exact final daemon request the audited provider request while preserving consumer-owned prompts, tools, retry, interpretation, and Mind admission. Reconcile Epiphany/Ghostlight/Connector protocol pins and repair stale standalone-daemon deployment maps. Then preserve the current uncommitted vendored-Codex edits and delete the 3,592-file tree if the final live-consumer audit remains empty. Resume the single-caller runtime-spine audit afterward. Keep OpenRouter as a separate temporary provider edge, Model Atlas operationally paused, and avoid local workspace-wide builds or deployment mutation. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, minimal model sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. The sealed typed worker launch owns live pass-family identity and outer-worker role. Model execution bindings own model-session membership; outer-worker root membership is structural. Archived worker attempts retain exact request kind/ID, deletion digest, decision context, and full typed structured outcome after live launch deletion, including typed failures. Model sessions carry only grouping identity plus the active/completed phase latch; completed-session retention derives its exact jobs from model bindings and writes one private tombstone containing retired identities plus the deletion-chain digest. The live and archived documents protect distinct admission and resurrection invariants and do not duplicate decision cargo. Runtime jobs carry only job identity plus the Queued/Completed/Failed latch. No job clock, role/session mirror, intermediate status, generic terminal-result document, latest-result selector, or model-turn identity echo participates in causality. Typed role/reorientation outcomes own structured terminal decisions and atomically close their job/process physiology; native model receipt/failure records own model-pass terminality; process claims own process death. Verification reasons from the exact Hands receipt bodies sealed in its basis and has no live receipt-reread tool. Mind/runtime writable epochs remain v11/v45; archived worker attempts are v3. Family launch CAS, model execution, and coordinator basis admission are the only session/job creation owners. Continue subtraction at the Hands actuator ABI and then the remaining single-caller runtime-spine surfaces; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, minimal model sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. The sealed typed worker launch owns live pass-family identity and outer-worker role. Model execution bindings own model-session membership; outer-worker root membership is structural. Archived worker attempts retain exact request kind/ID, deletion digest, decision context, and full typed structured outcome after live launch deletion, including typed failures. Model sessions carry only grouping identity plus the active/completed phase latch; completed-session retention derives its exact jobs from model bindings and writes one private tombstone containing retired identities plus the deletion-chain digest. The live and archived documents protect distinct admission and resurrection invariants and do not duplicate decision cargo. Runtime jobs carry only job identity plus the Queued/Completed/Failed latch. No job clock, role/session mirror, intermediate status, generic terminal-result document, latest-result selector, or model-turn identity echo participates in causality. Typed role/reorientation outcomes own structured terminal decisions and atomically close their job/process physiology; native model receipt/failure records own model-pass terminality; process claims own process death. Verification reasons from the exact route, authority, intent, patch, command, and commit bodies sealed in its basis and has no review document or live receipt-reread tool. Mind/runtime writable epochs remain v11/v46; archived worker attempts are v3. Family launch CAS, model execution, and coordinator basis admission are the only session/job creation owners. Continue subtraction at the exact Codex request seam and then the remaining single-caller runtime-spine surfaces; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. @@ -244,7 +245,7 @@ organ_readiness: eyes: local and copied Linux source-gathering circuits are proven. Immutable GitHub identity, execution revalidation without a grant, frontier-owned continuation, request-owned exact public-source coverage, sealed decision context, and keyed evidence/observation admission share typed owners. Exact c7412998 makes one Research lifecycle own launch, terminal decision durability, review, and Eyes.frontier_research admission; full RepoModel state is audit cargo while the exact frontier closure owns conflicts. Exact 3d13b1ea rejects zero, partial, or unrequested public lookup sets. Exact c40aa286 shares terminal receipt validation across provider and Mind. Exact packaged f90f1186 completed two immutable public lookup and Mind-acceptance cycles, advanced authenticated tool receipts from 53 to 61, produced no Hands consequence, survived process turnover, and stopped braked with both daemons exiting zero. GitHub's August 2026 service incidents are classified as external provider downtime; they do not falsify Epiphany's source identity or gate ownership. Denial-before-network and successful immutable lookup remain separate proofs. modeling: proven for the current bounded Windows circuit, the causal Linux resident Eyes-to-Modeling route, governed live directory observation, typed resident grant sight, first-attempt proposal-frontier publication, and single-consumption coordinator review. Exact d367e525 proves the full frontier-verdict lifecycle from atomic Soul request through deterministic launch, sealed decision, disjoint keyed merge, same-frontier refusal, and Modeling.frontier_verdict admission. Exact d4907ee8 proves one outer proposal job, one terminal review, post-transaction awaitFrontierProposal publication, and no replay. Broader Body-map coverage remains open. imagination: proven for three bounded live circuits, exact packaged receipt-free settlement, and genuine packaged model-produced option generation. Exact acd91e6e accepted signed public feedback into one proposal-only request, derived all causal identity and quoted-evidence references from authenticated runtime context, atomically published worker result plus candidate companion, settled Self once without retry, and neither adopted the proposal nor granted Hands. The rejected b661ec4b copied run remains evidence that model-authored evidence identifiers were an illicit provenance mouth; its three failed attempts were braked and sealed. - hands: proven for bounded consequences; native patch, command, commit, push, and typed receipts bind reviewed path ceilings to exact changed-path subsets. + hands: proven for bounded consequences; native patch, command, commit, push, and typed receipts bind adopted route ceilings to exact changed-path subsets. soul: proven for the current bounded route-chain consequence; exact d367e525 makes Verification acceptance atomically own the Soul verdict and deterministic frontier-Modeling request rather than relying on later accepted-at selection. Exact d3bfbda0 launched Verification through typed plan-decision provenance, result f23fe2b6 was accepted at revision 57, and Self then derived Modeling before any repeated Hands authority. mind: proven for launch-owned resident frontier adjudication; two historical attempts failed closed, exact bd96305e derived immutable identity from authenticated launch, authorized retry 2d2a3e8b completed, and Self atomically committed terminal adopt decision e7d7f3c7. Broader memory retention and long-duration behavior remain open. continuity: partial; authenticated 55660d78 terminalized the copied v28 dead worker once and refused duplicate restart, while sealed v28 remained unchanged. Exact 100d8854 closes only all-terminal sessions, emits one deterministic event, and refuses post-close jobs. Exact 42bc665a proves bounded retention and restart sequence recovery. A digest-pinned Linux runtime-spine at b5140288 repeated closure invariants on Yggdrasil. Authenticated c005 proves typed resident state survives hard exit, executable-body replacement, runtime-topology correction, and restart while preserving awaitFrontierProposal. Exact b8138a6b proves active-child and idle SIGTERM closure with exit zero and final braked state. Exact c930f505 proves cross-container resident ownership refusal without state mutation while Heartbeat retains its distinct typed lock. Exact ed15f83a packages resident lifecycle retention. Exact 16c4b19f packages coordinator receipt retention without resurrection. Exact 75b84180 packaged Linux proves worker start gating, claimed/active orphan death recovery, canonical resident requeue, and one distinct same-request retry without dual live authority. Exact 7637b1cf packages and proves atomic generic job/result/event plus terminal-failure process closure, canonical resident settlement, and a distinct same-request retry with no dual live authority. Exact 2e66433f packaged Self proves admitted-model-direction valid-result-before-receipt closes once without retry. Exact 52ee6b53 packages the corrected full-backing resident retention fence. Exact 53678374 packages authenticated failed and fulfilled outer-worker archival: window one retires only the older exact seven-envelope family, retained authority stays live, archived failure cannot resurrect, and archived fulfillment remains queryable. Direct packaged proposal Modeling and deployed journald ownership are accepted. Exact a4756857 packages CultCache 0ba8745 and proves named-volume publication across forty SIGKILL writers plus ten million concurrent lockless reads. Exact f04abd6b restarts a sealed braked resident with startup maintenance, stable revision/hashes, no grant resurrection, 0.36% sampled CPU, and a second clean SIGTERM exit zero. From c37cae8bc132b2a2b5597263b68cdc90add13add Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 23:44:57 +0200 Subject: [PATCH 102/340] Seal exact provider requests before transport --- Cargo.lock | 3 +- Cargo.toml | 2 +- epiphany-core/src/reasoning_context.rs | 66 +++--- epiphany-core/src/runtime_spine.rs | 26 +-- epiphany-openai-adapter/Cargo.toml | 1 + epiphany-openai-adapter/src/lib.rs | 204 ++++++++++++------ .../src/bin/epiphany-openai-runtime.rs | 22 +- epiphany-openai-runtime/src/lib.rs | 46 ++-- .../src/persona_executor.rs | 2 +- .../src/provider_transport.rs | 122 ++--------- 10 files changed, 242 insertions(+), 252 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index daebe993..319d7bb6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -242,7 +242,7 @@ dependencies = [ [[package]] name = "codex-connector" version = "0.1.0" -source = "git+https://github.com/GameCult/CodexConnector?rev=54d8bc2525b7e7fa1b9dd26b95871247ff4c7566#54d8bc2525b7e7fa1b9dd26b95871247ff4c7566" +source = "git+https://github.com/GameCult/CodexConnector?rev=89d965b0495ba817a1e48adda0a28509d6637d31#89d965b0495ba817a1e48adda0a28509d6637d31" dependencies = [ "aes-gcm", "base64 0.23.1", @@ -572,6 +572,7 @@ name = "epiphany-openai-adapter" version = "0.1.0" dependencies = [ "anyhow", + "codex-connector", "cultcache-rs", "epiphany-model-adapter", "serde", diff --git a/Cargo.toml b/Cargo.toml index f208bbc6..69754984 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,7 +29,7 @@ epiphany-core = { path = "epiphany-core" } epiphany-model-adapter = { path = "epiphany-model-adapter" } epiphany-openai-adapter = { path = "epiphany-openai-adapter" } epiphany-openai-runtime = { path = "epiphany-openai-runtime", optional = true } -codex-connector = { git = "https://github.com/GameCult/CodexConnector", rev = "54d8bc2525b7e7fa1b9dd26b95871247ff4c7566", default-features = false, optional = true } +codex-connector = { git = "https://github.com/GameCult/CodexConnector", rev = "89d965b0495ba817a1e48adda0a28509d6637d31", default-features = false, features = ["client"], optional = true } epiphany-tool-adapter = { path = "epiphany-tool-adapter" } epiphany-tool-mcp-runtime = { path = "epiphany-tool-mcp-runtime", optional = true } rmp-serde = "1" diff --git a/epiphany-core/src/reasoning_context.rs b/epiphany-core/src/reasoning_context.rs index 781b1b20..13c55b5f 100644 --- a/epiphany-core/src/reasoning_context.rs +++ b/epiphany-core/src/reasoning_context.rs @@ -7,7 +7,9 @@ use crate::{ use anyhow::{Result, anyhow}; use cultcache_rs::{CacheBackingStore, CultCache, CultCacheEnvelope, DatabaseEntry}; use epiphany_model_adapter::EpiphanyModelRequest; -use epiphany_openai_adapter::EpiphanyOpenAiModelRequest; +use epiphany_openai_adapter::EpiphanyProviderRequest; +#[cfg(test)] +use epiphany_openai_adapter::EpiphanyProviderRequestPayload; use epiphany_tool_adapter::{ EpiphanyToolInvocationIntent, EpiphanyToolInvocationReceipt, receipt_output_for_model, tool_invocation_intent_key, tool_invocation_receipt_key, @@ -18,7 +20,7 @@ use std::collections::BTreeSet; use std::path::Path; pub const REASONING_BASIS_SCHEMA_VERSION: &str = "epiphany.reasoning_basis.v1"; -pub const DECISION_CONTEXT_SCHEMA_VERSION: &str = "epiphany.decision_context.v2"; +pub const DECISION_CONTEXT_SCHEMA_VERSION: &str = "epiphany.decision_context.v3"; pub const MODEL_PASS_FAILURE_SCHEMA_VERSION: &str = "epiphany.model_pass_failure.v1"; pub const MIND_COMMIT_RECEIPT_SCHEMA_VERSION: &str = "epiphany.mind_commit_receipt.v1"; pub const DECISION_AUDIT_PROJECTION_SCHEMA_VERSION: &str = "epiphany.decision_audit_projection.v1"; @@ -342,7 +344,7 @@ pub struct EpiphanyDecisionToolObservation { #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache( - type = "epiphany.decision_context.v2", + type = "epiphany.decision_context.v3", schema = "EpiphanyDecisionContext" )] pub struct EpiphanyDecisionContext { @@ -369,7 +371,7 @@ impl EpiphanyDecisionContext { tool_observations: Vec, ) -> Result { basis.validate()?; - let provider_request = epiphany_openai_adapter::request_from_native(&native_request); + let provider_request = epiphany_openai_adapter::request_from_native(&native_request)?; validate_request_pair(basis, &native_request, &provider_request)?; validate_tool_observations(&native_request, &tool_observations)?; let mut context = Self { @@ -411,7 +413,7 @@ impl EpiphanyDecisionContext { .map_err(|error| anyhow!("decision native request is invalid: {error}")) } - pub fn provider_request(&self) -> Result { + pub fn provider_request(&self) -> Result { rmp_serde::from_slice(&self.provider_request_msgpack) .map_err(|error| anyhow!("decision provider request is invalid: {error}")) } @@ -633,7 +635,7 @@ pub struct EpiphanyDecisionAuditProjection { pub decision_context: EpiphanyDecisionContext, pub reasoning_projection: EpiphanyReasoningProjection, pub terminal_native_request: EpiphanyModelRequest, - pub terminal_provider_request: EpiphanyOpenAiModelRequest, + pub terminal_provider_request: EpiphanyProviderRequest, pub tool_observations: Vec, pub terminal_records: EpiphanyDecisionTerminalRecords, pub mind_commit_receipts: Vec, @@ -1340,7 +1342,7 @@ fn validate_context_store_ownership( .as_ref() != Some(&native) || cache - .get::(&provider.request_id)? + .get::(provider.request_id())? .as_ref() != Some(&provider) { @@ -1692,12 +1694,12 @@ fn commit_authorized_mind_mutation( fn validate_request_pair( basis: &EpiphanyReasoningBasis, native: &EpiphanyModelRequest, - provider: &EpiphanyOpenAiModelRequest, + provider: &EpiphanyProviderRequest, ) -> Result<()> { if native.reasoning_basis_id.as_deref() != Some(basis.basis_id.as_str()) { return Err(anyhow!("model request does not bind its reasoning basis")); } - if provider != &epiphany_openai_adapter::request_from_native(native) { + if provider != &epiphany_openai_adapter::request_from_native(native)? { return Err(anyhow!("native and provider terminal requests diverge")); } Ok(()) @@ -1981,9 +1983,7 @@ mod tests { ) } - fn requests( - basis: &EpiphanyReasoningBasis, - ) -> (EpiphanyModelRequest, EpiphanyOpenAiModelRequest) { + fn requests(basis: &EpiphanyReasoningBasis) -> (EpiphanyModelRequest, EpiphanyProviderRequest) { let mut native = EpiphanyModelRequest::new( "request-1", "conversation-1", @@ -1995,25 +1995,7 @@ mod tests { native.input.push(EpiphanyModelInputItem::UserText { text: "projection".into(), }); - let provider = EpiphanyOpenAiModelRequest { - schema_id: epiphany_openai_adapter::OPENAI_ADAPTER_REQUEST_SCHEMA_ID.into(), - request_id: native.request_id.clone(), - conversation_id: native.conversation_id.clone(), - model: native.model.clone(), - instructions: native.instructions.clone(), - input: vec![epiphany_openai_adapter::EpiphanyOpenAiInputItem::UserText { - text: "projection".into(), - }], - reasoning_effort: None, - reasoning_summary: None, - service_tier: None, - output_contract_id: None, - previous_response_id: None, - tools: Vec::new(), - output_schema_json: None, - provider_id: native.provider.clone(), - wire_dialect: epiphany_openai_adapter::EpiphanyOpenAiWireDialect::Responses, - }; + let provider = epiphany_openai_adapter::request_from_native(&native).unwrap(); (native, provider) } @@ -2060,7 +2042,12 @@ mod tests { let (native, _) = requests(&reasoning_basis); let context = EpiphanyDecisionContext::new(&reasoning_basis, native.clone(), Vec::new())?; let mut substituted_provider_input = context.provider_request()?; - substituted_provider_input.input.clear(); + match &mut substituted_provider_input.payload { + EpiphanyProviderRequestPayload::Codex(request) => request.input.clear(), + EpiphanyProviderRequestPayload::OpenRouter(_) => { + panic!("test fixture must lower to the Codex provider contract") + } + } let mut substituted_provider_context = context; substituted_provider_context.provider_request_msgpack = rmp_serde::to_vec_named(&substituted_provider_input)?; @@ -2085,7 +2072,7 @@ mod tests { )?; assert_eq!( tool_context.provider_request()?, - epiphany_openai_adapter::request_from_native(&native_with_substituted_tools), + epiphany_openai_adapter::request_from_native(&native_with_substituted_tools)?, "provider request must be derived from the complete native request" ); @@ -2179,14 +2166,13 @@ mod tests { let context = EpiphanyDecisionContext::new(&reasoning_basis, native.clone(), Vec::new())?; let provider = context.provider_request()?; - assert_eq!(provider.provider_id, "openrouter"); - assert_eq!( - provider.wire_dialect, - epiphany_openai_adapter::EpiphanyOpenAiWireDialect::ChatCompletionsTerminalTool - ); + assert!(matches!( + provider.payload, + EpiphanyProviderRequestPayload::OpenRouter(_) + )); assert_eq!( provider, - epiphany_openai_adapter::request_from_native(&native) + epiphany_openai_adapter::request_from_native(&native)? ); Ok(()) } @@ -2608,7 +2594,7 @@ mod tests { assert_eq!(audit.context_id, context.context_id); assert_eq!(audit.reasoning_basis, basis); assert_eq!(audit.terminal_native_request.request_id, "request-1"); - assert_eq!(audit.terminal_provider_request.request_id, "request-1"); + assert_eq!(audit.terminal_provider_request.request_id(), "request-1"); assert_eq!( audit.terminal_records.role_worker_results, vec![terminal_result.clone()] diff --git a/epiphany-core/src/runtime_spine.rs b/epiphany-core/src/runtime_spine.rs index 023a21ff..2f35cec0 100644 --- a/epiphany-core/src/runtime_spine.rs +++ b/epiphany-core/src/runtime_spine.rs @@ -34,7 +34,7 @@ use epiphany_model_adapter::EpiphanyModelReceipt; use epiphany_model_adapter::EpiphanyModelRequest; use epiphany_model_adapter::EpiphanyModelStreamEvent; use epiphany_model_adapter::EpiphanyModelStreamPayload; -use epiphany_openai_adapter::EpiphanyOpenAiModelRequest; +use epiphany_openai_adapter::EpiphanyProviderRequest; use epiphany_tool_adapter::EpiphanyToolInvocationIntent; use epiphany_tool_adapter::EpiphanyToolInvocationReceipt; use epiphany_tool_adapter::TOOL_ADAPTER_INVOCATION_INTENT_SCHEMA_ID; @@ -55,7 +55,7 @@ pub const COORDINATOR_RUN_RECEIPT_TYPE: &str = "epiphany.coordinator_run_receipt pub const RUNTIME_IDENTITY_KEY: &str = "self"; pub const RUNTIME_SWARM_BINDING_KEY: &str = "runtime-swarm-binding"; pub const RUNTIME_SWARM_BINDING_SCHEMA_VERSION: &str = "epiphany.runtime.swarm_binding.v1"; -pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v46"; +pub const RUNTIME_SPINE_SCHEMA_VERSION: &str = "epiphany.runtime_spine.v47"; pub const EPIPHANY_RUNTIME_ROOT_SESSION_ID: &str = "epiphany-main"; #[derive(Clone, Debug, PartialEq, DatabaseEntry)] #[cultcache(type = "epiphany.runtime.identity", schema = "EpiphanyRuntimeIdentity")] @@ -700,7 +700,7 @@ fn runtime_spine_schema_cache() -> Result { cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; - cache.register_entry_type::()?; + cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; cache.register_entry_type::()?; @@ -1078,7 +1078,7 @@ pub fn open_runtime_model_execution( validate_non_empty(&job_options.job_id, "model execution job id")?; validate_non_empty(&model_request.request_id, "model execution request id")?; validate_non_empty(&model_request.provider, "model execution provider")?; - let provider_request = epiphany_openai_adapter::request_from_native(model_request); + let provider_request = epiphany_openai_adapter::request_from_native(model_request)?; let store_path = store_path.as_ref(); let mut cache = runtime_spine_cache(store_path)?; @@ -1173,7 +1173,7 @@ pub fn open_runtime_model_execution( .get::(&model_request.request_id)? .is_some() || cache - .get::(&provider_request.request_id)? + .get::(provider_request.request_id())? .is_some() { return Err(anyhow!( @@ -1210,7 +1210,7 @@ pub fn open_runtime_model_execution( .prepare_entry(&model_request.request_id, model_request)? .0, cache - .prepare_entry(&provider_request.request_id, &provider_request)? + .prepare_entry(provider_request.request_id(), &provider_request)? .0, ]; replacements.extend(source_worker_envelopes); @@ -1320,7 +1320,7 @@ pub fn put_runtime_tool_execution_intent( for envelope in [ cache.get_envelope::(model_request_id)?, cache.get_envelope::(model_request_id)?, - cache.get_envelope::(model_request_id)?, + cache.get_envelope::(model_request_id)?, ] { let envelope = envelope.ok_or_else(|| { anyhow!( @@ -1388,7 +1388,7 @@ pub(crate) fn validate_runtime_model_execution_binding( .get::(request_id)? .ok_or_else(|| anyhow!("model execution binding {request_id:?} lost its native request"))?; let provider = cache - .get::(request_id)? + .get::(request_id)? .ok_or_else(|| { anyhow!("model execution binding {request_id:?} lost its provider request") })?; @@ -1399,7 +1399,7 @@ pub(crate) fn validate_runtime_model_execution_binding( .get::(&binding.job_id)? .ok_or_else(|| anyhow!("model execution binding {request_id:?} lost its job"))?; if binding.request_id != request_id - || provider != epiphany_openai_adapter::request_from_native(&native) + || provider != epiphany_openai_adapter::request_from_native(&native)? { return Err(anyhow!( "model execution binding {request_id:?} is not one exact request family" @@ -1734,10 +1734,10 @@ fn archive_completed_model_session( for native_request in &native_requests { let request_id = &native_request.request_id; let provider_request = cache - .get::(request_id)? + .get::(request_id)? .ok_or_else(|| anyhow!("archived model execution lost provider request"))?; - if provider_request.request_id != *request_id - || provider_request != epiphany_openai_adapter::request_from_native(native_request) + if provider_request.request_id() != request_id + || provider_request != epiphany_openai_adapter::request_from_native(native_request)? { return Err(anyhow!( "archived model execution request family is inconsistent" @@ -1865,7 +1865,7 @@ fn archive_completed_model_session( binding.request_id.clone(), )); retired_identities.insert(( - EpiphanyOpenAiModelRequest::TYPE.to_string(), + EpiphanyProviderRequest::TYPE.to_string(), binding.request_id.clone(), )); for event in cache diff --git a/epiphany-openai-adapter/Cargo.toml b/epiphany-openai-adapter/Cargo.toml index 6fc79709..575cbf6d 100644 --- a/epiphany-openai-adapter/Cargo.toml +++ b/epiphany-openai-adapter/Cargo.toml @@ -11,6 +11,7 @@ path = "src/lib.rs" [dependencies] anyhow = "1" +codex-connector = { git = "https://github.com/GameCult/CodexConnector", rev = "89d965b0495ba817a1e48adda0a28509d6637d31", default-features = false } cultcache-rs = { path = "../vendor/cultcache-rs" } epiphany-model-adapter = { path = "../epiphany-model-adapter" } serde = { version = "1", features = ["derive"] } diff --git a/epiphany-openai-adapter/src/lib.rs b/epiphany-openai-adapter/src/lib.rs index ca2f5c89..698df1d8 100644 --- a/epiphany-openai-adapter/src/lib.rs +++ b/epiphany-openai-adapter/src/lib.rs @@ -1,52 +1,64 @@ +use anyhow::{Result, anyhow}; +use codex_connector::{CodexInputItem, CodexProviderRequest, CodexToolChoice, CodexToolDefinition}; use cultcache_rs::DatabaseEntry; use epiphany_model_adapter::{EpiphanyModelInputItem, EpiphanyModelRequest}; use serde::Deserialize; use serde::Serialize; use sha2::{Digest, Sha256}; -pub const OPENAI_ADAPTER_REQUEST_SCHEMA_ID: &str = "epiphany.openai_model_request.v1"; -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -pub enum EpiphanyOpenAiWireDialect { - Responses, - ChatCompletionsTerminalTool, -} - #[derive(Debug, Clone, PartialEq, DatabaseEntry)] #[cultcache( - type = "epiphany.openai_model_request.v1", - schema = "EpiphanyOpenAiModelRequest" + type = "epiphany.provider_request.v2", + schema = "EpiphanyProviderRequest" )] -pub struct EpiphanyOpenAiModelRequest { +pub struct EpiphanyProviderRequest { #[cultcache(key = 0)] - pub schema_id: String, - #[cultcache(key = 1)] + pub payload: EpiphanyProviderRequestPayload, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum EpiphanyProviderRequestPayload { + Codex(CodexProviderRequest), + OpenRouter(EpiphanyOpenAiModelRequest), +} + +impl EpiphanyProviderRequest { + pub fn request_id(&self) -> &str { + match &self.payload { + EpiphanyProviderRequestPayload::Codex(request) => &request.request_id, + EpiphanyProviderRequestPayload::OpenRouter(request) => &request.request_id, + } + } + + pub fn conversation_id(&self) -> &str { + match &self.payload { + EpiphanyProviderRequestPayload::Codex(request) => &request.conversation_id, + EpiphanyProviderRequestPayload::OpenRouter(request) => &request.conversation_id, + } + } + + pub fn model(&self) -> &str { + match &self.payload { + EpiphanyProviderRequestPayload::Codex(request) => &request.model, + EpiphanyProviderRequestPayload::OpenRouter(request) => &request.model, + } + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct EpiphanyOpenAiModelRequest { pub request_id: String, - #[cultcache(key = 2)] pub conversation_id: String, - #[cultcache(key = 3)] pub model: String, - #[cultcache(key = 4)] pub instructions: String, - #[cultcache(key = 5, default)] pub input: Vec, - #[cultcache(key = 6, default)] pub reasoning_effort: Option, - #[cultcache(key = 7, default)] pub reasoning_summary: Option, - #[cultcache(key = 8, default)] pub service_tier: Option, - #[cultcache(key = 9, default)] pub output_contract_id: Option, - #[cultcache(key = 10, default)] pub previous_response_id: Option, - #[cultcache(key = 11, default)] pub tools: Vec, - #[cultcache(key = 12, default)] pub output_schema_json: Option, - #[cultcache(key = 13)] - pub provider_id: String, - #[cultcache(key = 14)] - pub wire_dialect: EpiphanyOpenAiWireDialect, } impl EpiphanyOpenAiModelRequest { @@ -57,7 +69,6 @@ impl EpiphanyOpenAiModelRequest { instructions: impl Into, ) -> Self { Self { - schema_id: OPENAI_ADAPTER_REQUEST_SCHEMA_ID.to_string(), request_id: request_id.into(), conversation_id: conversation_id.into(), model: model.into(), @@ -70,18 +81,26 @@ impl EpiphanyOpenAiModelRequest { previous_response_id: None, tools: Vec::new(), output_schema_json: None, - provider_id: "openai-codex".to_string(), - wire_dialect: EpiphanyOpenAiWireDialect::Responses, } } } -/// The only lowering from a native model request to the OpenAI transport. -/// Internal audit identity stays on the native request; every provider-bearing -/// byte is derived here. -pub fn request_from_native(request: &EpiphanyModelRequest) -> EpiphanyOpenAiModelRequest { +/// The only lowering from a native model request to an exact provider request. +pub fn request_from_native(request: &EpiphanyModelRequest) -> Result { + let payload = match request.provider.as_str() { + "openai-codex" | "openai" => { + EpiphanyProviderRequestPayload::Codex(codex_request_from_native(request)?) + } + "openrouter" => { + EpiphanyProviderRequestPayload::OpenRouter(openrouter_request_from_native(request)) + } + _ => return Err(anyhow!("unsupported model provider {:?}", request.provider)), + }; + Ok(EpiphanyProviderRequest { payload }) +} + +fn openrouter_request_from_native(request: &EpiphanyModelRequest) -> EpiphanyOpenAiModelRequest { EpiphanyOpenAiModelRequest { - schema_id: OPENAI_ADAPTER_REQUEST_SCHEMA_ID.to_string(), request_id: request.request_id.clone(), conversation_id: request.conversation_id.clone(), model: request.model.clone(), @@ -102,11 +121,85 @@ pub fn request_from_native(request: &EpiphanyModelRequest) -> EpiphanyOpenAiMode }) .collect(), output_schema_json: request.output_schema_json.clone(), - provider_id: request.provider.clone(), - wire_dialect: if request.provider == "openrouter" { - EpiphanyOpenAiWireDialect::ChatCompletionsTerminalTool - } else { - EpiphanyOpenAiWireDialect::Responses + } +} + +fn codex_request_from_native(request: &EpiphanyModelRequest) -> Result { + let has_tool_result = request + .input + .iter() + .any(|item| matches!(item, EpiphanyModelInputItem::ToolResult { .. })); + let output_format_name = request.output_schema_json.as_ref().map(|_| { + provider_format_name( + request + .output_contract_id + .as_deref() + .unwrap_or(&request.request_id), + ) + }); + let output_schema_json = request + .output_schema_json + .as_deref() + .map(strict_provider_schema) + .transpose()? + .map(|schema| serde_json::to_string(&schema)) + .transpose()?; + let tools = request + .tools + .iter() + .map(|tool| { + Ok(CodexToolDefinition { + name: tool.name.clone(), + description: tool.description.clone(), + parameters_json: serde_json::to_string(&strict_provider_schema( + &tool.parameters_json, + )?)?, + }) + }) + .collect::>>()?; + let mut provider = CodexProviderRequest::new( + &request.request_id, + &request.conversation_id, + &request.model, + &request.instructions, + ); + provider.input = request.input.iter().map(codex_input_from_native).collect(); + provider.reasoning_effort = request.reasoning_effort.clone(); + provider.reasoning_summary = request.reasoning_summary.clone(); + provider.service_tier = request.service_tier.clone(); + provider.output_format_name = output_format_name; + provider.previous_response_id = request.previous_response_id.clone(); + provider.tools = tools; + provider.tool_choice = if !provider.tools.is_empty() && !has_tool_result { + CodexToolChoice::Required + } else { + CodexToolChoice::Auto + }; + provider.output_schema_json = output_schema_json; + provider.validate()?; + Ok(provider) +} + +fn codex_input_from_native(input: &EpiphanyModelInputItem) -> CodexInputItem { + match input { + EpiphanyModelInputItem::UserText { text } => { + CodexInputItem::UserText { text: text.clone() } + } + EpiphanyModelInputItem::AssistantText { text } => { + CodexInputItem::AssistantText { text: text.clone() } + } + EpiphanyModelInputItem::ToolCall { + call_id, + name, + arguments, + } => CodexInputItem::ToolCall { + call_id: provider_call_id(call_id), + name: name.clone(), + arguments: arguments.clone(), + }, + EpiphanyModelInputItem::ToolResult { call_id, output } => CodexInputItem::ToolResult { + call_id: provider_call_id(call_id), + output: output.clone(), }, } } @@ -284,13 +377,6 @@ pub const OPENROUTER_TERMINAL_TOOL_NAME: &str = "epiphany_submit_typed_result"; pub fn openrouter_request_body( request: &EpiphanyOpenAiModelRequest, ) -> anyhow::Result { - if request.provider_id != "openrouter" - || request.wire_dialect != EpiphanyOpenAiWireDialect::ChatCompletionsTerminalTool - { - return Err(anyhow::anyhow!( - "OpenRouter requires its exact provider identity and terminal-tool dialect" - )); - } let has_tool_result = request .input .iter() @@ -834,7 +920,7 @@ mod tests { use super::*; #[test] - fn native_provider_identity_selects_one_exact_wire_dialect() { + fn native_provider_identity_selects_one_exact_request_contract() { let openai = EpiphanyModelRequest::new( "openai-request", "conversation", @@ -850,16 +936,16 @@ mod tests { "decide", ); - let openai = request_from_native(&openai); - let openrouter = request_from_native(&openrouter); - assert_eq!(openai.provider_id, "openai-codex"); - assert_eq!(openai.wire_dialect, EpiphanyOpenAiWireDialect::Responses); - assert_eq!(openrouter.provider_id, "openrouter"); - assert_eq!( - openrouter.wire_dialect, - EpiphanyOpenAiWireDialect::ChatCompletionsTerminalTool - ); - assert_ne!(openai.schema_id, "epiphany.openai_model_request.v0"); + let openai = request_from_native(&openai).unwrap(); + let openrouter = request_from_native(&openrouter).unwrap(); + assert!(matches!( + openai.payload, + EpiphanyProviderRequestPayload::Codex(_) + )); + assert!(matches!( + openrouter.payload, + EpiphanyProviderRequestPayload::OpenRouter(_) + )); } #[test] @@ -918,8 +1004,6 @@ mod tests { fn openrouter_terminal_tool_preserves_structured_decision() { let mut request = EpiphanyOpenAiModelRequest::new("request", "conversation", "ox", "decide"); - request.provider_id = "openrouter".into(); - request.wire_dialect = EpiphanyOpenAiWireDialect::ChatCompletionsTerminalTool; request.output_schema_json = Some( r#"{"type":"object","properties":{"verdict":{"type":"string"}},"required":["verdict"]}"#.into(), ); diff --git a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs index fcf84953..ea8c93ee 100644 --- a/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs +++ b/epiphany-openai-runtime/src/bin/epiphany-openai-runtime.rs @@ -19,7 +19,7 @@ use epiphany_model_adapter::EpiphanyModelRequest; #[cfg(test)] use epiphany_openai_adapter::{ EpiphanyOpenAiModelReceipt, EpiphanyOpenAiModelRequest, EpiphanyOpenAiStreamEvent, - EpiphanyOpenAiStreamPayload, + EpiphanyOpenAiStreamPayload, EpiphanyProviderRequestPayload, }; use epiphany_openai_runtime::DEFAULT_CODEX_CONNECTOR_ENDPOINT; use epiphany_openai_runtime::DEFAULT_PROVIDER_REQUEST_TIMEOUT; @@ -897,9 +897,10 @@ mod tests { #[test] fn codex_connector_projection_is_one_strict_deterministic_request() -> Result<()> { - let mut request = EpiphanyOpenAiModelRequest::new( + let mut request = EpiphanyModelRequest::new( "connector-request", "connector-conversation", + "openai-codex", "gpt-test", "Decide.", ); @@ -910,7 +911,7 @@ mod tests { ); request .tools - .push(epiphany_openai_adapter::EpiphanyOpenAiToolDefinition { + .push(epiphany_model_adapter::EpiphanyModelToolDefinition { name: "inspect_body".into(), description: "Inspect the typed Body.".into(), parameters_json: @@ -919,19 +920,22 @@ mod tests { }); request .input - .push(epiphany_openai_adapter::EpiphanyOpenAiInputItem::ToolCall { + .push(epiphany_model_adapter::EpiphanyModelInputItem::ToolCall { call_id: "native/call".into(), name: "inspect_body".into(), arguments: r#"{"path":"src/lib.rs"}"#.into(), }); - request.input.push( - epiphany_openai_adapter::EpiphanyOpenAiInputItem::ToolResult { + request + .input + .push(epiphany_model_adapter::EpiphanyModelInputItem::ToolResult { call_id: "native/call".into(), output: r#"{"ok":true}"#.into(), - }, - ); + }); - let projected = provider_transport::codex_request_from_epiphany(request)?; + let projected = epiphany_openai_adapter::request_from_native(&request)?; + let EpiphanyProviderRequestPayload::Codex(projected) = projected.payload else { + panic!("Codex provider must lower to the connector contract") + }; assert_eq!( projected.output_format_name.as_deref(), Some("role_result_v1") diff --git a/epiphany-openai-runtime/src/lib.rs b/epiphany-openai-runtime/src/lib.rs index bf00b08c..e4c8bc83 100644 --- a/epiphany-openai-runtime/src/lib.rs +++ b/epiphany-openai-runtime/src/lib.rs @@ -29,9 +29,9 @@ use epiphany_model_adapter::EpiphanyModelRequest; use epiphany_model_adapter::EpiphanyModelStreamEvent; use epiphany_model_adapter::EpiphanyModelStreamPayload; use epiphany_model_adapter::EpiphanyModelToolDefinition; -use epiphany_openai_adapter::EpiphanyOpenAiModelRequest; use epiphany_openai_adapter::EpiphanyOpenAiStreamEvent; use epiphany_openai_adapter::EpiphanyOpenAiStreamPayload; +use epiphany_openai_adapter::EpiphanyProviderRequest; use epiphany_tool_adapter::EPIPHANY_TOOL_RUNTIME_ADAPTER_ID; use epiphany_tool_adapter::EpiphanyToolInvocationIntent; use epiphany_tool_adapter::EpiphanyToolInvocationReceipt; @@ -95,7 +95,7 @@ pub fn open_model_turn( provider: &str, options: &EpiphanyOpenAiRuntimeOptions, model_request: &EpiphanyModelRequest, -) -> Result { +) -> Result { validate_model_provider(provider)?; if !provider_matches_request(provider, &model_request.provider) { return Err(anyhow!( @@ -113,7 +113,7 @@ pub fn open_model_turn( }, model_request, )?; - Ok(openai_request_from_model_request(model_request)) + provider_request_from_model_request(model_request) } pub fn record_model_turn_events( @@ -123,7 +123,7 @@ pub fn record_model_turn_events( events: &[EpiphanyOpenAiStreamEvent], ) -> Result { let store_path = store_path.as_ref(); - let provider_request = openai_request_from_model_request(request); + let provider_request = provider_request_from_model_request(request)?; let events = compact_openai_events_for_storage(events); let tool_intents = tool_invocation_intents_from_openai_events(&request.provider, &events); for intent in &tool_intents { @@ -168,12 +168,12 @@ pub fn record_model_turn_events( let summary = if let Some(message) = failure { format!( "OpenAI model request {} failed: {message}", - provider_request.request_id + provider_request.request_id() ) } else if let Some(receipt) = &receipt { format!( "OpenAI model request {} completed through {}.", - provider_request.request_id, + provider_request.request_id(), receipt .transport .clone() @@ -182,7 +182,7 @@ pub fn record_model_turn_events( } else { format!( "OpenAI model request {} ended without a terminal receipt.", - provider_request.request_id + provider_request.request_id() ) }; terminalize_runtime_job( @@ -194,7 +194,7 @@ pub fn record_model_turn_events( EpiphanyRuntimeJobStatus::Failed }, &now(), - &provider_request.request_id, + provider_request.request_id(), )?; Ok(EpiphanyOpenAiRuntimeRunSummary { @@ -738,19 +738,19 @@ pub fn append_requested_public_source_receipts( pub fn default_options( store_path: PathBuf, - request: &EpiphanyOpenAiModelRequest, + request: &EpiphanyProviderRequest, ) -> EpiphanyOpenAiRuntimeOptions { EpiphanyOpenAiRuntimeOptions { store_path, provider_credential_path: None, connector_endpoint: Some(DEFAULT_CODEX_CONNECTOR_ENDPOINT), caller_runtime_id: "epiphany-model-runtime".to_string(), - session_id: format!("openai-session-{}", request.conversation_id), - job_id: format!("openai-job-{}", request.request_id), - objective: format!("Run typed OpenAI model request {}", request.request_id), + session_id: format!("openai-session-{}", request.conversation_id()), + job_id: format!("openai-job-{}", request.request_id()), + objective: format!("Run typed provider request {}", request.request_id()), coordinator_note: "Native OpenAI runtime route; Codex is auth/model transport only." .to_string(), - default_model: Some(request.model.clone()), + default_model: Some(request.model().to_string()), request_timeout: Some(DEFAULT_PROVIDER_REQUEST_TIMEOUT), } } @@ -767,9 +767,9 @@ pub fn model_receipt_key(request_id: &str) -> String { request_id.to_string() } -pub fn openai_request_from_model_request( +pub fn provider_request_from_model_request( request: &EpiphanyModelRequest, -) -> EpiphanyOpenAiModelRequest { +) -> Result { epiphany_openai_adapter::request_from_native(request) } @@ -2833,7 +2833,7 @@ mod tests { "gpt-5.4", "Answer plainly.", ); - let request = epiphany_openai_adapter::request_from_native(&native_request); + let request = epiphany_openai_adapter::request_from_native(&native_request)?; let options = default_options(store.clone(), &request); ensure_openai_runtime_ready(&options)?; open_runtime_model_execution( @@ -2868,7 +2868,7 @@ mod tests { .is_some() ); assert!(cache.get::("req-1")?.is_some()); - assert!(cache.get::("req-1")?.is_some()); + assert!(cache.get::("req-1")?.is_some()); assert_eq!( runtime_job(&store, &options.job_id)? .expect("snapshot") @@ -3275,9 +3275,11 @@ mod tests { "gpt-5.4", "Answer after tool output.", ); - native_request.output_schema_json = - Some(r#"{"type":"object","required":["researchDecision"]}"#.to_string()); - let request = epiphany_openai_adapter::request_from_native(&native_request); + native_request.output_schema_json = Some( + r#"{"type":"object","properties":{"researchDecision":{"type":"string"}},"required":["researchDecision"]}"# + .to_string(), + ); + let request = epiphany_openai_adapter::request_from_native(&native_request)?; let options = default_options(store.clone(), &request); ensure_openai_runtime_ready(&options)?; open_runtime_model_execution( @@ -3346,7 +3348,9 @@ mod tests { assert_eq!(followup.previous_response_id, None); assert_eq!( followup.output_schema_json.as_deref(), - Some(r#"{"type":"object","required":["researchDecision"]}"#) + Some( + r#"{"type":"object","properties":{"researchDecision":{"type":"string"}},"required":["researchDecision"]}"# + ) ); assert_eq!(followup.input.len(), 2); assert_eq!( diff --git a/epiphany-openai-runtime/src/persona_executor.rs b/epiphany-openai-runtime/src/persona_executor.rs index f956e343..5a5192aa 100644 --- a/epiphany-openai-runtime/src/persona_executor.rs +++ b/epiphany-openai-runtime/src/persona_executor.rs @@ -687,7 +687,7 @@ mod tests { PersonaModelExecutionPlan::from_admitted_input( store, "turn-1", - "test", + crate::DEFAULT_MODEL_PROVIDER, "test-model", cultmesh_store, "epiphany-test", diff --git a/epiphany-openai-runtime/src/provider_transport.rs b/epiphany-openai-runtime/src/provider_transport.rs index ff2d0785..80fbc6fc 100644 --- a/epiphany-openai-runtime/src/provider_transport.rs +++ b/epiphany-openai-runtime/src/provider_transport.rs @@ -4,16 +4,14 @@ use std::time::{Duration, SystemTime, UNIX_EPOCH}; use anyhow::{Context, Result, anyhow}; use codex_connector::{ - CodexConnectorClient, CodexInputItem, CodexProviderRequest, CodexToolChoice, - CodexToolDefinition, CodexTransportDisposition, CodexTransportEventPayload, - CodexTransportInvocation, CodexTransportOutcome, + CodexConnectorClient, CodexProviderRequest, CodexTransportDisposition, + CodexTransportEventPayload, CodexTransportInvocation, CodexTransportOutcome, }; use epiphany_model_adapter::EpiphanyModelRequest; use epiphany_openai_adapter::{ - EpiphanyOpenAiInputItem, EpiphanyOpenAiModelReceipt, EpiphanyOpenAiModelRequest, - EpiphanyOpenAiStreamEvent, EpiphanyOpenAiStreamPayload, EpiphanyOpenAiWireDialect, - openrouter_events_from_response, openrouter_request_body, provider_call_id, - provider_format_name, strict_provider_schema, + EpiphanyOpenAiModelReceipt, EpiphanyOpenAiModelRequest, EpiphanyOpenAiStreamEvent, + EpiphanyOpenAiStreamPayload, EpiphanyProviderRequestPayload, openrouter_events_from_response, + openrouter_request_body, }; use epiphany_openai_runtime::{ EpiphanyOpenAiRuntimeOptions, EpiphanyOpenAiRuntimeRunSummary, OPENROUTER_MODEL_PROVIDER, @@ -34,19 +32,22 @@ pub async fn run_model_turn( ) -> Result { let provider_request = open_model_turn(provider, &options, &request)?; let request_id = request.request_id.clone(); - let events = match provider { - "openai-codex" | "openai" => { + let events = match (provider, provider_request.payload) { + ("openai-codex" | "openai", EpiphanyProviderRequestPayload::Codex(codex_request)) => { collect_transport_events( - execute_codex_connector(&options, &request, provider_request), + execute_codex_connector(&options, &request, codex_request), &request_id, ) .await } - OPENROUTER_MODEL_PROVIDER => { - collect_transport_events(execute_openrouter(&options, provider_request), &request_id) - .await + (OPENROUTER_MODEL_PROVIDER, EpiphanyProviderRequestPayload::OpenRouter(request)) => { + collect_transport_events(execute_openrouter(&options, request), &request_id).await + } + _ => { + return Err(anyhow!( + "provider request contract disagrees with selected provider" + )); } - _ => unreachable!("open_model_turn validates provider identity"), }; record_model_turn_events(&options.store_path, &options, &request, &events) } @@ -54,7 +55,7 @@ pub async fn run_model_turn( async fn execute_codex_connector( options: &EpiphanyOpenAiRuntimeOptions, native_request: &EpiphanyModelRequest, - request: EpiphanyOpenAiModelRequest, + provider_request: CodexProviderRequest, ) -> Result> { let endpoint = options .connector_endpoint @@ -70,7 +71,6 @@ async fn execute_codex_connector( "codex-connector", )?); let native_request_sha256: [u8; 32] = Sha256::digest(rmp_serde::to_vec(native_request)?).into(); - let provider_request = codex_request_from_epiphany(request)?; let expires_at_unix_ms = unix_time_ms()? .checked_add(INVOCATION_ADMISSION_WINDOW.as_millis() as u64) .ok_or_else(|| anyhow!("Codex connector invocation expiry overflowed"))?; @@ -94,96 +94,6 @@ async fn execute_codex_connector( .context("Codex connector client task failed")? } -pub(super) fn codex_request_from_epiphany( - request: EpiphanyOpenAiModelRequest, -) -> Result { - if !matches!(request.provider_id.as_str(), "openai-codex" | "openai") - || request.wire_dialect != EpiphanyOpenAiWireDialect::Responses - { - return Err(anyhow!( - "Codex connector requires an OpenAI provider identity and Responses dialect" - )); - } - let has_tool_result = request - .input - .iter() - .any(|item| matches!(item, EpiphanyOpenAiInputItem::ToolResult { .. })); - let output_format_name = request.output_schema_json.as_ref().map(|_| { - provider_format_name( - request - .output_contract_id - .as_deref() - .unwrap_or(&request.request_id), - ) - }); - let output_schema_json = request - .output_schema_json - .as_deref() - .map(strict_provider_schema) - .transpose()? - .map(|schema| serde_json::to_string(&schema)) - .transpose()?; - let tools = request - .tools - .into_iter() - .map(|tool| { - Ok(CodexToolDefinition { - name: tool.name, - description: tool.description, - parameters_json: serde_json::to_string(&strict_provider_schema( - &tool.parameters_json, - )?)?, - }) - }) - .collect::>>()?; - let tool_choice = if !tools.is_empty() && !has_tool_result { - CodexToolChoice::Required - } else { - CodexToolChoice::Auto - }; - let input = request - .input - .into_iter() - .map(|item| match item { - EpiphanyOpenAiInputItem::UserText { text } => CodexInputItem::UserText { text }, - EpiphanyOpenAiInputItem::AssistantText { text } => { - CodexInputItem::AssistantText { text } - } - EpiphanyOpenAiInputItem::ToolCall { - call_id, - name, - arguments, - } => CodexInputItem::ToolCall { - call_id: provider_call_id(&call_id), - name, - arguments, - }, - EpiphanyOpenAiInputItem::ToolResult { call_id, output } => CodexInputItem::ToolResult { - call_id: provider_call_id(&call_id), - output, - }, - }) - .collect(); - let mut provider_request = CodexProviderRequest::new( - request.request_id, - request.conversation_id, - request.model, - request.instructions, - ); - provider_request.input = input; - provider_request.reasoning_effort = request.reasoning_effort; - provider_request.reasoning_summary = request.reasoning_summary; - provider_request.service_tier = request.service_tier; - provider_request.output_format_name = output_format_name; - provider_request.previous_response_id = request.previous_response_id; - provider_request.tools = tools; - provider_request.tool_choice = tool_choice; - provider_request.parallel_tool_calls = false; - provider_request.output_schema_json = output_schema_json; - provider_request.validate()?; - Ok(provider_request) -} - pub(super) fn events_from_connector_result( result: codex_connector::CodexTransportResult, ) -> Result> { From 87ea81db2ae8e9b10fa3d266114e3407e65cd2f9 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 23:52:00 +0200 Subject: [PATCH 103/340] Retire obsolete provider request publication --- Cargo.lock | 2 +- Cargo.toml | 2 +- epiphany-openai-adapter/Cargo.toml | 2 +- schemas/cultnet/README.md | 6 +- .../epiphany.openai-model-request.schema.json | 106 ------------------ schemas/cultnet/index.json | 11 -- 6 files changed, 7 insertions(+), 122 deletions(-) delete mode 100644 schemas/cultnet/epiphany.openai-model-request.schema.json diff --git a/Cargo.lock b/Cargo.lock index 319d7bb6..68b88aa0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -242,7 +242,7 @@ dependencies = [ [[package]] name = "codex-connector" version = "0.1.0" -source = "git+https://github.com/GameCult/CodexConnector?rev=89d965b0495ba817a1e48adda0a28509d6637d31#89d965b0495ba817a1e48adda0a28509d6637d31" +source = "git+https://github.com/GameCult/CodexConnector?rev=6dc80f6d266db4d82566d2434adcc55a48e8ecad#6dc80f6d266db4d82566d2434adcc55a48e8ecad" dependencies = [ "aes-gcm", "base64 0.23.1", diff --git a/Cargo.toml b/Cargo.toml index 69754984..6cf9cf9b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,7 +29,7 @@ epiphany-core = { path = "epiphany-core" } epiphany-model-adapter = { path = "epiphany-model-adapter" } epiphany-openai-adapter = { path = "epiphany-openai-adapter" } epiphany-openai-runtime = { path = "epiphany-openai-runtime", optional = true } -codex-connector = { git = "https://github.com/GameCult/CodexConnector", rev = "89d965b0495ba817a1e48adda0a28509d6637d31", default-features = false, features = ["client"], optional = true } +codex-connector = { git = "https://github.com/GameCult/CodexConnector", rev = "6dc80f6d266db4d82566d2434adcc55a48e8ecad", default-features = false, features = ["client"], optional = true } epiphany-tool-adapter = { path = "epiphany-tool-adapter" } epiphany-tool-mcp-runtime = { path = "epiphany-tool-mcp-runtime", optional = true } rmp-serde = "1" diff --git a/epiphany-openai-adapter/Cargo.toml b/epiphany-openai-adapter/Cargo.toml index 575cbf6d..dc24a1cd 100644 --- a/epiphany-openai-adapter/Cargo.toml +++ b/epiphany-openai-adapter/Cargo.toml @@ -11,7 +11,7 @@ path = "src/lib.rs" [dependencies] anyhow = "1" -codex-connector = { git = "https://github.com/GameCult/CodexConnector", rev = "89d965b0495ba817a1e48adda0a28509d6637d31", default-features = false } +codex-connector = { git = "https://github.com/GameCult/CodexConnector", rev = "6dc80f6d266db4d82566d2434adcc55a48e8ecad", default-features = false } cultcache-rs = { path = "../vendor/cultcache-rs" } epiphany-model-adapter = { path = "../epiphany-model-adapter" } serde = { version = "1", features = ["derive"] } diff --git a/schemas/cultnet/README.md b/schemas/cultnet/README.md index 30c1a711..7328746d 100644 --- a/schemas/cultnet/README.md +++ b/schemas/cultnet/README.md @@ -23,11 +23,13 @@ hand-maintained JSON registry. ## Main Families -- `epiphany.openai_model_request.v1`: the exact provider request crossing the - OpenAI-compatible transport boundary. - `gamecult.persona_state.v0`: portable public Persona state. - `epiphany.work_organ_state.v0`: portable state for lean work organs. +Provider request contracts are owned by their provider boundary. The shared +Codex contract lives in `GameCult/CodexConnector`; Epiphany's closed durable +provider-request document is private Mind state, not a public CultNet promise. + The catalog publishes contracts the executable body actually produces or consumes. Editor capabilities are provider-owned CultMesh/Eve surfaces, not Epiphany-owned Rider or Unity command families. Brokkr owns Unity editor diff --git a/schemas/cultnet/epiphany.openai-model-request.schema.json b/schemas/cultnet/epiphany.openai-model-request.schema.json deleted file mode 100644 index eaaa522d..00000000 --- a/schemas/cultnet/epiphany.openai-model-request.schema.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://gamecult.dev/epiphany/cultnet/epiphany.openai-model-request.schema.json", - "title": "Epiphany OpenAI Model Request", - "type": "object", - "required": ["schema_id", "request_id", "conversation_id", "model", "instructions", "input", "provider_id", "wire_dialect"], - "properties": { - "schema_id": { "const": "epiphany.openai_model_request.v1" }, - "request_id": { "type": "string" }, - "conversation_id": { "type": "string" }, - "model": { "type": "string" }, - "instructions": { "type": "string" }, - "input": { - "type": "array", - "items": { "$ref": "#/$defs/input_item" } - }, - "reasoning_effort": { "type": ["string", "null"] }, - "reasoning_summary": { "type": ["string", "null"] }, - "service_tier": { "type": ["string", "null"] }, - "output_contract_id": { "type": ["string", "null"] }, - "previous_response_id": { "type": ["string", "null"] }, - "tools": { - "type": "array", - "items": { "$ref": "#/$defs/tool_definition" } - }, - "output_schema_json": { "type": ["string", "null"] }, - "provider_id": { "enum": ["openai-codex", "openai", "openrouter"] }, - "wire_dialect": { "enum": ["Responses", "ChatCompletionsTerminalTool"] } - }, - "additionalProperties": false, - "$defs": { - "input_item": { - "oneOf": [ - { - "type": "object", - "required": ["ToolCall"], - "properties": { - "ToolCall": { - "type": "object", - "required": ["call_id", "name", "arguments"], - "properties": { - "call_id": { "type": "string" }, - "name": { "type": "string" }, - "arguments": { "type": "string" } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": ["UserText"], - "properties": { - "UserText": { - "type": "object", - "required": ["text"], - "properties": { "text": { "type": "string" } }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": ["AssistantText"], - "properties": { - "AssistantText": { - "type": "object", - "required": ["text"], - "properties": { "text": { "type": "string" } }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": ["ToolResult"], - "properties": { - "ToolResult": { - "type": "object", - "required": ["call_id", "output"], - "properties": { - "call_id": { "type": "string" }, - "output": { "type": "string" } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - ] - }, - "tool_definition": { - "type": "object", - "required": ["name", "description", "parameters_json"], - "properties": { - "name": { "type": "string" }, - "description": { "type": "string" }, - "parameters_json": { "type": "string" } - }, - "additionalProperties": false - } - } -} diff --git a/schemas/cultnet/index.json b/schemas/cultnet/index.json index 0c201ec7..fd57fe34 100644 --- a/schemas/cultnet/index.json +++ b/schemas/cultnet/index.json @@ -1,17 +1,6 @@ { "schemaVersion": "epiphany.cultnet_catalog.v0", "schemas": [ - { - "schemaId": "https://gamecult.dev/epiphany/cultnet/epiphany.openai-model-request.schema.json", - "kind": "document_payload", - "wireContracts": [ - "cultnet.schema.v0" - ], - "schemaVersion": "epiphany.openai_model_request.v1", - "documentType": "epiphany.openai_model_request.v1", - "title": "Epiphany OpenAI Model Request", - "path": "epiphany.openai-model-request.schema.json" - }, { "schemaId": "https://gamecult.dev/cultnet/gamecult.persona_state.v0.schema.json", "kind": "document_payload", From 895476b1b32dcea2d3c533311e293480601c00e3 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 24 Aug 2026 23:58:20 +0200 Subject: [PATCH 104/340] Map standalone Codex transport authority --- notes/epiphany-current-algorithmic-map.md | 34 +++++++--- notes/epiphany-fork-implementation-plan.md | 48 ++++++++------ notes/fresh-workspace-handoff.md | 61 ++++++++++++------ notes/standalone-codex-transport-migration.md | 49 ++++++++++---- state/ledgers.msgpack | Bin 727528 -> 728252 bytes state/map.yaml | 11 ++-- 6 files changed, 136 insertions(+), 67 deletions(-) diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index ed69f419..60860c38 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -83,11 +83,13 @@ runtime-local identity, session, job, binding, coordinator, native model/tool, and state-ledger JSON mirror. Those documents remain typed CultCache state and are discovered from the native registration or projected by their owning CultMesh provider; no live CultNet crossing consumed the hand-maintained JSON, -and several schemas contradicted their Rust owners. The catalog now contains -only three earned portable boundaries: the exact OpenAI-compatible provider -request, `gamecult.persona_state.v0`, and `epiphany.work_organ_state.v0`. The -two cuts remove 850 net maintained lines. Atlas remains untouched and untested -end to end. +and several schemas contradicted their Rust owners. Those two cuts left three +portable boundaries and removed 850 net maintained lines. Exact `87ea81db` +then deletes the generic OpenAI-shaped schema after its Rust document ceases to +exist. The public Epiphany catalog now contains only +`gamecult.persona_state.v0` and `epiphany.work_organ_state.v0`. Connector owns +the shared Codex contract; Epiphany's closed provider-request document remains +private Mind state. Atlas remains untouched and untested end to end. Dependency ownership follows source ownership. Exact `695af6c6` deletes thirteen manifest edges with no consumer in their owning package, plus the @@ -669,11 +671,12 @@ route, not a tool route plus a parallel no-tools opinion. The target boundary is the independent daemon mapped in `notes/standalone-codex-transport-migration.md`. Independent `GameCult/CodexConnector` exact -`54d8bc2525b7e7fa1b9dd26b95871247ff4c7566` now owns one typed multi-caller +`6dc80f6d266db4d82566d2434adcc55a48e8ecad` owns one typed multi-caller transport package and one public daemon binary without linking a Codex crate. -Its default library is only the encrypted contract/client ABI; daemon-only -auth, raw Responses transport, CultCache replay, and Ureq/Rustls dependencies -sit behind the `daemon` feature. +With no features the library exposes only the typed provider/result contract. +The default `client` feature adds authenticated encryption, framing, and socket +transport. Auth, raw Responses transport, CultCache replay, and Ureq/Rustls sit +behind the `daemon` feature. Each consumer internally derives its exact typed provider request. The daemon verifies those exact bytes, returns a digest-bound transport receipt plus typed events, and uses a private digest-pinned official `codex app-server` child only @@ -696,6 +699,17 @@ readiness, the independent Idunn target, Yggdrasil installation, one real Epiphany round trip, and Ghostlight's copied wire/deployment deletion remain open. +Exact `c37cae8b` closes the remaining request-authorship split. The consumer +adapter turns the canonical native request directly into one closed durable +provider-request variant before inference. For Codex, that variant contains the +exact `CodexProviderRequest` sent across the socket. The release edge may add +only Connector invocation physiology: caller identity, native-request digest, +expiry, encryption, and framing. It cannot lower schemas, rename tool calls, +choose tools, or author a second provider request. OpenRouter retains its own +exact direct request variant. Decision contexts and runtime model execution +persist the same provider-request bytes; runtime v47 and decision context v3 +refuse the old writable shape. + ## Canonical authority map | Owner | Inputs | Outputs | Invariant | @@ -707,7 +721,7 @@ open. | `current_work.rs` | keyed Mind view and exact runtime request/job/result/decision families | pure family scheduling and continuation projections | Events, timestamps, role lanes, and thread provenance cannot create or suppress work. | | coordinator policy/status | keyed Mind presence, exact current work, and the accepted continuity decision | one action/reason pair plus operator-readable role lanes | Coordinator presence is derived; no mutable coordinator head, pressure tableau, or duplicate policy wrapper exists. | | runtime worker attempt owner | sealed typed launch, exact process claim, semantic result or typed failure, job result, archival evidence | one terminal attempt authority | The launch document solely owns live family identity. The result cannot repeat routing identity; after live deletion the archive owns exact request kind/ID beside the preserved structured decision. Scheduling, process liveness, and semantic admission remain distinct authorities. | -| model-provider boundary | sealed native model request plus explicit provider configuration | exact internally derived provider request and transport result | OpenRouter remains a release-owned direct boundary. Codex crosses the lean CodexConnector client ABI; the daemon owns only caller admission, credential refresh, exact transport, and durable replay. Provider selection cannot author a second request truth or admit Mind state. | +| model-provider boundary | sealed native model request plus explicit provider configuration | one closed durable provider-request variant and transport result | The consumer adapter owns provider lowering. OpenRouter remains a release-owned direct boundary. For Codex, the persisted request is the exact `CodexProviderRequest` crossing the lean Connector client ABI; the release edge adds only authenticated invocation physiology. The daemon owns caller admission, credential refresh, exact transport, and durable replay. No transport layer can author a second request truth or admit Mind state. | | OpenAI Responses schema projector | full native typed output schema | one provider-legal strict generation schema | Provider formatting preserves useful supported constraints but never replaces native decoding or Mind admission. | | model-pass terminal owner | sealed reasoning basis/context and typed failure class | exact transport closure plus `EpiphanyModelPassFailure` and terminal session/job result in one batch CAS | The caller cannot nominate a job/session; the context-derived binding closes role, reorient, and Persona failures without granting generic transport results decision authority. | | Substrate Gate | exact worker/job authority and requested operation | scoped grant or refusal | Access permission does not admit Mind state. | diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 3f9afc0b..53fa2d6e 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -222,15 +222,17 @@ Delete or demote: ## Immediate Next Action Keep the five-day shakedown, Ox17 deployment, and Model Atlas operational Gate -1 paused. Exact `ed7357a2` completes Epiphany's source-side Codex transport cut: -the embedded spine, compiled Codex graph, direct auth/HTTP/SSE path, and -Codex-home readiness are absent. Modeling still consumes typed Body and keyed -RepoModel state directly; Persona still consumes keyed memory and social state -directly. No Epiphany-owned Rider or Unity bridge exists: Brokkr owns Unity -through typed Eve/CultMesh capabilities, and a future Rider daemon owns Rider. -Do not admit a fresh package until the standalone Connector has redacted signed -readiness, an independent Idunn target, and a real digest-bound Epiphany round -trip. +1 paused. Exact `ed7357a2` removes Codex transport from Epiphany's body, and +exact `c37cae8b` closes the residual request-authorship split. Epiphany now +seals the exact final `CodexProviderRequest` as durable Mind input before the +release edge sees it. The edge adds authenticated invocation physiology but no +schema, tool, call-ID, tool-choice, or output-format opinion. Modeling still +consumes typed Body and keyed RepoModel state directly; Persona still consumes +keyed memory and social state directly. No Epiphany-owned Rider or Unity bridge +exists: Brokkr owns Unity through typed Eve/CultMesh capabilities, and a future +Rider daemon owns Rider. Do not admit a fresh package until the standalone +Connector has redacted signed readiness, an independent Idunn target, and a +real digest-bound Epiphany round trip. The immediate comparison is now explicit. The former release-edge `codex-login` graph is gone from Epiphany. `epiphany-core` remains broad and @@ -241,20 +243,26 @@ semantic owner rather than invent a package taxonomy. The provider decision is a service extraction specified by `notes/standalone-codex-transport-migration.md`. Independent `GameCult/CodexConnector` exact -`54d8bc2525b7e7fa1b9dd26b95871247ff4c7566` owns the v2 multi-caller contract, +`6dc80f6d266db4d82566d2434adcc55a48e8ecad` owns the v2 multi-caller contract, exact native/provider digest binding, typed tool and terminal receipts, the pinned official Codex credential child, raw Responses transport, and durable -keyed replay. Its default feature set is the lean encrypted client/contract ABI; -daemon-only anatomy is feature-gated. It links no Codex crate. Active replay -identity is written before network access; the exact encrypted completion is -durable before reply; restart ambiguity refuses rather than re-executing. -Redacted CultMesh/Odin readiness is the remaining daemon source cut before its -independent Idunn deployment. +keyed replay. No features yields only the typed contract; default `client` adds +authenticated framing and socket transport; `daemon` adds service authority. +It links no Codex crate. Active replay identity is written before network +access; the exact encrypted completion is durable before reply; restart +ambiguity refuses rather than re-executing. Redacted CultMesh/Odin readiness is +the remaining daemon source cut before its independent Idunn deployment. -Epiphany now passes the shared client contract and its old path is deleted. -Ghostlight must adopt the same ABI and remove its copied wire types plus -connector deployment authority after the standalone service is proven on -Yggdrasil. No dual daemon or refresh writer is an acceptable transition state. +Epiphany pins the contract-only surface in its adapter and enables the client +only at its release edge. Exact `87ea81db` also deletes Epiphany's obsolete +public schema for the extinct generic provider request; the shared Codex +contract belongs to Connector, while Epiphany's wrapper remains private Mind +state. Ghostlight exact `8e7d980` now pins the same Connector source without +changing its live deployment. Repair the stale deployment maps next. No dual +daemon or refresh writer is an acceptable transition state. After that, +preserve the dirty vendored-Codex edits and delete +the 3,592-file tree if its final live-consumer audit remains empty; resume the +single-caller runtime-spine audit afterward. Model Atlas has component proofs but no live inter-swarm collaboration run. Preserve its publication, trust, transport, projection, Soul verification, Self diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 21918cde..24ffcf84 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -2,11 +2,11 @@ Updated: 2026-08-24 Branch: `codex/epiphany-shakedown-live` -Latest committed Epiphany source cut: `24023265` -Current connector source: `54d8bc2525b7e7fa1b9dd26b95871247ff4c7566` -Current pass: source subtraction continues after deleting duplicate live Hands -receipt rereads; the Hands actuator ABI boundary is next; Ox17 and Atlas -Gate 1 remain paused +Latest committed Epiphany source cut: `87ea81db` +Current connector source: `6dc80f6d266db4d82566d2434adcc55a48e8ecad` +Current pass: exact provider-request authorship is singular; reconcile the +stale deployment maps, then preserve and remove the unused vendored Codex tree; +Ox17 and Atlas Gate 1 remain paused ## Orientation @@ -17,9 +17,9 @@ Idunn's Yggdrasil CI/CD task with local compiler work, or wake resident cognition without an explicit operator resumption. Epiphany is a supervised engineering alpha. Exact source `d2ca6630` remains the -production symlink body and is inactive. Exact `2c3335dc` is the current -build-affecting source. Historical live proofs remain evidence; they do not -authorize the next capstone or Gate 1. +production symlink body and is inactive. Exact `87ea81db` is the current +build-affecting source on this branch. Historical live proofs remain evidence; +they do not authorize the next capstone or Gate 1. ## Current live deployment @@ -1338,18 +1338,39 @@ coordinator `12/12`, swarm `10/10`, and model-runtime `13/13`. ## Immediate next action -The Ox17 deployment lane remains paused. Continue subtraction from exact -`a01c6842`. Map the remaining Codex provider boundary before changing it: the -decision context currently seals `EpiphanyOpenAiModelRequest`, then the release -edge derives the final `CodexProviderRequest` that crosses the standalone -daemon boundary. Collapse that two-request seam without moving prompts, tools, -retry, interpretation, or Mind admission into CodexConnector. Then reconcile -the consumer protocol pins and stale deployment maps. The 3,592-file vendored -Codex tree is excluded from every production build and has no nonhistorical -source consumer; preserve its current uncommitted edits before deciding its -deletion. Resume the single-caller runtime-spine audit after this boundary is -watertight. Preserve keyed Mind, direct Body-to-Modeling flow, OpenRouter as a -separate temporary provider edge, and the complete unrun Model Atlas slice. +The Ox17 deployment lane remains paused. Exact Epiphany `c37cae8b` closes the +remaining two-stage Codex request seam. The consumer adapter now derives and +seals one closed durable provider-request document: either the exact final +`CodexProviderRequest` or the exact OpenRouter request. The release edge no +longer rewrites Codex schemas, tools, call IDs, tool choice, or output format; +it only wraps the sealed request in the authenticated Connector invocation. +Runtime and decision-context writable schemas are v47/v3. The source cut is 10 +net maintained deletions and passes Core 152/152, runtime 21/21, adapter 5/5, +model edge 12/12, and Persona 1/1. + +CodexConnector source exact +`6dc80f6d266db4d82566d2434adcc55a48e8ecad` includes current mainline transport +diagnostics and exposes three compile surfaces: contract-only with no features, +the default encrypted socket client, and the daemon. Contract/client/daemon +tests pass 8/8, 10/10, and 29/29. Documentation exact `8c57be4` records that +boundary. Epiphany pins the contract-only surface in its adapter and enables +the client only at the release edge. + +Exact `87ea81db` pins the current Connector source and deletes Epiphany's stale +106-line public JSON schema for the extinct generic request; the public catalog +now contains only the portable Persona and work-organ contracts. + +Ghostlight exact `8e7d980` now pins the same Connector source contract. Only +Cargo metadata and the additive Connector API diff were checked locally; no +Ghostlight compilation or deployment ran on Starfire. + +Continue subtraction from exact `87ea81db`. Reconcile the stale +standalone-daemon deployment maps without mutating live service authority. Then +preserve the uncommitted edits inside the 3,592-file +vendored Codex tree and delete the tree if the final live-consumer audit remains +empty. Resume the single-caller runtime-spine audit afterward. Preserve keyed +Mind, direct Body-to-Modeling flow, OpenRouter as a separate temporary provider +edge, and the complete unrun Model Atlas slice. Yggdrasil previously exposed 96 GiB of dead native Cargo targets after interrupted full-workspace builds; exact cleanup returned the builder target diff --git a/notes/standalone-codex-transport-migration.md b/notes/standalone-codex-transport-migration.md index c1bcd058..f87bc710 100644 --- a/notes/standalone-codex-transport-migration.md +++ b/notes/standalone-codex-transport-migration.md @@ -16,10 +16,12 @@ and release cadence. The source and live mechanisms are deliberately distinct during the braked cut: -1. Exact Epiphany `ed7357a2` uses the standalone Connector client ABI for Codex - requests. Its embedded spine, direct Codex auth/HTTP/SSE path, compiled Codex - graph, `CODEX_HOME`, and auth.json readiness are deleted. That source is not - deployed; production Epiphany remains inactive on its historical release. +1. Exact Epiphany `c37cae8b` seals the final Codex provider request and uses the + standalone Connector client ABI only for authenticated transport. Its + embedded spine, direct Codex auth/HTTP/SSE path, compiled Codex graph, + `CODEX_HOME`, auth.json readiness, and second release-edge request lowering + are deleted. That source is not deployed; production Epiphany remains + inactive on its historical release. 2. Yggdrasil still runs `epiphany-model-connector.service` for Ghostlight. It uses encrypted CultNet/MessagePack on loopback TCP 4103, owns a private writable Codex home, serializes refresh through one `AuthManager`, bounds @@ -35,14 +37,15 @@ is useful; the ownership is not. ## Current cut status Independent `GameCult/CodexConnector` exact -`54d8bc2525b7e7fa1b9dd26b95871247ff4c7566` completes migration steps 1-4 on +`6dc80f6d266db4d82566d2434adcc55a48e8ecad` completes migration steps 1-4 on the source side except redacted CultMesh/Odin publication and the Ghostlight cut. It owns one Cargo package, one public daemon binary, the v2 multi-caller -encrypted MessagePack contract and lean default client ABI, -caller-native and exact provider-request digest binding, typed tool/result -transport, a private digest-pinned official `codex app-server` credential -child, raw Responses HTTP/SSE, and durable keyed replay. It links no Codex -crate. +MessagePack contract, caller-native and exact provider-request digest binding, +typed tool/result transport, a private digest-pinned official +`codex app-server` credential child, raw Responses HTTP/SSE, and durable keyed +replay. It links no Codex crate. The no-feature library is contract-only; +default `client` adds authenticated encryption, framing, and socket transport; +`daemon` adds service authority. Replay uses one CultCache document per caller/request identity in an owned Redb store. The daemon persists `Active` before provider I/O and replaces it with @@ -53,8 +56,8 @@ capacity for unrelated identities. Replay records do not disappear merely because request admission expiry elapsed. A non-secret connection-key epoch detects rotation without persisting a secret-derived verifier. -Default acceptance passes 10/10 and daemon acceptance passes 23/23 plus exact -library/binary checks and Clippy. All disposable Connector targets were removed. +Contract-only, client, and daemon acceptance pass 8/8, 10/10, and 29/29. +Connector documentation exact `8c57be4` records the feature boundary. Exact Epiphany `ed7357a2` consumes the lean client, keeps OpenRouter as a direct separate provider edge, and preserves Connector caller/native/provider digest @@ -64,6 +67,28 @@ maintained non-lock source shrinks by 857 lines and Cargo.lock by 4,830 lines. The bounded verification roots were removed; only the exact state inspector remains. No live service, credential, or deployment authority moved. +Exact Epiphany `c37cae8b` closes the remaining two-request seam. The +consumer-owned adapter now lowers the native request directly to one durable +closed provider-request variant. Its Codex variant is the exact +`CodexProviderRequest` supplied to the daemon; the release edge adds only +caller identity, native digest, expiry, encryption, and framing. The old +release-edge schema/tool/call-ID/output-format lowering is deleted. Runtime and +decision-context writable schemas advance to v47/v3. Core 152/152, runtime +21/21, adapter 5/5, model edge 12/12, and Persona 1/1 pass. The source cut +removes 10 net maintained lines. Epiphany pins the contract-only Connector +surface in its adapter and enables `client` only at the release edge. + +Exact Epiphany `87ea81db` pins current Connector source `6dc80f6d` and deletes +the obsolete public JSON schema for the extinct generic OpenAI-shaped request. +Provider wire contracts are published by their owning provider boundary; +Epiphany's closed provider-request wrapper remains private Mind state. + +Exact Ghostlight `8e7d980` pins the same Connector source contract. Cargo +metadata and the additive Connector API diff validate the dependency seam; no +local Ghostlight compilation, Idunn transaction, or live service mutation was +performed. The current Yggdrasil Ghostlight connector remains historical live +physiology until the standalone deployment cut is admitted separately. + ## Authority map ### Standalone Codex transport service diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index 9d2285177a3d1e58b58cb4f144973f2ebf326443..000c90dc372c1a96cd5d89f7200c961685fe492b 100644 GIT binary patch delta 699 zcmZ9K!EVz)5QcGpLK=j)6{!*$;OfMVX%Z(np{Ru(kdVrW+j@86tgv_8-F0YAIdI?w z2oY}q>H$^a%zJR-C6E{!428olYuBUs|M_OWpZi}f{Ev6N&R{f&!k1sKboM`-KlDyL zPruo;-fmhRsrp_eT_as5?T~JeZj#!h-Orm==Vb5wozCr@{$y}4iMF2}c>C*Dhi8mC z;EzU}VVrp&`aCY1n25}2VwOaC%t z7P}}?tPc7$8mZDLVC@x;ki~tGKq1xIl0(zn>e6t8q2O^iAO733N~9C3D+egbB$FIc zRMeRN3Ds>vS-!xW_25YJ(jqnD91F)3#|haPg#I83NIqy7%5Q|b5biGjzy^y5D{ewN_|DoAd_Tc Z(JUqHD=%GL3{(WSh}DT>W-bl(egfNg?~ecg delta 77 zcmdn9Q|HBIoedI<+(sr=2If)67`P>lZdPV2WMs^3p32ldm5C9EK{PWEvj8zG5VHX> TI}mdKF((jnZJ)}-9V`w2#nBf- diff --git a/state/map.yaml b/state/map.yaml index d44b5bb0..36478b53 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -115,15 +115,16 @@ current_status: summary: The keyed RepoModel hard cut, decision-context foundation, Model Atlas code slice, complete Body, Proposal, frontier-verdict Modeling, frontier Research, frontier Verification, frontier Planning/PlanMind, Reorientation, and Persona decision-context lifecycles are landed on codex/epiphany-shakedown-live. Keyed Mind plus exact runtime receipts own coordinator presence, work discovery, deterministic launch, job-bound continuation, review, typed failure, semantic admission, and retained decision reachability. Exact 07d891ba and ec1431ff delete the persisted/global thread aggregate and its generic coordinator/prompt/revision surfaces. Exact f7948795 deletes MindGatewayReview, MindStateCommitReceipt v0, the generic interpreter prompt, runtime registration/read APIs, false thought/state-effect/adoption CultNet mouths, and stale launch proof profiles. CultMesh now projects only reasoning basis, decision context, and exact Mind commit receipt, read-only. Exact 1c9aafd8 seals the terminal decision context before model-backed frontier-Planning failure and binds the typed failure to it. Exact e0e75a30 deletes the residual aggregate role patch/parser/policy surface, gives Research one closed typed decision, and deletes the unowned generic Imagination planning patch. Exact 12b1b285 makes runtime model/tool binding validation the shared owner for execution and decision sealing; hostile provider, receipt, and stored-binding substitutions refuse, while retained basis/context audit survives transcript-delta deletion. Exact 01602fd3 advances Mind/runtime to v2/v1 and refuses historical or split writable identity pairs before registered writers see them. Exact 26b6a5bf proves simultaneous disjoint Modeling writes, simultaneous Verification+Modeling admission, same-identity conflict, exact replay, and reopened graph assembly; raw mutation primitives are crate-private. Exact 7c2ebd81 moves Persona state-note admission from the legacy agent-memory aggregate into keyed Mind documents and proves a concrete Hands consequence can commit simultaneously. Exact 79c0e373 seals the assembled Persona input and observed source versions in Mind before inference. Exact d3300bba authenticates that input through its one exact Mind commit, refuses naked typed documents, re-enters without external observation or model inference, and proves current-work reconstruction is identical and read-only across Launch, Wait, completed, and post-Research boundaries. Exact edb5c3a3 deletes the launch, heartbeat, and terminal-result family identity mirrors: the sealed typed launch owns live pass identity and the archived attempt owns historical request identity. Exact cabdd6c3 separates immutable coordinator incarnation basis/terminality from minimal model-session admission and removes the remaining session prose, clocks, dead states, redundant options, and whole-store coordinator snapshot. Exact a46725a1 reduces runtime jobs to Queued/Completed/Failed admission latches and removes timestamp selection from Research. Exact 10a70afc derives job role/session ownership from sealed launches and model bindings, leaving the generic job as identity plus status. Exact 53e869c0 removes generic job-result evidence/artifact mirrors; exact 8eaa96c5 stops persisting generic result documents for structured worker decisions; exact 2c3335dc deletes the generic result family entirely and makes typed decisions, model receipts/failures, job status, and process claims own their respective terminal facts. Exact dbb00c2b retains the minimal live/archive session pair for explicit phase closure and retired-identity refusal while deleting display echoes and a wrapper. Exact 24023265 makes the sealed Verification projection the sole Hands receipt input and deletes the duplicate live reread path. Exact a01c6842 deletes the coordinator's same-function always-approved Hands review, derives consequence authority through route/intent/grant identities, and refuses ambiguous receipt sets instead of selecting by timestamp. No compatibility reader, bootstrap aggregate, schema migrator, or dual reader survives. The source-level Decision-Auditable Concurrent Mind migration is accepted; the fresh exact-package capstone remains open. The machine remains a supervised engineering alpha; Model Atlas operational Gate 1 stays paused. public_positioning: docs/positioning.md is the current public claim owner. Epiphany is the organizational layer above frontier AI workers; global coherence collapse is the primary failure; prompts are bounded projections of governed organizational state; humans retain purpose, judgment, authority, disagreement, exceptions, and acceptance. GameCult is the forge and longitudinal evidence program for a target federation of one locally owned Epiphany project organism per living project Body. Model Atlas carries typed offers, claims, evidence, and derived technical relationships; Bifrost is the intended external work, membership, governance, attribution, and identity-linked receipt rail. Public Persona relationships and visitor surfaces are intended social infrastructure, while private Mind and consequence authority remain local. The fleet, real three-repository Gate 1, complete Bifrost attribution, sustained autonomous production, visitor experience, and external design-partner pilots remain gated alpha targets. competitive_launch_signal: The 2026-08-22 Munder Difflin launch analysis in notes/munder-difflin-launch-intelligence-2026-08-23.md is the current Eyes/Imagination owner for this category signal. It establishes strong demand to try a packaged, local, visual multi-agent control plane and supplies repeated qualitative demand for an operator-attention surface over plans, questions, blockers, decisions, consequences, and liveness; it does not establish retention, reliable autonomy, or paid product-market fit. Munder is materially ahead in installation, cross-platform reach, provider reuse, category compression, community formation, and feedback velocity. Its public failures make renderer-owned physiology, cross-Body restoration, proxy safety metrics, false consequence receipts, provider parity, and marketed-but-unavailable federation concrete falsification targets. Epiphany does not yet own a general operator UI: Persona projection into shared asynchronous chat is the concrete human surface, while CultMesh remains projection-neutral. Social Aquarium, a dense operator cockpit, TUI, and audit surfaces may use distinct Eve compositions over the same provider-owned facts. A one-hour projection experiment and managed continuity/federation remain evidence-led options rather than adopted roadmap authority; the source-subtraction and test-authority audit remains next. - latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. The pure OpenAI runtime library opens exact model execution and admits typed provider events. OpenRouter auth/networking remains a direct release-entrypoint boundary; Codex transport crosses the lean authenticated CodexConnector client ABI and no Codex auth, HTTP/SSE, Codex-home, or compiled Codex dependency remains in Epiphany. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Workers use one governed tool-capable route; no parallel no-tools mode survives. The sealed typed worker launch is the sole live owner of pass-family identity; terminal role results contain semantic decision cargo rather than routing echoes, and archived attempts retain historical request identity plus the structured decision. Runtime jobs are only mutable job-identity plus Queued/Completed/Failed admission latches; clocks, role/session mirrors, unowned intermediate states, and generic terminal-result documents are absent. Model bindings own model-session membership, sealed launches own outer-worker role, root membership is structural, and Research derives attempt authority as an exact set rather than timestamp order. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Structured role/reorientation outcomes terminalize jobs and process claims through exact-envelope CAS; native model receipt/failure records own model terminality, process claims own process death, and archives retain typed decisions including typed failures. Mind/runtime writable epochs are v11/v46. The public CultNet catalog contains only three earned portable boundaries: exact OpenAI-compatible provider request, Persona state, and work-organ state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. + latest_phase: Fresh-package Ox17 remains paused while source subtraction continues. The live source owns keyed Mind, sealed reasoning projections and exact provider requests, direct Body-to-Modeling work, typed frontier planning, Persona, provider-owned Bifrost feedback, and Odin/Idunn deployment receipts. Provider events and receipts are transient transport values normalized into one native persisted model stream/receipt family. The pure OpenAI runtime library opens exact model execution and admits typed provider events. OpenRouter auth/networking remains a direct release-entrypoint boundary. For Codex, the consumer adapter seals the exact final `CodexProviderRequest` into Mind before inference; the release edge only wraps it in the authenticated Connector invocation. No Codex auth, HTTP/SSE, Codex-home, or compiled Codex implementation remains in Epiphany. Runtime model bindings are request-to-session/job edges; provider, worker ancestry, and reasoning basis remain on the native model request. Runtime tool bindings are intent-to-session/job edges; model ancestry remains on the exact tool intent. Workers use one governed tool-capable route; no parallel no-tools mode survives. The sealed typed worker launch is the sole live owner of pass-family identity; terminal role results contain semantic decision cargo rather than routing echoes, and archived attempts retain historical request identity plus the structured decision. Runtime jobs are only mutable job-identity plus Queued/Completed/Failed admission latches; clocks, role/session mirrors, unowned intermediate states, and generic terminal-result documents are absent. Model bindings own model-session membership, sealed launches own outer-worker role, root membership is structural, and Research derives attempt authority as an exact set rather than timestamp order. Runtime child documents, Hands consequence receipts, and repository-frontier documents carry only causal identity, lifecycle, strong dependencies, semantic payload, and consequence; CultCache plus the runtime root epoch own internal type/schema identity. Runtime identity and swarm binding retain their explicit epoch fields. Sealed worker contexts retain explicit schema and contract because they are exact model input. Autonomous proposal origin belongs to the Proposal-Modeling request; there is no companion binding document or stored hash echo. The immutable repository-domain receipt carries only the canonical repository name and exact authenticated Body hash; runtime, swarm, workspace, envelope identity/schema, prose, and time remain derived. Operator objective intake carries only thread provenance, the asserted objective, source actor/reference, and submission time; CultCache owns envelope identity/schema and the Mind objective owns active state. Persona-memory v2 owns exact Interpreter effect/context provenance; Persona social mention v2 relies on its queue and turn request for routing; tool-receipt v1 owns exact result JSON or error. Research authenticates the real Substrate Gate grant and tool receipts in place, then writes keyed evidence/observations under one exact `Eyes.frontier_research` Mind commit; no source-lookup document or evidence packet survives. Resident Self state v3 and retention head v1 retain lifecycle counts and the exact deletion chain without a causal clock. Structured role/reorientation outcomes terminalize jobs and process claims through exact-envelope CAS; native model receipt/failure records own model terminality, process claims own process death, and archives retain typed decisions including typed failures. Mind/runtime writable epochs are v11/v47. The public CultNet catalog contains only two earned portable boundaries: Persona state and work-organ state. Provider request contracts belong to their provider boundary; Epiphany's closed provider-request document is private Mind state. Old writable stores refuse with no migrator or dual reader. Brokkr owns Unity through Eve/CultMesh; a future Rider daemon owns Rider. No Idunn build, package, deployment, Ox root, or Model Atlas Gate run is authorized. Ox16 remains sealed historical evidence. execution_binding_authority_cut: Exact ce6bff12 reduces model and tool execution bindings to the only facts they own. A model binding maps one native request to its runtime session and job; a tool binding maps one typed intent to its runtime session and job. Provider identity, source worker, reasoning basis, and model-request ancestry are no longer copied into bindings or compared through timestamp-shaped API arguments. Validation, retention, public-source lookup, worker terminality, decision sealing, and tool continuation reload the exact native request or tool intent. Runtime writable state advances to v37. Core, epoch refusal, transcript-free decision audit, OpenAI tool continuation, and the release-owned tool runtime pass. The cut removes 67 net source lines and leaves runtime_spine.rs at 9,300 physical lines with 50 public functions and 25 public structs. Verification generated 12.713 GiB across 19,134 files; Cargo cleanup restored the single 1.78 MiB state inspector. Atlas is untouched; no live inter-swarm collaboration has run. provider_transport_boundary_cut: Exact ed7357a2 removes Codex transport from Epiphany's compiled body. The complete epiphany-openai-codex-spine package, codex-login/codex-client graph, CODEX_HOME/auth.json readiness, direct Codex HTTP/SSE, and Codex credential creation/argv are gone. Model and Persona entrypoints use the lean typed client from exact CodexConnector 54d8bc2525b7e7fa1b9dd26b95871247ff4c7566 over authenticated loopback MessagePack; Connector owns Codex auth, transport, replay, and exact native/provider digest receipts. Epiphany retains sealed native/provider requests, strict schema/call-ID projection, tool continuation, decision admission, and typed receipt evidence. OpenRouter remains one direct ureq/Rustls boundary with its own credential and terminal-tool dialect. Model receipts advance to v1 and runtime to v38; caller identity, both request digests, and cached-token usage survive transcript deletion. The maintained non-lock source shrinks by 857 lines and Cargo.lock drops 4,830 lines. Core 150/150, runtime 21/21, adapter 5/5, model edge 12/12, Persona 1/1, exact launch checks, and focused no-deps Clippy pass. Two focused build roots totaling 10.8 GiB were removed; only the exact 1,776,640-byte state inspector at SHA-256 DD38855C6F092C2C53D2212A938E737643F41130F4681708840BA6075320A04E remains. Atlas is untouched and no collaboration acceptance is claimed. + provider_request_authority_cut: Exact c37cae8b replaces the durable generic OpenAI-shaped request with a closed provider-request document. The consumer adapter now lowers the canonical native request directly to either the exact final `CodexProviderRequest` or the exact OpenRouter request before inference and decision-context sealing. The release edge no longer performs Codex schema, tool, call-ID, or output-format lowering; it supplies the already sealed Codex request to the authenticated Connector invocation. Runtime and decision-context writable schemas advance to v47/v3 with no compatibility reader. Exact 87ea81db pins current Connector source 6dc80f6d266db4d82566d2434adcc55a48e8ecad and deletes Epiphany's obsolete 106-line public schema for the dead generic request, leaving two earned portable CultNet contracts. Connector separates contract-only, client, and daemon compile surfaces; Epiphany uses the contract-only surface in the adapter and the client surface only at the release edge. The Epiphany source cuts remove 125 net maintained lines; Core 152/152, runtime 21/21, adapter 5/5, model edge 12/12, Persona 1/1, and Connector contract/client/daemon 8/8, 10/10, 29/29 pass. Atlas is untouched and no live collaboration acceptance is claimed. runtime_session_authority_cut: Exact cabdd6c3 removes coordinator process incarnations from the generic model-session aggregate. EpiphanyRuntimeSession now contains only grouping identity plus active/completed admission state. Immutable EpiphanyCoordinatorRunBasis records exact thread, resident launch, objective, and start provenance. Exact completion/failure receipts and process-death recovery compete through one deterministic EpiphanyCoordinatorRunTerminality identity, so one full typed authority wins while unrelated document inserts merge. Objective prose, clocks, coordinator notes, four unused status variants, the one-field session-options wrapper, and the dead whole-snapshot append helper are deleted. Runtime advances to v40 with no compatibility reader. The focused Core, model-failure audit, Persona, coordinator terminality/conflict, release coordinator, and release model-runtime checks pass. The code cut removes 62 maintained lines net. Verification created 6.3 GiB across 7,017 Cargo files; cleanup restored exactly the 1,776,640-byte state inspector at SHA-256 DD38855C6F092C2C53D2212A938E737643F41130F4681708840BA6075320A04E. Atlas remains untouched and no live inter-swarm collaboration is claimed. runtime_job_authority_cut: Exact a46725a1 removes timestamp causality and dead transition theater from EpiphanyRuntimeJob. The job is now the minimal mutable admission latch from Queued to Completed or Failed; Running, WaitingForReview, Cancelled, created_at, and updated_at are gone. Research no longer chooses a latest attempt by creation time: it derives the exact attempt set, refuses multiple live or multiple successful authorities, requires terminal evidence for failures, and otherwise projects launch, wait, or review deterministically. Runtime advances to v41 with no compatibility reader. Core, old-epoch refusal, model-failure audit, Persona replay, OpenAI runtime, release coordinator, and release model-runtime checks pass. The cut removes 67 maintained lines net. Verification created 3.2 GiB across 4,498 Cargo files; cleanup restored exactly the authenticated 1,776,640-byte state inspector. Atlas remains untouched and live inter-swarm collaboration remains unproven. runtime_job_binding_cut: Exact 10a70afc makes EpiphanyRuntimeJob a two-field identity/status latch. The sealed worker launch owns outer-worker role; EpiphanyRuntimeModelExecutionBinding owns model-session membership; outer workers belong to the root session by definition. Role and session disappear from jobs and generic job results, the result's always-empty metadata map is deleted, and heartbeat launch options lose constant root-session plus unused objective/note cargo. Session closure and retention derive their exact job set from model bindings; tool ownership derives from either the sealed launch or one exact model binding; duplicate terminal results refuse instead of sorting by completion time. Runtime advances to v42 without a compatibility reader. Keyed lifecycle, model-failure audit, transcript-free binding, tool continuation, Persona replay, coordinator terminality, epoch refusal, OpenAI runtime, release coordinator, and release model-runtime checks pass. The cut removes 73 maintained lines net. Verification created 3.7 GiB across 4,764 Cargo files; cleanup restored exactly the authenticated 1,776,640-byte state inspector. Atlas remains untouched and live inter-swarm collaboration remains unproven. runtime_job_result_cargo_cut: Exact 53e869c0 deletes evidence and artifact mirrors from EpiphanyRuntimeJobResult and its completion API. Structured role/reorientation outcomes remain the sole evidence/artifact owners; the generic result retains only lifecycle verdict, terse summary/next-move account, completion time, and optional decision-context binding for transport and process-death physiology. Reorientation failure display no longer invents generic evidence. Runtime advances to v43 with no compatibility reader. Keyed lifecycle, auditable model failure, epoch refusal, reorientation, typed worker admission, Persona replay, OpenAI runtime, release coordinator, and release model-runtime checks pass. The cut removes 51 maintained lines net. Verification created 3.654 GiB across 4,759 Cargo files; Cargo cleanup restored exactly the authenticated 1,776,640-byte state inspector. Atlas remains untouched and live inter-swarm collaboration remains unproven. structured_worker_result_cut: Exact 8eaa96c5 makes typed role/reorientation outcomes the sole durable structured worker decisions. Runtime completion strong-reads and byte-identically replays the exact structured envelope while atomically terminalizing job/process physiology; it persists a generic result only when no structured outcome exists. Fulfilled worker archives retain decision context plus the full typed role result, not a generic companion. Coordinator reorientation success derives from job status and requires the typed reorientation result. Runtime advances to v44 and archived worker attempts to v3 with no compatibility reader. Keyed lifecycle, decision audit, model-failure audit, reorientation, role admission, Persona replay, runtime-error/tool-loop failures, release coordinator, and release model-runtime checks pass. The source cut adds 7 maintained lines because the exact CAS dependency fence replaces a larger durable duplication. Verification created 5.632 GiB across 6,826 Cargo files; Cargo cleanup restored exactly the authenticated 1,776,640-byte state inspector. Atlas remains untouched and live inter-swarm collaboration remains unproven. - standalone_codex_transport_target: Independent GameCult/CodexConnector exact 54d8bc2525b7e7fa1b9dd26b95871247ff4c7566 owns one Cargo package and one public daemon binary. Its default library is the lean encrypted client/contract ABI; the daemon feature adds the public service, bounded raw Responses transport, the private digest-pinned official codex app-server credential child, and keyed CultCache replay. Active identity is sealed before provider I/O; the exact encrypted completion is durable before reply; completed replay survives restart byte-identically; restart-era active work refuses as indeterminate without consuming current capacity. Callers own native/provider projection, prompts, tools, decisions, and admission. Redacted CultMesh/Odin readiness, the independent Idunn target, Yggdrasil service installation, and Ghostlight's consumer/deployment cut remain open. No live credential or deployment authority has moved. + standalone_codex_transport_target: Independent GameCult/CodexConnector source exact 6dc80f6d266db4d82566d2434adcc55a48e8ecad owns one Cargo package and one public daemon binary. Its no-feature library is the typed provider/result contract only; the default `client` feature adds authenticated encryption, bounded framing, and one-request socket transport; `daemon` adds the public service, bounded raw Responses transport, the private digest-pinned official codex app-server credential child, and keyed CultCache replay. Active identity is sealed before provider I/O; the exact encrypted completion is durable before reply; completed replay survives restart byte-identically; restart-era active work refuses as indeterminate without consuming current capacity. Callers own native/provider projection, prompts, tools, decisions, and admission. Connector docs exact 8c57be4 describe the three compile surfaces; Ghostlight exact 8e7d980 pins the same source contract. Redacted CultMesh/Odin readiness, the independent Idunn target, and Yggdrasil service installation remain open. No live credential or deployment authority moved in this cut. fixed_routing_and_retention_cargo_cut: Exact ffd91c20 deletes EyesEvidencePacket.source_role_id, PersonaSocialMention.target_agent_id, and ResidentSelfRetentionHead.retained_at_millis. Each producer supplied one fixed or non-causal value and no consumer read it; the request/context, Persona queue plus turn request, and retention chain remain the real owners. Eyes packet v2, Persona mention v2, Resident Self state v3/retention head v1, and runtime v27 form a hard cut. Core and the three consuming release entrypoints compile; consequential Persona, Research, and epoch-refusal proofs pass. The maintained source delta is 6 net deletions. Atlas is untouched; no live inter-swarm collaboration has run. provider_stream_authority_cut: Exact fe118e13 makes OpenAI/OpenRouter events and receipts transient transport values. The runtime immediately normalizes them into the single persisted native model event/receipt family used by tool continuation, assistant reconstruction, terminal validation, and bounded retention. Duplicate provider writes, registrations, archive requirements, schema IDs, two public schemas/index rows, and the include-only model-runtime shell are gone; the exact provider request remains durable. Runtime advances to v28 and the catalog drops to 18 schemas. The cut removes 270 net maintained lines. Adapter 1/1, provider spine 14/14, reasoning context 8/8, runtime 23/23, model entrypoint 11/11, swarm 4/4, epoch refusal 1/1, and release construction 15/15 pass. Atlas is untouched; live inter-swarm collaboration remains unproven. cultnet_catalog_authority_cut: Exact dbed11b3 and 8bb0719b delete the hand-maintained JSON shadow registry. The nonexistent runtime-event contract and obsolete public archived-session tombstone schema disappear first. Runtime-local identity, session, job, binding, coordinator, native model/tool, and state-ledger schemas then disappear because no live CultNet provider carries them and several contradicted their Rust owners. Typed CultCache registration and owner-projected CultMesh state remain authoritative. The catalog has exactly three earned boundaries: the exact OpenAI-compatible provider request, gamecult.persona_state.v0, and epiphany.work_organ_state.v0. Parse/path/unindexed/forbidden-contract checks pass at 3/3/0/0/0. The cuts remove 850 net maintained lines. Atlas is untouched; live inter-swarm collaboration remains unproven. @@ -223,10 +224,10 @@ current_status: starfire_linux_modeling_peak: 109887488_bytes_resident_body_plus_modeling_circuit yggdrasil_epiphany_service_contract: idunn_source_change_owner_eve_and_local_typed_operator_surfaces_no_discord_control_plane resident_physiology: historical_c011_exact_465af24d_zero_zombie_proof_accepted_current_containers_exited_255 - unresolved_authority: `runtime_spine.rs` remains the largest central liability; it still mixes immutable identity, minimal model sessions/jobs, process claims, model/tool execution binding, family admission, consequence receipts, retention, and resurrection fences. Exact a01c6842 removes the counterfeit Hands review; route, Substrate Gate grant, minimal intent, frontier authority, and exact consequences now own that chain. No production actuator authors those receipts, so the coordinator truthfully stops at `awaitingHandsExecutor`. The sharper provider seam is now Codex: Mind seals `EpiphanyOpenAiModelRequest`, while the release edge derives the final `CodexProviderRequest` sent to the standalone daemon. That second derivation must be collapsed or sealed exactly without moving consumer cognition into CodexConnector. The 3,592-file vendored Codex tree has no production build consumer but contains uncommitted edits that must be preserved before deletion. Historical c011 and partial Gate roots stay untouched/read-only. - next_action: Continue source subtraction from exact a01c6842. Map the two-stage Codex request lowering and make the exact final daemon request the audited provider request while preserving consumer-owned prompts, tools, retry, interpretation, and Mind admission. Reconcile Epiphany/Ghostlight/Connector protocol pins and repair stale standalone-daemon deployment maps. Then preserve the current uncommitted vendored-Codex edits and delete the 3,592-file tree if the final live-consumer audit remains empty. Resume the single-caller runtime-spine audit afterward. Keep OpenRouter as a separate temporary provider edge, Model Atlas operationally paused, and avoid local workspace-wide builds or deployment mutation. + unresolved_authority: `runtime_spine.rs` remains the largest central liability; it still mixes immutable identity, minimal model sessions/jobs, process claims, model/tool execution binding, family admission, consequence receipts, retention, and resurrection fences. Exact a01c6842 removes the counterfeit Hands review; route, Substrate Gate grant, minimal intent, frontier authority, and exact consequences now own that chain. No production actuator authors those receipts, so the coordinator truthfully stops at `awaitingHandsExecutor`. Exact c37cae8b closes the two-stage Codex request seam: Mind seals the final daemon request and the release edge only transports it. Ghostlight exact 8e7d980 pins the same Connector source contract without changing its live deployment. The 3,592-file vendored Codex tree has no production build consumer but contains uncommitted edits that must be preserved before deletion. Standalone-daemon deployment maps remain stale. Historical c011 and partial Gate roots stay untouched/read-only. + next_action: Continue source subtraction from exact 87ea81db. Repair stale standalone-daemon deployment maps without touching live service authority. Then preserve the current uncommitted vendored-Codex edits and delete the 3,592-file tree if the final live-consumer audit remains empty. Resume the single-caller runtime-spine audit afterward. Keep OpenRouter as a separate temporary provider edge, Model Atlas operationally paused, and avoid local workspace-wide builds or deployment mutation. - runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, minimal model sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. The sealed typed worker launch owns live pass-family identity and outer-worker role. Model execution bindings own model-session membership; outer-worker root membership is structural. Archived worker attempts retain exact request kind/ID, deletion digest, decision context, and full typed structured outcome after live launch deletion, including typed failures. Model sessions carry only grouping identity plus the active/completed phase latch; completed-session retention derives its exact jobs from model bindings and writes one private tombstone containing retired identities plus the deletion-chain digest. The live and archived documents protect distinct admission and resurrection invariants and do not duplicate decision cargo. Runtime jobs carry only job identity plus the Queued/Completed/Failed latch. No job clock, role/session mirror, intermediate status, generic terminal-result document, latest-result selector, or model-turn identity echo participates in causality. Typed role/reorientation outcomes own structured terminal decisions and atomically close their job/process physiology; native model receipt/failure records own model-pass terminality; process claims own process death. Verification reasons from the exact route, authority, intent, patch, command, and commit bodies sealed in its basis and has no review document or live receipt-reread tool. Mind/runtime writable epochs remain v11/v46; archived worker attempts are v3. Family launch CAS, model execution, and coordinator basis admission are the only session/job creation owners. Continue subtraction at the exact Codex request seam and then the remaining single-caller runtime-spine surfaces; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. + runtime_spine_surface_cut: `runtime_spine.rs` owns immutable runtime identity, minimal model sessions/jobs and process claims, model/tool execution bindings, family admission, consequence receipts, retention, and identity-resurrection fences. Provider requests remain exact durable audit input; provider events/receipts normalize into one native persisted stream/receipt family. The sealed typed worker launch owns live pass-family identity and outer-worker role. Model execution bindings own model-session membership; outer-worker root membership is structural. Archived worker attempts retain exact request kind/ID, deletion digest, decision context, and full typed structured outcome after live launch deletion, including typed failures. Model sessions carry only grouping identity plus the active/completed phase latch; completed-session retention derives its exact jobs from model bindings and writes one private tombstone containing retired identities plus the deletion-chain digest. The live and archived documents protect distinct admission and resurrection invariants and do not duplicate decision cargo. Runtime jobs carry only job identity plus the Queued/Completed/Failed latch. No job clock, role/session mirror, intermediate status, generic terminal-result document, latest-result selector, or model-turn identity echo participates in causality. Typed role/reorientation outcomes own structured terminal decisions and atomically close their job/process physiology; native model receipt/failure records own model-pass terminality; process claims own process death. Verification reasons from the exact route, authority, intent, patch, command, and commit bodies sealed in its basis and has no review document or live receipt-reread tool. Mind/runtime writable epochs remain v11/v47; archived worker attempts are v3. Family launch CAS, model execution, and coordinator basis admission are the only session/job creation owners. Continue subtraction through the remaining single-caller runtime-spine surfaces; do not recreate deleted authority through registries, adapters, compatibility readers, or summary DTOs. runtime_event_cut: Exact 27fe11ae deletes persisted generic runtime events, their registry and CultNet contract, CLI/status surfaces, coordinator and lifecycle shadows, archival dependencies, and the obsolete legacy coordinator repair path. Exact d66baa27, 058751fb, and 573ddc8b first removed provider-event duplication, the arbitrary event writer, and paired lifecycle events. Runtime session/job state plus exact typed results, failures, coordinator run receipts, and coordinator death recoveries solely own terminal facts. Events cannot route work, authenticate terminality, or resurrect authority because no runtime-event document remains. From 7a125d783825f7a86b2479742248547fbd640d58 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Tue, 25 Aug 2026 00:02:24 +0200 Subject: [PATCH 105/340] Evict vendored Codex implementation --- AGENTS.md | 9 - Cargo.toml | 2 +- LICENSE | 35 +- notes/README.md | 1 - notes/codex-auth-spine-inventory.md | 198 - notes/epiphany-fork-implementation-plan.md | 4 +- notes/native-coordinator-liberation-map.md | 405 - vendor/codex/.bazelignore | 4 - vendor/codex/.bazelrc | 165 - vendor/codex/.bazelversion | 1 - vendor/codex/.codespellignore | 6 - vendor/codex/.codespellrc | 6 - .../codex/.codex/skills/babysit-pr/SKILL.md | 187 - .../skills/babysit-pr/agents/openai.yaml | 4 - .../babysit-pr/references/github-api-notes.md | 72 - .../babysit-pr/references/heuristics.md | 58 - .../skills/babysit-pr/scripts/gh_pr_watch.py | 806 - .../babysit-pr/scripts/test_gh_pr_watch.py | 155 - .../code-review-breaking-changes/SKILL.md | 12 - .../skills/code-review-change-size/SKILL.md | 11 - .../skills/code-review-context/SKILL.md | 13 - .../skills/code-review-testing/SKILL.md | 14 - .../codex/.codex/skills/code-review/SKILL.md | 14 - vendor/codex/.codex/skills/codex-bug/SKILL.md | 48 - .../.codex/skills/codex-pr-body/SKILL.md | 59 - .../codex/.codex/skills/remote-tests/SKILL.md | 16 - vendor/codex/.codex/skills/test-tui/SKILL.md | 14 - vendor/codex/.devcontainer/Dockerfile | 27 - vendor/codex/.devcontainer/Dockerfile.secure | 74 - vendor/codex/.devcontainer/README.md | 49 - vendor/codex/.devcontainer/devcontainer.json | 27 - .../.devcontainer/devcontainer.secure.json | 83 - vendor/codex/.devcontainer/init-firewall.sh | 170 - vendor/codex/.devcontainer/post-start.sh | 36 - vendor/codex/.devcontainer/post_install.py | 113 - vendor/codex/.gitattributes | 1 - vendor/codex/.github/CODEOWNERS | 5 - .../.github/ISSUE_TEMPLATE/1-codex-app.yml | 54 - .../.github/ISSUE_TEMPLATE/2-extension.yml | 61 - vendor/codex/.github/ISSUE_TEMPLATE/3-cli.yml | 70 - .../.github/ISSUE_TEMPLATE/4-bug-report.yml | 37 - .../ISSUE_TEMPLATE/5-feature-request.yml | 32 - .../.github/ISSUE_TEMPLATE/6-docs-issue.yml | 27 - .../actions/linux-code-sign/action.yml | 45 - .../actions/macos-code-sign/action.yml | 253 - .../macos-code-sign/codex.entitlements.plist | 8 - .../actions/macos-code-sign/notary_helpers.sh | 46 - .../actions/prepare-bazel-ci/action.yml | 64 - .../run-argument-comment-lint/action.yml | 54 - .../.github/actions/setup-bazel-ci/action.yml | 128 - .../actions/setup-rusty-v8-musl/action.yml | 49 - .../actions/windows-code-sign/action.yml | 57 - vendor/codex/.github/blob-size-allowlist.txt | 10 - vendor/codex/.github/codex-cli-splash.png | Bin 838131 -> 0 bytes vendor/codex/.github/codex/home/config.toml | 3 - .../.github/codex/labels/codex-attempt.md | 9 - .../.github/codex/labels/codex-review.md | 7 - .../.github/codex/labels/codex-rust-review.md | 139 - .../.github/codex/labels/codex-triage.md | 7 - vendor/codex/.github/dependabot.yaml | 30 - ...dotslash-argument-comment-lint-config.json | 24 - vendor/codex/.github/dotslash-config.json | 84 - vendor/codex/.github/dotslash-zsh-config.json | 23 - vendor/codex/.github/pull_request_template.md | 8 - .../scripts/build-zsh-release-artifact.sh | 61 - .../scripts/install-musl-build-tools.sh | 279 - .../run-argument-comment-lint-bazel.sh | 115 - vendor/codex/.github/scripts/run-bazel-ci.sh | 404 - .../codex/.github/scripts/rusty_v8_bazel.py | 358 - .../.github/scripts/rusty_v8_module_bazel.py | 230 - .../.github/scripts/test_rusty_v8_bazel.py | 126 - .../scripts/verify_bazel_clippy_lints.py | 234 - .../verify_cargo_workspace_manifests.py | 388 - .../scripts/verify_tui_core_boundary.py | 89 - .../codex/.github/workflows/Dockerfile.bazel | 36 - vendor/codex/.github/workflows/README.md | 33 - vendor/codex/.github/workflows/bazel.yml | 292 - .../.github/workflows/blob-size-policy.yml | 32 - vendor/codex/.github/workflows/cargo-deny.yml | 26 - vendor/codex/.github/workflows/ci.yml | 70 - vendor/codex/.github/workflows/cla.yml | 49 - .../workflows/close-stale-contributor-prs.yml | 107 - vendor/codex/.github/workflows/codespell.yml | 27 - .../.github/workflows/issue-deduplicator.yml | 402 - .../codex/.github/workflows/issue-labeler.yml | 143 - .../codex/.github/workflows/rust-ci-full.yml | 774 - vendor/codex/.github/workflows/rust-ci.yml | 222 - .../rust-release-argument-comment-lint.yml | 106 - .../workflows/rust-release-prepare.yml | 53 - .../workflows/rust-release-windows.yml | 264 - .../.github/workflows/rust-release-zsh.yml | 95 - .../codex/.github/workflows/rust-release.yml | 707 - .../.github/workflows/rusty-v8-release.yml | 188 - vendor/codex/.github/workflows/sdk.yml | 122 - vendor/codex/.github/workflows/v8-canary.yml | 132 - vendor/codex/.github/workflows/zstd | 46 - vendor/codex/.gitignore | 94 - vendor/codex/.markdownlint-cli2.yaml | 6 - vendor/codex/.npmrc | 4 - vendor/codex/.prettierignore | 7 - vendor/codex/.prettierrc.toml | 8 - vendor/codex/AGENTS.md | 234 - vendor/codex/BUILD.bazel | 42 - vendor/codex/CHANGELOG.md | 1 - vendor/codex/LICENSE | 201 - vendor/codex/MODULE.bazel | 519 - vendor/codex/MODULE.bazel.lock | 1958 -- vendor/codex/NOTICE | 9 - vendor/codex/README.md | 60 - vendor/codex/SECURITY.md | 17 - vendor/codex/announcement_tip.toml | 17 - vendor/codex/cliff.toml | 46 - vendor/codex/codex-cli/.dockerignore | 1 - vendor/codex/codex-cli/.gitignore | 1 - vendor/codex/codex-cli/Dockerfile | 59 - vendor/codex/codex-cli/bin/codex.js | 229 - vendor/codex/codex-cli/bin/rg | 79 - vendor/codex/codex-cli/package.json | 22 - vendor/codex/codex-cli/scripts/README.md | 23 - .../codex-cli/scripts/build_container.sh | 16 - .../codex-cli/scripts/build_npm_package.py | 453 - .../codex/codex-cli/scripts/init_firewall.sh | 115 - .../codex-cli/scripts/install_native_deps.py | 475 - .../codex-cli/scripts/run_in_container.sh | 95 - vendor/codex/codex-rs/.cargo/audit.toml | 9 - vendor/codex/codex-rs/.cargo/config.toml | 14 - vendor/codex/codex-rs/.config/nextest.toml | 46 - .../.github/workflows/cargo-audit.yml | 26 - vendor/codex/codex-rs/.gitignore | 8 - vendor/codex/codex-rs/BUILD.bazel | 18 - vendor/codex/codex-rs/Cargo.lock | 14672 --------------- vendor/codex/codex-rs/Cargo.toml | 472 - vendor/codex/codex-rs/README.md | 102 - .../codex/codex-rs/agent-identity/BUILD.bazel | 6 - .../codex/codex-rs/agent-identity/Cargo.toml | 29 - .../codex/codex-rs/agent-identity/src/lib.rs | 414 - vendor/codex/codex-rs/analytics/BUILD.bazel | 6 - vendor/codex/codex-rs/analytics/Cargo.toml | 32 - .../analytics/src/analytics_client_tests.rs | 1983 -- vendor/codex/codex-rs/analytics/src/client.rs | 221 - vendor/codex/codex-rs/analytics/src/events.rs | 612 - vendor/codex/codex-rs/analytics/src/facts.rs | 289 - vendor/codex/codex-rs/analytics/src/lib.rs | 50 - .../codex/codex-rs/analytics/src/reducer.rs | 879 - vendor/codex/codex-rs/ansi-escape/BUILD.bazel | 6 - vendor/codex/codex-rs/ansi-escape/Cargo.toml | 20 - vendor/codex/codex-rs/ansi-escape/README.md | 15 - vendor/codex/codex-rs/ansi-escape/src/lib.rs | 58 - .../codex-rs/app-server-client/BUILD.bazel | 6 - .../codex-rs/app-server-client/Cargo.toml | 36 - .../codex-rs/app-server-client/README.md | 67 - .../codex-rs/app-server-client/src/lib.rs | 2017 -- .../codex-rs/app-server-client/src/remote.rs | 856 - .../codex-rs/app-server-protocol/BUILD.bazel | 7 - .../codex-rs/app-server-protocol/Cargo.toml | 43 - .../schema/json/ApplyPatchApprovalParams.json | 114 - .../json/ApplyPatchApprovalResponse.json | 124 - .../json/ChatgptAuthTokensRefreshParams.json | 33 - .../ChatgptAuthTokensRefreshResponse.json | 23 - .../schema/json/ClientNotification.json | 22 - .../schema/json/ClientRequest.json | 5443 ------ ...CommandExecutionRequestApprovalParams.json | 622 - ...mmandExecutionRequestApprovalResponse.json | 116 - .../schema/json/DynamicToolCallParams.json | 33 - .../schema/json/DynamicToolCallResponse.json | 66 - .../json/ExecCommandApprovalParams.json | 165 - .../json/ExecCommandApprovalResponse.json | 124 - .../json/FileChangeRequestApprovalParams.json | 35 - .../FileChangeRequestApprovalResponse.json | 47 - .../schema/json/FuzzyFileSearchParams.json | 26 - .../schema/json/FuzzyFileSearchResponse.json | 66 - ...ileSearchSessionCompletedNotification.json | 13 - ...yFileSearchSessionUpdatedNotification.json | 74 - .../schema/json/JSONRPCError.json | 48 - .../schema/json/JSONRPCErrorError.json | 19 - .../schema/json/JSONRPCMessage.json | 137 - .../schema/json/JSONRPCNotification.json | 15 - .../schema/json/JSONRPCRequest.json | 60 - .../schema/json/JSONRPCResponse.json | 29 - .../McpServerElicitationRequestParams.json | 609 - .../McpServerElicitationRequestResponse.json | 29 - .../PermissionsRequestApprovalParams.json | 329 - .../PermissionsRequestApprovalResponse.json | 328 - .../schema/json/RequestId.json | 13 - .../schema/json/ServerNotification.json | 5329 ------ .../schema/json/ServerRequest.json | 1967 -- .../json/ToolRequestUserInputParams.json | 84 - .../json/ToolRequestUserInputResponse.json | 34 - .../codex_app_server_protocol.schemas.json | 15351 ---------------- .../codex_app_server_protocol.v2.schemas.json | 13237 ------------- .../schema/json/v1/InitializeParams.json | 67 - .../schema/json/v1/InitializeResponse.json | 38 - .../v2/AccountLoginCompletedNotification.json | 25 - .../AccountRateLimitsUpdatedNotification.json | 156 - .../json/v2/AccountUpdatedNotification.json | 79 - .../v2/AgentMessageDeltaNotification.json | 25 - .../json/v2/CancelLoginAccountParams.json | 13 - .../json/v2/CancelLoginAccountResponse.json | 22 - .../CommandExecOutputDeltaNotification.json | 55 - .../schema/json/v2/CommandExecParams.json | 305 - .../json/v2/CommandExecResizeParams.json | 48 - .../json/v2/CommandExecResizeResponse.json | 6 - .../schema/json/v2/CommandExecResponse.json | 26 - .../json/v2/CommandExecTerminateParams.json | 15 - .../json/v2/CommandExecTerminateResponse.json | 6 - .../json/v2/CommandExecWriteParams.json | 26 - .../json/v2/CommandExecWriteResponse.json | 6 - ...mmandExecutionOutputDeltaNotification.json | 25 - .../json/v2/ConfigBatchWriteParams.json | 59 - .../schema/json/v2/ConfigReadParams.json | 18 - .../schema/json/v2/ConfigReadResponse.json | 786 - .../v2/ConfigRequirementsReadResponse.json | 270 - .../json/v2/ConfigValueWriteParams.json | 41 - .../json/v2/ConfigWarningNotification.json | 77 - .../schema/json/v2/ConfigWriteResponse.json | 237 - .../json/v2/ContextCompactedNotification.json | 18 - .../v2/DeprecationNoticeNotification.json | 21 - .../schema/json/v2/DeviceKeyCreateParams.json | 39 - .../json/v2/DeviceKeyCreateResponse.json | 45 - .../schema/json/v2/DeviceKeyPublicParams.json | 14 - .../json/v2/DeviceKeyPublicResponse.json | 45 - .../schema/json/v2/DeviceKeySignParams.json | 165 - .../schema/json/v2/DeviceKeySignResponse.json | 33 - .../schema/json/v2/ErrorNotification.json | 198 - ...xperimentalFeatureEnablementSetParams.json | 17 - ...erimentalFeatureEnablementSetResponse.json | 17 - .../v2/ExperimentalFeatureListParams.json | 23 - .../v2/ExperimentalFeatureListResponse.json | 116 - .../schema/json/v2/FeedbackUploadParams.json | 47 - .../json/v2/FeedbackUploadResponse.json | 13 - .../v2/FileChangeOutputDeltaNotification.json | 25 - .../FileChangePatchUpdatedNotification.json | 107 - .../schema/json/v2/FsChangedNotification.json | 29 - .../schema/json/v2/FsCopyParams.json | 38 - .../schema/json/v2/FsCopyResponse.json | 6 - .../json/v2/FsCreateDirectoryParams.json | 32 - .../json/v2/FsCreateDirectoryResponse.json | 6 - .../schema/json/v2/FsGetMetadataParams.json | 25 - .../schema/json/v2/FsGetMetadataResponse.json | 37 - .../schema/json/v2/FsReadDirectoryParams.json | 25 - .../json/v2/FsReadDirectoryResponse.json | 43 - .../schema/json/v2/FsReadFileParams.json | 25 - .../schema/json/v2/FsReadFileResponse.json | 15 - .../schema/json/v2/FsRemoveParams.json | 39 - .../schema/json/v2/FsRemoveResponse.json | 6 - .../schema/json/v2/FsUnwatchParams.json | 15 - .../schema/json/v2/FsUnwatchResponse.json | 6 - .../schema/json/v2/FsWatchParams.json | 30 - .../schema/json/v2/FsWatchResponse.json | 25 - .../schema/json/v2/FsWriteFileParams.json | 30 - .../schema/json/v2/FsWriteFileResponse.json | 6 - .../schema/json/v2/GetAccountParams.json | 12 - .../json/v2/GetAccountRateLimitsResponse.json | 171 - .../schema/json/v2/GetAccountResponse.json | 86 - .../json/v2/GuardianWarningNotification.json | 19 - .../json/v2/HookCompletedNotification.json | 190 - .../json/v2/HookStartedNotification.json | 190 - .../json/v2/ItemCompletedNotification.json | 1366 -- ...anApprovalReviewCompletedNotification.json | 624 - ...dianApprovalReviewStartedNotification.json | 613 - .../json/v2/ItemStartedNotification.json | 1366 -- .../json/v2/ListMcpServerStatusParams.json | 43 - .../json/v2/ListMcpServerStatusResponse.json | 191 - .../schema/json/v2/LoginAccountParams.json | 92 - .../schema/json/v2/LoginAccountResponse.json | 93 - .../schema/json/v2/LogoutAccountResponse.json | 5 - .../schema/json/v2/McpResourceReadParams.json | 23 - .../json/v2/McpResourceReadResponse.json | 69 - ...ServerOauthLoginCompletedNotification.json | 23 - .../json/v2/McpServerOauthLoginParams.json | 29 - .../json/v2/McpServerOauthLoginResponse.json | 13 - .../json/v2/McpServerRefreshResponse.json | 5 - .../McpServerStatusUpdatedNotification.json | 34 - .../json/v2/McpServerToolCallParams.json | 23 - .../json/v2/McpServerToolCallResponse.json | 22 - .../v2/McpToolCallProgressNotification.json | 25 - .../schema/json/v2/ModelListParams.json | 30 - .../schema/json/v2/ModelListResponse.json | 200 - .../json/v2/ModelReroutedNotification.json | 37 - .../schema/json/v2/PlanDeltaNotification.json | 26 - .../RawResponseItemCompletedNotification.json | 931 - ...ReasoningSummaryPartAddedNotification.json | 26 - ...ReasoningSummaryTextDeltaNotification.json | 30 - .../v2/ReasoningTextDeltaNotification.json | 30 - .../schema/json/v2/ReviewStartParams.json | 129 - .../schema/json/v2/ReviewStartResponse.json | 1601 -- .../v2/SendAddCreditsNudgeEmailParams.json | 22 - .../v2/SendAddCreditsNudgeEmailResponse.json | 22 - .../v2/ServerRequestResolvedNotification.json | 30 - .../v2/TerminalInteractionNotification.json | 29 - ...readApproveGuardianDeniedActionParams.json | 17 - ...adApproveGuardianDeniedActionResponse.json | 5 - .../schema/json/v2/ThreadArchiveParams.json | 13 - .../schema/json/v2/ThreadArchiveResponse.json | 5 - .../json/v2/ThreadArchivedNotification.json | 13 - .../json/v2/ThreadClosedNotification.json | 13 - .../json/v2/ThreadCompactStartParams.json | 13 - .../json/v2/ThreadCompactStartResponse.json | 5 - .../schema/json/v2/ThreadForkParams.json | 459 - .../schema/json/v2/ThreadForkResponse.json | 2525 --- .../json/v2/ThreadInjectItemsParams.json | 19 - .../json/v2/ThreadInjectItemsResponse.json | 5 - .../schema/json/v2/ThreadListParams.json | 138 - .../schema/json/v2/ThreadListResponse.json | 1964 -- .../json/v2/ThreadLoadedListParams.json | 23 - .../json/v2/ThreadLoadedListResponse.json | 24 - .../json/v2/ThreadMetadataUpdateParams.json | 52 - .../json/v2/ThreadMetadataUpdateResponse.json | 1947 -- .../v2/ThreadNameUpdatedNotification.json | 19 - .../schema/json/v2/ThreadReadParams.json | 18 - .../schema/json/v2/ThreadReadResponse.json | 1947 -- .../v2/ThreadRealtimeClosedNotification.json | 20 - .../v2/ThreadRealtimeErrorNotification.json | 18 - .../ThreadRealtimeItemAddedNotification.json | 16 - ...dRealtimeOutputAudioDeltaNotification.json | 58 - .../v2/ThreadRealtimeSdpNotification.json | 18 - .../v2/ThreadRealtimeStartedNotification.json | 33 - ...adRealtimeTranscriptDeltaNotification.json | 23 - ...eadRealtimeTranscriptDoneNotification.json | 23 - .../schema/json/v2/ThreadResumeParams.json | 1382 -- .../schema/json/v2/ThreadResumeResponse.json | 2525 --- .../schema/json/v2/ThreadRollbackParams.json | 20 - .../json/v2/ThreadRollbackResponse.json | 1952 -- .../schema/json/v2/ThreadSetNameParams.json | 17 - .../schema/json/v2/ThreadSetNameResponse.json | 5 - .../json/v2/ThreadShellCommandParams.json | 18 - .../json/v2/ThreadShellCommandResponse.json | 5 - .../schema/json/v2/ThreadStartParams.json | 521 - .../schema/json/v2/ThreadStartResponse.json | 2525 --- .../json/v2/ThreadStartedNotification.json | 1947 -- .../v2/ThreadStatusChangedNotification.json | 101 - .../ThreadTokenUsageUpdatedNotification.json | 84 - .../schema/json/v2/ThreadTurnsListParams.json | 49 - .../json/v2/ThreadTurnsListResponse.json | 1613 -- .../schema/json/v2/ThreadUnarchiveParams.json | 13 - .../json/v2/ThreadUnarchiveResponse.json | 1947 -- .../json/v2/ThreadUnarchivedNotification.json | 13 - .../json/v2/ThreadUnsubscribeParams.json | 13 - .../json/v2/ThreadUnsubscribeResponse.json | 23 - .../json/v2/TurnCompletedNotification.json | 1600 -- .../json/v2/TurnDiffUpdatedNotification.json | 22 - .../schema/json/v2/TurnInterruptParams.json | 17 - .../schema/json/v2/TurnInterruptResponse.json | 5 - .../json/v2/TurnPlanUpdatedNotification.json | 55 - .../schema/json/v2/TurnStartParams.json | 887 - .../schema/json/v2/TurnStartResponse.json | 1596 -- .../json/v2/TurnStartedNotification.json | 1600 -- .../schema/json/v2/TurnSteerParams.json | 165 - .../schema/json/v2/TurnSteerResponse.json | 13 - .../schema/json/v2/WarningNotification.json | 21 - ...dowsSandboxSetupCompletedNotification.json | 32 - .../v2/WindowsSandboxSetupStartParams.json | 36 - .../v2/WindowsSandboxSetupStartResponse.json | 13 - ...ndowsWorldWritableWarningNotification.json | 26 - .../schema/typescript/AbsolutePathBuf.ts | 14 - .../schema/typescript/AgentPath.ts | 5 - .../typescript/ApplyPatchApprovalParams.ts | 21 - .../typescript/ApplyPatchApprovalResponse.ts | 6 - .../schema/typescript/AuthMode.ts | 8 - .../schema/typescript/ClientInfo.ts | 5 - .../schema/typescript/ClientNotification.ts | 5 - .../schema/typescript/ClientRequest.ts | 67 - .../schema/typescript/CollaborationMode.ts | 10 - .../schema/typescript/ContentItem.ts | 6 - .../schema/typescript/ConversationGitInfo.ts | 5 - .../schema/typescript/ConversationSummary.ts | 8 - .../typescript/ExecCommandApprovalParams.ts | 16 - .../typescript/ExecCommandApprovalResponse.ts | 6 - .../schema/typescript/ExecPolicyAmendment.ts | 12 - .../schema/typescript/FileChange.ts | 5 - .../schema/typescript/ForcedLoginMethod.ts | 5 - .../typescript/FunctionCallOutputBody.ts | 6 - .../FunctionCallOutputContentItem.ts | 10 - .../typescript/FuzzyFileSearchMatchType.ts | 5 - .../typescript/FuzzyFileSearchParams.ts | 5 - .../typescript/FuzzyFileSearchResponse.ts | 6 - .../typescript/FuzzyFileSearchResult.ts | 9 - ...yFileSearchSessionCompletedNotification.ts | 5 - ...zzyFileSearchSessionUpdatedNotification.ts | 6 - .../schema/typescript/GetAuthStatusParams.ts | 5 - .../typescript/GetAuthStatusResponse.ts | 6 - .../GetConversationSummaryParams.ts | 6 - .../GetConversationSummaryResponse.ts | 6 - .../schema/typescript/GhostCommit.ts | 8 - .../typescript/GitDiffToRemoteParams.ts | 5 - .../typescript/GitDiffToRemoteResponse.ts | 6 - .../schema/typescript/GitSha.ts | 5 - .../schema/typescript/ImageDetail.ts | 5 - .../typescript/InitializeCapabilities.ts | 17 - .../schema/typescript/InitializeParams.ts | 7 - .../schema/typescript/InitializeResponse.ts | 20 - .../schema/typescript/InputModality.ts | 8 - .../schema/typescript/LocalShellAction.ts | 6 - .../schema/typescript/LocalShellExecAction.ts | 5 - .../schema/typescript/LocalShellStatus.ts | 5 - .../schema/typescript/MessagePhase.ts | 11 - .../schema/typescript/ModeKind.ts | 8 - .../typescript/NetworkPolicyAmendment.ts | 6 - .../typescript/NetworkPolicyRuleAction.ts | 5 - .../schema/typescript/ParsedCommand.ts | 12 - .../schema/typescript/Personality.ts | 5 - .../schema/typescript/PlanType.ts | 5 - .../typescript/RealtimeConversationVersion.ts | 5 - .../typescript/RealtimeOutputModality.ts | 5 - .../schema/typescript/RealtimeVoice.ts | 5 - .../schema/typescript/RealtimeVoicesList.ts | 6 - .../schema/typescript/ReasoningEffort.ts | 8 - .../schema/typescript/ReasoningItemContent.ts | 5 - .../ReasoningItemReasoningSummary.ts | 5 - .../schema/typescript/ReasoningSummary.ts | 10 - .../schema/typescript/RequestId.ts | 5 - .../schema/typescript/Resource.ts | 9 - .../schema/typescript/ResourceContent.ts | 17 - .../schema/typescript/ResourceTemplate.ts | 9 - .../schema/typescript/ResponseItem.ts | 18 - .../schema/typescript/ReviewDecision.ts | 10 - .../schema/typescript/ServerNotification.ts | 63 - .../schema/typescript/ServerRequest.ts | 18 - .../schema/typescript/ServiceTier.ts | 5 - .../schema/typescript/SessionSource.ts | 6 - .../schema/typescript/Settings.ts | 9 - .../schema/typescript/SubAgentSource.ts | 7 - .../schema/typescript/ThreadId.ts | 5 - .../schema/typescript/ThreadMemoryMode.ts | 5 - .../schema/typescript/Tool.ts | 9 - .../schema/typescript/Verbosity.ts | 9 - .../schema/typescript/WebSearchAction.ts | 5 - .../schema/typescript/WebSearchContextSize.ts | 5 - .../schema/typescript/WebSearchLocation.ts | 5 - .../schema/typescript/WebSearchMode.ts | 5 - .../schema/typescript/WebSearchToolConfig.ts | 7 - .../schema/typescript/index.ts | 80 - .../schema/typescript/serde_json/JsonValue.ts | 5 - .../schema/typescript/v2/Account.ts | 6 - .../v2/AccountLoginCompletedNotification.ts | 5 - .../AccountRateLimitsUpdatedNotification.ts | 6 - .../v2/AccountUpdatedNotification.ts | 7 - .../v2/AddCreditsNudgeCreditType.ts | 5 - .../v2/AddCreditsNudgeEmailStatus.ts | 5 - .../v2/AdditionalFileSystemPermissions.ts | 7 - .../v2/AdditionalNetworkPermissions.ts | 5 - .../v2/AdditionalPermissionProfile.ts | 7 - .../v2/AgentMessageDeltaNotification.ts | 5 - .../schema/typescript/v2/AnalyticsConfig.ts | 6 - .../schema/typescript/v2/ApprovalsReviewer.ts | 12 - .../schema/typescript/v2/AskForApproval.ts | 5 - .../typescript/v2/AutoReviewDecisionSource.ts | 8 - .../schema/typescript/v2/ByteRange.ts | 5 - .../typescript/v2/CancelLoginAccountParams.ts | 5 - .../v2/CancelLoginAccountResponse.ts | 6 - .../typescript/v2/CancelLoginAccountStatus.ts | 5 - .../v2/ChatgptAuthTokensRefreshParams.ts | 16 - .../v2/ChatgptAuthTokensRefreshReason.ts | 5 - .../v2/ChatgptAuthTokensRefreshResponse.ts | 5 - .../schema/typescript/v2/CodexErrorInfo.ts | 12 - .../schema/typescript/v2/CollabAgentState.ts | 6 - .../schema/typescript/v2/CollabAgentStatus.ts | 5 - .../schema/typescript/v2/CollabAgentTool.ts | 5 - .../v2/CollabAgentToolCallStatus.ts | 5 - .../typescript/v2/CollaborationModeMask.ts | 10 - .../schema/typescript/v2/CommandAction.ts | 6 - .../v2/CommandExecOutputDeltaNotification.ts | 30 - .../typescript/v2/CommandExecOutputStream.ts | 8 - .../schema/typescript/v2/CommandExecParams.ts | 97 - .../typescript/v2/CommandExecResizeParams.ts | 18 - .../v2/CommandExecResizeResponse.ts | 8 - .../typescript/v2/CommandExecResponse.ts | 24 - .../typescript/v2/CommandExecTerminalSize.ts | 16 - .../v2/CommandExecTerminateParams.ts | 13 - .../v2/CommandExecTerminateResponse.ts | 8 - .../typescript/v2/CommandExecWriteParams.ts | 22 - .../typescript/v2/CommandExecWriteResponse.ts | 8 - .../v2/CommandExecutionApprovalDecision.ts | 7 - ...CommandExecutionOutputDeltaNotification.ts | 5 - .../CommandExecutionRequestApprovalParams.ts | 58 - ...CommandExecutionRequestApprovalResponse.ts | 6 - .../typescript/v2/CommandExecutionSource.ts | 5 - .../typescript/v2/CommandExecutionStatus.ts | 5 - .../schema/typescript/v2/Config.ts | 23 - .../typescript/v2/ConfigBatchWriteParams.ts | 14 - .../schema/typescript/v2/ConfigEdit.ts | 7 - .../schema/typescript/v2/ConfigLayer.ts | 7 - .../typescript/v2/ConfigLayerMetadata.ts | 6 - .../schema/typescript/v2/ConfigLayerSource.ts | 16 - .../schema/typescript/v2/ConfigReadParams.ts | 11 - .../typescript/v2/ConfigReadResponse.ts | 8 - .../typescript/v2/ConfigRequirements.ts | 9 - .../v2/ConfigRequirementsReadResponse.ts | 10 - .../typescript/v2/ConfigValueWriteParams.ts | 11 - .../v2/ConfigWarningNotification.ts | 22 - .../typescript/v2/ConfigWriteResponse.ts | 12 - .../v2/ContextCompactedNotification.ts | 8 - .../schema/typescript/v2/CreditsSnapshot.ts | 5 - .../v2/DeprecationNoticeNotification.ts | 13 - .../typescript/v2/DeviceKeyAlgorithm.ts | 8 - .../typescript/v2/DeviceKeyCreateParams.ts | 13 - .../typescript/v2/DeviceKeyCreateResponse.ts | 14 - .../typescript/v2/DeviceKeyProtectionClass.ts | 8 - .../v2/DeviceKeyProtectionPolicy.ts | 8 - .../typescript/v2/DeviceKeyPublicParams.ts | 8 - .../typescript/v2/DeviceKeyPublicResponse.ts | 14 - .../typescript/v2/DeviceKeySignParams.ts | 9 - .../typescript/v2/DeviceKeySignPayload.ts | 54 - .../typescript/v2/DeviceKeySignResponse.ts | 18 - .../v2/DynamicToolCallOutputContentItem.ts | 5 - .../typescript/v2/DynamicToolCallParams.ts | 6 - .../typescript/v2/DynamicToolCallResponse.ts | 6 - .../typescript/v2/DynamicToolCallStatus.ts | 5 - .../schema/typescript/v2/DynamicToolSpec.ts | 6 - .../schema/typescript/v2/ErrorNotification.ts | 6 - .../typescript/v2/ExecPolicyAmendment.ts | 5 - .../typescript/v2/ExperimentalFeature.ts | 37 - .../ExperimentalFeatureEnablementSetParams.ts | 12 - ...xperimentalFeatureEnablementSetResponse.ts | 9 - .../v2/ExperimentalFeatureListParams.ts | 13 - .../v2/ExperimentalFeatureListResponse.ts | 11 - .../typescript/v2/ExperimentalFeatureStage.ts | 5 - .../typescript/v2/FeedbackUploadParams.ts | 5 - .../typescript/v2/FeedbackUploadResponse.ts | 5 - .../v2/FileChangeApprovalDecision.ts | 5 - .../v2/FileChangeOutputDeltaNotification.ts | 5 - .../v2/FileChangePatchUpdatedNotification.ts | 6 - .../v2/FileChangeRequestApprovalParams.ts | 14 - .../v2/FileChangeRequestApprovalResponse.ts | 6 - .../typescript/v2/FileSystemAccessMode.ts | 5 - .../schema/typescript/v2/FileSystemPath.ts | 7 - .../typescript/v2/FileSystemSandboxEntry.ts | 7 - .../typescript/v2/FileSystemSpecialPath.ts | 5 - .../schema/typescript/v2/FileUpdateChange.ts | 6 - .../typescript/v2/FsChangedNotification.ts | 17 - .../schema/typescript/v2/FsCopyParams.ts | 21 - .../schema/typescript/v2/FsCopyResponse.ts | 8 - .../typescript/v2/FsCreateDirectoryParams.ts | 17 - .../v2/FsCreateDirectoryResponse.ts | 8 - .../typescript/v2/FsGetMetadataParams.ts | 13 - .../typescript/v2/FsGetMetadataResponse.ts | 28 - .../typescript/v2/FsReadDirectoryEntry.ts | 20 - .../typescript/v2/FsReadDirectoryParams.ts | 13 - .../typescript/v2/FsReadDirectoryResponse.ts | 13 - .../schema/typescript/v2/FsReadFileParams.ts | 13 - .../typescript/v2/FsReadFileResponse.ts | 12 - .../schema/typescript/v2/FsRemoveParams.ts | 21 - .../schema/typescript/v2/FsRemoveResponse.ts | 8 - .../schema/typescript/v2/FsUnwatchParams.ts | 12 - .../schema/typescript/v2/FsUnwatchResponse.ts | 8 - .../schema/typescript/v2/FsWatchParams.ts | 17 - .../schema/typescript/v2/FsWatchResponse.ts | 13 - .../schema/typescript/v2/FsWriteFileParams.ts | 17 - .../typescript/v2/FsWriteFileResponse.ts | 8 - .../schema/typescript/v2/GetAccountParams.ts | 13 - .../v2/GetAccountRateLimitsResponse.ts | 14 - .../typescript/v2/GetAccountResponse.ts | 6 - .../schema/typescript/v2/GitInfo.ts | 5 - .../typescript/v2/GrantedPermissionProfile.ts | 7 - .../typescript/v2/GuardianApprovalReview.ts | 13 - .../v2/GuardianApprovalReviewAction.ts | 9 - .../v2/GuardianApprovalReviewStatus.ts | 8 - .../typescript/v2/GuardianCommandSource.ts | 5 - .../schema/typescript/v2/GuardianRiskLevel.ts | 8 - .../v2/GuardianUserAuthorization.ts | 8 - .../v2/GuardianWarningNotification.ts | 13 - .../v2/HookCompletedNotification.ts | 6 - .../schema/typescript/v2/HookEventName.ts | 5 - .../schema/typescript/v2/HookExecutionMode.ts | 5 - .../schema/typescript/v2/HookHandlerType.ts | 5 - .../schema/typescript/v2/HookOutputEntry.ts | 6 - .../typescript/v2/HookOutputEntryKind.ts | 5 - .../typescript/v2/HookPromptFragment.ts | 5 - .../schema/typescript/v2/HookRunStatus.ts | 5 - .../schema/typescript/v2/HookRunSummary.ts | 13 - .../schema/typescript/v2/HookScope.ts | 5 - .../schema/typescript/v2/HookSource.ts | 5 - .../typescript/v2/HookStartedNotification.ts | 6 - .../v2/ItemCompletedNotification.ts | 6 - ...dianApprovalReviewCompletedNotification.ts | 30 - ...ardianApprovalReviewStartedNotification.ts | 29 - .../typescript/v2/ItemStartedNotification.ts | 6 - .../v2/ListMcpServerStatusParams.ts | 19 - .../v2/ListMcpServerStatusResponse.ts | 11 - .../typescript/v2/LoginAccountParams.ts | 21 - .../typescript/v2/LoginAccountResponse.ts | 17 - .../typescript/v2/LogoutAccountResponse.ts | 5 - .../schema/typescript/v2/McpAuthStatus.ts | 5 - .../typescript/v2/McpElicitationArrayType.ts | 5 - .../v2/McpElicitationBooleanSchema.ts | 6 - .../v2/McpElicitationBooleanType.ts | 5 - .../v2/McpElicitationConstOption.ts | 5 - .../typescript/v2/McpElicitationEnumSchema.ts | 8 - .../McpElicitationLegacyTitledEnumSchema.ts | 6 - .../v2/McpElicitationMultiSelectEnumSchema.ts | 7 - .../v2/McpElicitationNumberSchema.ts | 6 - .../typescript/v2/McpElicitationNumberType.ts | 5 - .../typescript/v2/McpElicitationObjectType.ts | 5 - .../v2/McpElicitationPrimitiveSchema.ts | 9 - .../typescript/v2/McpElicitationSchema.ts | 13 - .../McpElicitationSingleSelectEnumSchema.ts | 7 - .../v2/McpElicitationStringFormat.ts | 5 - .../v2/McpElicitationStringSchema.ts | 7 - .../typescript/v2/McpElicitationStringType.ts | 5 - .../v2/McpElicitationTitledEnumItems.ts | 6 - ...pElicitationTitledMultiSelectEnumSchema.ts | 7 - ...ElicitationTitledSingleSelectEnumSchema.ts | 7 - .../v2/McpElicitationUntitledEnumItems.ts | 6 - ...licitationUntitledMultiSelectEnumSchema.ts | 7 - ...icitationUntitledSingleSelectEnumSchema.ts | 6 - .../typescript/v2/McpResourceReadParams.ts | 5 - .../typescript/v2/McpResourceReadResponse.ts | 6 - .../v2/McpServerElicitationAction.ts | 5 - .../v2/McpServerElicitationRequestParams.ts | 16 - .../v2/McpServerElicitationRequestResponse.ts | 17 - ...cpServerOauthLoginCompletedNotification.ts | 5 - .../v2/McpServerOauthLoginParams.ts | 5 - .../v2/McpServerOauthLoginResponse.ts | 5 - .../typescript/v2/McpServerRefreshResponse.ts | 5 - .../typescript/v2/McpServerStartupState.ts | 5 - .../schema/typescript/v2/McpServerStatus.ts | 9 - .../typescript/v2/McpServerStatusDetail.ts | 5 - .../v2/McpServerStatusUpdatedNotification.ts | 6 - .../typescript/v2/McpServerToolCallParams.ts | 6 - .../v2/McpServerToolCallResponse.ts | 6 - .../schema/typescript/v2/McpToolCallError.ts | 5 - .../v2/McpToolCallProgressNotification.ts | 5 - .../schema/typescript/v2/McpToolCallResult.ts | 6 - .../schema/typescript/v2/McpToolCallStatus.ts | 5 - .../schema/typescript/v2/MemoryCitation.ts | 6 - .../typescript/v2/MemoryCitationEntry.ts | 5 - .../schema/typescript/v2/MergeStrategy.ts | 5 - .../schema/typescript/v2/Model.ts | 10 - .../typescript/v2/ModelAvailabilityNux.ts | 5 - .../schema/typescript/v2/ModelListParams.ts | 17 - .../schema/typescript/v2/ModelListResponse.ts | 11 - .../typescript/v2/ModelRerouteReason.ts | 5 - .../v2/ModelReroutedNotification.ts | 6 - .../schema/typescript/v2/ModelUpgradeInfo.ts | 5 - .../schema/typescript/v2/NetworkAccess.ts | 5 - .../typescript/v2/NetworkApprovalContext.ts | 6 - .../typescript/v2/NetworkApprovalProtocol.ts | 5 - .../typescript/v2/NetworkDomainPermission.ts | 5 - .../typescript/v2/NetworkPolicyAmendment.ts | 6 - .../typescript/v2/NetworkPolicyRuleAction.ts | 5 - .../typescript/v2/NetworkRequirements.ts | 32 - .../v2/NetworkUnixSocketPermission.ts | 5 - .../typescript/v2/NonSteerableTurnKind.ts | 5 - .../typescript/v2/OverriddenMetadata.ts | 7 - .../schema/typescript/v2/PatchApplyStatus.ts | 5 - .../schema/typescript/v2/PatchChangeKind.ts | 5 - .../typescript/v2/PermissionGrantScope.ts | 5 - .../schema/typescript/v2/PermissionProfile.ts | 7 - .../PermissionProfileFileSystemPermissions.ts | 6 - .../v2/PermissionProfileNetworkPermissions.ts | 5 - .../v2/PermissionsRequestApprovalParams.ts | 7 - .../v2/PermissionsRequestApprovalResponse.ts | 11 - .../typescript/v2/PlanDeltaNotification.ts | 9 - .../schema/typescript/v2/ProfileV2.ts | 19 - .../typescript/v2/RateLimitReachedType.ts | 5 - .../schema/typescript/v2/RateLimitSnapshot.ts | 9 - .../schema/typescript/v2/RateLimitWindow.ts | 5 - .../RawResponseItemCompletedNotification.ts | 6 - .../schema/typescript/v2/ReadOnlyAccess.ts | 6 - .../typescript/v2/ReasoningEffortOption.ts | 6 - .../ReasoningSummaryPartAddedNotification.ts | 5 - .../ReasoningSummaryTextDeltaNotification.ts | 5 - .../v2/ReasoningTextDeltaNotification.ts | 5 - .../RemoteControlClientConnectionAudience.ts | 8 - .../RemoteControlClientEnrollmentAudience.ts | 8 - .../typescript/v2/RequestPermissionProfile.ts | 7 - .../typescript/v2/ResidencyRequirement.ts | 5 - .../schema/typescript/v2/ReviewDelivery.ts | 5 - .../schema/typescript/v2/ReviewStartParams.ts | 12 - .../typescript/v2/ReviewStartResponse.ts | 13 - .../schema/typescript/v2/ReviewTarget.ts | 9 - .../schema/typescript/v2/SandboxMode.ts | 5 - .../schema/typescript/v2/SandboxPolicy.ts | 8 - .../typescript/v2/SandboxWorkspaceWrite.ts | 5 - .../v2/SendAddCreditsNudgeEmailParams.ts | 6 - .../v2/SendAddCreditsNudgeEmailResponse.ts | 6 - .../v2/ServerRequestResolvedNotification.ts | 6 - .../schema/typescript/v2/SessionSource.ts | 6 - .../schema/typescript/v2/SortDirection.ts | 5 - .../v2/TerminalInteractionNotification.ts | 5 - .../schema/typescript/v2/TextElement.ts | 14 - .../schema/typescript/v2/TextPosition.ts | 13 - .../schema/typescript/v2/TextRange.ts | 6 - .../schema/typescript/v2/Thread.ts | 77 - .../schema/typescript/v2/ThreadActiveFlag.ts | 5 - ...ThreadApproveGuardianDeniedActionParams.ts | 10 - ...readApproveGuardianDeniedActionResponse.ts | 5 - .../typescript/v2/ThreadArchiveParams.ts | 5 - .../typescript/v2/ThreadArchiveResponse.ts | 5 - .../v2/ThreadArchivedNotification.ts | 5 - .../typescript/v2/ThreadClosedNotification.ts | 5 - .../typescript/v2/ThreadCompactStartParams.ts | 5 - .../v2/ThreadCompactStartResponse.ts | 5 - .../schema/typescript/v2/ThreadForkParams.ts | 39 - .../typescript/v2/ThreadForkResponse.ts | 33 - .../typescript/v2/ThreadInjectItemsParams.ts | 10 - .../v2/ThreadInjectItemsResponse.ts | 5 - .../schema/typescript/v2/ThreadItem.ts | 101 - .../schema/typescript/v2/ThreadListParams.ts | 54 - .../typescript/v2/ThreadListResponse.ts | 18 - .../typescript/v2/ThreadLoadedListParams.ts | 13 - .../typescript/v2/ThreadLoadedListResponse.ts | 14 - .../v2/ThreadMetadataGitInfoUpdateParams.ts | 20 - .../v2/ThreadMetadataUpdateParams.ts | 12 - .../v2/ThreadMetadataUpdateResponse.ts | 6 - .../v2/ThreadNameUpdatedNotification.ts | 5 - .../schema/typescript/v2/ThreadReadParams.ts | 9 - .../typescript/v2/ThreadReadResponse.ts | 6 - .../typescript/v2/ThreadRealtimeAudioChunk.ts | 8 - .../v2/ThreadRealtimeClosedNotification.ts | 8 - .../v2/ThreadRealtimeErrorNotification.ts | 8 - .../v2/ThreadRealtimeItemAddedNotification.ts | 9 - ...eadRealtimeOutputAudioDeltaNotification.ts | 9 - .../v2/ThreadRealtimeSdpNotification.ts | 8 - .../v2/ThreadRealtimeStartTransport.ts | 13 - .../v2/ThreadRealtimeStartedNotification.ts | 9 - ...readRealtimeTranscriptDeltaNotification.ts | 13 - ...hreadRealtimeTranscriptDoneNotification.ts | 13 - .../typescript/v2/ThreadResumeParams.ts | 48 - .../typescript/v2/ThreadResumeResponse.ts | 33 - .../typescript/v2/ThreadRollbackParams.ts | 12 - .../typescript/v2/ThreadRollbackResponse.ts | 14 - .../typescript/v2/ThreadSetNameParams.ts | 5 - .../typescript/v2/ThreadSetNameResponse.ts | 5 - .../typescript/v2/ThreadShellCommandParams.ts | 12 - .../v2/ThreadShellCommandResponse.ts | 5 - .../schema/typescript/v2/ThreadSortKey.ts | 5 - .../schema/typescript/v2/ThreadSourceKind.ts | 5 - .../schema/typescript/v2/ThreadStartParams.ts | 29 - .../typescript/v2/ThreadStartResponse.ts | 33 - .../schema/typescript/v2/ThreadStartSource.ts | 5 - .../v2/ThreadStartedNotification.ts | 6 - .../schema/typescript/v2/ThreadStatus.ts | 6 - .../v2/ThreadStatusChangedNotification.ts | 6 - .../schema/typescript/v2/ThreadTokenUsage.ts | 6 - .../v2/ThreadTokenUsageUpdatedNotification.ts | 6 - .../typescript/v2/ThreadTurnsListParams.ts | 18 - .../typescript/v2/ThreadTurnsListResponse.ts | 18 - .../typescript/v2/ThreadUnarchiveParams.ts | 5 - .../typescript/v2/ThreadUnarchiveResponse.ts | 6 - .../v2/ThreadUnarchivedNotification.ts | 5 - .../typescript/v2/ThreadUnsubscribeParams.ts | 5 - .../v2/ThreadUnsubscribeResponse.ts | 6 - .../typescript/v2/ThreadUnsubscribeStatus.ts | 5 - .../typescript/v2/TokenUsageBreakdown.ts | 5 - .../v2/ToolRequestUserInputAnswer.ts | 8 - .../v2/ToolRequestUserInputOption.ts | 8 - .../v2/ToolRequestUserInputParams.ts | 9 - .../v2/ToolRequestUserInputQuestion.ts | 9 - .../v2/ToolRequestUserInputResponse.ts | 9 - .../schema/typescript/v2/ToolsV2.ts | 6 - .../schema/typescript/v2/Turn.ts | 30 - .../v2/TurnCompletedNotification.ts | 6 - .../v2/TurnDiffUpdatedNotification.ts | 9 - .../typescript/v2/TurnEnvironmentParams.ts | 6 - .../schema/typescript/v2/TurnError.ts | 6 - .../typescript/v2/TurnInterruptParams.ts | 5 - .../typescript/v2/TurnInterruptResponse.ts | 5 - .../schema/typescript/v2/TurnPlanStep.ts | 6 - .../typescript/v2/TurnPlanStepStatus.ts | 5 - .../v2/TurnPlanUpdatedNotification.ts | 6 - .../schema/typescript/v2/TurnStartParams.ts | 59 - .../schema/typescript/v2/TurnStartResponse.ts | 6 - .../typescript/v2/TurnStartedNotification.ts | 6 - .../schema/typescript/v2/TurnStatus.ts | 5 - .../schema/typescript/v2/TurnSteerParams.ts | 10 - .../schema/typescript/v2/TurnSteerResponse.ts | 5 - .../schema/typescript/v2/UserInput.ts | 10 - .../typescript/v2/WarningNotification.ts | 13 - .../schema/typescript/v2/WebSearchAction.ts | 5 - ...indowsSandboxSetupCompletedNotification.ts | 6 - .../typescript/v2/WindowsSandboxSetupMode.ts | 5 - .../v2/WindowsSandboxSetupStartParams.ts | 7 - .../v2/WindowsSandboxSetupStartResponse.ts | 5 - ...WindowsWorldWritableWarningNotification.ts | 5 - .../schema/typescript/v2/WriteStatus.ts | 5 - .../schema/typescript/v2/index.ts | 345 - .../app-server-protocol/src/bin/export.rs | 34 - .../src/bin/write_schema_fixtures.rs | 42 - .../src/experimental_api.rs | 195 - .../app-server-protocol/src/export.rs | 2836 --- .../app-server-protocol/src/jsonrpc_lite.rs | 88 - .../codex-rs/app-server-protocol/src/lib.rs | 49 - .../src/protocol/common.rs | 2054 --- .../src/protocol/item_builders.rs | 313 - .../src/protocol/mappers.rs | 23 - .../app-server-protocol/src/protocol/mod.rs | 10 - .../src/protocol/serde_helpers.rs | 23 - .../src/protocol/thread_history.rs | 3115 ---- .../app-server-protocol/src/protocol/v1.rs | 245 - .../app-server-protocol/src/protocol/v2.rs | 9029 --------- .../src/schema_fixtures.rs | 361 - .../tests/schema_fixtures.rs | 143 - .../app-server-test-client/BUILD.bazel | 6 - .../app-server-test-client/Cargo.toml | 25 - .../codex-rs/app-server-test-client/README.md | 58 - .../scripts/live_elicitation_hold.sh | 46 - .../app-server-test-client/src/lib.rs | 2230 --- .../app-server-test-client/src/main.rs | 7 - vendor/codex/codex-rs/app-server/BUILD.bazel | 13 - vendor/codex/codex-rs/app-server/Cargo.toml | 116 - vendor/codex/codex-rs/app-server/README.md | 1443 -- .../app-server/src/app_server_tracing.rs | 179 - .../app-server/src/bespoke_event_handling.rs | 4926 ----- .../app-server/src/bin/notify_capture.rs | 44 - .../app-server/src/bin/test_notify_capture.rs | 23 - .../app-server/src/codex_message_processor.rs | 933 - .../codex_message_processor/auth_routes.rs | 901 - .../codex_message_processor/catalog_routes.rs | 204 - .../codex_message_processor/command_routes.rs | 298 - .../listener_lifecycle.rs | 714 - .../src/codex_message_processor/mcp_routes.rs | 499 - .../realtime_routes.rs | 217 - .../codex_message_processor/review_routes.rs | 361 - .../running_thread_resume_routes.rs | 451 - .../thread_admin_routes.rs | 309 - .../thread_archive_routes.rs | 210 - .../codex_message_processor/thread_config.rs | 191 - .../thread_fork_routes.rs | 339 - .../thread_metadata_routes.rs | 480 - .../thread_projection.rs | 790 - .../thread_read_routes.rs | 579 - .../thread_resume_routes.rs | 432 - .../thread_start_routes.rs | 386 - .../thread_turn_projection.rs | 197 - .../thread_turn_routes.rs | 154 - .../token_usage_replay.rs | 134 - .../codex_message_processor/turn_routes.rs | 536 - .../codex_message_processor/utility_routes.rs | 411 - .../codex-rs/app-server/src/command_exec.rs | 1023 - .../codex-rs/app-server/src/config_api.rs | 722 - .../codex-rs/app-server/src/config_manager.rs | 326 - .../app-server/src/config_manager_service.rs | 653 - .../src/config_manager_service_tests.rs | 713 - .../codex-rs/app-server/src/device_key_api.rs | 226 - .../codex-rs/app-server/src/dynamic_tools.rs | 75 - .../codex-rs/app-server/src/error_code.rs | 5 - .../codex/codex-rs/app-server/src/filters.rs | 158 - .../codex/codex-rs/app-server/src/fs_api.rs | 179 - .../codex/codex-rs/app-server/src/fs_watch.rs | 414 - .../app-server/src/fuzzy_file_search.rs | 256 - .../codex-rs/app-server/src/in_process.rs | 948 - vendor/codex/codex-rs/app-server/src/lib.rs | 924 - vendor/codex/codex-rs/app-server/src/main.rs | 93 - .../app-server/src/message_processor.rs | 1236 -- .../src/message_processor/tracing_tests.rs | 764 - .../codex/codex-rs/app-server/src/models.rs | 60 - .../app-server/src/outgoing_message.rs | 1194 -- .../app-server/src/server_request_error.rs | 42 - .../codex-rs/app-server/src/thread_state.rs | 398 - .../codex-rs/app-server/src/thread_status.rs | 908 - .../codex-rs/app-server/src/transport/auth.rs | 751 - .../codex-rs/app-server/src/transport/mod.rs | 1060 -- .../remote_control/client_tracker.rs | 570 - .../src/transport/remote_control/enroll.rs | 503 - .../src/transport/remote_control/mod.rs | 86 - .../src/transport/remote_control/protocol.rs | 252 - .../src/transport/remote_control/tests.rs | 1448 -- .../src/transport/remote_control/websocket.rs | 1611 -- .../app-server/src/transport/stdio.rs | 113 - .../app-server/src/transport/websocket.rs | 307 - vendor/codex/codex-rs/app-server/tests/all.rs | 3 - .../app-server/tests/common/BUILD.bazel | 7 - .../app-server/tests/common/Cargo.toml | 36 - .../tests/common/analytics_server.rs | 16 - .../app-server/tests/common/auth_fixtures.rs | 170 - .../app-server/tests/common/config.rs | 108 - .../codex-rs/app-server/tests/common/lib.rs | 51 - .../app-server/tests/common/mcp_process.rs | 1271 -- .../tests/common/mock_model_server.rs | 81 - .../app-server/tests/common/models_cache.rs | 98 - .../app-server/tests/common/responses.rs | 105 - .../app-server/tests/common/rollout.rs | 270 - .../codex-rs/app-server/tests/suite/auth.rs | 528 - .../tests/suite/conversation_summary.rs | 148 - .../tests/suite/fuzzy_file_search.rs | 611 - .../codex-rs/app-server/tests/suite/mod.rs | 4 - .../app-server/tests/suite/v2/account.rs | 1632 -- .../app-server/tests/suite/v2/analytics.rs | 221 - .../tests/suite/v2/client_metadata.rs | 368 - .../tests/suite/v2/collaboration_mode_list.rs | 60 - .../app-server/tests/suite/v2/command_exec.rs | 926 - .../app-server/tests/suite/v2/compaction.rs | 410 - .../app-server/tests/suite/v2/config_rpc.rs | 691 - .../suite/v2/connection_handling_websocket.rs | 871 - .../v2/connection_handling_websocket_unix.rs | 294 - .../app-server/tests/suite/v2/device_key.rs | 119 - .../tests/suite/v2/dynamic_tools.rs | 727 - .../tests/suite/v2/experimental_api.rs | 320 - .../suite/v2/experimental_feature_list.rs | 319 - .../codex-rs/app-server/tests/suite/v2/fs.rs | 850 - .../app-server/tests/suite/v2/initialize.rs | 326 - .../app-server/tests/suite/v2/mcp_resource.rs | 326 - .../tests/suite/v2/mcp_server_elicitation.rs | 490 - .../tests/suite/v2/mcp_server_status.rs | 390 - .../app-server/tests/suite/v2/mcp_tool.rs | 252 - .../app-server/tests/suite/v2/memory_reset.rs | 145 - .../codex-rs/app-server/tests/suite/v2/mod.rs | 52 - .../app-server/tests/suite/v2/model_list.rs | 216 - .../tests/suite/v2/output_schema.rs | 234 - .../app-server/tests/suite/v2/plan_item.rs | 289 - .../app-server/tests/suite/v2/rate_limits.rs | 456 - .../tests/suite/v2/realtime_conversation.rs | 2385 --- .../tests/suite/v2/request_permissions.rs | 160 - .../tests/suite/v2/request_user_input.rs | 152 - .../app-server/tests/suite/v2/review.rs | 485 - .../tests/suite/v2/safety_check_downgrade.rs | 246 - .../tests/suite/v2/thread_archive.rs | 635 - .../app-server/tests/suite/v2/thread_fork.rs | 654 - .../tests/suite/v2/thread_inject_items.rs | 288 - .../app-server/tests/suite/v2/thread_list.rs | 1757 -- .../tests/suite/v2/thread_loaded_list.rs | 139 - .../tests/suite/v2/thread_memory_mode_set.rs | 138 - .../tests/suite/v2/thread_metadata_update.rs | 464 - .../tests/suite/v2/thread_name_websocket.rs | 228 - .../app-server/tests/suite/v2/thread_read.rs | 811 - .../tests/suite/v2/thread_resume.rs | 2288 --- .../tests/suite/v2/thread_rollback.rs | 198 - .../tests/suite/v2/thread_shell_command.rs | 463 - .../app-server/tests/suite/v2/thread_start.rs | 1000 - .../tests/suite/v2/thread_status.rs | 240 - .../tests/suite/v2/thread_unarchive.rs | 198 - .../tests/suite/v2/thread_unsubscribe.rs | 433 - .../tests/suite/v2/turn_interrupt.rs | 276 - .../app-server/tests/suite/v2/turn_start.rs | 3234 ---- .../tests/suite/v2/turn_start_zsh_fork.rs | 828 - .../app-server/tests/suite/v2/turn_steer.rs | 314 - .../tests/suite/v2/windows_sandbox_setup.rs | 91 - .../codex/codex-rs/app-server/tests/suite/zsh | 73 - vendor/codex/codex-rs/apply-patch/BUILD.bazel | 11 - vendor/codex/codex-rs/apply-patch/Cargo.toml | 33 - .../apply_patch_tool_instructions.md | 75 - .../codex-rs/apply-patch/src/invocation.rs | 857 - vendor/codex/codex-rs/apply-patch/src/lib.rs | 1320 -- vendor/codex/codex-rs/apply-patch/src/main.rs | 3 - .../codex/codex-rs/apply-patch/src/parser.rs | 1108 -- .../codex-rs/apply-patch/src/seek_sequence.rs | 163 - .../apply-patch/src/standalone_executable.rs | 83 - .../codex/codex-rs/apply-patch/tests/all.rs | 3 - .../tests/fixtures/scenarios/.gitattributes | 1 - .../scenarios/001_add_file/expected/bar.md | 1 - .../fixtures/scenarios/001_add_file/patch.txt | 4 - .../expected/modify.txt | 2 - .../expected/nested/new.txt | 1 - .../002_multiple_operations/input/delete.txt | 1 - .../002_multiple_operations/input/modify.txt | 2 - .../002_multiple_operations/patch.txt | 9 - .../003_multiple_chunks/expected/multi.txt | 4 - .../003_multiple_chunks/input/multi.txt | 4 - .../scenarios/003_multiple_chunks/patch.txt | 9 - .../expected/old/other.txt | 1 - .../expected/renamed/dir/name.txt | 1 - .../input/old/name.txt | 1 - .../input/old/other.txt | 1 - .../004_move_to_new_directory/patch.txt | 7 - .../005_rejects_empty_patch/expected/foo.txt | 1 - .../005_rejects_empty_patch/input/foo.txt | 1 - .../005_rejects_empty_patch/patch.txt | 2 - .../expected/modify.txt | 2 - .../input/modify.txt | 2 - .../006_rejects_missing_context/patch.txt | 6 - .../expected/foo.txt | 1 - .../input/foo.txt | 1 - .../007_rejects_missing_file_delete/patch.txt | 3 - .../expected/foo.txt | 1 - .../input/foo.txt | 1 - .../008_rejects_empty_update_hunk/patch.txt | 3 - .../expected/foo.txt | 1 - .../input/foo.txt | 1 - .../patch.txt | 6 - .../expected/old/other.txt | 1 - .../expected/renamed/dir/name.txt | 1 - .../input/old/name.txt | 1 - .../input/old/other.txt | 1 - .../input/renamed/dir/name.txt | 1 - .../patch.txt | 7 - .../expected/duplicate.txt | 1 - .../input/duplicate.txt | 1 - .../patch.txt | 4 - .../expected/dir/foo.txt | 1 - .../input/dir/foo.txt | 1 - .../012_delete_directory_fails/patch.txt | 3 - .../expected/foo.txt | 1 - .../input/foo.txt | 1 - .../013_rejects_invalid_hunk_header/patch.txt | 3 - .../expected/no_newline.txt | 2 - .../input/no_newline.txt | 1 - .../patch.txt | 7 - .../expected/created.txt | 1 - .../patch.txt | 8 - .../expected/input.txt | 4 - .../input/input.txt | 2 - .../016_pure_addition_update_chunk/patch.txt | 6 - .../expected/foo.txt | 1 - .../input/foo.txt | 1 - .../patch.txt | 6 - .../expected/file.txt | 1 - .../input/file.txt | 1 - .../patch.txt | 6 - .../019_unicode_simple/expected/foo.txt | 3 - .../019_unicode_simple/input/foo.txt | 3 - .../scenarios/019_unicode_simple/patch.txt | 7 - .../020_delete_file_success/expected/keep.txt | 1 - .../020_delete_file_success/input/keep.txt | 1 - .../input/obsolete.txt | 1 - .../020_delete_file_success/patch.txt | 3 - .../expected/file.txt | 1 - .../input/file.txt | 1 - .../patch.txt | 6 - .../expected/lines.txt | 2 - .../input/lines.txt | 3 - .../021_update_file_deletion_only/patch.txt | 7 - .../expected/tail.txt | 2 - .../input/tail.txt | 2 - .../patch.txt | 8 - .../tests/fixtures/scenarios/README.md | 18 - .../codex-rs/apply-patch/tests/suite/cli.rs | 91 - .../codex-rs/apply-patch/tests/suite/mod.rs | 4 - .../apply-patch/tests/suite/scenarios.rs | 126 - .../codex-rs/apply-patch/tests/suite/tool.rs | 279 - vendor/codex/codex-rs/arg0/BUILD.bazel | 6 - vendor/codex/codex-rs/arg0/Cargo.toml | 25 - vendor/codex/codex-rs/arg0/src/lib.rs | 585 - vendor/codex/codex-rs/async-utils/BUILD.bazel | 6 - vendor/codex/codex-rs/async-utils/Cargo.toml | 16 - vendor/codex/codex-rs/async-utils/src/lib.rs | 86 - vendor/codex/codex-rs/aws-auth/BUILD.bazel | 6 - vendor/codex/codex-rs/aws-auth/Cargo.toml | 26 - vendor/codex/codex-rs/aws-auth/src/config.rs | 38 - vendor/codex/codex-rs/aws-auth/src/lib.rs | 261 - vendor/codex/codex-rs/aws-auth/src/signing.rs | 76 - .../codex/codex-rs/backend-client/BUILD.bazel | 7 - .../codex/codex-rs/backend-client/Cargo.toml | 25 - .../codex-rs/backend-client/src/client.rs | 862 - .../codex/codex-rs/backend-client/src/lib.rs | 12 - .../codex-rs/backend-client/src/types.rs | 376 - .../fixtures/task_details_with_diff.json | 38 - .../fixtures/task_details_with_error.json | 22 - vendor/codex/codex-rs/cli/BUILD.bazel | 11 - vendor/codex/codex-rs/cli/Cargo.toml | 78 - vendor/codex/codex-rs/cli/build.rs | 5 - vendor/codex/codex-rs/cli/src/app_cmd.rs | 25 - .../codex/codex-rs/cli/src/debug_sandbox.rs | 758 - .../cli/src/debug_sandbox/pid_tracker.rs | 372 - .../cli/src/debug_sandbox/seatbelt.rs | 114 - .../codex/codex-rs/cli/src/desktop_app/mac.rs | 316 - .../codex/codex-rs/cli/src/desktop_app/mod.rs | 22 - .../codex-rs/cli/src/desktop_app/windows.rs | 132 - vendor/codex/codex-rs/cli/src/exit_status.rs | 23 - vendor/codex/codex-rs/cli/src/lib.rs | 73 - vendor/codex/codex-rs/cli/src/login.rs | 412 - vendor/codex/codex-rs/cli/src/main.rs | 2284 --- vendor/codex/codex-rs/cli/src/mcp_cmd.rs | 923 - .../codex/codex-rs/cli/src/responses_cmd.rs | 243 - vendor/codex/codex-rs/cli/src/wsl_paths.rs | 59 - .../cli/tests/debug_clear_memories.rs | 133 - .../codex/codex-rs/cli/tests/debug_models.rs | 40 - vendor/codex/codex-rs/cli/tests/execpolicy.rs | 119 - vendor/codex/codex-rs/cli/tests/features.rs | 91 - .../codex-rs/cli/tests/mcp_add_remove.rs | 228 - vendor/codex/codex-rs/cli/tests/mcp_list.rs | 166 - vendor/codex/codex-rs/clippy.toml | 18 - .../codex-rs/cloud-requirements/BUILD.bazel | 6 - .../codex-rs/cloud-requirements/Cargo.toml | 32 - .../codex-rs/cloud-requirements/src/lib.rs | 2119 --- .../codex-rs/cloud-tasks-client/BUILD.bazel | 6 - .../codex-rs/cloud-tasks-client/Cargo.toml | 22 - .../codex-rs/cloud-tasks-client/src/api.rs | 170 - .../codex-rs/cloud-tasks-client/src/http.rs | 907 - .../codex-rs/cloud-tasks-client/src/lib.rs | 19 - .../cloud-tasks-mock-client/BUILD.bazel | 6 - .../cloud-tasks-mock-client/Cargo.toml | 19 - .../cloud-tasks-mock-client/src/lib.rs | 3 - .../cloud-tasks-mock-client/src/mock.rs | 203 - vendor/codex/codex-rs/cloud-tasks/BUILD.bazel | 7 - vendor/codex/codex-rs/cloud-tasks/Cargo.toml | 45 - vendor/codex/codex-rs/cloud-tasks/src/app.rs | 512 - vendor/codex/codex-rs/cloud-tasks/src/cli.rs | 120 - .../codex-rs/cloud-tasks/src/env_detect.rs | 362 - vendor/codex/codex-rs/cloud-tasks/src/lib.rs | 2405 --- .../codex-rs/cloud-tasks/src/new_task.rs | 35 - .../cloud-tasks/src/scrollable_diff.rs | 176 - vendor/codex/codex-rs/cloud-tasks/src/ui.rs | 1046 -- vendor/codex/codex-rs/cloud-tasks/src/util.rs | 146 - .../codex-rs/cloud-tasks/tests/env_filter.rs | 39 - vendor/codex/codex-rs/code-mode/BUILD.bazel | 6 - vendor/codex/codex-rs/code-mode/Cargo.toml | 28 - .../codex-rs/code-mode/src/description.rs | 1101 -- vendor/codex/codex-rs/code-mode/src/lib.rs | 32 - .../codex/codex-rs/code-mode/src/response.rs | 26 - .../code-mode/src/runtime/callbacks.rs | 274 - .../codex-rs/code-mode/src/runtime/globals.rs | 144 - .../codex-rs/code-mode/src/runtime/mod.rs | 378 - .../code-mode/src/runtime/module_loader.rs | 235 - .../codex-rs/code-mode/src/runtime/timers.rs | 114 - .../codex-rs/code-mode/src/runtime/value.rs | 228 - .../codex/codex-rs/code-mode/src/service.rs | 898 - vendor/codex/codex-rs/codex-api/BUILD.bazel | 6 - vendor/codex/codex-rs/codex-api/Cargo.toml | 41 - vendor/codex/codex-rs/codex-api/README.md | 37 - .../codex-rs/codex-api/src/api_bridge.rs | 174 - .../codex-api/src/api_bridge_tests.rs | 132 - vendor/codex/codex-rs/codex-api/src/auth.rs | 74 - vendor/codex/codex-rs/codex-api/src/common.rs | 292 - .../codex-api/src/endpoint/compact.rs | 93 - .../codex-api/src/endpoint/memories.rs | 228 - .../codex-rs/codex-api/src/endpoint/mod.rs | 27 - .../codex-rs/codex-api/src/endpoint/models.rs | 271 - .../codex-api/src/endpoint/realtime_call.rs | 546 - .../endpoint/realtime_websocket/methods.rs | 2328 --- .../realtime_websocket/methods_common.rs | 93 - .../endpoint/realtime_websocket/methods_v1.rs | 73 - .../endpoint/realtime_websocket/methods_v2.rs | 170 - .../src/endpoint/realtime_websocket/mod.rs | 18 - .../endpoint/realtime_websocket/protocol.rs | 229 - .../realtime_websocket/protocol_common.rs | 83 - .../realtime_websocket/protocol_v1.rs | 98 - .../realtime_websocket/protocol_v2.rs | 210 - .../codex-api/src/endpoint/responses.rs | 151 - .../src/endpoint/responses_websocket.rs | 835 - .../codex-api/src/endpoint/session.rs | 154 - vendor/codex/codex-rs/codex-api/src/error.rs | 38 - vendor/codex/codex-rs/codex-api/src/files.rs | 380 - vendor/codex/codex-rs/codex-api/src/lib.rs | 69 - .../codex/codex-rs/codex-api/src/provider.rs | 169 - .../codex-rs/codex-api/src/rate_limits.rs | 368 - .../codex-api/src/requests/headers.rs | 37 - .../codex-rs/codex-api/src/requests/mod.rs | 5 - .../codex-api/src/requests/responses.rs | 37 - .../codex/codex-rs/codex-api/src/sse/mod.rs | 6 - .../codex-rs/codex-api/src/sse/responses.rs | 1124 -- .../codex/codex-rs/codex-api/src/telemetry.rs | 98 - .../codex/codex-rs/codex-api/tests/clients.rs | 489 - .../codex-api/tests/models_integration.rs | 130 - .../codex-api/tests/realtime_websocket_e2e.rs | 633 - .../codex-api/tests/sse_end_to_end.rs | 169 - .../codex-backend-openapi-models/BUILD.bazel | 6 - .../codex-backend-openapi-models/Cargo.toml | 25 - .../codex-backend-openapi-models/src/lib.rs | 6 - .../models/additional_rate_limit_details.rs | 38 - .../src/models/code_task_details_response.rs | 42 - .../src/models/config_file_response.rs | 40 - .../src/models/credit_status_details.rs | 52 - .../models/external_pull_request_response.rs | 40 - .../src/models/git_pull_request.rs | 77 - .../src/models/mod.rs | 46 - .../models/paginated_list_task_list_item_.rs | 30 - .../src/models/rate_limit_status_details.rs | 46 - .../src/models/rate_limit_status_payload.rs | 125 - .../src/models/rate_limit_window_snapshot.rs | 39 - .../src/models/task_list_item.rs | 63 - .../src/models/task_response.rs | 62 - .../codex/codex-rs/codex-client/BUILD.bazel | 7 - vendor/codex/codex-rs/codex-client/Cargo.toml | 36 - vendor/codex/codex-rs/codex-client/README.md | 8 - .../codex-client/src/bin/custom_ca_probe.rs | 29 - .../src/chatgpt_cloudflare_cookies.rs | 264 - .../codex-client/src/chatgpt_hosts.rs | 39 - .../codex-rs/codex-client/src/custom_ca.rs | 788 - .../codex-client/src/default_client.rs | 218 - .../codex/codex-rs/codex-client/src/error.rs | 30 - vendor/codex/codex-rs/codex-client/src/lib.rs | 42 - .../codex-rs/codex-client/src/request.rs | 215 - .../codex/codex-rs/codex-client/src/retry.rs | 73 - vendor/codex/codex-rs/codex-client/src/sse.rs | 48 - .../codex-rs/codex-client/src/telemetry.rs | 14 - .../codex-rs/codex-client/src/transport.rs | 156 - .../codex-rs/codex-client/tests/ca_env.rs | 145 - .../tests/fixtures/test-ca-trusted.pem | 25 - .../codex-client/tests/fixtures/test-ca.pem | 21 - .../tests/fixtures/test-intermediate.pem | 21 - .../codex-experimental-api-macros/BUILD.bazel | 7 - .../codex-experimental-api-macros/Cargo.toml | 16 - .../codex-experimental-api-macros/src/lib.rs | 310 - vendor/codex/codex-rs/codex-mcp/BUILD.bazel | 6 - vendor/codex/codex-rs/codex-mcp/Cargo.toml | 40 - vendor/codex/codex-rs/codex-mcp/src/lib.rs | 38 - .../codex/codex-rs/codex-mcp/src/mcp/auth.rs | 303 - .../codex/codex-rs/codex-mcp/src/mcp/mod.rs | 533 - .../codex-rs/codex-mcp/src/mcp/mod_tests.rs | 156 - .../codex-mcp/src/mcp_connection_manager.rs | 1321 -- .../src/mcp_connection_manager_tests.rs | 517 - .../codex-rs/codex-mcp/src/mcp_tool_names.rs | 202 - .../collaboration-mode-templates/BUILD.bazel | 12 - .../collaboration-mode-templates/Cargo.toml | 13 - .../collaboration-mode-templates/src/lib.rs | 4 - .../templates/default.md | 11 - .../templates/execute.md | 45 - .../templates/pair_programming.md | 7 - .../templates/plan.md | 128 - vendor/codex/codex-rs/config.md | 6 - vendor/codex/codex-rs/config/BUILD.bazel | 6 - vendor/codex/codex-rs/config/Cargo.toml | 46 - .../codex-rs/config/src/cloud_requirements.rs | 105 - .../config/src/config_requirements.rs | 2338 --- .../codex/codex-rs/config/src/config_toml.rs | 838 - .../codex/codex-rs/config/src/constraint.rs | 332 - .../codex/codex-rs/config/src/diagnostics.rs | 397 - .../codex/codex-rs/config/src/fingerprint.rs | 67 - vendor/codex/codex-rs/config/src/host_name.rs | 97 - .../codex/codex-rs/config/src/key_aliases.rs | 52 - vendor/codex/codex-rs/config/src/lib.rs | 98 - vendor/codex/codex-rs/config/src/mcp_edit.rs | 285 - .../codex-rs/config/src/mcp_edit_tests.rs | 84 - vendor/codex/codex-rs/config/src/mcp_types.rs | 417 - .../codex-rs/config/src/mcp_types_tests.rs | 471 - vendor/codex/codex-rs/config/src/merge.rs | 34 - .../codex/codex-rs/config/src/merge_tests.rs | 100 - vendor/codex/codex-rs/config/src/overrides.rs | 55 - .../codex-rs/config/src/permissions_toml.rs | 244 - .../codex/codex-rs/config/src/profile_toml.rs | 83 - .../config/src/project_root_markers.rs | 50 - .../config/src/requirements_exec_policy.rs | 236 - vendor/codex/codex-rs/config/src/schema.rs | 109 - .../codex-rs/config/src/shell_environment.rs | 123 - vendor/codex/codex-rs/config/src/state.rs | 386 - .../codex/codex-rs/config/src/state_tests.rs | 34 - .../codex-rs/config/src/thread_config.rs | 314 - vendor/codex/codex-rs/config/src/types.rs | 656 - .../codex/codex-rs/config/src/types_tests.rs | 20 - vendor/codex/codex-rs/core/BUILD.bazel | 62 - vendor/codex/codex-rs/core/Cargo.toml | 171 - vendor/codex/codex-rs/core/README.md | 89 - vendor/codex/codex-rs/core/config.schema.json | 2657 --- .../codex-rs/core/gpt-5.1-codex-max_prompt.md | 80 - .../codex-rs/core/gpt-5.2-codex_prompt.md | 80 - vendor/codex/codex-rs/core/gpt_5_1_prompt.md | 331 - vendor/codex/codex-rs/core/gpt_5_2_prompt.md | 298 - .../codex/codex-rs/core/gpt_5_codex_prompt.md | 68 - .../core/hierarchical_agents_message.md | 7 - .../prompt_with_apply_patch_instructions.md | 351 - vendor/codex/codex-rs/core/review_prompt.md | 87 - .../codex-rs/core/src/agent/agent_names.txt | 101 - .../codex-rs/core/src/agent/agent_resolver.rs | 36 - .../core/src/agent/builtins/awaiter.toml | 35 - .../core/src/agent/builtins/explorer.toml | 0 .../codex/codex-rs/core/src/agent/control.rs | 1222 -- .../codex-rs/core/src/agent/control_tests.rs | 2496 --- .../codex/codex-rs/core/src/agent/mailbox.rs | 161 - vendor/codex/codex-rs/core/src/agent/mod.rs | 14 - .../codex/codex-rs/core/src/agent/registry.rs | 344 - .../codex-rs/core/src/agent/registry_tests.rs | 350 - vendor/codex/codex-rs/core/src/agent/role.rs | 434 - .../codex-rs/core/src/agent/role_tests.rs | 709 - .../codex/codex-rs/core/src/agent/status.rs | 27 - vendor/codex/codex-rs/core/src/agents_md.rs | 367 - .../codex-rs/core/src/agents_md_tests.rs | 487 - vendor/codex/codex-rs/core/src/apply_patch.rs | 105 - .../codex-rs/core/src/apply_patch_tests.rs | 22 - vendor/codex/codex-rs/core/src/apps/mod.rs | 2 - vendor/codex/codex-rs/core/src/arc_monitor.rs | 430 - .../codex-rs/core/src/arc_monitor_tests.rs | 447 - .../codex-rs/core/src/bin/config_schema.rs | 20 - vendor/codex/codex-rs/core/src/client.rs | 2052 --- .../codex/codex-rs/core/src/client_common.rs | 190 - .../codex-rs/core/src/client_common_tests.rs | 230 - .../codex/codex-rs/core/src/client_tests.rs | 171 - .../codex/codex-rs/core/src/codex_delegate.rs | 849 - .../codex-rs/core/src/codex_delegate_tests.rs | 417 - .../codex/codex-rs/core/src/codex_thread.rs | 413 - .../core/src/command_canonicalization.rs | 42 - .../src/command_canonicalization_tests.rs | 88 - .../codex-rs/core/src/commit_attribution.rs | 33 - .../core/src/commit_attribution_tests.rs | 43 - vendor/codex/codex-rs/core/src/compact.rs | 587 - .../codex/codex-rs/core/src/compact_remote.rs | 364 - .../codex/codex-rs/core/src/compact_tests.rs | 602 - .../codex-rs/core/src/config/agent_roles.rs | 544 - .../codex-rs/core/src/config/config_tests.rs | 7324 -------- vendor/codex/codex-rs/core/src/config/edit.rs | 1021 - .../codex-rs/core/src/config/edit_tests.rs | 1203 -- .../core/src/config/managed_features.rs | 353 - vendor/codex/codex-rs/core/src/config/mod.rs | 2517 --- .../core/src/config/network_proxy_spec.rs | 383 - .../src/config/network_proxy_spec_tests.rs | 433 - .../codex-rs/core/src/config/permissions.rs | 534 - .../core/src/config/permissions_tests.rs | 354 - .../codex/codex-rs/core/src/config/schema.md | 11 - .../codex/codex-rs/core/src/config/schema.rs | 7 - .../codex-rs/core/src/config/schema_tests.rs | 55 - .../codex-rs/core/src/config_loader/README.md | 77 - .../core/src/config_loader/layer_io.rs | 137 - .../codex-rs/core/src/config_loader/macos.rs | 179 - .../codex-rs/core/src/config_loader/mod.rs | 1207 -- .../codex-rs/core/src/config_loader/tests.rs | 2321 --- .../context/approved_command_prefix_saved.rs | 24 - .../collaboration_mode_instructions.rs | 32 - .../src/context/contextual_user_message.rs | 94 - .../context/contextual_user_message_tests.rs | 95 - .../core/src/context/environment_context.rs | 209 - .../src/context/environment_context_tests.rs | 186 - .../codex-rs/core/src/context/fragment.rs | 88 - .../guardian_followup_review_reminder.rs | 21 - .../src/context/hook_additional_context.rs | 22 - .../context/image_generation_instructions.rs | 30 - vendor/codex/codex-rs/core/src/context/mod.rs | 47 - .../src/context/model_switch_instructions.rs | 27 - .../core/src/context/network_rule_saved.rs | 35 - .../src/context/permissions_instructions.rs | 315 - .../context/permissions_instructions_tests.rs | 392 - .../context/personality_spec_instructions.rs | 25 - .../permissions/approval_policy/never.md | 1 - .../permissions/approval_policy/on_failure.md | 1 - .../permissions/approval_policy/on_request.md | 57 - .../on_request_rule_request_permission.md | 33 - .../approval_policy/unless_trusted.md | 1 - .../sandbox_mode/danger_full_access.md | 1 - .../permissions/sandbox_mode/read_only.md | 1 - .../sandbox_mode/workspace_write.md | 1 - .../context/prompts/realtime/realtime_end.md | 3 - .../prompts/realtime/realtime_start.md | 9 - .../src/context/realtime_end_instructions.rs | 32 - .../context/realtime_start_instructions.rs | 18 - .../realtime_start_with_instructions.rs | 26 - .../src/context/spawn_agent_instructions.rs | 14 - .../core/src/context/subagent_notification.rs | 34 - .../codex-rs/core/src/context/turn_aborted.rs | 26 - .../core/src/context/user_instructions.rs | 17 - .../core/src/context/user_shell_command.rs | 40 - .../core/src/context_manager/history.rs | 740 - .../core/src/context_manager/history_tests.rs | 1959 -- .../codex-rs/core/src/context_manager/mod.rs | 9 - .../core/src/context_manager/normalize.rs | 345 - .../core/src/context_manager/updates.rs | 239 - .../codex/codex-rs/core/src/event_mapping.rs | 213 - .../codex-rs/core/src/event_mapping_tests.rs | 500 - vendor/codex/codex-rs/core/src/exec.rs | 1410 -- vendor/codex/codex-rs/core/src/exec_env.rs | 55 - .../codex/codex-rs/core/src/exec_env_tests.rs | 259 - vendor/codex/codex-rs/core/src/exec_policy.rs | 926 - .../codex-rs/core/src/exec_policy_tests.rs | 2064 --- vendor/codex/codex-rs/core/src/exec_tests.rs | 1067 -- .../codex/codex-rs/core/src/file_watcher.rs | 856 - .../codex-rs/core/src/file_watcher_tests.rs | 540 - vendor/codex/codex-rs/core/src/flags.rs | 6 - .../codex/codex-rs/core/src/function_tool.rs | 11 - .../codex/codex-rs/core/src/git_info_tests.rs | 632 - .../core/src/guardian/approval_request.rs | 541 - .../codex/codex-rs/core/src/guardian/mod.rs | 159 - .../codex-rs/core/src/guardian/policy.md | 42 - .../core/src/guardian/policy_template.md | 57 - .../codex-rs/core/src/guardian/prompt.rs | 608 - .../codex-rs/core/src/guardian/review.rs | 782 - .../core/src/guardian/review_session.rs | 1139 -- ...ardian_followup_review_request_layout.snap | 67 - ...tests__guardian_review_request_layout.snap | 26 - .../codex/codex-rs/core/src/guardian/tests.rs | 2167 --- .../codex/codex-rs/core/src/hook_runtime.rs | 627 - .../codex-rs/core/src/installation_id.rs | 149 - vendor/codex/codex-rs/core/src/landlock.rs | 77 - vendor/codex/codex-rs/core/src/lib.rs | 172 - vendor/codex/codex-rs/core/src/mcp.rs | 30 - .../codex-rs/core/src/mcp_openai_file.rs | 474 - .../core/src/mcp_tool_approval_templates.rs | 27 - .../codex/codex-rs/core/src/mcp_tool_call.rs | 1530 -- .../codex-rs/core/src/mcp_tool_call_tests.rs | 1825 -- .../codex-rs/core/src/mcp_tool_exposure.rs | 43 - .../core/src/mcp_tool_exposure_test.rs | 140 - .../codex-rs/core/src/memories/README.md | 138 - .../codex-rs/core/src/memories/citations.rs | 85 - .../core/src/memories/citations_tests.rs | 71 - .../codex-rs/core/src/memories/control.rs | 44 - .../codex-rs/core/src/memories/extensions.rs | 251 - .../codex/codex-rs/core/src/memories/mod.rs | 123 - .../codex-rs/core/src/memories/phase1.rs | 623 - .../core/src/memories/phase1_tests.rs | 156 - .../codex-rs/core/src/memories/phase2.rs | 542 - .../codex-rs/core/src/memories/prompts.rs | 293 - .../core/src/memories/prompts_tests.rs | 118 - .../codex/codex-rs/core/src/memories/start.rs | 44 - .../codex-rs/core/src/memories/storage.rs | 253 - .../core/src/memories/storage_tests.rs | 70 - .../codex/codex-rs/core/src/memories/tests.rs | 1022 - .../codex/codex-rs/core/src/memories/usage.rs | 143 - .../codex/codex-rs/core/src/memory_trace.rs | 230 - .../codex-rs/core/src/memory_trace_tests.rs | 73 - .../codex/codex-rs/core/src/mention_syntax.rs | 2 - .../codex-rs/core/src/message_history.rs | 418 - .../core/src/message_history_tests.rs | 211 - .../core/src/network_policy_decision.rs | 106 - .../core/src/network_policy_decision_tests.rs | 192 - .../codex-rs/core/src/network_proxy_loader.rs | 330 - .../core/src/network_proxy_loader_tests.rs | 250 - .../core/src/original_image_detail.rs | 3 - vendor/codex/codex-rs/core/src/otel_init.rs | 99 - .../core/src/personality_migration.rs | 110 - .../core/src/personality_migration_tests.rs | 162 - .../codex/codex-rs/core/src/prompt_debug.rs | 97 - .../codex-rs/core/src/realtime_context.rs | 565 - .../core/src/realtime_context_tests.rs | 329 - .../core/src/realtime_conversation.rs | 1445 -- .../core/src/realtime_conversation_tests.rs | 139 - .../codex-rs/core/src/realtime_prompt.rs | 82 - .../codex/codex-rs/core/src/review_format.rs | 82 - .../codex/codex-rs/core/src/review_prompts.rs | 185 - vendor/codex/codex-rs/core/src/rollout.rs | 70 - vendor/codex/codex-rs/core/src/safety.rs | 179 - .../codex/codex-rs/core/src/safety_tests.rs | 319 - .../codex/codex-rs/core/src/sandbox_tags.rs | 28 - .../codex-rs/core/src/sandbox_tags_tests.rs | 39 - .../codex/codex-rs/core/src/sandboxing/mod.rs | 166 - .../codex-rs/core/src/session/handlers.rs | 1233 -- vendor/codex/codex-rs/core/src/session/mcp.rs | 295 - vendor/codex/codex-rs/core/src/session/mod.rs | 3058 --- .../codex/codex-rs/core/src/session/review.rs | 164 - .../src/session/rollout_reconstruction.rs | 299 - .../session/rollout_reconstruction_tests.rs | 1508 -- .../codex-rs/core/src/session/session.rs | 917 - ..._startup_context_then_first_turn_diff.snap | 15 - .../codex/codex-rs/core/src/session/tests.rs | 6457 ------- .../core/src/session/tests/guardian_tests.rs | 783 - .../codex/codex-rs/core/src/session/turn.rs | 1887 -- .../codex-rs/core/src/session/turn_context.rs | 672 - .../codex/codex-rs/core/src/session_prefix.rs | 25 - .../core/src/session_rollout_init_error.rs | 49 - .../core/src/session_startup_prewarm.rs | 238 - vendor/codex/codex-rs/core/src/shell.rs | 409 - .../codex/codex-rs/core/src/shell_detect.rs | 24 - .../codex/codex-rs/core/src/shell_snapshot.rs | 567 - .../codex-rs/core/src/shell_snapshot_tests.rs | 498 - vendor/codex/codex-rs/core/src/shell_tests.rs | 192 - vendor/codex/codex-rs/core/src/spawn.rs | 126 - vendor/codex/codex-rs/core/src/state/mod.rs | 12 - .../codex/codex-rs/core/src/state/service.rs | 68 - .../codex/codex-rs/core/src/state/session.rs | 221 - vendor/codex/codex-rs/core/src/state/turn.rs | 274 - .../codex-rs/core/src/state_db_bridge.rs | 8 - .../codex-rs/core/src/stream_events_utils.rs | 509 - .../core/src/stream_events_utils_tests.rs | 302 - .../codex/codex-rs/core/src/tasks/compact.rs | 47 - .../codex-rs/core/src/tasks/ghost_snapshot.rs | 252 - .../core/src/tasks/ghost_snapshot_tests.rs | 34 - vendor/codex/codex-rs/core/src/tasks/mod.rs | 711 - .../codex-rs/core/src/tasks/mod_tests.rs | 180 - .../codex/codex-rs/core/src/tasks/regular.rs | 83 - .../codex/codex-rs/core/src/tasks/review.rs | 319 - vendor/codex/codex-rs/core/src/tasks/undo.rs | 129 - .../codex-rs/core/src/tasks/user_shell.rs | 357 - .../codex/codex-rs/core/src/test_support.rs | 124 - .../codex/codex-rs/core/src/thread_manager.rs | 1020 - .../codex-rs/core/src/thread_manager_tests.rs | 739 - .../core/src/thread_rollout_truncation.rs | 170 - .../src/thread_rollout_truncation_tests.rs | 318 - .../src/tools/code_mode/execute_handler.rs | 86 - .../tools/code_mode/execute_handler_tests.rs | 41 - .../codex-rs/core/src/tools/code_mode/mod.rs | 409 - .../src/tools/code_mode/response_adapter.rs | 47 - .../core/src/tools/code_mode/wait_handler.rs | 84 - .../codex/codex-rs/core/src/tools/context.rs | 597 - .../codex-rs/core/src/tools/context_tests.rs | 419 - .../codex/codex-rs/core/src/tools/events.rs | 528 - .../core/src/tools/handlers/apply_patch.rs | 568 - .../src/tools/handlers/apply_patch_tests.rs | 280 - .../core/src/tools/handlers/dynamic.rs | 142 - .../src/tools/handlers/grep_files_tests.rs | 95 - .../core/src/tools/handlers/js_repl.rs | 300 - .../core/src/tools/handlers/js_repl_tests.rs | 90 - .../core/src/tools/handlers/list_dir.rs | 293 - .../core/src/tools/handlers/list_dir_tests.rs | 331 - .../codex-rs/core/src/tools/handlers/mcp.rs | 63 - .../core/src/tools/handlers/mcp_resource.rs | 675 - .../src/tools/handlers/mcp_resource_tests.rs | 125 - .../codex-rs/core/src/tools/handlers/mod.rs | 384 - .../core/src/tools/handlers/multi_agents.rs | 74 - .../handlers/multi_agents/close_agent.rs | 121 - .../handlers/multi_agents/resume_agent.rs | 173 - .../tools/handlers/multi_agents/send_input.rs | 116 - .../src/tools/handlers/multi_agents/spawn.rs | 208 - .../src/tools/handlers/multi_agents/wait.rs | 238 - .../src/tools/handlers/multi_agents_common.rs | 379 - .../src/tools/handlers/multi_agents_tests.rs | 3565 ---- .../src/tools/handlers/multi_agents_v2.rs | 43 - .../handlers/multi_agents_v2/close_agent.rs | 134 - .../handlers/multi_agents_v2/followup_task.rs | 32 - .../handlers/multi_agents_v2/list_agents.rs | 68 - .../handlers/multi_agents_v2/message_tool.rs | 167 - .../handlers/multi_agents_v2/send_message.rs | 32 - .../tools/handlers/multi_agents_v2/spawn.rs | 304 - .../tools/handlers/multi_agents_v2/wait.rs | 132 - .../codex-rs/core/src/tools/handlers/plan.rs | 102 - .../src/tools/handlers/read_file_tests.rs | 503 - .../src/tools/handlers/request_permissions.rs | 68 - .../src/tools/handlers/request_user_input.rs | 80 - .../handlers/request_user_input_tests.rs | 66 - .../codex-rs/core/src/tools/handlers/shell.rs | 588 - .../core/src/tools/handlers/shell_tests.rs | 292 - .../core/src/tools/handlers/test_sync.rs | 152 - .../core/src/tools/handlers/tool_search.rs | 430 - .../src/tools/handlers/unavailable_tool.rs | 44 - .../core/src/tools/handlers/unified_exec.rs | 443 - .../src/tools/handlers/unified_exec_tests.rs | 410 - .../core/src/tools/handlers/view_image.rs | 233 - .../codex-rs/core/src/tools/hook_names.rs | 55 - .../codex-rs/core/src/tools/js_repl/kernel.js | 1799 -- .../core/src/tools/js_repl/meriyah.umd.min.js | 6 - .../codex-rs/core/src/tools/js_repl/mod.rs | 2037 -- .../core/src/tools/js_repl/mod_tests.rs | 2850 --- vendor/codex/codex-rs/core/src/tools/mod.rs | 119 - .../core/src/tools/network_approval.rs | 710 - .../core/src/tools/network_approval_tests.rs | 315 - .../codex-rs/core/src/tools/orchestrator.rs | 460 - .../codex/codex-rs/core/src/tools/parallel.rs | 197 - .../codex/codex-rs/core/src/tools/registry.rs | 676 - .../codex-rs/core/src/tools/registry_tests.rs | 51 - .../codex/codex-rs/core/src/tools/router.rs | 305 - .../codex-rs/core/src/tools/router_tests.rs | 302 - .../core/src/tools/runtimes/apply_patch.rs | 262 - .../src/tools/runtimes/apply_patch_tests.rs | 209 - .../codex-rs/core/src/tools/runtimes/mod.rs | 238 - .../core/src/tools/runtimes/mod_tests.rs | 777 - .../codex-rs/core/src/tools/runtimes/shell.rs | 290 - .../tools/runtimes/shell/unix_escalation.rs | 1023 - .../runtimes/shell/unix_escalation_tests.rs | 672 - .../tools/runtimes/shell/zsh_fork_backend.rs | 136 - .../core/src/tools/runtimes/unified_exec.rs | 354 - .../codex-rs/core/src/tools/sandboxing.rs | 396 - .../core/src/tools/sandboxing_tests.rs | 108 - vendor/codex/codex-rs/core/src/tools/spec.rs | 325 - .../codex-rs/core/src/tools/spec_tests.rs | 1392 -- .../core/src/tools/tool_search_entry.rs | 142 - .../codex-rs/core/src/turn_diff_tracker.rs | 469 - .../core/src/turn_diff_tracker_tests.rs | 427 - .../codex/codex-rs/core/src/turn_metadata.rs | 300 - .../codex-rs/core/src/turn_metadata_tests.rs | 146 - vendor/codex/codex-rs/core/src/turn_timing.rs | 193 - .../codex-rs/core/src/turn_timing_tests.rs | 127 - .../codex-rs/core/src/unavailable_tool.rs | 92 - .../core/src/unified_exec/async_watcher.rs | 322 - .../src/unified_exec/async_watcher_tests.rs | 39 - .../codex-rs/core/src/unified_exec/errors.rs | 40 - .../core/src/unified_exec/head_tail_buffer.rs | 183 - .../unified_exec/head_tail_buffer_tests.rs | 89 - .../codex-rs/core/src/unified_exec/mod.rs | 180 - .../core/src/unified_exec/mod_tests.rs | 626 - .../codex-rs/core/src/unified_exec/process.rs | 499 - .../core/src/unified_exec/process_manager.rs | 1062 -- .../src/unified_exec/process_manager_tests.rs | 192 - .../core/src/unified_exec/process_state.rs | 24 - .../core/src/unified_exec/process_tests.rs | 147 - .../codex-rs/core/src/user_shell_command.rs | 41 - .../core/src/user_shell_command_tests.rs | 58 - vendor/codex/codex-rs/core/src/util.rs | 139 - vendor/codex/codex-rs/core/src/util_tests.rs | 472 - vendor/codex/codex-rs/core/src/utils/mod.rs | 1 - .../codex-rs/core/src/utils/path_utils.rs | 1 - vendor/codex/codex-rs/core/src/web_search.rs | 39 - .../codex-rs/core/src/windows_sandbox.rs | 451 - .../core/src/windows_sandbox_read_grants.rs | 40 - .../src/windows_sandbox_read_grants_tests.rs | 57 - .../core/src/windows_sandbox_tests.rs | 189 - .../core/templates/agents/orchestrator.md | 42 - .../templates/collab/experimental_prompt.md | 15 - .../codex-rs/core/templates/compact/prompt.md | 9 - .../core/templates/compact/summary_prefix.md | 1 - .../core/templates/memories/consolidation.md | 749 - .../core/templates/memories/read_path.md | 123 - .../templates/memories/stage_one_input.md | 11 - .../templates/memories/stage_one_system.md | 569 - .../gpt-5.2-codex_instructions_template.md | 80 - .../personalities/gpt-5.2-codex_friendly.md | 19 - .../personalities/gpt-5.2-codex_pragmatic.md | 18 - .../core/templates/realtime/backend_prompt.md | 65 - .../templates/review/exit_interrupted.xml | 8 - .../core/templates/review/exit_success.xml | 7 - .../review/history_message_completed.md | 8 - .../review/history_message_interrupted.md | 8 - .../templates/search_tool/tool_description.md | 7 - vendor/codex/codex-rs/core/tests/all.rs | 5 - .../core/tests/cli_responses_fixture.sse | 8 - .../codex-rs/core/tests/common/BUILD.bazel | 10 - .../codex-rs/core/tests/common/Cargo.toml | 47 - .../core/tests/common/context_snapshot.rs | 493 - .../codex/codex-rs/core/tests/common/lib.rs | 612 - .../core/tests/common/mcp_test_server.rs | 359 - .../codex-rs/core/tests/common/process.rs | 48 - .../codex-rs/core/tests/common/responses.rs | 1677 -- .../core/tests/common/streaming_sse.rs | 709 - .../codex-rs/core/tests/common/test_codex.rs | 961 - .../core/tests/common/test_codex_exec.rs | 49 - .../codex-rs/core/tests/common/tracing.rs | 26 - .../codex-rs/core/tests/common/zsh_fork.rs | 124 - .../core/tests/fixtures/incomplete_sse.json | 3 - .../codex-rs/core/tests/responses_headers.rs | 601 - .../codex-rs/core/tests/suite/abort_tasks.rs | 251 - .../core/tests/suite/agent_websocket.rs | 440 - .../codex-rs/core/tests/suite/agents_md.rs | 141 - .../core/tests/suite/apply_patch_cli.rs | 1644 -- .../codex-rs/core/tests/suite/approvals.rs | 3042 --- .../codex-rs/core/tests/suite/cli_stream.rs | 628 - .../codex/codex-rs/core/tests/suite/client.rs | 2816 --- .../core/tests/suite/client_websockets.rs | 1922 -- .../codex-rs/core/tests/suite/code_mode.rs | 2912 --- .../core/tests/suite/codex_delegate.rs | 245 - .../tests/suite/collaboration_instructions.rs | 840 - .../codex-rs/core/tests/suite/compact.rs | 3435 ---- .../core/tests/suite/compact_remote.rs | 2734 --- .../core/tests/suite/compact_resume_fork.rs | 879 - .../core/tests/suite/deprecation_notice.rs | 205 - .../codex/codex-rs/core/tests/suite/exec.rs | 180 - .../codex-rs/core/tests/suite/exec_policy.rs | 396 - .../codex-rs/core/tests/suite/fork_thread.rs | 164 - .../core/tests/suite/hierarchical_agents.rs | 95 - .../codex/codex-rs/core/tests/suite/hooks.rs | 2919 --- .../core/tests/suite/image_rollout.rs | 261 - .../codex/codex-rs/core/tests/suite/items.rs | 1199 -- .../codex-rs/core/tests/suite/js_repl.rs | 795 - .../codex-rs/core/tests/suite/json_result.rs | 111 - .../codex-rs/core/tests/suite/live_cli.rs | 148 - .../codex-rs/core/tests/suite/memories.rs | 642 - vendor/codex/codex-rs/core/tests/suite/mod.rs | 106 - .../core/tests/suite/model_overrides.rs | 91 - .../core/tests/suite/model_switching.rs | 1114 -- .../core/tests/suite/model_visible_layout.rs | 521 - .../core/tests/suite/models_cache_ttl.rs | 362 - .../core/tests/suite/models_etag_responses.rs | 148 - .../codex/codex-rs/core/tests/suite/otel.rs | 1549 -- .../core/tests/suite/override_updates.rs | 229 - .../core/tests/suite/pending_input.rs | 784 - .../core/tests/suite/permissions_messages.rs | 591 - .../codex-rs/core/tests/suite/personality.rs | 935 - .../core/tests/suite/personality_migration.rs | 338 - .../core/tests/suite/prompt_caching.rs | 1062 -- .../core/tests/suite/prompt_debug_tests.rs | 60 - .../core/tests/suite/quota_exceeded.rs | 76 - .../core/tests/suite/realtime_conversation.rs | 3385 ---- .../codex-rs/core/tests/suite/remote_env.rs | 359 - .../core/tests/suite/remote_models.rs | 1290 -- .../core/tests/suite/request_compression.rs | 117 - .../core/tests/suite/request_permissions.rs | 1877 -- .../tests/suite/request_permissions_tool.rs | 480 - .../core/tests/suite/request_user_input.rs | 327 - .../suite/responses_api_proxy_headers.rs | 241 - .../codex/codex-rs/core/tests/suite/resume.rs | 467 - .../core/tests/suite/resume_warning.rs | 135 - .../codex/codex-rs/core/tests/suite/review.rs | 949 - .../codex-rs/core/tests/suite/rmcp_client.rs | 2364 --- .../core/tests/suite/rollout_list_find.rs | 222 - .../tests/suite/safety_check_downgrade.rs | 320 - .../codex-rs/core/tests/suite/search_tool.rs | 999 - .../core/tests/suite/shell_command.rs | 312 - .../core/tests/suite/shell_serialization.rs | 955 - .../core/tests/suite/shell_snapshot.rs | 718 - ...t__manual_compact_with_history_shapes.snap | 19 - ...nual_compact_without_prev_user_shapes.snap | 14 - ...__compact__mid_turn_compaction_shapes.snap | 19 - ...mpling_model_switch_compaction_shapes.snap | 26 - ...action_context_window_exceeded_shapes.snap | 12 - ..._compaction_including_incoming_shapes.snap | 26 - ...n_strips_incoming_model_switch_shapes.snap | 27 - ...t_resume_restates_realtime_end_shapes.snap | 21 - ...ompact_restates_realtime_start_shapes.snap | 21 - ...te_manual_compact_with_history_shapes.snap | 17 - ...nual_compact_without_prev_user_shapes.snap | 10 - ..._does_not_restate_realtime_end_shapes.snap | 32 - ...y_reinjects_above_last_summary_shapes.snap | 16 - ...te__remote_mid_turn_compaction_shapes.snap | 18 - ...summary_only_reinjects_context_shapes.snap | 17 - ...action_context_window_exceeded_shapes.snap | 11 - ...te_pre_turn_compaction_failure_shapes.snap | 11 - ..._compaction_including_incoming_shapes.snap | 21 - ...mpaction_restates_realtime_end_shapes.snap | 21 - ...action_restates_realtime_start_shapes.snap | 21 - ...n_strips_incoming_model_switch_shapes.snap | 26 - ...k_followup_turn_trims_context_updates.snap | 23 - ...fork__rollback_past_compaction_shapes.snap | 26 - ...ut_cwd_change_does_not_refresh_agents.snap | 18 - ...ronment_context_includes_one_subagent.snap | 6 - ...onment_context_includes_two_subagents.snap | 6 - ...resume_override_matches_rollout_model.snap | 18 - ...layout_resume_with_personality_change.snap | 21 - ...__model_visible_layout_turn_overrides.snap | 21 - ...ng_input_queued_mail_after_commentary.snap | 17 - ...ing_input_queued_mail_after_reasoning.snap | 17 - ...user_input_no_preempt_after_reasoning.snap | 20 - ...t_thread_selects_many_turns_by_budget.snap | 52 - ...n_is_capped_when_mirrored_to_realtime.snap | 12 - ..._turn_is_sent_to_realtime_when_active.snap | 10 - .../tests/suite/spawn_agent_description.rs | 226 - .../codex-rs/core/tests/suite/sqlite_state.rs | 520 - .../suite/stream_error_allows_next_turn.rs | 130 - .../core/tests/suite/stream_no_completed.rs | 103 - .../tests/suite/subagent_notifications.rs | 608 - .../codex-rs/core/tests/suite/tool_harness.rs | 478 - .../core/tests/suite/tool_parallelism.rs | 420 - .../codex/codex-rs/core/tests/suite/tools.rs | 965 - .../codex-rs/core/tests/suite/truncation.rs | 801 - .../codex-rs/core/tests/suite/turn_state.rs | 147 - .../codex/codex-rs/core/tests/suite/undo.rs | 553 - .../codex-rs/core/tests/suite/unified_exec.rs | 2831 --- .../tests/suite/unstable_features_warning.rs | 108 - .../core/tests/suite/user_notification.rs | 81 - .../core/tests/suite/user_shell_cmd.rs | 499 - .../codex-rs/core/tests/suite/view_image.rs | 1561 -- .../codex-rs/core/tests/suite/web_search.rs | 277 - .../core/tests/suite/websocket_fallback.rs | 245 - .../core/tests/suite/window_headers.rs | 148 - vendor/codex/codex-rs/debug-client/Cargo.toml | 18 - vendor/codex/codex-rs/debug-client/README.md | 60 - .../codex/codex-rs/debug-client/src/client.rs | 415 - .../codex-rs/debug-client/src/commands.rs | 156 - .../codex/codex-rs/debug-client/src/main.rs | 310 - .../codex/codex-rs/debug-client/src/output.rs | 175 - .../codex/codex-rs/debug-client/src/reader.rs | 338 - .../codex/codex-rs/debug-client/src/state.rs | 28 - vendor/codex/codex-rs/default.nix | 56 - vendor/codex/codex-rs/deny.toml | 292 - vendor/codex/codex-rs/device-key/BUILD.bazel | 6 - vendor/codex/codex-rs/device-key/Cargo.toml | 20 - vendor/codex/codex-rs/device-key/src/lib.rs | 1374 -- .../codex/codex-rs/device-key/src/platform.rs | 51 - vendor/codex/codex-rs/docs/bazel.md | 65 - .../codex-rs/docs/codex_mcp_interface.md | 143 - vendor/codex/codex-rs/docs/protocol_v1.md | 193 - vendor/codex/codex-rs/exec-server/BUILD.bazel | 11 - vendor/codex/codex-rs/exec-server/Cargo.toml | 53 - vendor/codex/codex-rs/exec-server/README.md | 349 - .../codex/codex-rs/exec-server/src/client.rs | 1178 -- .../exec-server/src/client/http_client.rs | 26 - .../src/client/http_response_body_stream.rs | 355 - .../src/client/reqwest_http_client.rs | 267 - .../exec-server/src/client/rpc_http_client.rs | 88 - .../codex-rs/exec-server/src/client_api.rs | 45 - .../codex-rs/exec-server/src/connection.rs | 318 - .../codex-rs/exec-server/src/environment.rs | 475 - .../codex-rs/exec-server/src/file_system.rs | 184 - .../codex-rs/exec-server/src/fs_helper.rs | 300 - .../exec-server/src/fs_helper_main.rs | 45 - .../codex-rs/exec-server/src/fs_sandbox.rs | 635 - vendor/codex/codex-rs/exec-server/src/lib.rs | 89 - .../exec-server/src/local_file_system.rs | 570 - .../codex-rs/exec-server/src/local_process.rs | 748 - .../codex/codex-rs/exec-server/src/process.rs | 238 - .../codex-rs/exec-server/src/process_id.rs | 74 - .../codex-rs/exec-server/src/protocol.rs | 443 - .../exec-server/src/remote_file_system.rs | 305 - .../exec-server/src/remote_process.rs | 92 - vendor/codex/codex-rs/exec-server/src/rpc.rs | 631 - .../codex-rs/exec-server/src/runtime_paths.rs | 43 - .../exec-server/src/sandboxed_file_system.rs | 240 - .../codex/codex-rs/exec-server/src/server.rs | 20 - .../src/server/file_system_handler.rs | 237 - .../exec-server/src/server/handler.rs | 347 - .../exec-server/src/server/handler/tests.rs | 352 - .../exec-server/src/server/jsonrpc.rs | 53 - .../exec-server/src/server/process_handler.rs | 58 - .../exec-server/src/server/processor.rs | 418 - .../exec-server/src/server/registry.rs | 118 - .../src/server/session_registry.rs | 259 - .../exec-server/src/server/transport.rs | 94 - .../exec-server/src/server/transport_tests.rs | 50 - .../exec-server/tests/common/exec_server.rs | 261 - .../codex-rs/exec-server/tests/common/mod.rs | 123 - .../exec-server/tests/exec_process.rs | 623 - .../codex-rs/exec-server/tests/file_system.rs | 1125 -- .../codex-rs/exec-server/tests/http_client.rs | 1119 -- .../exec-server/tests/http_request.rs | 568 - .../codex-rs/exec-server/tests/initialize.rs | 36 - .../codex-rs/exec-server/tests/process.rs | 307 - .../codex-rs/exec-server/tests/websocket.rs | 62 - vendor/codex/codex-rs/exec/BUILD.bazel | 7 - vendor/codex/codex-rs/exec/Cargo.toml | 75 - vendor/codex/codex-rs/exec/src/cli.rs | 285 - vendor/codex/codex-rs/exec/src/cli_tests.rs | 72 - .../codex-rs/exec/src/event_processor.rs | 48 - .../src/event_processor_with_human_output.rs | 568 - ...event_processor_with_human_output_tests.rs | 361 - .../src/event_processor_with_jsonl_output.rs | 625 - ...event_processor_with_jsonl_output_tests.rs | 57 - vendor/codex/codex-rs/exec/src/exec_events.rs | 312 - vendor/codex/codex-rs/exec/src/lib.rs | 1799 -- vendor/codex/codex-rs/exec/src/lib_tests.rs | 446 - vendor/codex/codex-rs/exec/src/main.rs | 45 - vendor/codex/codex-rs/exec/src/main_tests.rs | 37 - vendor/codex/codex-rs/exec/tests/all.rs | 5 - .../tests/event_processor_with_json_output.rs | 1612 -- .../fixtures/apply_patch_freeform_final.txt | 4 - .../tests/fixtures/cli_responses_fixture.sse | 10 - .../codex-rs/exec/tests/suite/add_dir.rs | 72 - .../codex-rs/exec/tests/suite/apply_patch.rs | 150 - .../codex-rs/exec/tests/suite/auth_env.rs | 31 - .../codex-rs/exec/tests/suite/ephemeral.rs | 53 - .../exec/tests/suite/mcp_required_exit.rs | 38 - vendor/codex/codex-rs/exec/tests/suite/mod.rs | 12 - .../codex-rs/exec/tests/suite/originator.rs | 54 - .../exec/tests/suite/output_schema.rs | 62 - .../codex-rs/exec/tests/suite/prompt_stdin.rs | 171 - .../codex/codex-rs/exec/tests/suite/resume.rs | 544 - .../codex-rs/exec/tests/suite/sandbox.rs | 564 - .../exec/tests/suite/server_error_exit.rs | 33 - .../codex-rs/execpolicy-legacy/BUILD.bazel | 7 - .../codex-rs/execpolicy-legacy/Cargo.toml | 35 - .../codex-rs/execpolicy-legacy/README.md | 183 - .../codex/codex-rs/execpolicy-legacy/build.rs | 3 - .../execpolicy-legacy/src/arg_matcher.rs | 118 - .../execpolicy-legacy/src/arg_resolver.rs | 204 - .../execpolicy-legacy/src/arg_type.rs | 87 - .../execpolicy-legacy/src/default.policy | 202 - .../codex-rs/execpolicy-legacy/src/error.rs | 96 - .../execpolicy-legacy/src/exec_call.rs | 28 - .../execpolicy-legacy/src/execv_checker.rs | 295 - .../codex-rs/execpolicy-legacy/src/lib.rs | 45 - .../codex-rs/execpolicy-legacy/src/main.rs | 169 - .../codex-rs/execpolicy-legacy/src/opt.rs | 77 - .../codex-rs/execpolicy-legacy/src/policy.rs | 103 - .../execpolicy-legacy/src/policy_parser.rs | 226 - .../codex-rs/execpolicy-legacy/src/program.rs | 247 - .../execpolicy-legacy/src/sed_command.rs | 17 - .../execpolicy-legacy/src/valid_exec.rs | 95 - .../codex-rs/execpolicy-legacy/tests/all.rs | 3 - .../execpolicy-legacy/tests/suite/bad.rs | 9 - .../execpolicy-legacy/tests/suite/cp.rs | 86 - .../execpolicy-legacy/tests/suite/good.rs | 9 - .../execpolicy-legacy/tests/suite/head.rs | 136 - .../execpolicy-legacy/tests/suite/literal.rs | 54 - .../execpolicy-legacy/tests/suite/ls.rs | 175 - .../execpolicy-legacy/tests/suite/mod.rs | 10 - .../tests/suite/parse_sed_command.rs | 23 - .../execpolicy-legacy/tests/suite/pwd.rs | 86 - .../execpolicy-legacy/tests/suite/sed.rs | 91 - vendor/codex/codex-rs/execpolicy/BUILD.bazel | 6 - vendor/codex/codex-rs/execpolicy/Cargo.toml | 32 - vendor/codex/codex-rs/execpolicy/README.md | 98 - .../execpolicy/examples/example.codexpolicy | 78 - vendor/codex/codex-rs/execpolicy/src/amend.rs | 337 - .../codex/codex-rs/execpolicy/src/decision.rs | 27 - vendor/codex/codex-rs/execpolicy/src/error.rs | 101 - .../execpolicy/src/execpolicycheck.rs | 95 - .../execpolicy/src/executable_name.rs | 29 - vendor/codex/codex-rs/execpolicy/src/lib.rs | 30 - vendor/codex/codex-rs/execpolicy/src/main.rs | 18 - .../codex/codex-rs/execpolicy/src/parser.rs | 472 - .../codex/codex-rs/execpolicy/src/policy.rs | 375 - vendor/codex/codex-rs/execpolicy/src/rule.rs | 306 - .../codex/codex-rs/execpolicy/tests/basic.rs | 963 - vendor/codex/codex-rs/features/BUILD.bazel | 16 - vendor/codex/codex-rs/features/Cargo.toml | 24 - .../codex-rs/features/src/feature_configs.rs | 23 - vendor/codex/codex-rs/features/src/legacy.rs | 125 - vendor/codex/codex-rs/features/src/lib.rs | 1001 - vendor/codex/codex-rs/features/src/tests.rs | 414 - vendor/codex/codex-rs/feedback/BUILD.bazel | 6 - vendor/codex/codex-rs/feedback/Cargo.toml | 19 - .../feedback/src/feedback_diagnostics.rs | 179 - vendor/codex/codex-rs/feedback/src/lib.rs | 801 - vendor/codex/codex-rs/file-search/BUILD.bazel | 6 - vendor/codex/codex-rs/file-search/Cargo.toml | 30 - vendor/codex/codex-rs/file-search/README.md | 5 - vendor/codex/codex-rs/file-search/src/cli.rs | 42 - vendor/codex/codex-rs/file-search/src/lib.rs | 1187 -- vendor/codex/codex-rs/file-search/src/main.rs | 83 - vendor/codex/codex-rs/git-utils/BUILD.bazel | 6 - vendor/codex/codex-rs/git-utils/Cargo.toml | 36 - vendor/codex/codex-rs/git-utils/README.md | 37 - vendor/codex/codex-rs/git-utils/src/apply.rs | 847 - .../codex/codex-rs/git-utils/src/baseline.rs | 645 - vendor/codex/codex-rs/git-utils/src/branch.rs | 256 - vendor/codex/codex-rs/git-utils/src/errors.rs | 35 - .../codex-rs/git-utils/src/ghost_commits.rs | 1786 -- vendor/codex/codex-rs/git-utils/src/info.rs | 726 - vendor/codex/codex-rs/git-utils/src/lib.rs | 52 - .../codex-rs/git-utils/src/operations.rs | 239 - .../codex/codex-rs/git-utils/src/platform.rs | 37 - vendor/codex/codex-rs/hooks/BUILD.bazel | 11 - vendor/codex/codex-rs/hooks/Cargo.toml | 31 - ...rmission-request.command.input.schema.json | 78 - ...mission-request.command.output.schema.json | 101 - .../post-tool-use.command.input.schema.json | 81 - .../post-tool-use.command.output.schema.json | 82 - .../pre-tool-use.command.input.schema.json | 79 - .../pre-tool-use.command.output.schema.json | 103 - .../session-start.command.input.schema.json | 59 - .../session-start.command.output.schema.json | 61 - .../generated/stop.command.input.schema.json | 63 - .../generated/stop.command.output.schema.json | 45 - ...er-prompt-submit.command.input.schema.json | 59 - ...r-prompt-submit.command.output.schema.json | 79 - .../src/bin/write_hooks_schema_fixtures.rs | 9 - .../hooks/src/engine/command_runner.rs | 135 - .../codex/codex-rs/hooks/src/engine/config.rs | 50 - .../codex-rs/hooks/src/engine/discovery.rs | 385 - .../codex-rs/hooks/src/engine/dispatcher.rs | 407 - vendor/codex/codex-rs/hooks/src/engine/mod.rs | 172 - .../hooks/src/engine/output_parser.rs | 494 - .../hooks/src/engine/schema_loader.rs | 102 - .../codex/codex-rs/hooks/src/events/common.rs | 254 - vendor/codex/codex-rs/hooks/src/events/mod.rs | 7 - .../hooks/src/events/permission_request.rs | 334 - .../hooks/src/events/post_tool_use.rs | 585 - .../codex-rs/hooks/src/events/pre_tool_use.rs | 573 - .../hooks/src/events/session_start.rs | 380 - .../codex/codex-rs/hooks/src/events/stop.rs | 547 - .../hooks/src/events/user_prompt_submit.rs | 438 - .../codex/codex-rs/hooks/src/legacy_notify.rs | 149 - vendor/codex/codex-rs/hooks/src/lib.rs | 37 - vendor/codex/codex-rs/hooks/src/registry.rs | 179 - vendor/codex/codex-rs/hooks/src/schema.rs | 745 - vendor/codex/codex-rs/hooks/src/types.rs | 292 - .../codex-rs/hooks/src/user_notification.rs | 153 - .../codex-rs/install-context/BUILD.bazel | 6 - .../codex/codex-rs/install-context/Cargo.toml | 19 - .../codex/codex-rs/install-context/src/lib.rs | 258 - .../codex/codex-rs/keyring-store/BUILD.bazel | 6 - .../codex/codex-rs/keyring-store/Cargo.toml | 24 - .../codex/codex-rs/keyring-store/src/lib.rs | 226 - .../codex/codex-rs/linux-sandbox/BUILD.bazel | 36 - .../codex/codex-rs/linux-sandbox/Cargo.toml | 46 - vendor/codex/codex-rs/linux-sandbox/README.md | 97 - vendor/codex/codex-rs/linux-sandbox/build.rs | 111 - vendor/codex/codex-rs/linux-sandbox/config.h | 3 - .../codex/codex-rs/linux-sandbox/src/bwrap.rs | 2021 -- .../codex-rs/linux-sandbox/src/landlock.rs | 343 - .../codex-rs/linux-sandbox/src/launcher.rs | 226 - .../codex/codex-rs/linux-sandbox/src/lib.rs | 27 - .../linux-sandbox/src/linux_run_main.rs | 744 - .../linux-sandbox/src/linux_run_main_tests.rs | 538 - .../codex/codex-rs/linux-sandbox/src/main.rs | 6 - .../linux-sandbox/src/proxy_routing.rs | 797 - .../linux-sandbox/src/vendored_bwrap.rs | 78 - .../codex/codex-rs/linux-sandbox/tests/all.rs | 3 - .../linux-sandbox/tests/suite/landlock.rs | 775 - .../tests/suite/managed_proxy.rs | 312 - .../codex-rs/linux-sandbox/tests/suite/mod.rs | 3 - vendor/codex/codex-rs/lmstudio/BUILD.bazel | 6 - vendor/codex/codex-rs/lmstudio/Cargo.toml | 26 - vendor/codex/codex-rs/lmstudio/src/client.rs | 397 - vendor/codex/codex-rs/lmstudio/src/lib.rs | 46 - vendor/codex/codex-rs/login/BUILD.bazel | 10 - vendor/codex/codex-rs/login/Cargo.toml | 53 - .../codex-rs/login/src/assets/error.html | 122 - .../codex-rs/login/src/assets/success.html | 198 - .../codex-rs/login/src/auth/agent_identity.rs | 84 - .../codex-rs/login/src/auth/auth_tests.rs | 830 - .../codex-rs/login/src/auth/default_client.rs | 257 - .../login/src/auth/default_client_tests.rs | 125 - vendor/codex/codex-rs/login/src/auth/error.rs | 2 - .../login/src/auth/external_bearer.rs | 174 - .../codex/codex-rs/login/src/auth/manager.rs | 1811 -- vendor/codex/codex-rs/login/src/auth/mod.rs | 13 - .../codex/codex-rs/login/src/auth/revoke.rs | 209 - .../codex/codex-rs/login/src/auth/storage.rs | 336 - .../codex-rs/login/src/auth/storage_tests.rs | 450 - vendor/codex/codex-rs/login/src/auth/util.rs | 45 - .../codex-rs/login/src/auth_env_telemetry.rs | 89 - .../codex-rs/login/src/device_code_auth.rs | 228 - vendor/codex/codex-rs/login/src/lib.rs | 48 - vendor/codex/codex-rs/login/src/pkce.rs | 27 - vendor/codex/codex-rs/login/src/server.rs | 1239 -- vendor/codex/codex-rs/login/src/token_data.rs | 180 - .../codex-rs/login/src/token_data_tests.rs | 178 - vendor/codex/codex-rs/login/tests/all.rs | 3 - .../login/tests/suite/auth_refresh.rs | 1091 -- .../login/tests/suite/device_code_login.rs | 333 - .../login/tests/suite/login_server_e2e.rs | 464 - .../codex-rs/login/tests/suite/logout.rs | 234 - .../codex/codex-rs/login/tests/suite/mod.rs | 5 - vendor/codex/codex-rs/mcp-server/BUILD.bazel | 6 - vendor/codex/codex-rs/mcp-server/Cargo.toml | 53 - .../mcp-server/src/codex_tool_config.rs | 434 - .../mcp-server/src/codex_tool_runner.rs | 441 - .../codex-rs/mcp-server/src/exec_approval.rs | 147 - vendor/codex/codex-rs/mcp-server/src/lib.rs | 240 - vendor/codex/codex-rs/mcp-server/src/main.rs | 11 - .../mcp-server/src/message_processor.rs | 607 - .../mcp-server/src/outgoing_message.rs | 473 - .../codex-rs/mcp-server/src/patch_approval.rs | 142 - .../mcp-server/src/tool_handlers/mod.rs | 2 - vendor/codex/codex-rs/mcp-server/tests/all.rs | 3 - .../mcp-server/tests/common/BUILD.bazel | 7 - .../mcp-server/tests/common/Cargo.toml | 32 - .../codex-rs/mcp-server/tests/common/lib.rs | 22 - .../mcp-server/tests/common/mcp_process.rs | 400 - .../tests/common/mock_model_server.rs | 47 - .../mcp-server/tests/common/responses.rs | 47 - .../mcp-server/tests/suite/codex_tool.rs | 524 - .../codex-rs/mcp-server/tests/suite/mod.rs | 1 - .../codex-rs/model-provider-info/BUILD.bazel | 6 - .../codex-rs/model-provider-info/Cargo.toml | 28 - .../codex-rs/model-provider-info/src/lib.rs | 510 - .../src/model_provider_info_tests.rs | 440 - .../codex/codex-rs/model-provider/BUILD.bazel | 6 - .../codex/codex-rs/model-provider/Cargo.toml | 26 - .../model-provider/src/amazon_bedrock/auth.rs | 211 - .../src/amazon_bedrock/mantle.rs | 101 - .../model-provider/src/amazon_bedrock/mod.rs | 73 - .../codex/codex-rs/model-provider/src/auth.rs | 64 - .../src/bearer_auth_provider.rs | 102 - .../codex/codex-rs/model-provider/src/lib.rs | 10 - .../codex-rs/model-provider/src/provider.rs | 158 - .../codex/codex-rs/models-manager/BUILD.bazel | 10 - .../codex/codex-rs/models-manager/Cargo.toml | 45 - .../codex/codex-rs/models-manager/models.json | 411 - .../codex/codex-rs/models-manager/prompt.md | 275 - .../codex-rs/models-manager/src/cache.rs | 183 - .../src/collaboration_mode_presets.rs | 115 - .../src/collaboration_mode_presets_tests.rs | 53 - .../codex-rs/models-manager/src/config.rs | 12 - .../codex/codex-rs/models-manager/src/lib.rs | 29 - .../codex-rs/models-manager/src/manager.rs | 606 - .../models-manager/src/manager_tests.rs | 878 - .../codex-rs/models-manager/src/model_info.rs | 121 - .../src/model_info_overrides_tests.rs | 54 - .../models-manager/src/model_info_tests.rs | 74 - .../models-manager/src/model_presets.rs | 6 - .../codex/codex-rs/network-proxy/BUILD.bazel | 6 - .../codex/codex-rs/network-proxy/Cargo.toml | 43 - vendor/codex/codex-rs/network-proxy/README.md | 219 - .../codex/codex-rs/network-proxy/src/certs.rs | 344 - .../codex-rs/network-proxy/src/config.rs | 869 - .../codex-rs/network-proxy/src/http_proxy.rs | 1319 -- .../codex/codex-rs/network-proxy/src/lib.rs | 62 - .../codex/codex-rs/network-proxy/src/mitm.rs | 482 - .../codex-rs/network-proxy/src/mitm_tests.rs | 128 - .../network-proxy/src/network_policy.rs | 898 - .../codex-rs/network-proxy/src/policy.rs | 465 - .../codex/codex-rs/network-proxy/src/proxy.rs | 1182 -- .../codex-rs/network-proxy/src/reasons.rs | 8 - .../codex-rs/network-proxy/src/responses.rs | 118 - .../codex-rs/network-proxy/src/runtime.rs | 1776 -- .../codex-rs/network-proxy/src/socks5.rs | 616 - .../codex/codex-rs/network-proxy/src/state.rs | 419 - .../codex-rs/network-proxy/src/upstream.rs | 190 - vendor/codex/codex-rs/node-version.txt | 1 - vendor/codex/codex-rs/ollama/BUILD.bazel | 6 - vendor/codex/codex-rs/ollama/Cargo.toml | 35 - vendor/codex/codex-rs/ollama/src/client.rs | 414 - vendor/codex/codex-rs/ollama/src/lib.rs | 97 - vendor/codex/codex-rs/ollama/src/parser.rs | 75 - vendor/codex/codex-rs/ollama/src/pull.rs | 147 - vendor/codex/codex-rs/ollama/src/url.rs | 39 - vendor/codex/codex-rs/otel/BUILD.bazel | 7 - vendor/codex/codex-rs/otel/Cargo.toml | 66 - vendor/codex/codex-rs/otel/README.md | 141 - vendor/codex/codex-rs/otel/src/config.rs | 94 - vendor/codex/codex-rs/otel/src/events/mod.rs | 2 - .../otel/src/events/session_telemetry.rs | 1098 -- .../codex/codex-rs/otel/src/events/shared.rs | 60 - vendor/codex/codex-rs/otel/src/lib.rs | 67 - .../codex/codex-rs/otel/src/metrics/client.rs | 406 - .../codex/codex-rs/otel/src/metrics/config.rs | 83 - .../codex/codex-rs/otel/src/metrics/error.rs | 46 - vendor/codex/codex-rs/otel/src/metrics/mod.rs | 27 - .../codex/codex-rs/otel/src/metrics/names.rs | 38 - .../otel/src/metrics/runtime_metrics.rs | 216 - .../codex/codex-rs/otel/src/metrics/tags.rs | 108 - .../codex/codex-rs/otel/src/metrics/timer.rs | 41 - .../codex-rs/otel/src/metrics/validation.rs | 55 - vendor/codex/codex-rs/otel/src/otlp.rs | 272 - vendor/codex/codex-rs/otel/src/provider.rs | 466 - vendor/codex/codex-rs/otel/src/targets.rs | 11 - .../codex/codex-rs/otel/src/trace_context.rs | 176 - .../codex/codex-rs/otel/tests/harness/mod.rs | 81 - .../otel/tests/suite/manager_metrics.rs | 163 - vendor/codex/codex-rs/otel/tests/suite/mod.rs | 8 - .../tests/suite/otel_export_routing_policy.rs | 852 - .../otel/tests/suite/otlp_http_loopback.rs | 561 - .../otel/tests/suite/runtime_summary.rs | 143 - .../codex/codex-rs/otel/tests/suite/send.rs | 217 - .../codex-rs/otel/tests/suite/snapshot.rs | 125 - .../codex/codex-rs/otel/tests/suite/timing.rs | 77 - .../codex-rs/otel/tests/suite/validation.rs | 91 - vendor/codex/codex-rs/otel/tests/tests.rs | 2 - .../codex-rs/process-hardening/BUILD.bazel | 6 - .../codex-rs/process-hardening/Cargo.toml | 18 - .../codex-rs/process-hardening/README.md | 8 - .../codex-rs/process-hardening/src/lib.rs | 189 - vendor/codex/codex-rs/protocol/BUILD.bazel | 7 - vendor/codex/codex-rs/protocol/Cargo.toml | 62 - vendor/codex/codex-rs/protocol/README.md | 7 - vendor/codex/codex-rs/protocol/src/account.rs | 87 - .../codex/codex-rs/protocol/src/agent_path.rs | 240 - .../codex/codex-rs/protocol/src/approvals.rs | 442 - vendor/codex/codex-rs/protocol/src/auth.rs | 120 - .../codex-rs/protocol/src/config_types.rs | 702 - .../codex-rs/protocol/src/dynamic_tools.rs | 139 - vendor/codex/codex-rs/protocol/src/error.rs | 631 - .../codex-rs/protocol/src/error_tests.rs | 547 - .../codex-rs/protocol/src/exec_output.rs | 169 - .../protocol/src/exec_output_tests.rs | 77 - vendor/codex/codex-rs/protocol/src/items.rs | 449 - vendor/codex/codex-rs/protocol/src/lib.rs | 28 - vendor/codex/codex-rs/protocol/src/mcp.rs | 360 - .../codex-rs/protocol/src/memory_citation.rs | 20 - .../codex-rs/protocol/src/message_history.rs | 11 - vendor/codex/codex-rs/protocol/src/models.rs | 2398 --- .../codex-rs/protocol/src/network_policy.rs | 22 - .../codex/codex-rs/protocol/src/num_format.rs | 103 - .../codex-rs/protocol/src/openai_models.rs | 832 - .../codex-rs/protocol/src/parse_command.rs | 31 - .../codex-rs/protocol/src/permissions.rs | 2454 --- .../codex/codex-rs/protocol/src/plan_tool.rs | 29 - .../src/prompts/base_instructions/default.md | 207 - .../codex/codex-rs/protocol/src/protocol.rs | 5262 ------ .../protocol/src/request_permissions.rs | 80 - .../protocol/src/request_user_input.rs | 55 - .../codex/codex-rs/protocol/src/thread_id.rs | 103 - .../codex/codex-rs/protocol/src/tool_name.rs | 62 - .../codex/codex-rs/protocol/src/user_input.rs | 104 - .../codex-rs/realtime-webrtc/BUILD.bazel | 7 - .../codex/codex-rs/realtime-webrtc/Cargo.toml | 19 - .../codex/codex-rs/realtime-webrtc/src/lib.rs | 90 - .../codex-rs/realtime-webrtc/src/native.rs | 227 - .../response-debug-context/BUILD.bazel | 6 - .../response-debug-context/Cargo.toml | 22 - .../response-debug-context/src/lib.rs | 165 - .../codex-rs/responses-api-proxy/BUILD.bazel | 6 - .../codex-rs/responses-api-proxy/Cargo.toml | 31 - .../codex-rs/responses-api-proxy/README.md | 110 - .../responses-api-proxy/npm/README.md | 13 - .../npm/bin/codex-responses-api-proxy.js | 97 - .../responses-api-proxy/npm/package.json | 22 - .../codex-rs/responses-api-proxy/src/dump.rs | 378 - .../codex-rs/responses-api-proxy/src/lib.rs | 275 - .../codex-rs/responses-api-proxy/src/main.rs | 12 - .../responses-api-proxy/src/read_api_key.rs | 342 - vendor/codex/codex-rs/rmcp-client/BUILD.bazel | 9 - vendor/codex/codex-rs/rmcp-client/Cargo.toml | 78 - .../codex-rs/rmcp-client/src/auth_status.rs | 373 - .../rmcp-client/src/bin/rmcp_test_server.rs | 161 - .../rmcp-client/src/bin/test_stdio_server.rs | 768 - .../src/bin/test_streamable_http_server.rs | 440 - .../src/elicitation_client_service.rs | 221 - .../src/executor_process_transport.rs | 376 - .../rmcp-client/src/http_client_adapter.rs | 391 - vendor/codex/codex-rs/rmcp-client/src/lib.rs | 37 - .../rmcp-client/src/logging_client_handler.rs | 136 - .../codex/codex-rs/rmcp-client/src/oauth.rs | 913 - .../rmcp-client/src/perform_oauth_login.rs | 656 - .../rmcp-client/src/program_resolver.rs | 238 - .../codex-rs/rmcp-client/src/rmcp_client.rs | 1009 - .../rmcp-client/src/stdio_server_launcher.rs | 537 - .../codex/codex-rs/rmcp-client/src/utils.rs | 335 - .../tests/process_group_cleanup.rs | 96 - .../codex-rs/rmcp-client/tests/resources.rs | 154 - .../tests/streamable_http_recovery.rs | 91 - .../tests/streamable_http_remote.rs | 37 - .../tests/streamable_http_test_support.rs | 314 - .../codex/codex-rs/rollout-trace/BUILD.bazel | 6 - .../codex/codex-rs/rollout-trace/Cargo.toml | 25 - vendor/codex/codex-rs/rollout-trace/README.md | 203 - .../codex-rs/rollout-trace/src/bundle.rs | 49 - .../codex-rs/rollout-trace/src/compaction.rs | 279 - .../codex-rs/rollout-trace/src/inference.rs | 369 - .../codex/codex-rs/rollout-trace/src/lib.rs | 58 - .../rollout-trace/src/model/conversation.rs | 176 - .../codex-rs/rollout-trace/src/model/mod.rs | 121 - .../rollout-trace/src/model/runtime.rs | 331 - .../rollout-trace/src/model/session.rs | 110 - .../codex-rs/rollout-trace/src/payload.rs | 49 - .../codex-rs/rollout-trace/src/raw_event.rs | 285 - .../codex-rs/rollout-trace/src/recorder.rs | 228 - .../rollout-trace/src/recorder_tests.rs | 162 - .../rollout-trace/src/reducer/code_cell.rs | 738 - .../src/reducer/code_cell_tests.rs | 423 - .../rollout-trace/src/reducer/compaction.rs | 183 - .../rollout-trace/src/reducer/conversation.rs | 700 - .../src/reducer/conversation/normalize.rs | 446 - .../src/reducer/conversation_tests.rs | 808 - .../rollout-trace/src/reducer/inference.rs | 143 - .../codex-rs/rollout-trace/src/reducer/mod.rs | 504 - .../rollout-trace/src/reducer/test_support.rs | 200 - .../rollout-trace/src/reducer/thread.rs | 264 - .../rollout-trace/src/reducer/tool.rs | 500 - .../rollout-trace/src/reducer/tool/agents.rs | 621 - .../src/reducer/tool/agents_tests.rs | 717 - .../src/reducer/tool/terminal.rs | 606 - .../src/reducer/tool/terminal_tests.rs | 580 - .../codex-rs/rollout-trace/src/writer.rs | 264 - vendor/codex/codex-rs/rollout/BUILD.bazel | 6 - vendor/codex/codex-rs/rollout/Cargo.toml | 49 - vendor/codex/codex-rs/rollout/src/config.rs | 100 - vendor/codex/codex-rs/rollout/src/lib.rs | 67 - vendor/codex/codex-rs/rollout/src/list.rs | 1341 -- vendor/codex/codex-rs/rollout/src/metadata.rs | 443 - .../codex-rs/rollout/src/metadata_tests.rs | 387 - vendor/codex/codex-rs/rollout/src/policy.rs | 224 - vendor/codex/codex-rs/rollout/src/recorder.rs | 1888 -- .../codex-rs/rollout/src/recorder_tests.rs | 977 - .../codex-rs/rollout/src/session_index.rs | 263 - .../rollout/src/session_index_tests.rs | 310 - vendor/codex/codex-rs/rollout/src/state_db.rs | 549 - .../codex-rs/rollout/src/state_db_tests.rs | 24 - vendor/codex/codex-rs/rollout/src/tests.rs | 1525 -- vendor/codex/codex-rs/rust-toolchain.toml | 3 - vendor/codex/codex-rs/rustfmt.toml | 4 - vendor/codex/codex-rs/sandboxing/BUILD.bazel | 11 - vendor/codex/codex-rs/sandboxing/Cargo.toml | 31 - vendor/codex/codex-rs/sandboxing/src/bwrap.rs | 136 - .../codex-rs/sandboxing/src/bwrap_tests.rs | 148 - .../codex/codex-rs/sandboxing/src/landlock.rs | 117 - .../codex-rs/sandboxing/src/landlock_tests.rs | 101 - vendor/codex/codex-rs/sandboxing/src/lib.rs | 47 - .../codex/codex-rs/sandboxing/src/manager.rs | 313 - .../codex-rs/sandboxing/src/manager_tests.rs | 357 - .../sandboxing/src/policy_transforms.rs | 689 - .../sandboxing/src/policy_transforms_tests.rs | 986 - ...estricted_read_only_platform_defaults.sbpl | 199 - .../codex/codex-rs/sandboxing/src/seatbelt.rs | 721 - .../sandboxing/src/seatbelt_base_policy.sbpl | 122 - .../src/seatbelt_network_policy.sbpl | 35 - .../codex-rs/sandboxing/src/seatbelt_tests.rs | 1369 -- .../codex/codex-rs/scripts/setup-windows.ps1 | 246 - vendor/codex/codex-rs/secrets/BUILD.bazel | 6 - vendor/codex/codex-rs/secrets/Cargo.toml | 27 - vendor/codex/codex-rs/secrets/src/lib.rs | 230 - vendor/codex/codex-rs/secrets/src/local.rs | 411 - .../codex/codex-rs/secrets/src/sanitizer.rs | 41 - .../codex/codex-rs/shell-command/BUILD.bazel | 7 - .../codex/codex-rs/shell-command/Cargo.toml | 26 - .../codex/codex-rs/shell-command/src/bash.rs | 590 - .../command_safety/is_dangerous_command.rs | 184 - .../src/command_safety/is_safe_command.rs | 633 - .../shell-command/src/command_safety/mod.rs | 5 - .../src/command_safety/powershell_parser.ps1 | 257 - .../src/command_safety/powershell_parser.rs | 289 - .../windows_dangerous_commands.rs | 755 - .../command_safety/windows_safe_commands.rs | 554 - .../codex/codex-rs/shell-command/src/lib.rs | 11 - .../shell-command/src/parse_command.rs | 2526 --- .../codex-rs/shell-command/src/powershell.rs | 189 - .../shell-command/src/shell_detect.rs | 32 - .../codex-rs/shell-escalation/BUILD.bazel | 6 - .../codex-rs/shell-escalation/Cargo.toml | 39 - .../codex/codex-rs/shell-escalation/README.md | 29 - .../patches/zsh-exec-wrapper.patch | 34 - .../src/bin/main_execve_wrapper.rs | 8 - .../codex-rs/shell-escalation/src/lib.rs | 35 - .../src/unix/escalate_client.rs | 144 - .../src/unix/escalate_protocol.rs | 88 - .../src/unix/escalate_server.rs | 1062 -- .../src/unix/escalation_policy.rs | 14 - .../src/unix/execve_wrapper.rs | 25 - .../codex-rs/shell-escalation/src/unix/mod.rs | 79 - .../shell-escalation/src/unix/socket.rs | 523 - .../shell-escalation/src/unix/stopwatch.rs | 237 - vendor/codex/codex-rs/state/BUILD.bazel | 7 - vendor/codex/codex-rs/state/Cargo.toml | 29 - .../state/logs_migrations/0001_logs.sql | 21 - .../0002_logs_feedback_log_body.sql | 53 - .../state/migrations/0001_threads.sql | 25 - .../codex-rs/state/migrations/0002_logs.sql | 13 - .../state/migrations/0003_logs_thread_id.sql | 3 - .../migrations/0004_thread_dynamic_tools.sql | 11 - .../migrations/0005_threads_cli_version.sql | 1 - .../state/migrations/0006_memories.sql | 31 - .../0007_threads_first_user_message.sql | 5 - .../state/migrations/0008_backfill_state.sql | 17 - .../0009_stage1_outputs_rollout_slug.sql | 2 - .../state/migrations/0010_logs_process_id.sql | 3 - .../0011_logs_partition_prune_indexes.sql | 4 - .../migrations/0012_logs_estimated_bytes.sql | 9 - .../0013_threads_agent_nickname.sql | 2 - .../state/migrations/0016_memory_usage.sql | 2 - .../migrations/0017_phase2_selection_flag.sql | 2 - .../0018_phase2_selection_snapshot.sql | 3 - ...019_thread_dynamic_tools_defer_loading.sql | 2 - .../0020_threads_model_reasoning_effort.sql | 2 - .../migrations/0021_thread_spawn_edges.sql | 8 - .../migrations/0022_threads_agent_path.sql | 1 - .../state/migrations/0023_drop_logs.sql | 3 - .../0024_remote_control_enrollments.sql | 10 - .../0025_thread_timestamps_millis.sql | 112 - .../0026_thread_dynamic_tools_namespace.sql | 2 - .../0027_threads_cwd_sort_indexes.sql | 2 - .../codex-rs/state/src/bin/logs_client.rs | 416 - vendor/codex/codex-rs/state/src/extract.rs | 472 - vendor/codex/codex-rs/state/src/lib.rs | 63 - vendor/codex/codex-rs/state/src/log_db.rs | 526 - vendor/codex/codex-rs/state/src/migrations.rs | 29 - .../state/src/model/backfill_state.rs | 73 - .../codex/codex-rs/state/src/model/graph.rs | 11 - vendor/codex/codex-rs/state/src/model/log.rs | 46 - .../codex-rs/state/src/model/memories.rs | 149 - vendor/codex/codex-rs/state/src/model/mod.rs | 35 - .../state/src/model/thread_metadata.rs | 552 - vendor/codex/codex-rs/state/src/paths.rs | 9 - vendor/codex/codex-rs/state/src/runtime.rs | 364 - .../codex-rs/state/src/runtime/backfill.rs | 311 - .../codex/codex-rs/state/src/runtime/logs.rs | 1913 -- .../codex-rs/state/src/runtime/memories.rs | 4615 ----- .../state/src/runtime/remote_control.rs | 283 - .../state/src/runtime/test_support.rs | 69 - .../codex-rs/state/src/runtime/threads.rs | 1875 -- .../codex/codex-rs/stdio-to-uds/BUILD.bazel | 6 - vendor/codex/codex-rs/stdio-to-uds/Cargo.toml | 31 - vendor/codex/codex-rs/stdio-to-uds/README.md | 20 - vendor/codex/codex-rs/stdio-to-uds/src/lib.rs | 46 - .../codex/codex-rs/stdio-to-uds/src/main.rs | 20 - .../stdio-to-uds/tests/stdio_to_uds.rs | 157 - .../codex-rs/terminal-detection/BUILD.bazel | 6 - .../codex-rs/terminal-detection/Cargo.toml | 18 - .../codex-rs/terminal-detection/src/lib.rs | 510 - .../terminal-detection/src/terminal_tests.rs | 881 - .../codex-rs/test-binary-support/BUILD.bazel | 7 - .../codex-rs/test-binary-support/Cargo.toml | 15 - .../codex/codex-rs/test-binary-support/lib.rs | 77 - .../codex/codex-rs/thread-store/BUILD.bazel | 6 - vendor/codex/codex-rs/thread-store/Cargo.toml | 39 - .../thread-store/examples/generate-proto.rs | 19 - .../thread-store/scripts/generate-proto.sh | 38 - .../codex/codex-rs/thread-store/src/error.rs | 36 - vendor/codex/codex-rs/thread-store/src/lib.rs | 37 - .../thread-store/src/local/archive_thread.rs | 173 - .../thread-store/src/local/helpers.rs | 168 - .../thread-store/src/local/list_threads.rs | 382 - .../codex-rs/thread-store/src/local/mod.rs | 115 - .../thread-store/src/local/read_thread.rs | 884 - .../thread-store/src/local/test_support.rs | 108 - .../src/local/unarchive_thread.rs | 198 - .../src/local/update_thread_metadata.rs | 397 - .../codex-rs/thread-store/src/recorder.rs | 28 - .../thread-store/src/remote/AGENTS.md | 13 - .../thread-store/src/remote/helpers.rs | 255 - .../thread-store/src/remote/list_threads.rs | 260 - .../codex-rs/thread-store/src/remote/mod.rs | 143 - .../remote/proto/codex.thread_store.v1.proto | 92 - .../src/remote/proto/codex.thread_store.v1.rs | 469 - .../codex/codex-rs/thread-store/src/store.rs | 68 - .../codex/codex-rs/thread-store/src/types.rs | 254 - vendor/codex/codex-rs/tools/BUILD.bazel | 9 - vendor/codex/codex-rs/tools/Cargo.toml | 28 - vendor/codex/codex-rs/tools/README.md | 101 - vendor/codex/codex-rs/tools/src/agent_tool.rs | 759 - .../codex-rs/tools/src/agent_tool_tests.rs | 304 - .../codex-rs/tools/src/apply_patch_tool.rs | 126 - .../tools/src/apply_patch_tool_tests.rs | 46 - vendor/codex/codex-rs/tools/src/code_mode.rs | 240 - .../codex-rs/tools/src/code_mode_tests.rs | 227 - .../codex/codex-rs/tools/src/dynamic_tool.rs | 17 - .../codex-rs/tools/src/dynamic_tool_tests.rs | 70 - .../codex/codex-rs/tools/src/image_detail.rs | 42 - .../codex-rs/tools/src/image_detail_tests.rs | 117 - .../codex/codex-rs/tools/src/js_repl_tool.rs | 55 - .../codex-rs/tools/src/js_repl_tool_tests.rs | 41 - .../codex/codex-rs/tools/src/json_schema.rs | 340 - .../codex-rs/tools/src/json_schema_tests.rs | 786 - vendor/codex/codex-rs/tools/src/lib.rs | 128 - vendor/codex/codex-rs/tools/src/local_tool.rs | 432 - .../codex-rs/tools/src/local_tool_tests.rs | 402 - .../codex-rs/tools/src/mcp_resource_tool.rs | 98 - .../tools/src/mcp_resource_tool_tests.rs | 96 - vendor/codex/codex-rs/tools/src/mcp_tool.rs | 64 - .../codex-rs/tools/src/mcp_tool_tests.rs | 126 - vendor/codex/codex-rs/tools/src/plan_tool.rs | 49 - .../tools/src/request_user_input_tool.rs | 147 - .../src/request_user_input_tool_tests.rs | 141 - .../codex/codex-rs/tools/src/responses_api.rs | 155 - .../codex-rs/tools/src/responses_api_tests.rs | 175 - .../codex-rs/tools/src/tool_apply_patch.lark | 19 - .../codex/codex-rs/tools/src/tool_config.rs | 309 - .../codex-rs/tools/src/tool_config_tests.rs | 213 - .../codex-rs/tools/src/tool_definition.rs | 30 - .../tools/src/tool_definition_tests.rs | 43 - .../codex-rs/tools/src/tool_discovery.rs | 164 - .../tools/src/tool_discovery_tests.rs | 47 - .../codex-rs/tools/src/tool_registry_plan.rs | 575 - .../tools/src/tool_registry_plan_tests.rs | 2036 -- .../tools/src/tool_registry_plan_types.rs | 128 - vendor/codex/codex-rs/tools/src/tool_spec.rs | 208 - .../codex-rs/tools/src/tool_spec_tests.rs | 293 - .../codex/codex-rs/tools/src/utility_tool.rs | 99 - .../codex-rs/tools/src/utility_tool_tests.rs | 108 - vendor/codex/codex-rs/tools/src/view_image.rs | 55 - vendor/codex/codex-rs/tui/BUILD.bazel | 30 - vendor/codex/codex-rs/tui/Cargo.toml | 149 - .../codex-rs/tui/frames/blocks/frame_1.txt | 17 - .../codex-rs/tui/frames/blocks/frame_10.txt | 17 - .../codex-rs/tui/frames/blocks/frame_11.txt | 17 - .../codex-rs/tui/frames/blocks/frame_12.txt | 17 - .../codex-rs/tui/frames/blocks/frame_13.txt | 17 - .../codex-rs/tui/frames/blocks/frame_14.txt | 17 - .../codex-rs/tui/frames/blocks/frame_15.txt | 17 - .../codex-rs/tui/frames/blocks/frame_16.txt | 17 - .../codex-rs/tui/frames/blocks/frame_17.txt | 17 - .../codex-rs/tui/frames/blocks/frame_18.txt | 17 - .../codex-rs/tui/frames/blocks/frame_19.txt | 17 - .../codex-rs/tui/frames/blocks/frame_2.txt | 17 - .../codex-rs/tui/frames/blocks/frame_20.txt | 17 - .../codex-rs/tui/frames/blocks/frame_21.txt | 17 - .../codex-rs/tui/frames/blocks/frame_22.txt | 17 - .../codex-rs/tui/frames/blocks/frame_23.txt | 17 - .../codex-rs/tui/frames/blocks/frame_24.txt | 17 - .../codex-rs/tui/frames/blocks/frame_25.txt | 17 - .../codex-rs/tui/frames/blocks/frame_26.txt | 17 - .../codex-rs/tui/frames/blocks/frame_27.txt | 17 - .../codex-rs/tui/frames/blocks/frame_28.txt | 17 - .../codex-rs/tui/frames/blocks/frame_29.txt | 17 - .../codex-rs/tui/frames/blocks/frame_3.txt | 17 - .../codex-rs/tui/frames/blocks/frame_30.txt | 17 - .../codex-rs/tui/frames/blocks/frame_31.txt | 17 - .../codex-rs/tui/frames/blocks/frame_32.txt | 17 - .../codex-rs/tui/frames/blocks/frame_33.txt | 17 - .../codex-rs/tui/frames/blocks/frame_34.txt | 17 - .../codex-rs/tui/frames/blocks/frame_35.txt | 17 - .../codex-rs/tui/frames/blocks/frame_36.txt | 17 - .../codex-rs/tui/frames/blocks/frame_4.txt | 17 - .../codex-rs/tui/frames/blocks/frame_5.txt | 17 - .../codex-rs/tui/frames/blocks/frame_6.txt | 17 - .../codex-rs/tui/frames/blocks/frame_7.txt | 17 - .../codex-rs/tui/frames/blocks/frame_8.txt | 17 - .../codex-rs/tui/frames/blocks/frame_9.txt | 17 - .../codex-rs/tui/frames/codex/frame_1.txt | 17 - .../codex-rs/tui/frames/codex/frame_10.txt | 17 - .../codex-rs/tui/frames/codex/frame_11.txt | 17 - .../codex-rs/tui/frames/codex/frame_12.txt | 17 - .../codex-rs/tui/frames/codex/frame_13.txt | 17 - .../codex-rs/tui/frames/codex/frame_14.txt | 17 - .../codex-rs/tui/frames/codex/frame_15.txt | 17 - .../codex-rs/tui/frames/codex/frame_16.txt | 17 - .../codex-rs/tui/frames/codex/frame_17.txt | 17 - .../codex-rs/tui/frames/codex/frame_18.txt | 17 - .../codex-rs/tui/frames/codex/frame_19.txt | 17 - .../codex-rs/tui/frames/codex/frame_2.txt | 17 - .../codex-rs/tui/frames/codex/frame_20.txt | 17 - .../codex-rs/tui/frames/codex/frame_21.txt | 17 - .../codex-rs/tui/frames/codex/frame_22.txt | 17 - .../codex-rs/tui/frames/codex/frame_23.txt | 17 - .../codex-rs/tui/frames/codex/frame_24.txt | 17 - .../codex-rs/tui/frames/codex/frame_25.txt | 17 - .../codex-rs/tui/frames/codex/frame_26.txt | 17 - .../codex-rs/tui/frames/codex/frame_27.txt | 17 - .../codex-rs/tui/frames/codex/frame_28.txt | 17 - .../codex-rs/tui/frames/codex/frame_29.txt | 17 - .../codex-rs/tui/frames/codex/frame_3.txt | 17 - .../codex-rs/tui/frames/codex/frame_30.txt | 17 - .../codex-rs/tui/frames/codex/frame_31.txt | 17 - .../codex-rs/tui/frames/codex/frame_32.txt | 17 - .../codex-rs/tui/frames/codex/frame_33.txt | 17 - .../codex-rs/tui/frames/codex/frame_34.txt | 17 - .../codex-rs/tui/frames/codex/frame_35.txt | 17 - .../codex-rs/tui/frames/codex/frame_36.txt | 17 - .../codex-rs/tui/frames/codex/frame_4.txt | 17 - .../codex-rs/tui/frames/codex/frame_5.txt | 17 - .../codex-rs/tui/frames/codex/frame_6.txt | 17 - .../codex-rs/tui/frames/codex/frame_7.txt | 17 - .../codex-rs/tui/frames/codex/frame_8.txt | 17 - .../codex-rs/tui/frames/codex/frame_9.txt | 17 - .../codex-rs/tui/frames/default/frame_1.txt | 17 - .../codex-rs/tui/frames/default/frame_10.txt | 17 - .../codex-rs/tui/frames/default/frame_11.txt | 17 - .../codex-rs/tui/frames/default/frame_12.txt | 17 - .../codex-rs/tui/frames/default/frame_13.txt | 17 - .../codex-rs/tui/frames/default/frame_14.txt | 17 - .../codex-rs/tui/frames/default/frame_15.txt | 17 - .../codex-rs/tui/frames/default/frame_16.txt | 17 - .../codex-rs/tui/frames/default/frame_17.txt | 17 - .../codex-rs/tui/frames/default/frame_18.txt | 17 - .../codex-rs/tui/frames/default/frame_19.txt | 17 - .../codex-rs/tui/frames/default/frame_2.txt | 17 - .../codex-rs/tui/frames/default/frame_20.txt | 17 - .../codex-rs/tui/frames/default/frame_21.txt | 17 - .../codex-rs/tui/frames/default/frame_22.txt | 17 - .../codex-rs/tui/frames/default/frame_23.txt | 17 - .../codex-rs/tui/frames/default/frame_24.txt | 17 - .../codex-rs/tui/frames/default/frame_25.txt | 17 - .../codex-rs/tui/frames/default/frame_26.txt | 17 - .../codex-rs/tui/frames/default/frame_27.txt | 17 - .../codex-rs/tui/frames/default/frame_28.txt | 17 - .../codex-rs/tui/frames/default/frame_29.txt | 17 - .../codex-rs/tui/frames/default/frame_3.txt | 17 - .../codex-rs/tui/frames/default/frame_30.txt | 17 - .../codex-rs/tui/frames/default/frame_31.txt | 17 - .../codex-rs/tui/frames/default/frame_32.txt | 17 - .../codex-rs/tui/frames/default/frame_33.txt | 17 - .../codex-rs/tui/frames/default/frame_34.txt | 17 - .../codex-rs/tui/frames/default/frame_35.txt | 17 - .../codex-rs/tui/frames/default/frame_36.txt | 17 - .../codex-rs/tui/frames/default/frame_4.txt | 17 - .../codex-rs/tui/frames/default/frame_5.txt | 17 - .../codex-rs/tui/frames/default/frame_6.txt | 17 - .../codex-rs/tui/frames/default/frame_7.txt | 17 - .../codex-rs/tui/frames/default/frame_8.txt | 17 - .../codex-rs/tui/frames/default/frame_9.txt | 17 - .../codex-rs/tui/frames/dots/frame_1.txt | 17 - .../codex-rs/tui/frames/dots/frame_10.txt | 17 - .../codex-rs/tui/frames/dots/frame_11.txt | 17 - .../codex-rs/tui/frames/dots/frame_12.txt | 17 - .../codex-rs/tui/frames/dots/frame_13.txt | 17 - .../codex-rs/tui/frames/dots/frame_14.txt | 17 - .../codex-rs/tui/frames/dots/frame_15.txt | 17 - .../codex-rs/tui/frames/dots/frame_16.txt | 17 - .../codex-rs/tui/frames/dots/frame_17.txt | 17 - .../codex-rs/tui/frames/dots/frame_18.txt | 17 - .../codex-rs/tui/frames/dots/frame_19.txt | 17 - .../codex-rs/tui/frames/dots/frame_2.txt | 17 - .../codex-rs/tui/frames/dots/frame_20.txt | 17 - .../codex-rs/tui/frames/dots/frame_21.txt | 17 - .../codex-rs/tui/frames/dots/frame_22.txt | 17 - .../codex-rs/tui/frames/dots/frame_23.txt | 17 - .../codex-rs/tui/frames/dots/frame_24.txt | 17 - .../codex-rs/tui/frames/dots/frame_25.txt | 17 - .../codex-rs/tui/frames/dots/frame_26.txt | 17 - .../codex-rs/tui/frames/dots/frame_27.txt | 17 - .../codex-rs/tui/frames/dots/frame_28.txt | 17 - .../codex-rs/tui/frames/dots/frame_29.txt | 17 - .../codex-rs/tui/frames/dots/frame_3.txt | 17 - .../codex-rs/tui/frames/dots/frame_30.txt | 17 - .../codex-rs/tui/frames/dots/frame_31.txt | 17 - .../codex-rs/tui/frames/dots/frame_32.txt | 17 - .../codex-rs/tui/frames/dots/frame_33.txt | 17 - .../codex-rs/tui/frames/dots/frame_34.txt | 17 - .../codex-rs/tui/frames/dots/frame_35.txt | 17 - .../codex-rs/tui/frames/dots/frame_36.txt | 17 - .../codex-rs/tui/frames/dots/frame_4.txt | 17 - .../codex-rs/tui/frames/dots/frame_5.txt | 17 - .../codex-rs/tui/frames/dots/frame_6.txt | 17 - .../codex-rs/tui/frames/dots/frame_7.txt | 17 - .../codex-rs/tui/frames/dots/frame_8.txt | 17 - .../codex-rs/tui/frames/dots/frame_9.txt | 17 - .../codex-rs/tui/frames/hash/frame_1.txt | 17 - .../codex-rs/tui/frames/hash/frame_10.txt | 17 - .../codex-rs/tui/frames/hash/frame_11.txt | 17 - .../codex-rs/tui/frames/hash/frame_12.txt | 17 - .../codex-rs/tui/frames/hash/frame_13.txt | 17 - .../codex-rs/tui/frames/hash/frame_14.txt | 17 - .../codex-rs/tui/frames/hash/frame_15.txt | 17 - .../codex-rs/tui/frames/hash/frame_16.txt | 17 - .../codex-rs/tui/frames/hash/frame_17.txt | 17 - .../codex-rs/tui/frames/hash/frame_18.txt | 17 - .../codex-rs/tui/frames/hash/frame_19.txt | 17 - .../codex-rs/tui/frames/hash/frame_2.txt | 17 - .../codex-rs/tui/frames/hash/frame_20.txt | 17 - .../codex-rs/tui/frames/hash/frame_21.txt | 17 - .../codex-rs/tui/frames/hash/frame_22.txt | 17 - .../codex-rs/tui/frames/hash/frame_23.txt | 17 - .../codex-rs/tui/frames/hash/frame_24.txt | 17 - .../codex-rs/tui/frames/hash/frame_25.txt | 17 - .../codex-rs/tui/frames/hash/frame_26.txt | 17 - .../codex-rs/tui/frames/hash/frame_27.txt | 17 - .../codex-rs/tui/frames/hash/frame_28.txt | 17 - .../codex-rs/tui/frames/hash/frame_29.txt | 17 - .../codex-rs/tui/frames/hash/frame_3.txt | 17 - .../codex-rs/tui/frames/hash/frame_30.txt | 17 - .../codex-rs/tui/frames/hash/frame_31.txt | 17 - .../codex-rs/tui/frames/hash/frame_32.txt | 17 - .../codex-rs/tui/frames/hash/frame_33.txt | 17 - .../codex-rs/tui/frames/hash/frame_34.txt | 17 - .../codex-rs/tui/frames/hash/frame_35.txt | 17 - .../codex-rs/tui/frames/hash/frame_36.txt | 17 - .../codex-rs/tui/frames/hash/frame_4.txt | 17 - .../codex-rs/tui/frames/hash/frame_5.txt | 17 - .../codex-rs/tui/frames/hash/frame_6.txt | 17 - .../codex-rs/tui/frames/hash/frame_7.txt | 17 - .../codex-rs/tui/frames/hash/frame_8.txt | 17 - .../codex-rs/tui/frames/hash/frame_9.txt | 17 - .../codex-rs/tui/frames/hbars/frame_1.txt | 17 - .../codex-rs/tui/frames/hbars/frame_10.txt | 17 - .../codex-rs/tui/frames/hbars/frame_11.txt | 17 - .../codex-rs/tui/frames/hbars/frame_12.txt | 17 - .../codex-rs/tui/frames/hbars/frame_13.txt | 17 - .../codex-rs/tui/frames/hbars/frame_14.txt | 17 - .../codex-rs/tui/frames/hbars/frame_15.txt | 17 - .../codex-rs/tui/frames/hbars/frame_16.txt | 17 - .../codex-rs/tui/frames/hbars/frame_17.txt | 17 - .../codex-rs/tui/frames/hbars/frame_18.txt | 17 - .../codex-rs/tui/frames/hbars/frame_19.txt | 17 - .../codex-rs/tui/frames/hbars/frame_2.txt | 17 - .../codex-rs/tui/frames/hbars/frame_20.txt | 17 - .../codex-rs/tui/frames/hbars/frame_21.txt | 17 - .../codex-rs/tui/frames/hbars/frame_22.txt | 17 - .../codex-rs/tui/frames/hbars/frame_23.txt | 17 - .../codex-rs/tui/frames/hbars/frame_24.txt | 17 - .../codex-rs/tui/frames/hbars/frame_25.txt | 17 - .../codex-rs/tui/frames/hbars/frame_26.txt | 17 - .../codex-rs/tui/frames/hbars/frame_27.txt | 17 - .../codex-rs/tui/frames/hbars/frame_28.txt | 17 - .../codex-rs/tui/frames/hbars/frame_29.txt | 17 - .../codex-rs/tui/frames/hbars/frame_3.txt | 17 - .../codex-rs/tui/frames/hbars/frame_30.txt | 17 - .../codex-rs/tui/frames/hbars/frame_31.txt | 17 - .../codex-rs/tui/frames/hbars/frame_32.txt | 17 - .../codex-rs/tui/frames/hbars/frame_33.txt | 17 - .../codex-rs/tui/frames/hbars/frame_34.txt | 17 - .../codex-rs/tui/frames/hbars/frame_35.txt | 17 - .../codex-rs/tui/frames/hbars/frame_36.txt | 17 - .../codex-rs/tui/frames/hbars/frame_4.txt | 17 - .../codex-rs/tui/frames/hbars/frame_5.txt | 17 - .../codex-rs/tui/frames/hbars/frame_6.txt | 17 - .../codex-rs/tui/frames/hbars/frame_7.txt | 17 - .../codex-rs/tui/frames/hbars/frame_8.txt | 17 - .../codex-rs/tui/frames/hbars/frame_9.txt | 17 - .../codex-rs/tui/frames/openai/frame_1.txt | 17 - .../codex-rs/tui/frames/openai/frame_10.txt | 17 - .../codex-rs/tui/frames/openai/frame_11.txt | 17 - .../codex-rs/tui/frames/openai/frame_12.txt | 17 - .../codex-rs/tui/frames/openai/frame_13.txt | 17 - .../codex-rs/tui/frames/openai/frame_14.txt | 17 - .../codex-rs/tui/frames/openai/frame_15.txt | 17 - .../codex-rs/tui/frames/openai/frame_16.txt | 17 - .../codex-rs/tui/frames/openai/frame_17.txt | 17 - .../codex-rs/tui/frames/openai/frame_18.txt | 17 - .../codex-rs/tui/frames/openai/frame_19.txt | 17 - .../codex-rs/tui/frames/openai/frame_2.txt | 17 - .../codex-rs/tui/frames/openai/frame_20.txt | 17 - .../codex-rs/tui/frames/openai/frame_21.txt | 17 - .../codex-rs/tui/frames/openai/frame_22.txt | 17 - .../codex-rs/tui/frames/openai/frame_23.txt | 17 - .../codex-rs/tui/frames/openai/frame_24.txt | 17 - .../codex-rs/tui/frames/openai/frame_25.txt | 17 - .../codex-rs/tui/frames/openai/frame_26.txt | 17 - .../codex-rs/tui/frames/openai/frame_27.txt | 17 - .../codex-rs/tui/frames/openai/frame_28.txt | 17 - .../codex-rs/tui/frames/openai/frame_29.txt | 17 - .../codex-rs/tui/frames/openai/frame_3.txt | 17 - .../codex-rs/tui/frames/openai/frame_30.txt | 17 - .../codex-rs/tui/frames/openai/frame_31.txt | 17 - .../codex-rs/tui/frames/openai/frame_32.txt | 17 - .../codex-rs/tui/frames/openai/frame_33.txt | 17 - .../codex-rs/tui/frames/openai/frame_34.txt | 17 - .../codex-rs/tui/frames/openai/frame_35.txt | 17 - .../codex-rs/tui/frames/openai/frame_36.txt | 17 - .../codex-rs/tui/frames/openai/frame_4.txt | 17 - .../codex-rs/tui/frames/openai/frame_5.txt | 17 - .../codex-rs/tui/frames/openai/frame_6.txt | 17 - .../codex-rs/tui/frames/openai/frame_7.txt | 17 - .../codex-rs/tui/frames/openai/frame_8.txt | 17 - .../codex-rs/tui/frames/openai/frame_9.txt | 17 - .../codex-rs/tui/frames/shapes/frame_1.txt | 17 - .../codex-rs/tui/frames/shapes/frame_10.txt | 17 - .../codex-rs/tui/frames/shapes/frame_11.txt | 17 - .../codex-rs/tui/frames/shapes/frame_12.txt | 17 - .../codex-rs/tui/frames/shapes/frame_13.txt | 17 - .../codex-rs/tui/frames/shapes/frame_14.txt | 17 - .../codex-rs/tui/frames/shapes/frame_15.txt | 17 - .../codex-rs/tui/frames/shapes/frame_16.txt | 17 - .../codex-rs/tui/frames/shapes/frame_17.txt | 17 - .../codex-rs/tui/frames/shapes/frame_18.txt | 17 - .../codex-rs/tui/frames/shapes/frame_19.txt | 17 - .../codex-rs/tui/frames/shapes/frame_2.txt | 17 - .../codex-rs/tui/frames/shapes/frame_20.txt | 17 - .../codex-rs/tui/frames/shapes/frame_21.txt | 17 - .../codex-rs/tui/frames/shapes/frame_22.txt | 17 - .../codex-rs/tui/frames/shapes/frame_23.txt | 17 - .../codex-rs/tui/frames/shapes/frame_24.txt | 17 - .../codex-rs/tui/frames/shapes/frame_25.txt | 17 - .../codex-rs/tui/frames/shapes/frame_26.txt | 17 - .../codex-rs/tui/frames/shapes/frame_27.txt | 17 - .../codex-rs/tui/frames/shapes/frame_28.txt | 17 - .../codex-rs/tui/frames/shapes/frame_29.txt | 17 - .../codex-rs/tui/frames/shapes/frame_3.txt | 17 - .../codex-rs/tui/frames/shapes/frame_30.txt | 17 - .../codex-rs/tui/frames/shapes/frame_31.txt | 17 - .../codex-rs/tui/frames/shapes/frame_32.txt | 17 - .../codex-rs/tui/frames/shapes/frame_33.txt | 17 - .../codex-rs/tui/frames/shapes/frame_34.txt | 17 - .../codex-rs/tui/frames/shapes/frame_35.txt | 17 - .../codex-rs/tui/frames/shapes/frame_36.txt | 17 - .../codex-rs/tui/frames/shapes/frame_4.txt | 17 - .../codex-rs/tui/frames/shapes/frame_5.txt | 17 - .../codex-rs/tui/frames/shapes/frame_6.txt | 17 - .../codex-rs/tui/frames/shapes/frame_7.txt | 17 - .../codex-rs/tui/frames/shapes/frame_8.txt | 17 - .../codex-rs/tui/frames/shapes/frame_9.txt | 17 - .../codex-rs/tui/frames/slug/frame_1.txt | 17 - .../codex-rs/tui/frames/slug/frame_10.txt | 17 - .../codex-rs/tui/frames/slug/frame_11.txt | 17 - .../codex-rs/tui/frames/slug/frame_12.txt | 17 - .../codex-rs/tui/frames/slug/frame_13.txt | 17 - .../codex-rs/tui/frames/slug/frame_14.txt | 17 - .../codex-rs/tui/frames/slug/frame_15.txt | 17 - .../codex-rs/tui/frames/slug/frame_16.txt | 17 - .../codex-rs/tui/frames/slug/frame_17.txt | 17 - .../codex-rs/tui/frames/slug/frame_18.txt | 17 - .../codex-rs/tui/frames/slug/frame_19.txt | 17 - .../codex-rs/tui/frames/slug/frame_2.txt | 17 - .../codex-rs/tui/frames/slug/frame_20.txt | 17 - .../codex-rs/tui/frames/slug/frame_21.txt | 17 - .../codex-rs/tui/frames/slug/frame_22.txt | 17 - .../codex-rs/tui/frames/slug/frame_23.txt | 17 - .../codex-rs/tui/frames/slug/frame_24.txt | 17 - .../codex-rs/tui/frames/slug/frame_25.txt | 17 - .../codex-rs/tui/frames/slug/frame_26.txt | 17 - .../codex-rs/tui/frames/slug/frame_27.txt | 17 - .../codex-rs/tui/frames/slug/frame_28.txt | 17 - .../codex-rs/tui/frames/slug/frame_29.txt | 17 - .../codex-rs/tui/frames/slug/frame_3.txt | 17 - .../codex-rs/tui/frames/slug/frame_30.txt | 17 - .../codex-rs/tui/frames/slug/frame_31.txt | 17 - .../codex-rs/tui/frames/slug/frame_32.txt | 17 - .../codex-rs/tui/frames/slug/frame_33.txt | 17 - .../codex-rs/tui/frames/slug/frame_34.txt | 17 - .../codex-rs/tui/frames/slug/frame_35.txt | 17 - .../codex-rs/tui/frames/slug/frame_36.txt | 17 - .../codex-rs/tui/frames/slug/frame_4.txt | 17 - .../codex-rs/tui/frames/slug/frame_5.txt | 17 - .../codex-rs/tui/frames/slug/frame_6.txt | 17 - .../codex-rs/tui/frames/slug/frame_7.txt | 17 - .../codex-rs/tui/frames/slug/frame_8.txt | 17 - .../codex-rs/tui/frames/slug/frame_9.txt | 17 - .../codex-rs/tui/frames/vbars/frame_1.txt | 17 - .../codex-rs/tui/frames/vbars/frame_10.txt | 17 - .../codex-rs/tui/frames/vbars/frame_11.txt | 17 - .../codex-rs/tui/frames/vbars/frame_12.txt | 17 - .../codex-rs/tui/frames/vbars/frame_13.txt | 17 - .../codex-rs/tui/frames/vbars/frame_14.txt | 17 - .../codex-rs/tui/frames/vbars/frame_15.txt | 17 - .../codex-rs/tui/frames/vbars/frame_16.txt | 17 - .../codex-rs/tui/frames/vbars/frame_17.txt | 17 - .../codex-rs/tui/frames/vbars/frame_18.txt | 17 - .../codex-rs/tui/frames/vbars/frame_19.txt | 17 - .../codex-rs/tui/frames/vbars/frame_2.txt | 17 - .../codex-rs/tui/frames/vbars/frame_20.txt | 17 - .../codex-rs/tui/frames/vbars/frame_21.txt | 17 - .../codex-rs/tui/frames/vbars/frame_22.txt | 17 - .../codex-rs/tui/frames/vbars/frame_23.txt | 17 - .../codex-rs/tui/frames/vbars/frame_24.txt | 17 - .../codex-rs/tui/frames/vbars/frame_25.txt | 17 - .../codex-rs/tui/frames/vbars/frame_26.txt | 17 - .../codex-rs/tui/frames/vbars/frame_27.txt | 17 - .../codex-rs/tui/frames/vbars/frame_28.txt | 17 - .../codex-rs/tui/frames/vbars/frame_29.txt | 17 - .../codex-rs/tui/frames/vbars/frame_3.txt | 17 - .../codex-rs/tui/frames/vbars/frame_30.txt | 17 - .../codex-rs/tui/frames/vbars/frame_31.txt | 17 - .../codex-rs/tui/frames/vbars/frame_32.txt | 17 - .../codex-rs/tui/frames/vbars/frame_33.txt | 17 - .../codex-rs/tui/frames/vbars/frame_34.txt | 17 - .../codex-rs/tui/frames/vbars/frame_35.txt | 17 - .../codex-rs/tui/frames/vbars/frame_36.txt | 17 - .../codex-rs/tui/frames/vbars/frame_4.txt | 17 - .../codex-rs/tui/frames/vbars/frame_5.txt | 17 - .../codex-rs/tui/frames/vbars/frame_6.txt | 17 - .../codex-rs/tui/frames/vbars/frame_7.txt | 17 - .../codex-rs/tui/frames/vbars/frame_8.txt | 17 - .../codex-rs/tui/frames/vbars/frame_9.txt | 17 - .../codex-rs/tui/prompt_for_init_command.md | 40 - .../codex/codex-rs/tui/src/additional_dirs.rs | 83 - vendor/codex/codex-rs/tui/src/app.rs | 1016 - .../codex-rs/tui/src/app/agent_navigation.rs | 354 - .../tui/src/app/app_server_adapter.rs | 1698 -- .../tui/src/app/app_server_requests.rs | 855 - .../tui/src/app/background_requests.rs | 473 - .../tui/src/app/config_persistence.rs | 667 - .../codex-rs/tui/src/app/event_dispatch.rs | 1349 -- .../codex/codex-rs/tui/src/app/history_ui.rs | 82 - vendor/codex/codex-rs/tui/src/app/input.rs | 222 - .../codex-rs/tui/src/app/loaded_threads.rs | 211 - .../tui/src/app/pending_interactive_replay.rs | 952 - .../codex-rs/tui/src/app/platform_actions.rs | 96 - .../codex-rs/tui/src/app/replay_filter.rs | 33 - .../codex-rs/tui/src/app/session_lifecycle.rs | 790 - vendor/codex/codex-rs/tui/src/app/side.rs | 621 - .../codex-rs/tui/src/app/startup_prompts.rs | 333 - .../codex-rs/tui/src/app/test_support.rs | 75 - vendor/codex/codex-rs/tui/src/app/tests.rs | 4904 ----- .../tui/src/app/tests/model_catalog.rs | 293 - ...gration_prompt_shows_for_hidden_model.snap | 12 - .../codex-rs/tui/src/app/thread_events.rs | 545 - .../codex-rs/tui/src/app/thread_routing.rs | 1401 -- .../tui/src/app/thread_session_state.rs | 55 - .../codex/codex-rs/tui/src/app_backtrack.rs | 888 - vendor/codex/codex-rs/tui/src/app_command.rs | 394 - vendor/codex/codex-rs/tui/src/app_event.rs | 539 - .../codex-rs/tui/src/app_event_sender.rs | 112 - .../src/app_server_approval_conversions.rs | 133 - .../codex-rs/tui/src/app_server_session.rs | 1694 -- .../codex/codex-rs/tui/src/ascii_animation.rs | 106 - vendor/codex/codex-rs/tui/src/audio_device.rs | 176 - .../codex/codex-rs/tui/src/bin/md-events.rs | 15 - .../codex-rs/tui/src/bottom_pane/AGENTS.md | 14 - .../tui/src/bottom_pane/approval_overlay.rs | 1675 -- .../tui/src/bottom_pane/bottom_pane_view.rs | 124 - .../tui/src/bottom_pane/chat_composer.rs | 8420 --------- .../chat_composer/history_search.rs | 958 - .../src/bottom_pane/chat_composer_history.rs | 1317 -- .../tui/src/bottom_pane/command_popup.rs | 474 - .../tui/src/bottom_pane/custom_prompt_view.rs | 259 - .../bottom_pane/experimental_features_view.rs | 300 - .../tui/src/bottom_pane/feedback_view.rs | 862 - .../tui/src/bottom_pane/file_search_popup.rs | 184 - .../codex-rs/tui/src/bottom_pane/footer.rs | 1807 -- .../src/bottom_pane/list_selection_view.rs | 2320 --- .../src/bottom_pane/mcp_server_elicitation.rs | 2494 --- .../src/bottom_pane/memories_settings_view.rs | 477 - .../codex/codex-rs/tui/src/bottom_pane/mod.rs | 2150 --- .../src/bottom_pane/multi_select_picker.rs | 795 - .../tui/src/bottom_pane/paste_burst.rs | 576 - .../src/bottom_pane/pending_input_preview.rs | 366 - .../bottom_pane/pending_thread_approvals.rs | 149 - .../tui/src/bottom_pane/popup_consts.rs | 21 - .../tui/src/bottom_pane/prompt_args.rs | 25 - .../bottom_pane/request_user_input/layout.rs | 363 - .../src/bottom_pane/request_user_input/mod.rs | 3061 --- .../bottom_pane/request_user_input/render.rs | 582 - ...tests__request_user_input_footer_wrap.snap | 14 - ...t__tests__request_user_input_freeform.snap | 13 - ...uest_user_input_hidden_options_footer.snap | 13 - ...__request_user_input_long_option_text.snap | 17 - ...quest_user_input_multi_question_first.snap | 13 - ...equest_user_input_multi_question_last.snap | 15 - ...ut__tests__request_user_input_options.snap | 13 - ...uest_user_input_options_notes_visible.snap | 19 - ..._request_user_input_scrolling_options.snap | 15 - ...ests__request_user_input_tight_height.snap | 13 - ...st_user_input_unanswered_confirmation.snap | 15 - ...s__request_user_input_wrapped_options.snap | 13 - .../tui/src/bottom_pane/scroll_state.rs | 115 - .../src/bottom_pane/selection_popup_common.rs | 855 - .../tui/src/bottom_pane/selection_tabs.rs | 103 - .../tui/src/bottom_pane/slash_commands.rs | 173 - ...overlay_additional_permissions_prompt.snap | 17 - ..._approval_overlay_cross_thread_prompt.snap | 15 - ...__approval_overlay_permissions_prompt.snap | 17 - ...l_overlay__tests__network_exec_prompt.snap | 37 - ...mposer__tests__backspace_after_pastes.snap | 14 - ...tom_pane__chat_composer__tests__empty.snap | 14 - ...er__tests__footer_collapse_empty_full.snap | 13 - ...ollapse_empty_mode_cycle_with_context.snap | 13 - ...apse_empty_mode_cycle_without_context.snap | 13 - ...ests__footer_collapse_empty_mode_only.snap | 13 - ...ests__footer_collapse_plan_empty_full.snap | 13 - ...se_plan_empty_mode_cycle_with_context.snap | 13 - ...plan_empty_mode_cycle_without_context.snap | 13 - ..._footer_collapse_plan_empty_mode_only.snap | 13 - ...ests__footer_collapse_plan_queue_full.snap | 13 - ...se_plan_queue_message_without_context.snap | 13 - ..._footer_collapse_plan_queue_mode_only.snap | 13 - ...ollapse_plan_queue_short_with_context.snap | 13 - ...apse_plan_queue_short_without_context.snap | 13 - ...er__tests__footer_collapse_queue_full.snap | 13 - ...ollapse_queue_message_without_context.snap | 13 - ...ests__footer_collapse_queue_mode_only.snap | 13 - ...ter_collapse_queue_short_with_context.snap | 13 - ..._collapse_queue_short_without_context.snap | 13 - ...__tests__footer_mode_ctrl_c_interrupt.snap | 13 - ...poser__tests__footer_mode_ctrl_c_quit.snap | 13 - ...sts__footer_mode_ctrl_c_then_esc_hint.snap | 13 - ...tests__footer_mode_esc_hint_backtrack.snap | 13 - ...ts__footer_mode_esc_hint_from_overlay.snap | 13 - ...ests__footer_mode_hidden_while_typing.snap | 13 - ...er__tests__footer_mode_history_search.snap | 13 - ...r_mode_overlay_then_external_esc_hint.snap | 13 - ...ooter_mode_shell_command_absorbs_bang.snap | 13 - ...__tests__footer_mode_shortcut_overlay.snap | 19 - ...er__tests__image_placeholder_multiple.snap | 13 - ...oser__tests__image_placeholder_single.snap | 13 - ...tom_pane__chat_composer__tests__large.snap | 14 - ...r__tests__mention_popup_type_prefixes.snap | 13 - ...chat_composer__tests__multiple_pastes.snap | 14 - ...composer__tests__plugin_mention_popup.snap | 13 - ...at_composer__tests__remote_image_rows.snap | 13 - ..._remote_image_rows_after_delete_first.snap | 13 - ...er__tests__remote_image_rows_selected.snap | 13 - ..._chat_composer__tests__slash_popup_mo.snap | 9 - ...chat_composer__tests__slash_popup_res.snap | 10 - ...tom_pane__chat_composer__tests__small.snap | 14 - ...omposer__tests__zellij_empty_composer.snap | 14 - ...view__tests__feedback_view_bad_result.snap | 9 - ...edback_view__tests__feedback_view_bug.snap | 9 - ...iew__tests__feedback_view_good_result.snap | 9 - ...back_view__tests__feedback_view_other.snap | 9 - ...ack_view__tests__feedback_view_render.snap | 17 - ...ew__tests__feedback_view_safety_check.snap | 9 - ...ck_view_with_connectivity_diagnostics.snap | 9 - ...ter__tests__footer_active_agent_label.snap | 5 - ...composer_has_draft_queue_hint_enabled.snap | 5 - ...er__tests__footer_context_tokens_used.snap | 5 - ...ooter__tests__footer_ctrl_c_quit_idle.snap | 5 - ...er__tests__footer_ctrl_c_quit_running.snap | 5 - ...__footer__tests__footer_esc_hint_idle.snap | 5 - ...footer__tests__footer_esc_hint_primed.snap | 5 - ...r_mode_indicator_narrow_overlap_hides.snap | 5 - ...ter_mode_indicator_running_hides_hint.snap | 5 - ...er__tests__footer_mode_indicator_wide.snap | 5 - ...shortcuts_collaboration_modes_enabled.snap | 12 - ...sts__footer_shortcuts_context_running.snap | 5 - ...oter__tests__footer_shortcuts_default.snap | 5 - ...tests__footer_shortcuts_shift_and_esc.snap | 11 - ...er_status_line_disabled_context_right.snap | 5 - ...footer_status_line_enabled_mode_right.snap | 5 - ...ter_status_line_enabled_no_mode_right.snap | 5 - ..._footer_status_line_overrides_context.snap | 5 - ...oter_status_line_overrides_draft_idle.snap | 5 - ...ooter_status_line_overrides_shortcuts.snap | 5 - ...footer_status_line_truncated_with_gap.snap | 5 - ...r_status_line_with_active_agent_label.snap | 5 - ...oter_status_line_yields_to_queue_hint.snap | 5 - ...n_col_width_mode_auto_all_rows_scroll.snap | 30 - ...on_col_width_mode_auto_visible_scroll.snap | 30 - ...selection_col_width_mode_fixed_scroll.snap | 30 - ...sts__list_selection_footer_note_wraps.snap | 13 - ..._list_selection_model_picker_width_80.snap | 13 - ...selection_narrow_width_preserves_rows.snap | 16 - ..._list_selection_spacing_with_subtitle.snap | 12 - ...st_selection_spacing_without_subtitle.snap | 11 - ...tion_approval_form_with_param_summary.snap | 19 - ...on_approval_form_with_session_persist.snap | 19 - ...citation_approval_form_without_schema.snap | 19 - ...__mcp_server_elicitation_boolean_form.snap | 19 - ..._server_elicitation_message_only_form.snap | 19 - ...essage_only_form_with_persist_options.snap | 19 - ...ueue__tests__render_many_line_message.snap | 27 - ...sage_queue__tests__render_one_message.snap | 18 - ...age_queue__tests__render_two_messages.snap | 22 - ..._queue__tests__render_wrapped_message.snap | 25 - ...view__tests__render_many_line_message.snap | 31 - ...ests__render_more_than_three_messages.snap | 34 - ...teer_uses_single_prefix_and_truncates.snap | 29 - ...ut_preview__tests__render_one_message.snap | 22 - ...r_one_message_with_shift_left_binding.snap | 22 - ...view__tests__render_one_pending_steer.snap | 20 - ..._pending_steers_above_queued_messages.snap | 42 - ...t_preview__tests__render_two_messages.snap | 26 - ...review__tests__render_wrapped_message.snap | 29 - ..._snapshot_uses_runtime_preview_values.snap | 21 - ...s_visible_when_status_hidden_snapshot.snap | 12 - ...er_fill_height_without_bottom_padding.snap | 10 - ...__status_and_queued_messages_snapshot.snap | 14 - ...hidden_when_height_too_small_height_1.snap | 5 - ...tom_pane__tests__status_only_snapshot.snap | 10 - ..._details_and_queued_messages_snapshot.snap | 16 - ...up__tests__terminal_title_setup_basic.snap | 21 - ...c_footer__tests__render_many_sessions.snap | 13 - ...c_footer__tests__render_more_sessions.snap | 13 - .../tui/src/bottom_pane/status_line_setup.rs | 563 - .../src/bottom_pane/status_surface_preview.rs | 173 - .../codex-rs/tui/src/bottom_pane/textarea.rs | 2660 --- .../tui/src/bottom_pane/title_setup.rs | 517 - .../src/bottom_pane/unified_exec_footer.rs | 117 - vendor/codex/codex-rs/tui/src/chatwidget.rs | 10858 ----------- .../codex-rs/tui/src/chatwidget/interrupts.rs | 254 - .../tui/src/chatwidget/plan_implementation.rs | 114 - .../codex-rs/tui/src/chatwidget/realtime.rs | 676 - .../tui/src/chatwidget/reasoning_shortcuts.rs | 287 - .../tui/src/chatwidget/session_header.rs | 16 - .../codex/codex-rs/tui/src/chatwidget/side.rs | 31 - .../tui/src/chatwidget/slash_dispatch.rs | 801 - ...ed_renders_requested_model_and_effort.snap | 6 - ...rver_collab_wait_items_render_history.snap | 12 - ...app_server_forked_thread_history_line.snap | 5 - ..._history_line_without_app_server_name.snap | 5 - ..._review_denied_renders_denied_request.snap | 13 - ...w_timed_out_renders_timed_out_request.snap | 20 - ...artup_failure_renders_warning_history.snap | 11 - ...ly_patch_manual_flow_history_approved.snap | 6 - ...hatwidget__tests__approval_modal_exec.snap | 17 - ...l_exec_multiline_prefix_no_execpolicy.snap | 16 - ..._tests__approval_modal_exec_no_reason.snap | 15 - ...atwidget__tests__approval_modal_patch.snap | 20 - ...get__tests__approvals_selection_popup.snap | 14 - ...ts__approvals_selection_popup@windows.snap | 17 - ...vals_selection_popup@windows_degraded.snap | 23 - ...et__tests__binary_size_ideal_response.snap | 153 - ...chatwidget__tests__chat_small_idle_h1.snap | 5 - ...chatwidget__tests__chat_small_idle_h2.snap | 6 - ...chatwidget__tests__chat_small_idle_h3.snap | 7 - ...twidget__tests__chat_small_running_h1.snap | 5 - ...twidget__tests__chat_small_running_h2.snap | 6 - ...twidget__tests__chat_small_running_h3.snap | 7 - ...exec_and_status_layout_vt100_snapshot.snap | 44 - ...t_markdown_code_blocks_vt100_snapshot.snap | 53 - ...i__chatwidget__tests__chatwidget_tall.snap | 29 - ...compact_queues_user_messages_snapshot.snap | 12 - ..._following_assistant_message_snapshot.snap | 11 - ...h_output_flushes_immediately_snapshot.snap | 16 - ...hook_output_survives_restart_snapshot.snap | 9 - ...e_final_message_are_rendered_snapshot.snap | 5 - ...h_command_while_task_running_snapshot.snap | 5 - ...pproval_history_decision_aborted_long.snap | 7 - ...al_history_decision_aborted_multiline.snap | 6 - ...roval_history_decision_approved_short.snap | 6 - ...dget__tests__exec_approval_modal_exec.snap | 40 - ...t__tests__experimental_features_popup.snap | 11 - ...dget__tests__exploring_step1_start_ls.snap | 6 - ...get__tests__exploring_step2_finish_ls.snap | 6 - ..._tests__exploring_step3_start_cat_foo.snap | 7 - ...tests__exploring_step4_finish_cat_foo.snap | 7 - ...sts__exploring_step5_finish_sed_range.snap | 7 - ...tests__exploring_step6_finish_cat_bar.snap | 7 - ...s__feedback_good_result_consent_popup.snap | 15 - ...dget__tests__feedback_selection_popup.snap | 13 - ..._tests__feedback_upload_consent_popup.snap | 19 - ...n_message_without_deltas_are_rendered.snap | 5 - ...et__tests__forked_thread_history_line.snap | 5 - ...rked_thread_history_line_without_name.snap | 5 - ...tests__full_access_confirmation_popup.snap | 15 - ...pproved_exec_renders_approved_request.snap | 11 - ...t_permissions_renders_request_summary.snap | 16 - ...ec_renders_warning_and_denied_request.snap | 17 - ...allel_reviews_render_aggregate_status.snap | 12 - ...renders_warning_and_timed_out_request.snap | 24 - ...cked_failed_feedback_history_snapshot.snap | 9 - ...pleted_without_running_flash_snapshot.snap | 9 - ...running_then_quiet_completed_snapshot.snap | 21 - ..._hook_runs_while_exec_active_snapshot.snap | 25 - ...ning_hooks_collapse_to_count_snapshot.snap | 9 - ...mage_generation_call_history_snapshot.snap | 7 - ...rrupt_clears_unified_exec_wait_streak.snap | 6 - ...t__tests__interrupt_exec_marks_failed.snap | 6 - ...pt_preserves_unified_exec_wait_streak.snap | 6 - ...tests__interrupted_turn_error_message.snap | 5 - ...terrupted_turn_pending_steers_message.snap | 5 - ...ommand_execution_strips_shell_wrapper.snap | 6 - ...cal_image_attachment_history_snapshot.snap | 6 - ...et__tests__mcp_startup_header_booting.snap | 11 - ...widget__tests__memories_enable_prompt.snap | 12 - ...t__tests__memories_reset_confirmation.snap | 12 - ...idget__tests__memories_settings_popup.snap | 17 - ...s__model_picker_filters_hidden_models.snap | 10 - ...ests__model_reasoning_selection_popup.snap | 12 - ...ng_selection_popup_extra_high_warning.snap | 17 - ...twidget__tests__model_selection_popup.snap | 14 - ...get__tests__multi_agent_enable_prompt.snap | 11 - ...__overlapping_hook_live_cell_snapshot.snap | 43 - ...s_selection_history_after_mode_switch.snap | 5 - ...ection_history_full_access_to_default.snap | 5 - ...istory_full_access_to_default@windows.snap | 5 - ...t__tests__personality_selection_popup.snap | 11 - ...get__tests__plan_implementation_popup.snap | 11 - ...an_implementation_popup_context_usage.snap | 11 - ...plan_implementation_popup_no_selected.snap | 11 - ..._tool_use_hook_events_render_snapshot.snap | 7 - ..._tool_use_hook_events_render_snapshot.snap | 7 - ..._tests__preamble_keeps_working_status.snap | 11 - ...tests__rate_limit_switch_prompt_popup.snap | 14 - ...tests__realtime_audio_selection_popup.snap | 11 - ...realtime_audio_selection_popup_narrow.snap | 11 - ...sts__realtime_microphone_picker_popup.snap | 18 - ...t__tests__renamed_thread_footer_title.snap | 9 - ...ayed_interrupted_reconnect_footer_row.snap | 5 - ..._review_queues_user_messages_snapshot.snap | 12 - ...ion_start_hook_events_render_snapshot.snap | 7 - ...e_context_label_preserves_status_line.snap | 9 - ...ide_context_label_shows_parent_status.snap | 9 - ...ts__slash_copy_no_output_info_message.snap | 6 - ..._tests__slash_rename_prefilled_prompt.snap | 10 - ...rked_side_question_while_task_running.snap | 11 - ...__tests__status_line_fast_mode_footer.snap | 9 - ...th_reasoning_context_remaining_footer.snap | 9 - ...line_model_with_reasoning_fast_footer.snap | 9 - ...model_with_reasoning_plan_mode_footer.snap | 9 - ...tatus_line_setup_popup_hardcoded_only.snap | 20 - ...ts__status_line_setup_popup_live_only.snap | 20 - ..._tests__status_line_setup_popup_mixed.snap | 20 - ...tatus_surface_previews_hardcoded_only.snap | 6 - ...ts__status_surface_previews_live_only.snap | 6 - ..._tests__status_surface_previews_mixed.snap | 6 - ...atwidget__tests__status_widget_active.snap | 11 - ...sts__status_widget_and_approval_modal.snap | 17 - ...inal_title_setup_popup_hardcoded_only.snap | 20 - ..._terminal_title_setup_popup_live_only.snap | 20 - ...sts__terminal_title_setup_popup_mixed.snap | 20 - ...ed_exec_begin_restores_working_status.snap | 11 - ...ified_exec_empty_then_non_empty_after.snap | 8 - ...fied_exec_non_empty_then_empty_active.snap | 6 - ...ified_exec_non_empty_then_empty_after.snap | 8 - ...nknown_end_with_active_exploring_cell.snap | 11 - ...d_exec_wait_after_final_agent_message.snap | 7 - ...ec_wait_before_streamed_agent_message.snap | 7 - ...renders_command_in_single_details_row.snap | 11 - ...ied_exec_waiting_multiple_empty_after.snap | 5 - ..._tui__chatwidget__tests__update_popup.snap | 14 - ...er_hook_notifications_render_snapshot.snap | 7 - ...atwidget__tests__user_shell_ls_output.snap | 7 - ...kspace_member_credits_depleted_prompt.snap | 11 - ...__workspace_member_usage_limit_prompt.snap | 11 - ...ner_credits_nudge_completion_feedback.snap | 11 - ..._workspace_owner_limit_state_messages.snap | 8 - ...usage_limit_nudge_completion_feedback.snap | 11 - .../tui/src/chatwidget/status_surfaces.rs | 736 - .../codex-rs/tui/src/chatwidget/tests.rs | 266 - .../tui/src/chatwidget/tests/app_server.rs | 732 - .../src/chatwidget/tests/approval_requests.rs | 323 - .../src/chatwidget/tests/background_events.rs | 18 - .../chatwidget/tests/composer_submission.rs | 1022 - .../tui/src/chatwidget/tests/exec_flow.rs | 1886 -- .../tui/src/chatwidget/tests/guardian.rs | 573 - .../tui/src/chatwidget/tests/helpers.rs | 928 - .../src/chatwidget/tests/history_replay.rs | 1032 -- .../tui/src/chatwidget/tests/mcp_startup.rs | 661 - .../tui/src/chatwidget/tests/permissions.rs | 711 - .../tui/src/chatwidget/tests/plan_mode.rs | 1517 -- .../chatwidget/tests/popups_and_settings.rs | 728 - .../tui/src/chatwidget/tests/review_mode.rs | 1551 -- .../codex-rs/tui/src/chatwidget/tests/side.rs | 310 - .../src/chatwidget/tests/slash_commands.rs | 1619 -- ...pproval_history_decision_aborted_long.snap | 6 - ...al_history_decision_aborted_multiline.snap | 5 - ...roval_history_decision_approved_short.snap | 5 - ...al_requests__exec_approval_modal_exec.snap | 39 - .../src/chatwidget/tests/status_and_layout.rs | 2660 --- .../chatwidget/tests/status_command_tests.rs | 164 - .../tests/status_surface_previews.rs | 261 - vendor/codex/codex-rs/tui/src/cli.rs | 137 - .../codex/codex-rs/tui/src/clipboard_copy.rs | 638 - .../codex/codex-rs/tui/src/clipboard_paste.rs | 549 - .../codex-rs/tui/src/collaboration_modes.rs | 62 - vendor/codex/codex-rs/tui/src/color.rs | 75 - .../codex/codex-rs/tui/src/custom_terminal.rs | 759 - vendor/codex/codex-rs/tui/src/cwd_prompt.rs | 317 - vendor/codex/codex-rs/tui/src/debug_config.rs | 901 - vendor/codex/codex-rs/tui/src/diff_render.rs | 2481 --- .../codex/codex-rs/tui/src/exec_cell/mod.rs | 12 - .../codex/codex-rs/tui/src/exec_cell/model.rs | 176 - .../codex-rs/tui/src/exec_cell/render.rs | 1066 -- vendor/codex/codex-rs/tui/src/exec_command.rs | 107 - .../codex/codex-rs/tui/src/external_editor.rs | 171 - vendor/codex/codex-rs/tui/src/file_search.rs | 133 - vendor/codex/codex-rs/tui/src/frames.rs | 71 - vendor/codex/codex-rs/tui/src/get_git_diff.rs | 119 - vendor/codex/codex-rs/tui/src/history_cell.rs | 4868 ----- .../tui/src/history_cell/hook_cell.rs | 782 - .../codex/codex-rs/tui/src/insert_history.rs | 824 - vendor/codex/codex-rs/tui/src/key_hint.rs | 112 - vendor/codex/codex-rs/tui/src/lib.rs | 2478 --- .../codex/codex-rs/tui/src/line_truncation.rs | 100 - vendor/codex/codex-rs/tui/src/live_wrap.rs | 285 - .../codex-rs/tui/src/local_chatgpt_auth.rs | 214 - vendor/codex/codex-rs/tui/src/main.rs | 78 - vendor/codex/codex-rs/tui/src/markdown.rs | 121 - .../codex/codex-rs/tui/src/markdown_render.rs | 1136 -- .../codex-rs/tui/src/markdown_render_tests.rs | 1370 -- .../codex/codex-rs/tui/src/markdown_stream.rs | 725 - .../codex/codex-rs/tui/src/mention_codec.rs | 262 - .../codex/codex-rs/tui/src/model_catalog.rs | 50 - .../codex/codex-rs/tui/src/model_migration.rs | 627 - vendor/codex/codex-rs/tui/src/multi_agents.rs | 806 - .../codex-rs/tui/src/notifications/bel.rs | 37 - .../codex-rs/tui/src/notifications/mod.rs | 135 - .../codex-rs/tui/src/notifications/osc9.rs | 127 - .../codex/codex-rs/tui/src/onboarding/auth.rs | 1250 -- .../onboarding/auth/headless_chatgpt_login.rs | 308 - .../codex/codex-rs/tui/src/onboarding/mod.rs | 4 - .../tui/src/onboarding/onboarding_screen.rs | 546 - ..._tests__renders_snapshot_for_git_repo.snap | 15 - .../tui/src/onboarding/trust_directory.rs | 248 - .../codex-rs/tui/src/onboarding/welcome.rs | 190 - .../codex/codex-rs/tui/src/oss_selection.rs | 373 - .../codex/codex-rs/tui/src/pager_overlay.rs | 1305 -- .../tui/src/public_widgets/composer_input.rs | 135 - .../codex-rs/tui/src/public_widgets/mod.rs | 1 - .../codex-rs/tui/src/render/highlight.rs | 1496 -- .../codex-rs/tui/src/render/line_utils.rs | 59 - vendor/codex/codex-rs/tui/src/render/mod.rs | 50 - .../codex-rs/tui/src/render/renderable.rs | 412 - ...tests__ansi_family_foreground_palette.snap | 21 - .../codex/codex-rs/tui/src/resume_picker.rs | 2224 --- .../codex/codex-rs/tui/src/selection_list.rs | 46 - vendor/codex/codex-rs/tui/src/session_log.rs | 215 - vendor/codex/codex-rs/tui/src/shimmer.rs | 80 - .../codex/codex-rs/tui/src/slash_command.rs | 233 - ...i__app__tests__agent_picker_item_name.snap | 9 - ...ter_long_transcript_fresh_header_only.snap | 10 - ...eader_fast_status_fast_capable_models.snap | 10 - ..._prompt__tests__cwd_prompt_fork_modal.snap | 14 - ...__cwd_prompt__tests__cwd_prompt_modal.snap | 14 - ..._tui__diff_render__tests__add_details.snap | 15 - ...s__ansi16_insert_delete_no_background.snap | 8 - ...__diff_render__tests__apply_add_block.snap | 14 - ...iff_render__tests__apply_delete_block.snap | 16 - ...er__tests__apply_multiple_files_block.snap | 18 - ...iff_render__tests__apply_update_block.snap | 16 - ..._block_line_numbers_three_digits_text.snap | 13 - ...__apply_update_block_relativizes_path.snap | 14 - ...__apply_update_block_wraps_long_lines.snap | 16 - ...ly_update_block_wraps_long_lines_text.snap | 15 - ...tests__apply_update_with_rename_block.snap | 16 - ...iff_render__tests__blank_context_line.snap | 15 - ...ff_render__tests__diff_gallery_120x40.snap | 44 - ...iff_render__tests__diff_gallery_80x24.snap | 28 - ...iff_render__tests__diff_gallery_94x35.snap | 39 - ...tests__single_line_replacement_counts.snap | 13 - ...ests__syntax_highlighted_insert_wraps.snap | 14 - ..._syntax_highlighted_insert_wraps_text.snap | 7 - ...ts__theme_scope_background_resolution.snap | 6 - ...er__tests__update_details_with_rename.snap | 17 - ...ests__vertical_ellipsis_between_hunks.snap | 21 - ...f_render__tests__wrap_behavior_insert.snap | 12 - ..._tests__active_mcp_tool_call_snapshot.snap | 5 - ...__tests__coalesced_reads_dedupe_names.snap | 6 - ...coalesces_reads_across_multiple_calls.snap | 7 - ...sces_sequential_reads_within_one_call.snap | 8 - ...ompleted_mcp_tool_call_error_snapshot.snap | 6 - ...call_multiple_outputs_inline_snapshot.snap | 7 - ...p_tool_call_multiple_outputs_snapshot.snap | 10 - ...pleted_mcp_tool_call_success_snapshot.snap | 6 - ...cp_tool_call_wrapped_outputs_snapshot.snap | 13 - ..._error_event_oversized_input_snapshot.snap | 5 - ...tests__mcp_inventory_loading_snapshot.snap | 6 - ..._statuses_renders_status_only_servers.snap | 12 - ...om_statuses_renders_verbose_inventory.snap | 15 - ...sts_tools_for_hyphenated_server_names.snap | 16 - ...p_tools_output_masks_sensitive_values.snap | 26 - ...both_lines_wrap_with_correct_prefixes.snap | 9 - ...ut_wrap_uses_branch_then_eight_spaces.snap | 7 - ...with_extra_indent_on_subsequent_lines.snap | 8 - ...pdate_with_note_and_wrapping_snapshot.snap | 20 - ...ts__plan_update_without_note_snapshot.snap | 7 - ...put_chunk_leading_whitespace_snapshot.snap | 11 - ...cell__tests__ps_output_empty_snapshot.snap | 9 - ...ests__ps_output_long_command_snapshot.snap | 10 - ...sts__ps_output_many_sessions_snapshot.snap | 25 - ...__tests__ps_output_multiline_snapshot.snap | 13 - ...n_cell_multiline_with_stderr_snapshot.snap | 12 - ...s__session_header_indicates_yolo_mode.snap | 11 - ...nfo_availability_nux_tooltip_snapshot.snap | 12 - ...single_line_command_compact_when_fits.snap | 6 - ...nd_wraps_with_four_space_continuation.snap | 8 - ...rr_tail_more_than_five_lines_snapshot.snap | 10 - ...y_cell_numbers_multiple_remote_images.snap | 9 - ...istory_cell_renders_remote_image_urls.snap | 8 - ...wraps_and_prefixes_each_line_snapshot.snap | 9 - ...sts__web_search_history_cell_snapshot.snap | 6 - ...arch_history_cell_transcript_snapshot.snap | 6 - ...sts__markdown_render_complex_snapshot.snap | 62 - ...s__markdown_render_file_link_snapshot.snap | 5 - ...ration__tests__model_migration_prompt.snap | 18 - ...ts__model_migration_prompt_gpt5_codex.snap | 15 - ...odel_migration_prompt_gpt5_codex_mini.snap | 15 - ...s__model_migration_prompt_gpt5_family.snap | 13 - ...gents__tests__collab_agent_transcript.snap | 17 - ...nts__tests__collab_resume_interrupted.snap | 7 - ..._tests__static_overlay_snapshot_basic.snap | 14 - ...ests__static_overlay_wraps_long_lines.snap | 12 - ...ript_overlay_apply_patch_scroll_vt100.snap | 15 - ..._transcript_overlay_renders_live_tail.snap | 14 - ...ts__transcript_overlay_snapshot_basic.snap | 14 - ...e_picker__tests__resume_picker_screen.snap | 13 - ...er__tests__resume_picker_search_error.snap | 5 - ...me_picker__tests__resume_picker_table.snap | 8 - ...er__tests__resume_picker_thread_names.snap | 7 - ...ator_widget__tests__renders_truncated.snap | 6 - ...__tests__renders_with_queued_messages.snap | 12 - ...s__renders_with_queued_messages@macos.snap | 13 - ...t__tests__renders_with_working_header.snap | 6 - ...ders_wrapped_details_panama_two_lines.snap | 7 - ...te_prompt__tests__update_prompt_modal.snap | 13 - .../codex/codex-rs/tui/src/status/account.rs | 8 - vendor/codex/codex-rs/tui/src/status/card.rs | 734 - .../codex/codex-rs/tui/src/status/format.rs | 147 - .../codex/codex-rs/tui/src/status/helpers.rs | 276 - vendor/codex/codex-rs/tui/src/status/mod.rs | 33 - .../codex-rs/tui/src/status/rate_limits.rs | 442 - ...ched_limits_hide_credits_without_flag.snap | 23 - ..._snapshot_includes_credits_and_limits.snap | 23 - ..._status_snapshot_includes_forked_from.snap | 23 - ...tatus_snapshot_includes_monthly_limit.snap | 21 - ...s_snapshot_includes_reasoning_details.snap | 22 - ...snapshot_shows_missing_limits_message.snap | 21 - ...apshot_shows_refreshing_limits_notice.snap | 22 - ...s_snapshot_shows_stale_limits_message.snap | 23 - ...shot_shows_unavailable_limits_message.snap | 21 - ...efreshing_empty_limits_as_unavailable.snap | 21 - ...snapshot_truncates_in_narrow_terminal.snap | 21 - ...s_default_reasoning_when_config_empty.snap | 21 - vendor/codex/codex-rs/tui/src/status/tests.rs | 1216 -- .../tui/src/status_indicator_widget.rs | 461 - .../codex-rs/tui/src/streaming/chunking.rs | 457 - .../codex-rs/tui/src/streaming/commit_tick.rs | 214 - .../codex-rs/tui/src/streaming/controller.rs | 401 - .../codex/codex-rs/tui/src/streaming/mod.rs | 126 - vendor/codex/codex-rs/tui/src/style.rs | 44 - .../codex-rs/tui/src/terminal_palette.rs | 422 - .../codex/codex-rs/tui/src/terminal_title.rs | 225 - vendor/codex/codex-rs/tui/src/test_backend.rs | 125 - vendor/codex/codex-rs/tui/src/test_support.rs | 6 - .../codex/codex-rs/tui/src/text_formatting.rs | 580 - vendor/codex/codex-rs/tui/src/theme_picker.rs | 654 - vendor/codex/codex-rs/tui/src/tooltips.rs | 573 - vendor/codex/codex-rs/tui/src/tui.rs | 834 - .../codex-rs/tui/src/tui/event_stream.rs | 511 - .../tui/src/tui/frame_rate_limiter.rs | 62 - .../codex-rs/tui/src/tui/frame_requester.rs | 354 - .../codex/codex-rs/tui/src/tui/job_control.rs | 182 - vendor/codex/codex-rs/tui/src/ui_consts.rs | 11 - .../codex/codex-rs/tui/src/update_action.rs | 127 - .../codex/codex-rs/tui/src/update_prompt.rs | 313 - vendor/codex/codex-rs/tui/src/updates.rs | 235 - vendor/codex/codex-rs/tui/src/version.rs | 2 - vendor/codex/codex-rs/tui/src/voice.rs | 489 - vendor/codex/codex-rs/tui/src/wrapping.rs | 1407 -- vendor/codex/codex-rs/tui/styles.md | 21 - vendor/codex/codex-rs/tui/tests/all.rs | 8 - .../tui/tests/fixtures/oss-story.jsonl | 8041 -------- .../tests/manager_dependency_regression.rs | 55 - vendor/codex/codex-rs/tui/tests/suite/mod.rs | 6 - .../tui/tests/suite/model_availability_nux.rs | 204 - .../tui/tests/suite/no_panic_on_startup.rs | 127 - .../tui/tests/suite/status_indicator.rs | 24 - .../codex-rs/tui/tests/suite/vt100_history.rs | 166 - .../tui/tests/suite/vt100_live_commit.rs | 45 - .../codex/codex-rs/tui/tests/test_backend.rs | 4 - vendor/codex/codex-rs/tui/tooltips.txt | 25 - vendor/codex/codex-rs/uds/BUILD.bazel | 6 - vendor/codex/codex-rs/uds/Cargo.toml | 29 - vendor/codex/codex-rs/uds/src/lib.rs | 331 - vendor/codex/codex-rs/uds/src/lib_tests.rs | 121 - .../codex-rs/utils/absolute-path/BUILD.bazel | 6 - .../codex-rs/utils/absolute-path/Cargo.toml | 24 - .../utils/absolute-path/src/absolutize.rs | 171 - .../codex-rs/utils/absolute-path/src/lib.rs | 617 - .../utils/approval-presets/BUILD.bazel | 6 - .../utils/approval-presets/Cargo.toml | 11 - .../utils/approval-presets/src/lib.rs | 46 - vendor/codex/codex-rs/utils/cache/BUILD.bazel | 6 - vendor/codex/codex-rs/utils/cache/Cargo.toml | 16 - vendor/codex/codex-rs/utils/cache/src/lib.rs | 193 - .../codex-rs/utils/cargo-bin/BUILD.bazel | 17 - .../codex/codex-rs/utils/cargo-bin/Cargo.toml | 13 - .../codex/codex-rs/utils/cargo-bin/README.md | 20 - .../codex-rs/utils/cargo-bin/repo_root.marker | 1 - .../codex/codex-rs/utils/cargo-bin/src/lib.rs | 226 - vendor/codex/codex-rs/utils/cli/BUILD.bazel | 6 - vendor/codex/codex-rs/utils/cli/Cargo.toml | 17 - .../utils/cli/src/approval_mode_cli_arg.rs | 38 - .../codex-rs/utils/cli/src/config_override.rs | 200 - .../utils/cli/src/format_env_display.rs | 72 - vendor/codex/codex-rs/utils/cli/src/lib.rs | 11 - .../utils/cli/src/sandbox_mode_cli_arg.rs | 47 - .../codex-rs/utils/cli/src/shared_options.rs | 174 - .../codex/codex-rs/utils/elapsed/BUILD.bazel | 6 - .../codex/codex-rs/utils/elapsed/Cargo.toml | 8 - .../codex/codex-rs/utils/elapsed/src/lib.rs | 71 - .../codex-rs/utils/fuzzy-match/BUILD.bazel | 6 - .../codex-rs/utils/fuzzy-match/Cargo.toml | 8 - .../codex-rs/utils/fuzzy-match/src/lib.rs | 168 - .../codex/codex-rs/utils/home-dir/BUILD.bazel | 6 - .../codex/codex-rs/utils/home-dir/Cargo.toml | 16 - .../codex/codex-rs/utils/home-dir/src/lib.rs | 134 - vendor/codex/codex-rs/utils/image/BUILD.bazel | 6 - vendor/codex/codex-rs/utils/image/Cargo.toml | 19 - .../codex/codex-rs/utils/image/src/error.rs | 55 - vendor/codex/codex-rs/utils/image/src/lib.rs | 349 - .../codex-rs/utils/json-to-toml/BUILD.bazel | 6 - .../codex-rs/utils/json-to-toml/Cargo.toml | 15 - .../codex-rs/utils/json-to-toml/src/lib.rs | 83 - vendor/codex/codex-rs/utils/oss/BUILD.bazel | 6 - vendor/codex/codex-rs/utils/oss/Cargo.toml | 14 - vendor/codex/codex-rs/utils/oss/src/lib.rs | 61 - .../utils/output-truncation/BUILD.bazel | 6 - .../utils/output-truncation/Cargo.toml | 15 - .../utils/output-truncation/src/lib.rs | 142 - .../output-truncation/src/truncate_tests.rs | 282 - .../codex-rs/utils/path-utils/BUILD.bazel | 6 - .../codex-rs/utils/path-utils/Cargo.toml | 17 - .../codex-rs/utils/path-utils/src/env.rs | 19 - .../codex-rs/utils/path-utils/src/lib.rs | 219 - .../utils/path-utils/src/path_utils_tests.rs | 115 - vendor/codex/codex-rs/utils/pty/BUILD.bazel | 6 - vendor/codex/codex-rs/utils/pty/Cargo.toml | 34 - vendor/codex/codex-rs/utils/pty/README.md | 64 - vendor/codex/codex-rs/utils/pty/src/lib.rs | 37 - vendor/codex/codex-rs/utils/pty/src/pipe.rs | 290 - .../codex/codex-rs/utils/pty/src/process.rs | 410 - .../codex-rs/utils/pty/src/process_group.rs | 184 - vendor/codex/codex-rs/utils/pty/src/pty.rs | 483 - vendor/codex/codex-rs/utils/pty/src/tests.rs | 1055 -- .../codex-rs/utils/pty/src/win/conpty.rs | 190 - .../codex/codex-rs/utils/pty/src/win/mod.rs | 174 - .../utils/pty/src/win/procthreadattr.rs | 91 - .../codex-rs/utils/pty/src/win/psuedocon.rs | 377 - .../codex-rs/utils/readiness/BUILD.bazel | 6 - .../codex/codex-rs/utils/readiness/Cargo.toml | 18 - .../codex/codex-rs/utils/readiness/src/lib.rs | 333 - .../utils/rustls-provider/BUILD.bazel | 6 - .../codex-rs/utils/rustls-provider/Cargo.toml | 11 - .../codex-rs/utils/rustls-provider/src/lib.rs | 12 - .../utils/sandbox-summary/BUILD.bazel | 6 - .../codex-rs/utils/sandbox-summary/Cargo.toml | 17 - .../sandbox-summary/src/config_summary.rs | 39 - .../codex-rs/utils/sandbox-summary/src/lib.rs | 5 - .../sandbox-summary/src/sandbox_summary.rs | 103 - .../utils/sleep-inhibitor/BUILD.bazel | 6 - .../codex-rs/utils/sleep-inhibitor/Cargo.toml | 25 - .../utils/sleep-inhibitor/src/dummy.rs | 12 - .../sleep-inhibitor/src/iokit_bindings.rs | 27 - .../codex-rs/utils/sleep-inhibitor/src/lib.rs | 113 - .../sleep-inhibitor/src/linux_inhibitor.rs | 240 - .../utils/sleep-inhibitor/src/macos.rs | 107 - .../sleep-inhibitor/src/windows_inhibitor.rs | 119 - .../codex-rs/utils/stream-parser/BUILD.bazel | 6 - .../codex-rs/utils/stream-parser/Cargo.toml | 11 - .../codex-rs/utils/stream-parser/README.md | 97 - .../utils/stream-parser/src/assistant_text.rs | 130 - .../utils/stream-parser/src/citation.rs | 179 - .../stream-parser/src/inline_hidden_tag.rs | 323 - .../codex-rs/utils/stream-parser/src/lib.rs | 23 - .../utils/stream-parser/src/proposed_plan.rs | 212 - .../utils/stream-parser/src/stream_text.rs | 36 - .../stream-parser/src/tagged_line_parser.rs | 249 - .../utils/stream-parser/src/utf8_stream.rs | 333 - .../codex/codex-rs/utils/string/BUILD.bazel | 6 - vendor/codex/codex-rs/utils/string/Cargo.toml | 14 - vendor/codex/codex-rs/utils/string/src/lib.rs | 163 - .../codex-rs/utils/string/src/truncate.rs | 156 - .../utils/string/src/truncate/tests.rs | 117 - .../codex/codex-rs/utils/template/BUILD.bazel | 6 - .../codex/codex-rs/utils/template/Cargo.toml | 11 - .../codex/codex-rs/utils/template/README.md | 41 - .../codex/codex-rs/utils/template/src/lib.rs | 442 - vendor/codex/codex-rs/v8-poc/.gitignore | 2 - vendor/codex/codex-rs/v8-poc/BUILD.bazel | 12 - vendor/codex/codex-rs/v8-poc/Cargo.toml | 18 - vendor/codex/codex-rs/v8-poc/src/lib.rs | 65 - vendor/codex/codex-rs/vendor/BUILD.bazel | 17 - .../codex-rs/vendor/bubblewrap/.dir-locals.el | 1 - .../codex-rs/vendor/bubblewrap/.editorconfig | 5 - .../bubblewrap/.github/workflows/check.yml | 105 - .../vendor/bubblewrap/CODE-OF-CONDUCT.md | 3 - .../codex/codex-rs/vendor/bubblewrap/COPYING | 481 - .../codex/codex-rs/vendor/bubblewrap/LICENSE | 1 - .../codex/codex-rs/vendor/bubblewrap/NEWS.md | 51 - .../codex-rs/vendor/bubblewrap/README.md | 255 - .../codex-rs/vendor/bubblewrap/SECURITY.md | 42 - .../codex-rs/vendor/bubblewrap/bind-mount.c | 598 - .../codex-rs/vendor/bubblewrap/bind-mount.h | 54 - .../codex-rs/vendor/bubblewrap/bubblewrap.c | 3641 ---- .../codex-rs/vendor/bubblewrap/bubblewrap.jpg | Bin 40239 -> 0 bytes .../codex-rs/vendor/bubblewrap/bwrap.xml | 648 - .../vendor/bubblewrap/ci/builddeps.sh | 107 - .../vendor/bubblewrap/ci/enable-userns.sh | 6 - .../vendor/bubblewrap/completions/bash/bwrap | 80 - .../bubblewrap/completions/bash/meson.build | 35 - .../vendor/bubblewrap/completions/meson.build | 7 - .../vendor/bubblewrap/completions/zsh/_bwrap | 115 - .../bubblewrap/completions/zsh/meson.build | 7 - .../bubblewrap/demos/bubblewrap-shell.sh | 34 - .../vendor/bubblewrap/demos/flatpak-run.sh | 65 - .../vendor/bubblewrap/demos/flatpak.bpf | Bin 744 -> 0 bytes .../bubblewrap/demos/userns-block-fd.py | 39 - .../codex-rs/vendor/bubblewrap/meson.build | 171 - .../vendor/bubblewrap/meson_options.txt | 73 - .../codex-rs/vendor/bubblewrap/network.c | 199 - .../codex-rs/vendor/bubblewrap/network.h | 22 - .../bubblewrap/packaging/bubblewrap.spec | 48 - .../vendor/bubblewrap/release-checklist.md | 18 - .../vendor/bubblewrap/tests/libtest-core.sh | 190 - .../vendor/bubblewrap/tests/libtest.sh | 115 - .../vendor/bubblewrap/tests/meson.build | 72 - .../vendor/bubblewrap/tests/test-run.sh | 692 - .../vendor/bubblewrap/tests/test-seccomp.py | 635 - .../bubblewrap/tests/test-specifying-pidns.sh | 28 - .../tests/test-specifying-userns.sh | 28 - .../vendor/bubblewrap/tests/test-utils.c | 247 - .../vendor/bubblewrap/tests/try-syscall.c | 180 - .../tests/use-as-subproject/.gitignore | 2 - .../bubblewrap/tests/use-as-subproject/README | 3 - .../use-as-subproject/assert-correct-rpath.py | 26 - .../tests/use-as-subproject/config.h | 1 - .../tests/use-as-subproject/dummy-config.h.in | 1 - .../tests/use-as-subproject/meson.build | 20 - .../codex-rs/vendor/bubblewrap/uncrustify.cfg | 136 - .../codex-rs/vendor/bubblewrap/uncrustify.sh | 2 - .../codex/codex-rs/vendor/bubblewrap/utils.c | 1080 -- .../codex/codex-rs/vendor/bubblewrap/utils.h | 217 - .../codex-rs/windows-sandbox-rs/BUILD.bazel | 10 - .../codex-rs/windows-sandbox-rs/Cargo.toml | 97 - .../codex-rs/windows-sandbox-rs/build.rs | 15 - .../codex-windows-sandbox-setup.manifest | 10 - .../windows-sandbox-rs/sandbox_smoketests.py | 626 - .../codex-rs/windows-sandbox-rs/src/acl.rs | 638 - .../codex-rs/windows-sandbox-rs/src/allow.rs | 264 - .../codex-rs/windows-sandbox-rs/src/audit.rs | 334 - .../src/bin/command_runner.rs | 12 - .../windows-sandbox-rs/src/bin/setup_main.rs | 12 - .../codex-rs/windows-sandbox-rs/src/cap.rs | 121 - .../windows-sandbox-rs/src/conpty/mod.rs | 151 - .../windows-sandbox-rs/src/desktop.rs | 196 - .../codex-rs/windows-sandbox-rs/src/dpapi.rs | 85 - .../src/elevated/command_runner_win.rs | 569 - .../src/elevated/cwd_junction.rs | 142 - .../src/elevated/ipc_framed.rs | 192 - .../src/elevated/runner_client.rs | 213 - .../src/elevated/runner_pipe.rs | 117 - .../windows-sandbox-rs/src/elevated_impl.rs | 544 - .../codex-rs/windows-sandbox-rs/src/env.rs | 174 - .../windows-sandbox-rs/src/firewall.rs | 512 - .../src/helper_materialization.rs | 421 - .../windows-sandbox-rs/src/hide_users.rs | 160 - .../windows-sandbox-rs/src/identity.rs | 232 - .../codex-rs/windows-sandbox-rs/src/lib.rs | 724 - .../windows-sandbox-rs/src/logging.rs | 91 - .../src/path_normalization.rs | 28 - .../codex-rs/windows-sandbox-rs/src/policy.rs | 60 - .../src/proc_thread_attr.rs | 100 - .../windows-sandbox-rs/src/process.rs | 355 - .../windows-sandbox-rs/src/read_acl_mutex.rs | 62 - .../windows-sandbox-rs/src/sandbox_users.rs | 496 - .../windows-sandbox-rs/src/sandbox_utils.rs | 67 - .../windows-sandbox-rs/src/setup_error.rs | 280 - .../windows-sandbox-rs/src/setup_main_win.rs | 899 - .../src/setup_orchestrator.rs | 1605 -- .../windows-sandbox-rs/src/spawn_prep.rs | 411 - .../src/ssh_config_dependencies.rs | 249 - .../codex-rs/windows-sandbox-rs/src/token.rs | 379 - .../src/unified_exec/backends/elevated.rs | 118 - .../src/unified_exec/backends/legacy.rs | 439 - .../src/unified_exec/backends/mod.rs | 3 - .../unified_exec/backends/windows_common.rs | 191 - .../src/unified_exec/session.rs | 83 - .../src/unified_exec/tests.rs | 535 - .../windows-sandbox-rs/src/winutil.rs | 236 - .../windows-sandbox-rs/src/workspace_acl.rs | 30 - vendor/codex/defs.bzl | 375 - vendor/codex/docs/CLA.md | 49 - vendor/codex/docs/agents_md.md | 7 - vendor/codex/docs/authentication.md | 3 - vendor/codex/docs/config.md | 111 - vendor/codex/docs/contributing.md | 97 - vendor/codex/docs/example-config.md | 3 - vendor/codex/docs/exec.md | 3 - vendor/codex/docs/execpolicy.md | 3 - .../docs/exit-confirmation-prompt-design.md | 96 - vendor/codex/docs/getting-started.md | 3 - vendor/codex/docs/install.md | 64 - vendor/codex/docs/js_repl.md | 155 - vendor/codex/docs/license.md | 3 - vendor/codex/docs/open-source-fund.md | 8 - vendor/codex/docs/sandbox.md | 3 - vendor/codex/docs/skills.md | 3 - vendor/codex/docs/slash_commands.md | 3 - vendor/codex/docs/tui-alternate-screen.md | 130 - vendor/codex/docs/tui-chat-composer.md | 348 - vendor/codex/docs/tui-request-user-input.md | 41 - .../codex/docs/tui-stream-chunking-review.md | 124 - .../codex/docs/tui-stream-chunking-tuning.md | 98 - .../docs/tui-stream-chunking-validation.md | 107 - vendor/codex/flake.lock | 48 - vendor/codex/flake.nix | 87 - vendor/codex/justfile | 119 - vendor/codex/package.json | 36 - vendor/codex/patches/BUILD.bazel | 26 - ...seil_windows_gnullvm_thread_identity.patch | 16 - .../patches/aws-lc-sys_memcmp_check.patch | 114 - ...aws-lc-sys_windows_msvc_memcmp_probe.patch | 38 - ...ws-lc-sys_windows_msvc_prebuilt_nasm.patch | 137 - .../patches/bzip2_windows_stack_args.patch | 23 - .../llvm_windows_symlink_extract.patch | 64 - .../ring_windows_msvc_include_dirs.patch | 100 - .../rules_rs_windows_exec_linker.patch | 66 - .../rules_rs_windows_gnullvm_exec.patch | 212 - ...ows_bootstrap_process_wrapper_linker.patch | 21 - ...st_windows_build_script_runner_paths.patch | 171 - .../rules_rust_windows_exec_bin_target.patch | 71 - ...t_windows_exec_msvc_build_script_env.patch | 184 - ...les_rust_windows_exec_rustc_dev_rlib.patch | 11 - .../patches/rules_rust_windows_exec_std.patch | 178 - ...es_rust_windows_gnullvm_build_script.patch | 78 - ...s_rust_windows_msvc_direct_link_args.patch | 93 - ...ws_process_wrapper_skip_temp_outputs.patch | 15 - .../patches/rusty_v8_prebuilt_out_dir.patch | 74 - vendor/codex/patches/v8_bazel_rules.patch | 274 - vendor/codex/patches/v8_module_deps.patch | 270 - .../codex/patches/v8_source_portability.patch | 327 - .../webrtc-sys_hermetic_darwin_sysroot.patch | 75 - vendor/codex/patches/windows-link.patch | 10 - .../codex/patches/xz_windows_stack_args.patch | 14 - .../zstd-sys_windows_msvc_include_dirs.patch | 41 - vendor/codex/pnpm-lock.yaml | 5195 ------ vendor/codex/pnpm-workspace.yaml | 11 - vendor/codex/rbe.bzl | 42 - vendor/codex/scripts/asciicheck.py | 127 - .../codex/scripts/check-module-bazel-lock.sh | 8 - vendor/codex/scripts/check_blob_size.py | 193 - vendor/codex/scripts/debug-codex.sh | 10 - vendor/codex/scripts/install/install.ps1 | 750 - vendor/codex/scripts/install/install.sh | 768 - .../scripts/list-bazel-clippy-targets.sh | 20 - .../scripts/list-bazel-release-targets.sh | 16 - .../mock_responses_websocket_server.py | 195 - vendor/codex/scripts/readme_toc.py | 120 - .../codex/scripts/run_tui_with_exec_server.sh | 61 - vendor/codex/scripts/stage_npm_packages.py | 206 - vendor/codex/scripts/start-codex-exec.sh | 185 - vendor/codex/scripts/test-remote-env.sh | 137 - vendor/codex/third_party/meriyah/LICENSE | 15 - vendor/codex/third_party/v8/BUILD.bazel | 352 - vendor/codex/third_party/v8/README.md | 59 - .../third_party/v8/rusty_v8_146_4_0.sha256 | 10 - .../codex/third_party/v8/v8_crate.BUILD.bazel | 41 - vendor/codex/third_party/wezterm/LICENSE | 21 - .../argument-comment-lint/.cargo/config.toml | 6 - .../tools/argument-comment-lint/.gitignore | 1 - .../tools/argument-comment-lint/BUILD.bazel | 32 - .../tools/argument-comment-lint/Cargo.lock | 1653 -- .../tools/argument-comment-lint/Cargo.toml | 24 - .../tools/argument-comment-lint/README.md | 170 - .../argument-comment-lint | 79 - .../tools/argument-comment-lint/driver.rs | 43 - .../argument-comment-lint/lint_aspect.bzl | 188 - .../list-bazel-targets.sh | 13 - .../run-prebuilt-linter.py | 45 - .../codex/tools/argument-comment-lint/run.py | 35 - .../argument-comment-lint/rust-toolchain | 3 - .../src/bin/argument-comment-lint.rs | 301 - .../src/comment_parser.rs | 63 - .../tools/argument-comment-lint/src/lib.rs | 274 - .../test_wrapper_common.py | 121 - .../ui/allow_char_literals.rs | 9 - .../ui/allow_string_literals.rs | 9 - .../ui/comment_matches.rs | 12 - .../ui/comment_matches_multiline.rs | 15 - .../ui/comment_mismatch.rs | 10 - .../ui/comment_mismatch.stderr | 15 - .../ui/ignore_external_methods.rs | 9 - .../ui/uncommented_literal.rs | 18 - .../ui/uncommented_literal.stderr | 26 - .../argument-comment-lint/wrapper_common.py | 278 - .../workspace_root_test_launcher.bat.tpl | 126 - .../codex/workspace_root_test_launcher.sh.tpl | 119 - 3599 files changed, 8 insertions(+), 851099 deletions(-) delete mode 100644 notes/codex-auth-spine-inventory.md delete mode 100644 notes/native-coordinator-liberation-map.md delete mode 100644 vendor/codex/.bazelignore delete mode 100644 vendor/codex/.bazelrc delete mode 100644 vendor/codex/.bazelversion delete mode 100644 vendor/codex/.codespellignore delete mode 100644 vendor/codex/.codespellrc delete mode 100644 vendor/codex/.codex/skills/babysit-pr/SKILL.md delete mode 100644 vendor/codex/.codex/skills/babysit-pr/agents/openai.yaml delete mode 100644 vendor/codex/.codex/skills/babysit-pr/references/github-api-notes.md delete mode 100644 vendor/codex/.codex/skills/babysit-pr/references/heuristics.md delete mode 100644 vendor/codex/.codex/skills/babysit-pr/scripts/gh_pr_watch.py delete mode 100644 vendor/codex/.codex/skills/babysit-pr/scripts/test_gh_pr_watch.py delete mode 100644 vendor/codex/.codex/skills/code-review-breaking-changes/SKILL.md delete mode 100644 vendor/codex/.codex/skills/code-review-change-size/SKILL.md delete mode 100644 vendor/codex/.codex/skills/code-review-context/SKILL.md delete mode 100644 vendor/codex/.codex/skills/code-review-testing/SKILL.md delete mode 100644 vendor/codex/.codex/skills/code-review/SKILL.md delete mode 100644 vendor/codex/.codex/skills/codex-bug/SKILL.md delete mode 100644 vendor/codex/.codex/skills/codex-pr-body/SKILL.md delete mode 100644 vendor/codex/.codex/skills/remote-tests/SKILL.md delete mode 100644 vendor/codex/.codex/skills/test-tui/SKILL.md delete mode 100644 vendor/codex/.devcontainer/Dockerfile delete mode 100644 vendor/codex/.devcontainer/Dockerfile.secure delete mode 100644 vendor/codex/.devcontainer/README.md delete mode 100644 vendor/codex/.devcontainer/devcontainer.json delete mode 100644 vendor/codex/.devcontainer/devcontainer.secure.json delete mode 100644 vendor/codex/.devcontainer/init-firewall.sh delete mode 100644 vendor/codex/.devcontainer/post-start.sh delete mode 100644 vendor/codex/.devcontainer/post_install.py delete mode 100644 vendor/codex/.gitattributes delete mode 100644 vendor/codex/.github/CODEOWNERS delete mode 100644 vendor/codex/.github/ISSUE_TEMPLATE/1-codex-app.yml delete mode 100644 vendor/codex/.github/ISSUE_TEMPLATE/2-extension.yml delete mode 100644 vendor/codex/.github/ISSUE_TEMPLATE/3-cli.yml delete mode 100644 vendor/codex/.github/ISSUE_TEMPLATE/4-bug-report.yml delete mode 100644 vendor/codex/.github/ISSUE_TEMPLATE/5-feature-request.yml delete mode 100644 vendor/codex/.github/ISSUE_TEMPLATE/6-docs-issue.yml delete mode 100644 vendor/codex/.github/actions/linux-code-sign/action.yml delete mode 100644 vendor/codex/.github/actions/macos-code-sign/action.yml delete mode 100644 vendor/codex/.github/actions/macos-code-sign/codex.entitlements.plist delete mode 100644 vendor/codex/.github/actions/macos-code-sign/notary_helpers.sh delete mode 100644 vendor/codex/.github/actions/prepare-bazel-ci/action.yml delete mode 100644 vendor/codex/.github/actions/run-argument-comment-lint/action.yml delete mode 100644 vendor/codex/.github/actions/setup-bazel-ci/action.yml delete mode 100644 vendor/codex/.github/actions/setup-rusty-v8-musl/action.yml delete mode 100644 vendor/codex/.github/actions/windows-code-sign/action.yml delete mode 100644 vendor/codex/.github/blob-size-allowlist.txt delete mode 100644 vendor/codex/.github/codex-cli-splash.png delete mode 100644 vendor/codex/.github/codex/home/config.toml delete mode 100644 vendor/codex/.github/codex/labels/codex-attempt.md delete mode 100644 vendor/codex/.github/codex/labels/codex-review.md delete mode 100644 vendor/codex/.github/codex/labels/codex-rust-review.md delete mode 100644 vendor/codex/.github/codex/labels/codex-triage.md delete mode 100644 vendor/codex/.github/dependabot.yaml delete mode 100644 vendor/codex/.github/dotslash-argument-comment-lint-config.json delete mode 100644 vendor/codex/.github/dotslash-config.json delete mode 100644 vendor/codex/.github/dotslash-zsh-config.json delete mode 100644 vendor/codex/.github/pull_request_template.md delete mode 100644 vendor/codex/.github/scripts/build-zsh-release-artifact.sh delete mode 100644 vendor/codex/.github/scripts/install-musl-build-tools.sh delete mode 100644 vendor/codex/.github/scripts/run-argument-comment-lint-bazel.sh delete mode 100644 vendor/codex/.github/scripts/run-bazel-ci.sh delete mode 100644 vendor/codex/.github/scripts/rusty_v8_bazel.py delete mode 100644 vendor/codex/.github/scripts/rusty_v8_module_bazel.py delete mode 100644 vendor/codex/.github/scripts/test_rusty_v8_bazel.py delete mode 100644 vendor/codex/.github/scripts/verify_bazel_clippy_lints.py delete mode 100644 vendor/codex/.github/scripts/verify_cargo_workspace_manifests.py delete mode 100644 vendor/codex/.github/scripts/verify_tui_core_boundary.py delete mode 100644 vendor/codex/.github/workflows/Dockerfile.bazel delete mode 100644 vendor/codex/.github/workflows/README.md delete mode 100644 vendor/codex/.github/workflows/bazel.yml delete mode 100644 vendor/codex/.github/workflows/blob-size-policy.yml delete mode 100644 vendor/codex/.github/workflows/cargo-deny.yml delete mode 100644 vendor/codex/.github/workflows/ci.yml delete mode 100644 vendor/codex/.github/workflows/cla.yml delete mode 100644 vendor/codex/.github/workflows/close-stale-contributor-prs.yml delete mode 100644 vendor/codex/.github/workflows/codespell.yml delete mode 100644 vendor/codex/.github/workflows/issue-deduplicator.yml delete mode 100644 vendor/codex/.github/workflows/issue-labeler.yml delete mode 100644 vendor/codex/.github/workflows/rust-ci-full.yml delete mode 100644 vendor/codex/.github/workflows/rust-ci.yml delete mode 100644 vendor/codex/.github/workflows/rust-release-argument-comment-lint.yml delete mode 100644 vendor/codex/.github/workflows/rust-release-prepare.yml delete mode 100644 vendor/codex/.github/workflows/rust-release-windows.yml delete mode 100644 vendor/codex/.github/workflows/rust-release-zsh.yml delete mode 100644 vendor/codex/.github/workflows/rust-release.yml delete mode 100644 vendor/codex/.github/workflows/rusty-v8-release.yml delete mode 100644 vendor/codex/.github/workflows/sdk.yml delete mode 100644 vendor/codex/.github/workflows/v8-canary.yml delete mode 100644 vendor/codex/.github/workflows/zstd delete mode 100644 vendor/codex/.gitignore delete mode 100644 vendor/codex/.markdownlint-cli2.yaml delete mode 100644 vendor/codex/.npmrc delete mode 100644 vendor/codex/.prettierignore delete mode 100644 vendor/codex/.prettierrc.toml delete mode 100644 vendor/codex/AGENTS.md delete mode 100644 vendor/codex/BUILD.bazel delete mode 100644 vendor/codex/CHANGELOG.md delete mode 100644 vendor/codex/LICENSE delete mode 100644 vendor/codex/MODULE.bazel delete mode 100644 vendor/codex/MODULE.bazel.lock delete mode 100644 vendor/codex/NOTICE delete mode 100644 vendor/codex/README.md delete mode 100644 vendor/codex/SECURITY.md delete mode 100644 vendor/codex/announcement_tip.toml delete mode 100644 vendor/codex/cliff.toml delete mode 100644 vendor/codex/codex-cli/.dockerignore delete mode 100644 vendor/codex/codex-cli/.gitignore delete mode 100644 vendor/codex/codex-cli/Dockerfile delete mode 100644 vendor/codex/codex-cli/bin/codex.js delete mode 100644 vendor/codex/codex-cli/bin/rg delete mode 100644 vendor/codex/codex-cli/package.json delete mode 100644 vendor/codex/codex-cli/scripts/README.md delete mode 100644 vendor/codex/codex-cli/scripts/build_container.sh delete mode 100644 vendor/codex/codex-cli/scripts/build_npm_package.py delete mode 100644 vendor/codex/codex-cli/scripts/init_firewall.sh delete mode 100644 vendor/codex/codex-cli/scripts/install_native_deps.py delete mode 100644 vendor/codex/codex-cli/scripts/run_in_container.sh delete mode 100644 vendor/codex/codex-rs/.cargo/audit.toml delete mode 100644 vendor/codex/codex-rs/.cargo/config.toml delete mode 100644 vendor/codex/codex-rs/.config/nextest.toml delete mode 100644 vendor/codex/codex-rs/.github/workflows/cargo-audit.yml delete mode 100644 vendor/codex/codex-rs/.gitignore delete mode 100644 vendor/codex/codex-rs/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/Cargo.lock delete mode 100644 vendor/codex/codex-rs/Cargo.toml delete mode 100644 vendor/codex/codex-rs/README.md delete mode 100644 vendor/codex/codex-rs/agent-identity/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/agent-identity/Cargo.toml delete mode 100644 vendor/codex/codex-rs/agent-identity/src/lib.rs delete mode 100644 vendor/codex/codex-rs/analytics/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/analytics/Cargo.toml delete mode 100644 vendor/codex/codex-rs/analytics/src/analytics_client_tests.rs delete mode 100644 vendor/codex/codex-rs/analytics/src/client.rs delete mode 100644 vendor/codex/codex-rs/analytics/src/events.rs delete mode 100644 vendor/codex/codex-rs/analytics/src/facts.rs delete mode 100644 vendor/codex/codex-rs/analytics/src/lib.rs delete mode 100644 vendor/codex/codex-rs/analytics/src/reducer.rs delete mode 100644 vendor/codex/codex-rs/ansi-escape/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/ansi-escape/Cargo.toml delete mode 100644 vendor/codex/codex-rs/ansi-escape/README.md delete mode 100644 vendor/codex/codex-rs/ansi-escape/src/lib.rs delete mode 100644 vendor/codex/codex-rs/app-server-client/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/app-server-client/Cargo.toml delete mode 100644 vendor/codex/codex-rs/app-server-client/README.md delete mode 100644 vendor/codex/codex-rs/app-server-client/src/lib.rs delete mode 100644 vendor/codex/codex-rs/app-server-client/src/remote.rs delete mode 100644 vendor/codex/codex-rs/app-server-protocol/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/app-server-protocol/Cargo.toml delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/ApplyPatchApprovalParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/ApplyPatchApprovalResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/ChatgptAuthTokensRefreshParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/ChatgptAuthTokensRefreshResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/ClientNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/ClientRequest.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/CommandExecutionRequestApprovalParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/CommandExecutionRequestApprovalResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/DynamicToolCallParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/DynamicToolCallResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/ExecCommandApprovalParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/ExecCommandApprovalResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/FileChangeRequestApprovalParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/FileChangeRequestApprovalResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/FuzzyFileSearchParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/FuzzyFileSearchResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/FuzzyFileSearchSessionCompletedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/FuzzyFileSearchSessionUpdatedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/JSONRPCError.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/JSONRPCErrorError.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/JSONRPCMessage.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/JSONRPCNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/JSONRPCRequest.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/JSONRPCResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/McpServerElicitationRequestParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/McpServerElicitationRequestResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/PermissionsRequestApprovalParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/PermissionsRequestApprovalResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/RequestId.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/ServerNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/ServerRequest.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/ToolRequestUserInputParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/ToolRequestUserInputResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.v2.schemas.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v1/InitializeParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v1/InitializeResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/AccountLoginCompletedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/AccountRateLimitsUpdatedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/AccountUpdatedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/AgentMessageDeltaNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/CancelLoginAccountParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/CancelLoginAccountResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/CommandExecOutputDeltaNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/CommandExecParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/CommandExecResizeParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/CommandExecResizeResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/CommandExecResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/CommandExecTerminateParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/CommandExecTerminateResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/CommandExecWriteParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/CommandExecWriteResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/CommandExecutionOutputDeltaNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ConfigBatchWriteParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ConfigReadParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ConfigReadResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ConfigRequirementsReadResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ConfigValueWriteParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ConfigWarningNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ConfigWriteResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ContextCompactedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/DeprecationNoticeNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/DeviceKeyCreateParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/DeviceKeyCreateResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/DeviceKeyPublicParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/DeviceKeyPublicResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/DeviceKeySignParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/DeviceKeySignResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ErrorNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ExperimentalFeatureEnablementSetParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ExperimentalFeatureEnablementSetResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ExperimentalFeatureListParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ExperimentalFeatureListResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FeedbackUploadParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FeedbackUploadResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FileChangeOutputDeltaNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FileChangePatchUpdatedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FsChangedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FsCopyParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FsCopyResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FsCreateDirectoryParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FsCreateDirectoryResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FsGetMetadataParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FsGetMetadataResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FsReadDirectoryParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FsReadDirectoryResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FsReadFileParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FsReadFileResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FsRemoveParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FsRemoveResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FsUnwatchParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FsUnwatchResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FsWatchParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FsWatchResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FsWriteFileParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/FsWriteFileResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/GetAccountParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/GetAccountRateLimitsResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/GetAccountResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/GuardianWarningNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/HookCompletedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/HookStartedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ItemCompletedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ItemGuardianApprovalReviewCompletedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ItemGuardianApprovalReviewStartedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ItemStartedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ListMcpServerStatusParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ListMcpServerStatusResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/LoginAccountParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/LoginAccountResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/LogoutAccountResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/McpResourceReadParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/McpResourceReadResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/McpServerOauthLoginCompletedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/McpServerOauthLoginParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/McpServerOauthLoginResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/McpServerRefreshResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/McpServerStatusUpdatedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/McpServerToolCallParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/McpServerToolCallResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/McpToolCallProgressNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ModelListParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ModelListResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ModelReroutedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/PlanDeltaNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/RawResponseItemCompletedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ReasoningSummaryPartAddedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ReasoningSummaryTextDeltaNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ReasoningTextDeltaNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ReviewStartParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ReviewStartResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/SendAddCreditsNudgeEmailParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/SendAddCreditsNudgeEmailResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ServerRequestResolvedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/TerminalInteractionNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadApproveGuardianDeniedActionParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadApproveGuardianDeniedActionResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadArchiveParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadArchiveResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadArchivedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadClosedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadCompactStartParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadCompactStartResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadForkParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadForkResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadInjectItemsParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadInjectItemsResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadListParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadListResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadLoadedListParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadLoadedListResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadMetadataUpdateParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadMetadataUpdateResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadNameUpdatedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadReadParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadReadResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadRealtimeClosedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadRealtimeErrorNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadRealtimeItemAddedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadRealtimeOutputAudioDeltaNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadRealtimeSdpNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadRealtimeStartedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadRealtimeTranscriptDeltaNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadRealtimeTranscriptDoneNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadResumeParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadResumeResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadRollbackParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadRollbackResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadSetNameParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadSetNameResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadShellCommandParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadShellCommandResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadStartParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadStartResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadStartedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadStatusChangedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadTokenUsageUpdatedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadTurnsListParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadTurnsListResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadUnarchiveParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadUnarchiveResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadUnarchivedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadUnsubscribeParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/ThreadUnsubscribeResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/TurnCompletedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/TurnDiffUpdatedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/TurnInterruptParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/TurnInterruptResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/TurnPlanUpdatedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/TurnStartParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/TurnStartResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/TurnStartedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/TurnSteerParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/TurnSteerResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/WarningNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/WindowsSandboxSetupCompletedNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/WindowsSandboxSetupStartParams.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/WindowsSandboxSetupStartResponse.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/json/v2/WindowsWorldWritableWarningNotification.json delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/AbsolutePathBuf.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/AgentPath.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ApplyPatchApprovalParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ApplyPatchApprovalResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/AuthMode.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ClientInfo.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ClientNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ClientRequest.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/CollaborationMode.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ContentItem.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ConversationGitInfo.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ConversationSummary.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ExecCommandApprovalParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ExecCommandApprovalResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ExecPolicyAmendment.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/FileChange.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ForcedLoginMethod.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/FunctionCallOutputBody.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/FunctionCallOutputContentItem.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/FuzzyFileSearchMatchType.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/FuzzyFileSearchParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/FuzzyFileSearchResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/FuzzyFileSearchResult.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/FuzzyFileSearchSessionCompletedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/FuzzyFileSearchSessionUpdatedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/GetAuthStatusParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/GetAuthStatusResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/GetConversationSummaryParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/GetConversationSummaryResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/GhostCommit.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/GitDiffToRemoteParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/GitDiffToRemoteResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/GitSha.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ImageDetail.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/InitializeCapabilities.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/InitializeParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/InitializeResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/InputModality.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/LocalShellAction.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/LocalShellExecAction.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/LocalShellStatus.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/MessagePhase.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ModeKind.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/NetworkPolicyAmendment.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/NetworkPolicyRuleAction.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ParsedCommand.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/Personality.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/PlanType.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/RealtimeConversationVersion.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/RealtimeOutputModality.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/RealtimeVoice.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/RealtimeVoicesList.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ReasoningEffort.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ReasoningItemContent.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ReasoningItemReasoningSummary.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ReasoningSummary.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/RequestId.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/Resource.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ResourceContent.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ResourceTemplate.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ResponseItem.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ReviewDecision.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ServerNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ServerRequest.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ServiceTier.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/SessionSource.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/Settings.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/SubAgentSource.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ThreadId.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/ThreadMemoryMode.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/Tool.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/Verbosity.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/WebSearchAction.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/WebSearchContextSize.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/WebSearchLocation.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/WebSearchMode.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/WebSearchToolConfig.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/index.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/serde_json/JsonValue.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/Account.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/AccountLoginCompletedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/AccountRateLimitsUpdatedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/AccountUpdatedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/AddCreditsNudgeCreditType.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/AddCreditsNudgeEmailStatus.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/AdditionalFileSystemPermissions.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/AdditionalNetworkPermissions.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/AdditionalPermissionProfile.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/AgentMessageDeltaNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/AnalyticsConfig.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ApprovalsReviewer.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/AskForApproval.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/AutoReviewDecisionSource.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ByteRange.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CancelLoginAccountParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CancelLoginAccountResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CancelLoginAccountStatus.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ChatgptAuthTokensRefreshParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ChatgptAuthTokensRefreshReason.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ChatgptAuthTokensRefreshResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CodexErrorInfo.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CollabAgentState.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CollabAgentStatus.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CollabAgentTool.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CollabAgentToolCallStatus.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CollaborationModeMask.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CommandAction.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CommandExecOutputDeltaNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CommandExecOutputStream.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CommandExecParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CommandExecResizeParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CommandExecResizeResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CommandExecResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CommandExecTerminalSize.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CommandExecTerminateParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CommandExecTerminateResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CommandExecWriteParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CommandExecWriteResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CommandExecutionApprovalDecision.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CommandExecutionOutputDeltaNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CommandExecutionRequestApprovalParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CommandExecutionRequestApprovalResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CommandExecutionSource.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CommandExecutionStatus.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/Config.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ConfigBatchWriteParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ConfigEdit.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ConfigLayer.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ConfigLayerMetadata.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ConfigLayerSource.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ConfigReadParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ConfigReadResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ConfigRequirements.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ConfigRequirementsReadResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ConfigValueWriteParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ConfigWarningNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ConfigWriteResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ContextCompactedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/CreditsSnapshot.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/DeprecationNoticeNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/DeviceKeyAlgorithm.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/DeviceKeyCreateParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/DeviceKeyCreateResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/DeviceKeyProtectionClass.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/DeviceKeyProtectionPolicy.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/DeviceKeyPublicParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/DeviceKeyPublicResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/DeviceKeySignParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/DeviceKeySignPayload.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/DeviceKeySignResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/DynamicToolCallOutputContentItem.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/DynamicToolCallParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/DynamicToolCallResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/DynamicToolCallStatus.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/DynamicToolSpec.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ErrorNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ExecPolicyAmendment.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ExperimentalFeature.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ExperimentalFeatureEnablementSetParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ExperimentalFeatureEnablementSetResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ExperimentalFeatureListParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ExperimentalFeatureListResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ExperimentalFeatureStage.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FeedbackUploadParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FeedbackUploadResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FileChangeApprovalDecision.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FileChangeOutputDeltaNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FileChangePatchUpdatedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FileChangeRequestApprovalParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FileChangeRequestApprovalResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FileSystemAccessMode.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FileSystemPath.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FileSystemSandboxEntry.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FileSystemSpecialPath.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FileUpdateChange.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsChangedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsCopyParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsCopyResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsCreateDirectoryParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsCreateDirectoryResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsGetMetadataParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsGetMetadataResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsReadDirectoryEntry.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsReadDirectoryParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsReadDirectoryResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsReadFileParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsReadFileResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsRemoveParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsRemoveResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsUnwatchParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsUnwatchResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsWatchParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsWatchResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsWriteFileParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/FsWriteFileResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/GetAccountParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/GetAccountRateLimitsResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/GetAccountResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/GitInfo.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/GrantedPermissionProfile.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/GuardianApprovalReview.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/GuardianApprovalReviewAction.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/GuardianApprovalReviewStatus.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/GuardianCommandSource.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/GuardianRiskLevel.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/GuardianUserAuthorization.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/GuardianWarningNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/HookCompletedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/HookEventName.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/HookExecutionMode.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/HookHandlerType.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/HookOutputEntry.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/HookOutputEntryKind.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/HookPromptFragment.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/HookRunStatus.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/HookRunSummary.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/HookScope.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/HookSource.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/HookStartedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ItemCompletedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ItemGuardianApprovalReviewCompletedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ItemGuardianApprovalReviewStartedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ItemStartedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ListMcpServerStatusParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ListMcpServerStatusResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/LoginAccountParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/LoginAccountResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/LogoutAccountResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpAuthStatus.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationArrayType.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationBooleanSchema.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationBooleanType.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationConstOption.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationEnumSchema.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationLegacyTitledEnumSchema.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationMultiSelectEnumSchema.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationNumberSchema.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationNumberType.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationObjectType.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationPrimitiveSchema.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationSchema.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationSingleSelectEnumSchema.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationStringFormat.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationStringSchema.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationStringType.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationTitledEnumItems.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationTitledMultiSelectEnumSchema.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationTitledSingleSelectEnumSchema.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationUntitledEnumItems.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationUntitledMultiSelectEnumSchema.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpElicitationUntitledSingleSelectEnumSchema.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpResourceReadParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpResourceReadResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpServerElicitationAction.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpServerElicitationRequestParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpServerElicitationRequestResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpServerOauthLoginCompletedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpServerOauthLoginParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpServerOauthLoginResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpServerRefreshResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpServerStartupState.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpServerStatus.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpServerStatusDetail.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpServerStatusUpdatedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpServerToolCallParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpServerToolCallResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpToolCallError.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpToolCallProgressNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpToolCallResult.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/McpToolCallStatus.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/MemoryCitation.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/MemoryCitationEntry.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/MergeStrategy.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/Model.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ModelAvailabilityNux.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ModelListParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ModelListResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ModelRerouteReason.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ModelReroutedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ModelUpgradeInfo.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/NetworkAccess.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/NetworkApprovalContext.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/NetworkApprovalProtocol.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/NetworkDomainPermission.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/NetworkPolicyAmendment.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/NetworkPolicyRuleAction.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/NetworkRequirements.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/NetworkUnixSocketPermission.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/NonSteerableTurnKind.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/OverriddenMetadata.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/PatchApplyStatus.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/PatchChangeKind.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/PermissionGrantScope.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/PermissionProfile.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/PermissionProfileFileSystemPermissions.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/PermissionProfileNetworkPermissions.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/PermissionsRequestApprovalParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/PermissionsRequestApprovalResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/PlanDeltaNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ProfileV2.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/RateLimitReachedType.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/RateLimitSnapshot.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/RateLimitWindow.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/RawResponseItemCompletedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ReadOnlyAccess.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ReasoningEffortOption.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ReasoningSummaryPartAddedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ReasoningSummaryTextDeltaNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ReasoningTextDeltaNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/RemoteControlClientConnectionAudience.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/RemoteControlClientEnrollmentAudience.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/RequestPermissionProfile.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ResidencyRequirement.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ReviewDelivery.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ReviewStartParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ReviewStartResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ReviewTarget.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/SandboxMode.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/SandboxPolicy.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/SandboxWorkspaceWrite.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/SendAddCreditsNudgeEmailParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/SendAddCreditsNudgeEmailResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ServerRequestResolvedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/SessionSource.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/SortDirection.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TerminalInteractionNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TextElement.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TextPosition.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TextRange.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/Thread.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadActiveFlag.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadApproveGuardianDeniedActionParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadApproveGuardianDeniedActionResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadArchiveParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadArchiveResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadArchivedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadClosedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadCompactStartParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadCompactStartResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadForkParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadForkResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadInjectItemsParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadInjectItemsResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadItem.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadListParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadListResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadLoadedListParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadLoadedListResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadMetadataGitInfoUpdateParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadMetadataUpdateParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadMetadataUpdateResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadNameUpdatedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadReadParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadReadResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadRealtimeAudioChunk.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadRealtimeClosedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadRealtimeErrorNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadRealtimeItemAddedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadRealtimeOutputAudioDeltaNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadRealtimeSdpNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadRealtimeStartTransport.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadRealtimeStartedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadRealtimeTranscriptDeltaNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadRealtimeTranscriptDoneNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadResumeParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadResumeResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadRollbackParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadRollbackResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadSetNameParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadSetNameResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadShellCommandParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadShellCommandResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadSortKey.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadSourceKind.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadStartParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadStartResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadStartSource.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadStartedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadStatus.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadStatusChangedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadTokenUsage.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadTokenUsageUpdatedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadTurnsListParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadTurnsListResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadUnarchiveParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadUnarchiveResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadUnarchivedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadUnsubscribeParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadUnsubscribeResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ThreadUnsubscribeStatus.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TokenUsageBreakdown.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ToolRequestUserInputAnswer.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ToolRequestUserInputOption.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ToolRequestUserInputParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ToolRequestUserInputQuestion.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ToolRequestUserInputResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/ToolsV2.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/Turn.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TurnCompletedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TurnDiffUpdatedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TurnEnvironmentParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TurnError.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TurnInterruptParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TurnInterruptResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TurnPlanStep.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TurnPlanStepStatus.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TurnPlanUpdatedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TurnStartParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TurnStartResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TurnStartedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TurnStatus.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TurnSteerParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/TurnSteerResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/UserInput.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/WarningNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/WebSearchAction.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/WindowsSandboxSetupCompletedNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/WindowsSandboxSetupMode.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/WindowsSandboxSetupStartParams.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/WindowsSandboxSetupStartResponse.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/WindowsWorldWritableWarningNotification.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/WriteStatus.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/schema/typescript/v2/index.ts delete mode 100644 vendor/codex/codex-rs/app-server-protocol/src/bin/export.rs delete mode 100644 vendor/codex/codex-rs/app-server-protocol/src/bin/write_schema_fixtures.rs delete mode 100644 vendor/codex/codex-rs/app-server-protocol/src/experimental_api.rs delete mode 100644 vendor/codex/codex-rs/app-server-protocol/src/export.rs delete mode 100644 vendor/codex/codex-rs/app-server-protocol/src/jsonrpc_lite.rs delete mode 100644 vendor/codex/codex-rs/app-server-protocol/src/lib.rs delete mode 100644 vendor/codex/codex-rs/app-server-protocol/src/protocol/common.rs delete mode 100644 vendor/codex/codex-rs/app-server-protocol/src/protocol/item_builders.rs delete mode 100644 vendor/codex/codex-rs/app-server-protocol/src/protocol/mappers.rs delete mode 100644 vendor/codex/codex-rs/app-server-protocol/src/protocol/mod.rs delete mode 100644 vendor/codex/codex-rs/app-server-protocol/src/protocol/serde_helpers.rs delete mode 100644 vendor/codex/codex-rs/app-server-protocol/src/protocol/thread_history.rs delete mode 100644 vendor/codex/codex-rs/app-server-protocol/src/protocol/v1.rs delete mode 100644 vendor/codex/codex-rs/app-server-protocol/src/protocol/v2.rs delete mode 100644 vendor/codex/codex-rs/app-server-protocol/src/schema_fixtures.rs delete mode 100644 vendor/codex/codex-rs/app-server-protocol/tests/schema_fixtures.rs delete mode 100644 vendor/codex/codex-rs/app-server-test-client/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/app-server-test-client/Cargo.toml delete mode 100644 vendor/codex/codex-rs/app-server-test-client/README.md delete mode 100644 vendor/codex/codex-rs/app-server-test-client/scripts/live_elicitation_hold.sh delete mode 100644 vendor/codex/codex-rs/app-server-test-client/src/lib.rs delete mode 100644 vendor/codex/codex-rs/app-server-test-client/src/main.rs delete mode 100644 vendor/codex/codex-rs/app-server/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/app-server/Cargo.toml delete mode 100644 vendor/codex/codex-rs/app-server/README.md delete mode 100644 vendor/codex/codex-rs/app-server/src/app_server_tracing.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/bespoke_event_handling.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/bin/notify_capture.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/bin/test_notify_capture.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/auth_routes.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/catalog_routes.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/command_routes.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/listener_lifecycle.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/mcp_routes.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/realtime_routes.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/review_routes.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/running_thread_resume_routes.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/thread_admin_routes.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/thread_archive_routes.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/thread_config.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/thread_fork_routes.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/thread_metadata_routes.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/thread_projection.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/thread_read_routes.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/thread_resume_routes.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/thread_start_routes.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/thread_turn_projection.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/thread_turn_routes.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/token_usage_replay.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/turn_routes.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/codex_message_processor/utility_routes.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/command_exec.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/config_api.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/config_manager.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/config_manager_service.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/config_manager_service_tests.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/device_key_api.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/dynamic_tools.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/error_code.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/filters.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/fs_api.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/fs_watch.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/fuzzy_file_search.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/in_process.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/lib.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/main.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/message_processor.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/message_processor/tracing_tests.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/models.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/outgoing_message.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/server_request_error.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/thread_state.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/thread_status.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/transport/auth.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/transport/mod.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/transport/remote_control/client_tracker.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/transport/remote_control/enroll.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/transport/remote_control/mod.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/transport/remote_control/protocol.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/transport/remote_control/tests.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/transport/remote_control/websocket.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/transport/stdio.rs delete mode 100644 vendor/codex/codex-rs/app-server/src/transport/websocket.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/all.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/common/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/app-server/tests/common/Cargo.toml delete mode 100644 vendor/codex/codex-rs/app-server/tests/common/analytics_server.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/common/auth_fixtures.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/common/config.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/common/lib.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/common/mcp_process.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/common/mock_model_server.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/common/models_cache.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/common/responses.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/common/rollout.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/auth.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/conversation_summary.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/fuzzy_file_search.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/mod.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/account.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/analytics.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/client_metadata.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/collaboration_mode_list.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/command_exec.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/compaction.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/config_rpc.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/connection_handling_websocket.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/connection_handling_websocket_unix.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/device_key.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/dynamic_tools.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/experimental_api.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/experimental_feature_list.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/fs.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/initialize.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/mcp_resource.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/mcp_server_elicitation.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/mcp_server_status.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/mcp_tool.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/memory_reset.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/mod.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/model_list.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/output_schema.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/plan_item.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/rate_limits.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/realtime_conversation.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/request_permissions.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/request_user_input.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/review.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/safety_check_downgrade.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/thread_archive.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/thread_fork.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/thread_inject_items.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/thread_list.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/thread_loaded_list.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/thread_memory_mode_set.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/thread_metadata_update.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/thread_name_websocket.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/thread_read.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/thread_resume.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/thread_rollback.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/thread_shell_command.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/thread_start.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/thread_status.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/thread_unarchive.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/thread_unsubscribe.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/turn_interrupt.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/turn_start.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/turn_start_zsh_fork.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/turn_steer.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/v2/windows_sandbox_setup.rs delete mode 100644 vendor/codex/codex-rs/app-server/tests/suite/zsh delete mode 100644 vendor/codex/codex-rs/apply-patch/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/apply-patch/Cargo.toml delete mode 100644 vendor/codex/codex-rs/apply-patch/apply_patch_tool_instructions.md delete mode 100644 vendor/codex/codex-rs/apply-patch/src/invocation.rs delete mode 100644 vendor/codex/codex-rs/apply-patch/src/lib.rs delete mode 100644 vendor/codex/codex-rs/apply-patch/src/main.rs delete mode 100644 vendor/codex/codex-rs/apply-patch/src/parser.rs delete mode 100644 vendor/codex/codex-rs/apply-patch/src/seek_sequence.rs delete mode 100644 vendor/codex/codex-rs/apply-patch/src/standalone_executable.rs delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/all.rs delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/.gitattributes delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/001_add_file/expected/bar.md delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/001_add_file/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/002_multiple_operations/expected/modify.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/002_multiple_operations/expected/nested/new.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/002_multiple_operations/input/delete.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/002_multiple_operations/input/modify.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/002_multiple_operations/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/003_multiple_chunks/expected/multi.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/003_multiple_chunks/input/multi.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/003_multiple_chunks/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/004_move_to_new_directory/expected/old/other.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/004_move_to_new_directory/expected/renamed/dir/name.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/004_move_to_new_directory/input/old/name.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/004_move_to_new_directory/input/old/other.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/004_move_to_new_directory/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/005_rejects_empty_patch/expected/foo.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/005_rejects_empty_patch/input/foo.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/005_rejects_empty_patch/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/006_rejects_missing_context/expected/modify.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/006_rejects_missing_context/input/modify.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/006_rejects_missing_context/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/007_rejects_missing_file_delete/expected/foo.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/007_rejects_missing_file_delete/input/foo.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/007_rejects_missing_file_delete/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/008_rejects_empty_update_hunk/expected/foo.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/008_rejects_empty_update_hunk/input/foo.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/008_rejects_empty_update_hunk/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/009_requires_existing_file_for_update/expected/foo.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/009_requires_existing_file_for_update/input/foo.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/009_requires_existing_file_for_update/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/010_move_overwrites_existing_destination/expected/old/other.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/010_move_overwrites_existing_destination/expected/renamed/dir/name.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/010_move_overwrites_existing_destination/input/old/name.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/010_move_overwrites_existing_destination/input/old/other.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/010_move_overwrites_existing_destination/input/renamed/dir/name.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/010_move_overwrites_existing_destination/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/011_add_overwrites_existing_file/expected/duplicate.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/011_add_overwrites_existing_file/input/duplicate.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/011_add_overwrites_existing_file/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/012_delete_directory_fails/expected/dir/foo.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/012_delete_directory_fails/input/dir/foo.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/012_delete_directory_fails/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/013_rejects_invalid_hunk_header/expected/foo.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/013_rejects_invalid_hunk_header/input/foo.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/013_rejects_invalid_hunk_header/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/014_update_file_appends_trailing_newline/expected/no_newline.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/014_update_file_appends_trailing_newline/input/no_newline.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/014_update_file_appends_trailing_newline/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/015_failure_after_partial_success_leaves_changes/expected/created.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/015_failure_after_partial_success_leaves_changes/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/016_pure_addition_update_chunk/expected/input.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/016_pure_addition_update_chunk/input/input.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/016_pure_addition_update_chunk/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/017_whitespace_padded_hunk_header/expected/foo.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/017_whitespace_padded_hunk_header/input/foo.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/017_whitespace_padded_hunk_header/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/018_whitespace_padded_patch_markers/expected/file.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/018_whitespace_padded_patch_markers/input/file.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/018_whitespace_padded_patch_markers/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/019_unicode_simple/expected/foo.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/019_unicode_simple/input/foo.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/019_unicode_simple/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/020_delete_file_success/expected/keep.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/020_delete_file_success/input/keep.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/020_delete_file_success/input/obsolete.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/020_delete_file_success/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/020_whitespace_padded_patch_marker_lines/expected/file.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/020_whitespace_padded_patch_marker_lines/input/file.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/020_whitespace_padded_patch_marker_lines/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/021_update_file_deletion_only/expected/lines.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/021_update_file_deletion_only/input/lines.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/021_update_file_deletion_only/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/022_update_file_end_of_file_marker/expected/tail.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/022_update_file_end_of_file_marker/input/tail.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/022_update_file_end_of_file_marker/patch.txt delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/fixtures/scenarios/README.md delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/suite/cli.rs delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/suite/mod.rs delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/suite/scenarios.rs delete mode 100644 vendor/codex/codex-rs/apply-patch/tests/suite/tool.rs delete mode 100644 vendor/codex/codex-rs/arg0/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/arg0/Cargo.toml delete mode 100644 vendor/codex/codex-rs/arg0/src/lib.rs delete mode 100644 vendor/codex/codex-rs/async-utils/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/async-utils/Cargo.toml delete mode 100644 vendor/codex/codex-rs/async-utils/src/lib.rs delete mode 100644 vendor/codex/codex-rs/aws-auth/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/aws-auth/Cargo.toml delete mode 100644 vendor/codex/codex-rs/aws-auth/src/config.rs delete mode 100644 vendor/codex/codex-rs/aws-auth/src/lib.rs delete mode 100644 vendor/codex/codex-rs/aws-auth/src/signing.rs delete mode 100644 vendor/codex/codex-rs/backend-client/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/backend-client/Cargo.toml delete mode 100644 vendor/codex/codex-rs/backend-client/src/client.rs delete mode 100644 vendor/codex/codex-rs/backend-client/src/lib.rs delete mode 100644 vendor/codex/codex-rs/backend-client/src/types.rs delete mode 100644 vendor/codex/codex-rs/backend-client/tests/fixtures/task_details_with_diff.json delete mode 100644 vendor/codex/codex-rs/backend-client/tests/fixtures/task_details_with_error.json delete mode 100644 vendor/codex/codex-rs/cli/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/cli/Cargo.toml delete mode 100644 vendor/codex/codex-rs/cli/build.rs delete mode 100644 vendor/codex/codex-rs/cli/src/app_cmd.rs delete mode 100644 vendor/codex/codex-rs/cli/src/debug_sandbox.rs delete mode 100644 vendor/codex/codex-rs/cli/src/debug_sandbox/pid_tracker.rs delete mode 100644 vendor/codex/codex-rs/cli/src/debug_sandbox/seatbelt.rs delete mode 100644 vendor/codex/codex-rs/cli/src/desktop_app/mac.rs delete mode 100644 vendor/codex/codex-rs/cli/src/desktop_app/mod.rs delete mode 100644 vendor/codex/codex-rs/cli/src/desktop_app/windows.rs delete mode 100644 vendor/codex/codex-rs/cli/src/exit_status.rs delete mode 100644 vendor/codex/codex-rs/cli/src/lib.rs delete mode 100644 vendor/codex/codex-rs/cli/src/login.rs delete mode 100644 vendor/codex/codex-rs/cli/src/main.rs delete mode 100644 vendor/codex/codex-rs/cli/src/mcp_cmd.rs delete mode 100644 vendor/codex/codex-rs/cli/src/responses_cmd.rs delete mode 100644 vendor/codex/codex-rs/cli/src/wsl_paths.rs delete mode 100644 vendor/codex/codex-rs/cli/tests/debug_clear_memories.rs delete mode 100644 vendor/codex/codex-rs/cli/tests/debug_models.rs delete mode 100644 vendor/codex/codex-rs/cli/tests/execpolicy.rs delete mode 100644 vendor/codex/codex-rs/cli/tests/features.rs delete mode 100644 vendor/codex/codex-rs/cli/tests/mcp_add_remove.rs delete mode 100644 vendor/codex/codex-rs/cli/tests/mcp_list.rs delete mode 100644 vendor/codex/codex-rs/clippy.toml delete mode 100644 vendor/codex/codex-rs/cloud-requirements/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/cloud-requirements/Cargo.toml delete mode 100644 vendor/codex/codex-rs/cloud-requirements/src/lib.rs delete mode 100644 vendor/codex/codex-rs/cloud-tasks-client/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/cloud-tasks-client/Cargo.toml delete mode 100644 vendor/codex/codex-rs/cloud-tasks-client/src/api.rs delete mode 100644 vendor/codex/codex-rs/cloud-tasks-client/src/http.rs delete mode 100644 vendor/codex/codex-rs/cloud-tasks-client/src/lib.rs delete mode 100644 vendor/codex/codex-rs/cloud-tasks-mock-client/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/cloud-tasks-mock-client/Cargo.toml delete mode 100644 vendor/codex/codex-rs/cloud-tasks-mock-client/src/lib.rs delete mode 100644 vendor/codex/codex-rs/cloud-tasks-mock-client/src/mock.rs delete mode 100644 vendor/codex/codex-rs/cloud-tasks/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/cloud-tasks/Cargo.toml delete mode 100644 vendor/codex/codex-rs/cloud-tasks/src/app.rs delete mode 100644 vendor/codex/codex-rs/cloud-tasks/src/cli.rs delete mode 100644 vendor/codex/codex-rs/cloud-tasks/src/env_detect.rs delete mode 100644 vendor/codex/codex-rs/cloud-tasks/src/lib.rs delete mode 100644 vendor/codex/codex-rs/cloud-tasks/src/new_task.rs delete mode 100644 vendor/codex/codex-rs/cloud-tasks/src/scrollable_diff.rs delete mode 100644 vendor/codex/codex-rs/cloud-tasks/src/ui.rs delete mode 100644 vendor/codex/codex-rs/cloud-tasks/src/util.rs delete mode 100644 vendor/codex/codex-rs/cloud-tasks/tests/env_filter.rs delete mode 100644 vendor/codex/codex-rs/code-mode/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/code-mode/Cargo.toml delete mode 100644 vendor/codex/codex-rs/code-mode/src/description.rs delete mode 100644 vendor/codex/codex-rs/code-mode/src/lib.rs delete mode 100644 vendor/codex/codex-rs/code-mode/src/response.rs delete mode 100644 vendor/codex/codex-rs/code-mode/src/runtime/callbacks.rs delete mode 100644 vendor/codex/codex-rs/code-mode/src/runtime/globals.rs delete mode 100644 vendor/codex/codex-rs/code-mode/src/runtime/mod.rs delete mode 100644 vendor/codex/codex-rs/code-mode/src/runtime/module_loader.rs delete mode 100644 vendor/codex/codex-rs/code-mode/src/runtime/timers.rs delete mode 100644 vendor/codex/codex-rs/code-mode/src/runtime/value.rs delete mode 100644 vendor/codex/codex-rs/code-mode/src/service.rs delete mode 100644 vendor/codex/codex-rs/codex-api/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/codex-api/Cargo.toml delete mode 100644 vendor/codex/codex-rs/codex-api/README.md delete mode 100644 vendor/codex/codex-rs/codex-api/src/api_bridge.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/api_bridge_tests.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/auth.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/common.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/endpoint/compact.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/endpoint/memories.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/endpoint/mod.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/endpoint/models.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/endpoint/realtime_call.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/endpoint/realtime_websocket/methods.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/endpoint/realtime_websocket/methods_common.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/endpoint/realtime_websocket/methods_v1.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/endpoint/realtime_websocket/methods_v2.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/endpoint/realtime_websocket/mod.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/endpoint/realtime_websocket/protocol.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/endpoint/realtime_websocket/protocol_common.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/endpoint/realtime_websocket/protocol_v1.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/endpoint/realtime_websocket/protocol_v2.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/endpoint/responses.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/endpoint/responses_websocket.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/endpoint/session.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/error.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/files.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/lib.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/provider.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/rate_limits.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/requests/headers.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/requests/mod.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/requests/responses.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/sse/mod.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/sse/responses.rs delete mode 100644 vendor/codex/codex-rs/codex-api/src/telemetry.rs delete mode 100644 vendor/codex/codex-rs/codex-api/tests/clients.rs delete mode 100644 vendor/codex/codex-rs/codex-api/tests/models_integration.rs delete mode 100644 vendor/codex/codex-rs/codex-api/tests/realtime_websocket_e2e.rs delete mode 100644 vendor/codex/codex-rs/codex-api/tests/sse_end_to_end.rs delete mode 100644 vendor/codex/codex-rs/codex-backend-openapi-models/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/codex-backend-openapi-models/Cargo.toml delete mode 100644 vendor/codex/codex-rs/codex-backend-openapi-models/src/lib.rs delete mode 100644 vendor/codex/codex-rs/codex-backend-openapi-models/src/models/additional_rate_limit_details.rs delete mode 100644 vendor/codex/codex-rs/codex-backend-openapi-models/src/models/code_task_details_response.rs delete mode 100644 vendor/codex/codex-rs/codex-backend-openapi-models/src/models/config_file_response.rs delete mode 100644 vendor/codex/codex-rs/codex-backend-openapi-models/src/models/credit_status_details.rs delete mode 100644 vendor/codex/codex-rs/codex-backend-openapi-models/src/models/external_pull_request_response.rs delete mode 100644 vendor/codex/codex-rs/codex-backend-openapi-models/src/models/git_pull_request.rs delete mode 100644 vendor/codex/codex-rs/codex-backend-openapi-models/src/models/mod.rs delete mode 100644 vendor/codex/codex-rs/codex-backend-openapi-models/src/models/paginated_list_task_list_item_.rs delete mode 100644 vendor/codex/codex-rs/codex-backend-openapi-models/src/models/rate_limit_status_details.rs delete mode 100644 vendor/codex/codex-rs/codex-backend-openapi-models/src/models/rate_limit_status_payload.rs delete mode 100644 vendor/codex/codex-rs/codex-backend-openapi-models/src/models/rate_limit_window_snapshot.rs delete mode 100644 vendor/codex/codex-rs/codex-backend-openapi-models/src/models/task_list_item.rs delete mode 100644 vendor/codex/codex-rs/codex-backend-openapi-models/src/models/task_response.rs delete mode 100644 vendor/codex/codex-rs/codex-client/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/codex-client/Cargo.toml delete mode 100644 vendor/codex/codex-rs/codex-client/README.md delete mode 100644 vendor/codex/codex-rs/codex-client/src/bin/custom_ca_probe.rs delete mode 100644 vendor/codex/codex-rs/codex-client/src/chatgpt_cloudflare_cookies.rs delete mode 100644 vendor/codex/codex-rs/codex-client/src/chatgpt_hosts.rs delete mode 100644 vendor/codex/codex-rs/codex-client/src/custom_ca.rs delete mode 100644 vendor/codex/codex-rs/codex-client/src/default_client.rs delete mode 100644 vendor/codex/codex-rs/codex-client/src/error.rs delete mode 100644 vendor/codex/codex-rs/codex-client/src/lib.rs delete mode 100644 vendor/codex/codex-rs/codex-client/src/request.rs delete mode 100644 vendor/codex/codex-rs/codex-client/src/retry.rs delete mode 100644 vendor/codex/codex-rs/codex-client/src/sse.rs delete mode 100644 vendor/codex/codex-rs/codex-client/src/telemetry.rs delete mode 100644 vendor/codex/codex-rs/codex-client/src/transport.rs delete mode 100644 vendor/codex/codex-rs/codex-client/tests/ca_env.rs delete mode 100644 vendor/codex/codex-rs/codex-client/tests/fixtures/test-ca-trusted.pem delete mode 100644 vendor/codex/codex-rs/codex-client/tests/fixtures/test-ca.pem delete mode 100644 vendor/codex/codex-rs/codex-client/tests/fixtures/test-intermediate.pem delete mode 100644 vendor/codex/codex-rs/codex-experimental-api-macros/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/codex-experimental-api-macros/Cargo.toml delete mode 100644 vendor/codex/codex-rs/codex-experimental-api-macros/src/lib.rs delete mode 100644 vendor/codex/codex-rs/codex-mcp/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/codex-mcp/Cargo.toml delete mode 100644 vendor/codex/codex-rs/codex-mcp/src/lib.rs delete mode 100644 vendor/codex/codex-rs/codex-mcp/src/mcp/auth.rs delete mode 100644 vendor/codex/codex-rs/codex-mcp/src/mcp/mod.rs delete mode 100644 vendor/codex/codex-rs/codex-mcp/src/mcp/mod_tests.rs delete mode 100644 vendor/codex/codex-rs/codex-mcp/src/mcp_connection_manager.rs delete mode 100644 vendor/codex/codex-rs/codex-mcp/src/mcp_connection_manager_tests.rs delete mode 100644 vendor/codex/codex-rs/codex-mcp/src/mcp_tool_names.rs delete mode 100644 vendor/codex/codex-rs/collaboration-mode-templates/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/collaboration-mode-templates/Cargo.toml delete mode 100644 vendor/codex/codex-rs/collaboration-mode-templates/src/lib.rs delete mode 100644 vendor/codex/codex-rs/collaboration-mode-templates/templates/default.md delete mode 100644 vendor/codex/codex-rs/collaboration-mode-templates/templates/execute.md delete mode 100644 vendor/codex/codex-rs/collaboration-mode-templates/templates/pair_programming.md delete mode 100644 vendor/codex/codex-rs/collaboration-mode-templates/templates/plan.md delete mode 100644 vendor/codex/codex-rs/config.md delete mode 100644 vendor/codex/codex-rs/config/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/config/Cargo.toml delete mode 100644 vendor/codex/codex-rs/config/src/cloud_requirements.rs delete mode 100644 vendor/codex/codex-rs/config/src/config_requirements.rs delete mode 100644 vendor/codex/codex-rs/config/src/config_toml.rs delete mode 100644 vendor/codex/codex-rs/config/src/constraint.rs delete mode 100644 vendor/codex/codex-rs/config/src/diagnostics.rs delete mode 100644 vendor/codex/codex-rs/config/src/fingerprint.rs delete mode 100644 vendor/codex/codex-rs/config/src/host_name.rs delete mode 100644 vendor/codex/codex-rs/config/src/key_aliases.rs delete mode 100644 vendor/codex/codex-rs/config/src/lib.rs delete mode 100644 vendor/codex/codex-rs/config/src/mcp_edit.rs delete mode 100644 vendor/codex/codex-rs/config/src/mcp_edit_tests.rs delete mode 100644 vendor/codex/codex-rs/config/src/mcp_types.rs delete mode 100644 vendor/codex/codex-rs/config/src/mcp_types_tests.rs delete mode 100644 vendor/codex/codex-rs/config/src/merge.rs delete mode 100644 vendor/codex/codex-rs/config/src/merge_tests.rs delete mode 100644 vendor/codex/codex-rs/config/src/overrides.rs delete mode 100644 vendor/codex/codex-rs/config/src/permissions_toml.rs delete mode 100644 vendor/codex/codex-rs/config/src/profile_toml.rs delete mode 100644 vendor/codex/codex-rs/config/src/project_root_markers.rs delete mode 100644 vendor/codex/codex-rs/config/src/requirements_exec_policy.rs delete mode 100644 vendor/codex/codex-rs/config/src/schema.rs delete mode 100644 vendor/codex/codex-rs/config/src/shell_environment.rs delete mode 100644 vendor/codex/codex-rs/config/src/state.rs delete mode 100644 vendor/codex/codex-rs/config/src/state_tests.rs delete mode 100644 vendor/codex/codex-rs/config/src/thread_config.rs delete mode 100644 vendor/codex/codex-rs/config/src/types.rs delete mode 100644 vendor/codex/codex-rs/config/src/types_tests.rs delete mode 100644 vendor/codex/codex-rs/core/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/core/Cargo.toml delete mode 100644 vendor/codex/codex-rs/core/README.md delete mode 100644 vendor/codex/codex-rs/core/config.schema.json delete mode 100644 vendor/codex/codex-rs/core/gpt-5.1-codex-max_prompt.md delete mode 100644 vendor/codex/codex-rs/core/gpt-5.2-codex_prompt.md delete mode 100644 vendor/codex/codex-rs/core/gpt_5_1_prompt.md delete mode 100644 vendor/codex/codex-rs/core/gpt_5_2_prompt.md delete mode 100644 vendor/codex/codex-rs/core/gpt_5_codex_prompt.md delete mode 100644 vendor/codex/codex-rs/core/hierarchical_agents_message.md delete mode 100644 vendor/codex/codex-rs/core/prompt_with_apply_patch_instructions.md delete mode 100644 vendor/codex/codex-rs/core/review_prompt.md delete mode 100644 vendor/codex/codex-rs/core/src/agent/agent_names.txt delete mode 100644 vendor/codex/codex-rs/core/src/agent/agent_resolver.rs delete mode 100644 vendor/codex/codex-rs/core/src/agent/builtins/awaiter.toml delete mode 100644 vendor/codex/codex-rs/core/src/agent/builtins/explorer.toml delete mode 100644 vendor/codex/codex-rs/core/src/agent/control.rs delete mode 100644 vendor/codex/codex-rs/core/src/agent/control_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/agent/mailbox.rs delete mode 100644 vendor/codex/codex-rs/core/src/agent/mod.rs delete mode 100644 vendor/codex/codex-rs/core/src/agent/registry.rs delete mode 100644 vendor/codex/codex-rs/core/src/agent/registry_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/agent/role.rs delete mode 100644 vendor/codex/codex-rs/core/src/agent/role_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/agent/status.rs delete mode 100644 vendor/codex/codex-rs/core/src/agents_md.rs delete mode 100644 vendor/codex/codex-rs/core/src/agents_md_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/apply_patch.rs delete mode 100644 vendor/codex/codex-rs/core/src/apply_patch_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/apps/mod.rs delete mode 100644 vendor/codex/codex-rs/core/src/arc_monitor.rs delete mode 100644 vendor/codex/codex-rs/core/src/arc_monitor_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/bin/config_schema.rs delete mode 100644 vendor/codex/codex-rs/core/src/client.rs delete mode 100644 vendor/codex/codex-rs/core/src/client_common.rs delete mode 100644 vendor/codex/codex-rs/core/src/client_common_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/client_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/codex_delegate.rs delete mode 100644 vendor/codex/codex-rs/core/src/codex_delegate_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/codex_thread.rs delete mode 100644 vendor/codex/codex-rs/core/src/command_canonicalization.rs delete mode 100644 vendor/codex/codex-rs/core/src/command_canonicalization_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/commit_attribution.rs delete mode 100644 vendor/codex/codex-rs/core/src/commit_attribution_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/compact.rs delete mode 100644 vendor/codex/codex-rs/core/src/compact_remote.rs delete mode 100644 vendor/codex/codex-rs/core/src/compact_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/config/agent_roles.rs delete mode 100644 vendor/codex/codex-rs/core/src/config/config_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/config/edit.rs delete mode 100644 vendor/codex/codex-rs/core/src/config/edit_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/config/managed_features.rs delete mode 100644 vendor/codex/codex-rs/core/src/config/mod.rs delete mode 100644 vendor/codex/codex-rs/core/src/config/network_proxy_spec.rs delete mode 100644 vendor/codex/codex-rs/core/src/config/network_proxy_spec_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/config/permissions.rs delete mode 100644 vendor/codex/codex-rs/core/src/config/permissions_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/config/schema.md delete mode 100644 vendor/codex/codex-rs/core/src/config/schema.rs delete mode 100644 vendor/codex/codex-rs/core/src/config/schema_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/config_loader/README.md delete mode 100644 vendor/codex/codex-rs/core/src/config_loader/layer_io.rs delete mode 100644 vendor/codex/codex-rs/core/src/config_loader/macos.rs delete mode 100644 vendor/codex/codex-rs/core/src/config_loader/mod.rs delete mode 100644 vendor/codex/codex-rs/core/src/config_loader/tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/approved_command_prefix_saved.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/collaboration_mode_instructions.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/contextual_user_message.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/contextual_user_message_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/environment_context.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/environment_context_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/fragment.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/guardian_followup_review_reminder.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/hook_additional_context.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/image_generation_instructions.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/mod.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/model_switch_instructions.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/network_rule_saved.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/permissions_instructions.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/permissions_instructions_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/personality_spec_instructions.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/prompts/permissions/approval_policy/never.md delete mode 100644 vendor/codex/codex-rs/core/src/context/prompts/permissions/approval_policy/on_failure.md delete mode 100644 vendor/codex/codex-rs/core/src/context/prompts/permissions/approval_policy/on_request.md delete mode 100644 vendor/codex/codex-rs/core/src/context/prompts/permissions/approval_policy/on_request_rule_request_permission.md delete mode 100644 vendor/codex/codex-rs/core/src/context/prompts/permissions/approval_policy/unless_trusted.md delete mode 100644 vendor/codex/codex-rs/core/src/context/prompts/permissions/sandbox_mode/danger_full_access.md delete mode 100644 vendor/codex/codex-rs/core/src/context/prompts/permissions/sandbox_mode/read_only.md delete mode 100644 vendor/codex/codex-rs/core/src/context/prompts/permissions/sandbox_mode/workspace_write.md delete mode 100644 vendor/codex/codex-rs/core/src/context/prompts/realtime/realtime_end.md delete mode 100644 vendor/codex/codex-rs/core/src/context/prompts/realtime/realtime_start.md delete mode 100644 vendor/codex/codex-rs/core/src/context/realtime_end_instructions.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/realtime_start_instructions.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/realtime_start_with_instructions.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/spawn_agent_instructions.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/subagent_notification.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/turn_aborted.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/user_instructions.rs delete mode 100644 vendor/codex/codex-rs/core/src/context/user_shell_command.rs delete mode 100644 vendor/codex/codex-rs/core/src/context_manager/history.rs delete mode 100644 vendor/codex/codex-rs/core/src/context_manager/history_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/context_manager/mod.rs delete mode 100644 vendor/codex/codex-rs/core/src/context_manager/normalize.rs delete mode 100644 vendor/codex/codex-rs/core/src/context_manager/updates.rs delete mode 100644 vendor/codex/codex-rs/core/src/event_mapping.rs delete mode 100644 vendor/codex/codex-rs/core/src/event_mapping_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/exec.rs delete mode 100644 vendor/codex/codex-rs/core/src/exec_env.rs delete mode 100644 vendor/codex/codex-rs/core/src/exec_env_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/exec_policy.rs delete mode 100644 vendor/codex/codex-rs/core/src/exec_policy_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/exec_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/file_watcher.rs delete mode 100644 vendor/codex/codex-rs/core/src/file_watcher_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/flags.rs delete mode 100644 vendor/codex/codex-rs/core/src/function_tool.rs delete mode 100644 vendor/codex/codex-rs/core/src/git_info_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/guardian/approval_request.rs delete mode 100644 vendor/codex/codex-rs/core/src/guardian/mod.rs delete mode 100644 vendor/codex/codex-rs/core/src/guardian/policy.md delete mode 100644 vendor/codex/codex-rs/core/src/guardian/policy_template.md delete mode 100644 vendor/codex/codex-rs/core/src/guardian/prompt.rs delete mode 100644 vendor/codex/codex-rs/core/src/guardian/review.rs delete mode 100644 vendor/codex/codex-rs/core/src/guardian/review_session.rs delete mode 100644 vendor/codex/codex-rs/core/src/guardian/snapshots/codex_core__guardian__tests__guardian_followup_review_request_layout.snap delete mode 100644 vendor/codex/codex-rs/core/src/guardian/snapshots/codex_core__guardian__tests__guardian_review_request_layout.snap delete mode 100644 vendor/codex/codex-rs/core/src/guardian/tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/hook_runtime.rs delete mode 100644 vendor/codex/codex-rs/core/src/installation_id.rs delete mode 100644 vendor/codex/codex-rs/core/src/landlock.rs delete mode 100644 vendor/codex/codex-rs/core/src/lib.rs delete mode 100644 vendor/codex/codex-rs/core/src/mcp.rs delete mode 100644 vendor/codex/codex-rs/core/src/mcp_openai_file.rs delete mode 100644 vendor/codex/codex-rs/core/src/mcp_tool_approval_templates.rs delete mode 100644 vendor/codex/codex-rs/core/src/mcp_tool_call.rs delete mode 100644 vendor/codex/codex-rs/core/src/mcp_tool_call_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/mcp_tool_exposure.rs delete mode 100644 vendor/codex/codex-rs/core/src/mcp_tool_exposure_test.rs delete mode 100644 vendor/codex/codex-rs/core/src/memories/README.md delete mode 100644 vendor/codex/codex-rs/core/src/memories/citations.rs delete mode 100644 vendor/codex/codex-rs/core/src/memories/citations_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/memories/control.rs delete mode 100644 vendor/codex/codex-rs/core/src/memories/extensions.rs delete mode 100644 vendor/codex/codex-rs/core/src/memories/mod.rs delete mode 100644 vendor/codex/codex-rs/core/src/memories/phase1.rs delete mode 100644 vendor/codex/codex-rs/core/src/memories/phase1_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/memories/phase2.rs delete mode 100644 vendor/codex/codex-rs/core/src/memories/prompts.rs delete mode 100644 vendor/codex/codex-rs/core/src/memories/prompts_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/memories/start.rs delete mode 100644 vendor/codex/codex-rs/core/src/memories/storage.rs delete mode 100644 vendor/codex/codex-rs/core/src/memories/storage_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/memories/tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/memories/usage.rs delete mode 100644 vendor/codex/codex-rs/core/src/memory_trace.rs delete mode 100644 vendor/codex/codex-rs/core/src/memory_trace_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/mention_syntax.rs delete mode 100644 vendor/codex/codex-rs/core/src/message_history.rs delete mode 100644 vendor/codex/codex-rs/core/src/message_history_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/network_policy_decision.rs delete mode 100644 vendor/codex/codex-rs/core/src/network_policy_decision_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/network_proxy_loader.rs delete mode 100644 vendor/codex/codex-rs/core/src/network_proxy_loader_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/original_image_detail.rs delete mode 100644 vendor/codex/codex-rs/core/src/otel_init.rs delete mode 100644 vendor/codex/codex-rs/core/src/personality_migration.rs delete mode 100644 vendor/codex/codex-rs/core/src/personality_migration_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/prompt_debug.rs delete mode 100644 vendor/codex/codex-rs/core/src/realtime_context.rs delete mode 100644 vendor/codex/codex-rs/core/src/realtime_context_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/realtime_conversation.rs delete mode 100644 vendor/codex/codex-rs/core/src/realtime_conversation_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/realtime_prompt.rs delete mode 100644 vendor/codex/codex-rs/core/src/review_format.rs delete mode 100644 vendor/codex/codex-rs/core/src/review_prompts.rs delete mode 100644 vendor/codex/codex-rs/core/src/rollout.rs delete mode 100644 vendor/codex/codex-rs/core/src/safety.rs delete mode 100644 vendor/codex/codex-rs/core/src/safety_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/sandbox_tags.rs delete mode 100644 vendor/codex/codex-rs/core/src/sandbox_tags_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/sandboxing/mod.rs delete mode 100644 vendor/codex/codex-rs/core/src/session/handlers.rs delete mode 100644 vendor/codex/codex-rs/core/src/session/mcp.rs delete mode 100644 vendor/codex/codex-rs/core/src/session/mod.rs delete mode 100644 vendor/codex/codex-rs/core/src/session/review.rs delete mode 100644 vendor/codex/codex-rs/core/src/session/rollout_reconstruction.rs delete mode 100644 vendor/codex/codex-rs/core/src/session/rollout_reconstruction_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/session/session.rs delete mode 100644 vendor/codex/codex-rs/core/src/session/snapshots/codex_core__codex_tests__fork_startup_context_then_first_turn_diff.snap delete mode 100644 vendor/codex/codex-rs/core/src/session/tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/session/tests/guardian_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/session/turn.rs delete mode 100644 vendor/codex/codex-rs/core/src/session/turn_context.rs delete mode 100644 vendor/codex/codex-rs/core/src/session_prefix.rs delete mode 100644 vendor/codex/codex-rs/core/src/session_rollout_init_error.rs delete mode 100644 vendor/codex/codex-rs/core/src/session_startup_prewarm.rs delete mode 100644 vendor/codex/codex-rs/core/src/shell.rs delete mode 100644 vendor/codex/codex-rs/core/src/shell_detect.rs delete mode 100644 vendor/codex/codex-rs/core/src/shell_snapshot.rs delete mode 100644 vendor/codex/codex-rs/core/src/shell_snapshot_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/shell_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/spawn.rs delete mode 100644 vendor/codex/codex-rs/core/src/state/mod.rs delete mode 100644 vendor/codex/codex-rs/core/src/state/service.rs delete mode 100644 vendor/codex/codex-rs/core/src/state/session.rs delete mode 100644 vendor/codex/codex-rs/core/src/state/turn.rs delete mode 100644 vendor/codex/codex-rs/core/src/state_db_bridge.rs delete mode 100644 vendor/codex/codex-rs/core/src/stream_events_utils.rs delete mode 100644 vendor/codex/codex-rs/core/src/stream_events_utils_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tasks/compact.rs delete mode 100644 vendor/codex/codex-rs/core/src/tasks/ghost_snapshot.rs delete mode 100644 vendor/codex/codex-rs/core/src/tasks/ghost_snapshot_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tasks/mod.rs delete mode 100644 vendor/codex/codex-rs/core/src/tasks/mod_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tasks/regular.rs delete mode 100644 vendor/codex/codex-rs/core/src/tasks/review.rs delete mode 100644 vendor/codex/codex-rs/core/src/tasks/undo.rs delete mode 100644 vendor/codex/codex-rs/core/src/tasks/user_shell.rs delete mode 100644 vendor/codex/codex-rs/core/src/test_support.rs delete mode 100644 vendor/codex/codex-rs/core/src/thread_manager.rs delete mode 100644 vendor/codex/codex-rs/core/src/thread_manager_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/thread_rollout_truncation.rs delete mode 100644 vendor/codex/codex-rs/core/src/thread_rollout_truncation_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/code_mode/execute_handler.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/code_mode/execute_handler_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/code_mode/mod.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/code_mode/response_adapter.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/code_mode/wait_handler.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/context.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/context_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/events.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/apply_patch.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/apply_patch_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/dynamic.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/grep_files_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/js_repl.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/js_repl_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/list_dir.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/list_dir_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/mcp.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/mcp_resource.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/mcp_resource_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/mod.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/multi_agents.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/multi_agents/close_agent.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/multi_agents/resume_agent.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/multi_agents/send_input.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/multi_agents/spawn.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/multi_agents/wait.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/multi_agents_common.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/multi_agents_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/multi_agents_v2.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/multi_agents_v2/close_agent.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/multi_agents_v2/followup_task.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/multi_agents_v2/list_agents.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/multi_agents_v2/message_tool.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/multi_agents_v2/send_message.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/multi_agents_v2/spawn.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/multi_agents_v2/wait.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/plan.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/read_file_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/request_permissions.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/request_user_input.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/request_user_input_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/shell.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/shell_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/test_sync.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/tool_search.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/unavailable_tool.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/unified_exec.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/unified_exec_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/handlers/view_image.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/hook_names.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/js_repl/kernel.js delete mode 100644 vendor/codex/codex-rs/core/src/tools/js_repl/meriyah.umd.min.js delete mode 100644 vendor/codex/codex-rs/core/src/tools/js_repl/mod.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/js_repl/mod_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/mod.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/network_approval.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/network_approval_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/orchestrator.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/parallel.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/registry.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/registry_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/router.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/router_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/runtimes/apply_patch.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/runtimes/apply_patch_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/runtimes/mod.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/runtimes/mod_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/runtimes/shell.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/runtimes/shell/unix_escalation.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/runtimes/shell/unix_escalation_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/runtimes/shell/zsh_fork_backend.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/runtimes/unified_exec.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/sandboxing.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/sandboxing_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/spec.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/spec_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/tools/tool_search_entry.rs delete mode 100644 vendor/codex/codex-rs/core/src/turn_diff_tracker.rs delete mode 100644 vendor/codex/codex-rs/core/src/turn_diff_tracker_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/turn_metadata.rs delete mode 100644 vendor/codex/codex-rs/core/src/turn_metadata_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/turn_timing.rs delete mode 100644 vendor/codex/codex-rs/core/src/turn_timing_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/unavailable_tool.rs delete mode 100644 vendor/codex/codex-rs/core/src/unified_exec/async_watcher.rs delete mode 100644 vendor/codex/codex-rs/core/src/unified_exec/async_watcher_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/unified_exec/errors.rs delete mode 100644 vendor/codex/codex-rs/core/src/unified_exec/head_tail_buffer.rs delete mode 100644 vendor/codex/codex-rs/core/src/unified_exec/head_tail_buffer_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/unified_exec/mod.rs delete mode 100644 vendor/codex/codex-rs/core/src/unified_exec/mod_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/unified_exec/process.rs delete mode 100644 vendor/codex/codex-rs/core/src/unified_exec/process_manager.rs delete mode 100644 vendor/codex/codex-rs/core/src/unified_exec/process_manager_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/unified_exec/process_state.rs delete mode 100644 vendor/codex/codex-rs/core/src/unified_exec/process_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/user_shell_command.rs delete mode 100644 vendor/codex/codex-rs/core/src/user_shell_command_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/util.rs delete mode 100644 vendor/codex/codex-rs/core/src/util_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/utils/mod.rs delete mode 100644 vendor/codex/codex-rs/core/src/utils/path_utils.rs delete mode 100644 vendor/codex/codex-rs/core/src/web_search.rs delete mode 100644 vendor/codex/codex-rs/core/src/windows_sandbox.rs delete mode 100644 vendor/codex/codex-rs/core/src/windows_sandbox_read_grants.rs delete mode 100644 vendor/codex/codex-rs/core/src/windows_sandbox_read_grants_tests.rs delete mode 100644 vendor/codex/codex-rs/core/src/windows_sandbox_tests.rs delete mode 100644 vendor/codex/codex-rs/core/templates/agents/orchestrator.md delete mode 100644 vendor/codex/codex-rs/core/templates/collab/experimental_prompt.md delete mode 100644 vendor/codex/codex-rs/core/templates/compact/prompt.md delete mode 100644 vendor/codex/codex-rs/core/templates/compact/summary_prefix.md delete mode 100644 vendor/codex/codex-rs/core/templates/memories/consolidation.md delete mode 100644 vendor/codex/codex-rs/core/templates/memories/read_path.md delete mode 100644 vendor/codex/codex-rs/core/templates/memories/stage_one_input.md delete mode 100644 vendor/codex/codex-rs/core/templates/memories/stage_one_system.md delete mode 100644 vendor/codex/codex-rs/core/templates/model_instructions/gpt-5.2-codex_instructions_template.md delete mode 100644 vendor/codex/codex-rs/core/templates/personalities/gpt-5.2-codex_friendly.md delete mode 100644 vendor/codex/codex-rs/core/templates/personalities/gpt-5.2-codex_pragmatic.md delete mode 100644 vendor/codex/codex-rs/core/templates/realtime/backend_prompt.md delete mode 100644 vendor/codex/codex-rs/core/templates/review/exit_interrupted.xml delete mode 100644 vendor/codex/codex-rs/core/templates/review/exit_success.xml delete mode 100644 vendor/codex/codex-rs/core/templates/review/history_message_completed.md delete mode 100644 vendor/codex/codex-rs/core/templates/review/history_message_interrupted.md delete mode 100644 vendor/codex/codex-rs/core/templates/search_tool/tool_description.md delete mode 100644 vendor/codex/codex-rs/core/tests/all.rs delete mode 100644 vendor/codex/codex-rs/core/tests/cli_responses_fixture.sse delete mode 100644 vendor/codex/codex-rs/core/tests/common/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/core/tests/common/Cargo.toml delete mode 100644 vendor/codex/codex-rs/core/tests/common/context_snapshot.rs delete mode 100644 vendor/codex/codex-rs/core/tests/common/lib.rs delete mode 100644 vendor/codex/codex-rs/core/tests/common/mcp_test_server.rs delete mode 100644 vendor/codex/codex-rs/core/tests/common/process.rs delete mode 100644 vendor/codex/codex-rs/core/tests/common/responses.rs delete mode 100644 vendor/codex/codex-rs/core/tests/common/streaming_sse.rs delete mode 100644 vendor/codex/codex-rs/core/tests/common/test_codex.rs delete mode 100644 vendor/codex/codex-rs/core/tests/common/test_codex_exec.rs delete mode 100644 vendor/codex/codex-rs/core/tests/common/tracing.rs delete mode 100644 vendor/codex/codex-rs/core/tests/common/zsh_fork.rs delete mode 100644 vendor/codex/codex-rs/core/tests/fixtures/incomplete_sse.json delete mode 100644 vendor/codex/codex-rs/core/tests/responses_headers.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/abort_tasks.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/agent_websocket.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/agents_md.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/apply_patch_cli.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/approvals.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/cli_stream.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/client.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/client_websockets.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/code_mode.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/codex_delegate.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/collaboration_instructions.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/compact.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/compact_remote.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/compact_resume_fork.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/deprecation_notice.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/exec.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/exec_policy.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/fork_thread.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/hierarchical_agents.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/hooks.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/image_rollout.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/items.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/js_repl.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/json_result.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/live_cli.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/memories.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/mod.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/model_overrides.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/model_switching.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/model_visible_layout.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/models_cache_ttl.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/models_etag_responses.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/otel.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/override_updates.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/pending_input.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/permissions_messages.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/personality.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/personality_migration.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/prompt_caching.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/prompt_debug_tests.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/quota_exceeded.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/realtime_conversation.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/remote_env.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/remote_models.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/request_compression.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/request_permissions.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/request_permissions_tool.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/request_user_input.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/responses_api_proxy_headers.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/resume.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/resume_warning.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/review.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/rmcp_client.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/rollout_list_find.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/safety_check_downgrade.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/search_tool.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/shell_command.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/shell_serialization.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/shell_snapshot.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact__manual_compact_with_history_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact__manual_compact_without_prev_user_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact__mid_turn_compaction_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact__pre_sampling_model_switch_compaction_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact__pre_turn_compaction_context_window_exceeded_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact__pre_turn_compaction_including_incoming_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact__pre_turn_compaction_strips_incoming_model_switch_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_compact_resume_restates_realtime_end_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_manual_compact_restates_realtime_start_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_manual_compact_with_history_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_manual_compact_without_prev_user_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_mid_turn_compaction_does_not_restate_realtime_end_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_mid_turn_compaction_multi_summary_reinjects_above_last_summary_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_mid_turn_compaction_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_mid_turn_compaction_summary_only_reinjects_context_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_context_window_exceeded_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_failure_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_including_incoming_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_restates_realtime_end_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_restates_realtime_start_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_strips_incoming_model_switch_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact_resume_fork__rollback_followup_turn_trims_context_updates.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__compact_resume_fork__rollback_past_compaction_shapes.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__model_visible_layout__model_visible_layout_cwd_change_does_not_refresh_agents.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__model_visible_layout__model_visible_layout_environment_context_includes_one_subagent.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__model_visible_layout__model_visible_layout_environment_context_includes_two_subagents.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__model_visible_layout__model_visible_layout_resume_override_matches_rollout_model.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__model_visible_layout__model_visible_layout_resume_with_personality_change.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__model_visible_layout__model_visible_layout_turn_overrides.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__pending_input__pending_input_queued_mail_after_commentary.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__pending_input__pending_input_queued_mail_after_reasoning.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__pending_input__pending_input_user_input_no_preempt_after_reasoning.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__realtime_conversation__conversation_startup_context_current_thread_selects_many_turns_by_budget.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__realtime_conversation__conversation_user_text_turn_is_capped_when_mirrored_to_realtime.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/snapshots/all__suite__realtime_conversation__conversation_user_text_turn_is_sent_to_realtime_when_active.snap delete mode 100644 vendor/codex/codex-rs/core/tests/suite/spawn_agent_description.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/sqlite_state.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/stream_error_allows_next_turn.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/stream_no_completed.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/subagent_notifications.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/tool_harness.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/tool_parallelism.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/tools.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/truncation.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/turn_state.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/undo.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/unified_exec.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/unstable_features_warning.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/user_notification.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/user_shell_cmd.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/view_image.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/web_search.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/websocket_fallback.rs delete mode 100644 vendor/codex/codex-rs/core/tests/suite/window_headers.rs delete mode 100644 vendor/codex/codex-rs/debug-client/Cargo.toml delete mode 100644 vendor/codex/codex-rs/debug-client/README.md delete mode 100644 vendor/codex/codex-rs/debug-client/src/client.rs delete mode 100644 vendor/codex/codex-rs/debug-client/src/commands.rs delete mode 100644 vendor/codex/codex-rs/debug-client/src/main.rs delete mode 100644 vendor/codex/codex-rs/debug-client/src/output.rs delete mode 100644 vendor/codex/codex-rs/debug-client/src/reader.rs delete mode 100644 vendor/codex/codex-rs/debug-client/src/state.rs delete mode 100644 vendor/codex/codex-rs/default.nix delete mode 100644 vendor/codex/codex-rs/deny.toml delete mode 100644 vendor/codex/codex-rs/device-key/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/device-key/Cargo.toml delete mode 100644 vendor/codex/codex-rs/device-key/src/lib.rs delete mode 100644 vendor/codex/codex-rs/device-key/src/platform.rs delete mode 100644 vendor/codex/codex-rs/docs/bazel.md delete mode 100644 vendor/codex/codex-rs/docs/codex_mcp_interface.md delete mode 100644 vendor/codex/codex-rs/docs/protocol_v1.md delete mode 100644 vendor/codex/codex-rs/exec-server/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/exec-server/Cargo.toml delete mode 100644 vendor/codex/codex-rs/exec-server/README.md delete mode 100644 vendor/codex/codex-rs/exec-server/src/client.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/client/http_client.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/client/http_response_body_stream.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/client/reqwest_http_client.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/client/rpc_http_client.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/client_api.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/connection.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/environment.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/file_system.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/fs_helper.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/fs_helper_main.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/fs_sandbox.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/lib.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/local_file_system.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/local_process.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/process.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/process_id.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/protocol.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/remote_file_system.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/remote_process.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/rpc.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/runtime_paths.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/sandboxed_file_system.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/server.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/server/file_system_handler.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/server/handler.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/server/handler/tests.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/server/jsonrpc.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/server/process_handler.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/server/processor.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/server/registry.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/server/session_registry.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/server/transport.rs delete mode 100644 vendor/codex/codex-rs/exec-server/src/server/transport_tests.rs delete mode 100644 vendor/codex/codex-rs/exec-server/tests/common/exec_server.rs delete mode 100644 vendor/codex/codex-rs/exec-server/tests/common/mod.rs delete mode 100644 vendor/codex/codex-rs/exec-server/tests/exec_process.rs delete mode 100644 vendor/codex/codex-rs/exec-server/tests/file_system.rs delete mode 100644 vendor/codex/codex-rs/exec-server/tests/http_client.rs delete mode 100644 vendor/codex/codex-rs/exec-server/tests/http_request.rs delete mode 100644 vendor/codex/codex-rs/exec-server/tests/initialize.rs delete mode 100644 vendor/codex/codex-rs/exec-server/tests/process.rs delete mode 100644 vendor/codex/codex-rs/exec-server/tests/websocket.rs delete mode 100644 vendor/codex/codex-rs/exec/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/exec/Cargo.toml delete mode 100644 vendor/codex/codex-rs/exec/src/cli.rs delete mode 100644 vendor/codex/codex-rs/exec/src/cli_tests.rs delete mode 100644 vendor/codex/codex-rs/exec/src/event_processor.rs delete mode 100644 vendor/codex/codex-rs/exec/src/event_processor_with_human_output.rs delete mode 100644 vendor/codex/codex-rs/exec/src/event_processor_with_human_output_tests.rs delete mode 100644 vendor/codex/codex-rs/exec/src/event_processor_with_jsonl_output.rs delete mode 100644 vendor/codex/codex-rs/exec/src/event_processor_with_jsonl_output_tests.rs delete mode 100644 vendor/codex/codex-rs/exec/src/exec_events.rs delete mode 100644 vendor/codex/codex-rs/exec/src/lib.rs delete mode 100644 vendor/codex/codex-rs/exec/src/lib_tests.rs delete mode 100644 vendor/codex/codex-rs/exec/src/main.rs delete mode 100644 vendor/codex/codex-rs/exec/src/main_tests.rs delete mode 100644 vendor/codex/codex-rs/exec/tests/all.rs delete mode 100644 vendor/codex/codex-rs/exec/tests/event_processor_with_json_output.rs delete mode 100644 vendor/codex/codex-rs/exec/tests/fixtures/apply_patch_freeform_final.txt delete mode 100644 vendor/codex/codex-rs/exec/tests/fixtures/cli_responses_fixture.sse delete mode 100644 vendor/codex/codex-rs/exec/tests/suite/add_dir.rs delete mode 100644 vendor/codex/codex-rs/exec/tests/suite/apply_patch.rs delete mode 100644 vendor/codex/codex-rs/exec/tests/suite/auth_env.rs delete mode 100644 vendor/codex/codex-rs/exec/tests/suite/ephemeral.rs delete mode 100644 vendor/codex/codex-rs/exec/tests/suite/mcp_required_exit.rs delete mode 100644 vendor/codex/codex-rs/exec/tests/suite/mod.rs delete mode 100644 vendor/codex/codex-rs/exec/tests/suite/originator.rs delete mode 100644 vendor/codex/codex-rs/exec/tests/suite/output_schema.rs delete mode 100644 vendor/codex/codex-rs/exec/tests/suite/prompt_stdin.rs delete mode 100644 vendor/codex/codex-rs/exec/tests/suite/resume.rs delete mode 100644 vendor/codex/codex-rs/exec/tests/suite/sandbox.rs delete mode 100644 vendor/codex/codex-rs/exec/tests/suite/server_error_exit.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/Cargo.toml delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/README.md delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/build.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/src/arg_matcher.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/src/arg_resolver.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/src/arg_type.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/src/default.policy delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/src/error.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/src/exec_call.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/src/execv_checker.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/src/lib.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/src/main.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/src/opt.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/src/policy.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/src/policy_parser.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/src/program.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/src/sed_command.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/src/valid_exec.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/tests/all.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/tests/suite/bad.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/tests/suite/cp.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/tests/suite/good.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/tests/suite/head.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/tests/suite/literal.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/tests/suite/ls.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/tests/suite/mod.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/tests/suite/parse_sed_command.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/tests/suite/pwd.rs delete mode 100644 vendor/codex/codex-rs/execpolicy-legacy/tests/suite/sed.rs delete mode 100644 vendor/codex/codex-rs/execpolicy/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/execpolicy/Cargo.toml delete mode 100644 vendor/codex/codex-rs/execpolicy/README.md delete mode 100644 vendor/codex/codex-rs/execpolicy/examples/example.codexpolicy delete mode 100644 vendor/codex/codex-rs/execpolicy/src/amend.rs delete mode 100644 vendor/codex/codex-rs/execpolicy/src/decision.rs delete mode 100644 vendor/codex/codex-rs/execpolicy/src/error.rs delete mode 100644 vendor/codex/codex-rs/execpolicy/src/execpolicycheck.rs delete mode 100644 vendor/codex/codex-rs/execpolicy/src/executable_name.rs delete mode 100644 vendor/codex/codex-rs/execpolicy/src/lib.rs delete mode 100644 vendor/codex/codex-rs/execpolicy/src/main.rs delete mode 100644 vendor/codex/codex-rs/execpolicy/src/parser.rs delete mode 100644 vendor/codex/codex-rs/execpolicy/src/policy.rs delete mode 100644 vendor/codex/codex-rs/execpolicy/src/rule.rs delete mode 100644 vendor/codex/codex-rs/execpolicy/tests/basic.rs delete mode 100644 vendor/codex/codex-rs/features/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/features/Cargo.toml delete mode 100644 vendor/codex/codex-rs/features/src/feature_configs.rs delete mode 100644 vendor/codex/codex-rs/features/src/legacy.rs delete mode 100644 vendor/codex/codex-rs/features/src/lib.rs delete mode 100644 vendor/codex/codex-rs/features/src/tests.rs delete mode 100644 vendor/codex/codex-rs/feedback/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/feedback/Cargo.toml delete mode 100644 vendor/codex/codex-rs/feedback/src/feedback_diagnostics.rs delete mode 100644 vendor/codex/codex-rs/feedback/src/lib.rs delete mode 100644 vendor/codex/codex-rs/file-search/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/file-search/Cargo.toml delete mode 100644 vendor/codex/codex-rs/file-search/README.md delete mode 100644 vendor/codex/codex-rs/file-search/src/cli.rs delete mode 100644 vendor/codex/codex-rs/file-search/src/lib.rs delete mode 100644 vendor/codex/codex-rs/file-search/src/main.rs delete mode 100644 vendor/codex/codex-rs/git-utils/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/git-utils/Cargo.toml delete mode 100644 vendor/codex/codex-rs/git-utils/README.md delete mode 100644 vendor/codex/codex-rs/git-utils/src/apply.rs delete mode 100644 vendor/codex/codex-rs/git-utils/src/baseline.rs delete mode 100644 vendor/codex/codex-rs/git-utils/src/branch.rs delete mode 100644 vendor/codex/codex-rs/git-utils/src/errors.rs delete mode 100644 vendor/codex/codex-rs/git-utils/src/ghost_commits.rs delete mode 100644 vendor/codex/codex-rs/git-utils/src/info.rs delete mode 100644 vendor/codex/codex-rs/git-utils/src/lib.rs delete mode 100644 vendor/codex/codex-rs/git-utils/src/operations.rs delete mode 100644 vendor/codex/codex-rs/git-utils/src/platform.rs delete mode 100644 vendor/codex/codex-rs/hooks/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/hooks/Cargo.toml delete mode 100644 vendor/codex/codex-rs/hooks/schema/generated/permission-request.command.input.schema.json delete mode 100644 vendor/codex/codex-rs/hooks/schema/generated/permission-request.command.output.schema.json delete mode 100644 vendor/codex/codex-rs/hooks/schema/generated/post-tool-use.command.input.schema.json delete mode 100644 vendor/codex/codex-rs/hooks/schema/generated/post-tool-use.command.output.schema.json delete mode 100644 vendor/codex/codex-rs/hooks/schema/generated/pre-tool-use.command.input.schema.json delete mode 100644 vendor/codex/codex-rs/hooks/schema/generated/pre-tool-use.command.output.schema.json delete mode 100644 vendor/codex/codex-rs/hooks/schema/generated/session-start.command.input.schema.json delete mode 100644 vendor/codex/codex-rs/hooks/schema/generated/session-start.command.output.schema.json delete mode 100644 vendor/codex/codex-rs/hooks/schema/generated/stop.command.input.schema.json delete mode 100644 vendor/codex/codex-rs/hooks/schema/generated/stop.command.output.schema.json delete mode 100644 vendor/codex/codex-rs/hooks/schema/generated/user-prompt-submit.command.input.schema.json delete mode 100644 vendor/codex/codex-rs/hooks/schema/generated/user-prompt-submit.command.output.schema.json delete mode 100644 vendor/codex/codex-rs/hooks/src/bin/write_hooks_schema_fixtures.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/engine/command_runner.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/engine/config.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/engine/discovery.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/engine/dispatcher.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/engine/mod.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/engine/output_parser.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/engine/schema_loader.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/events/common.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/events/mod.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/events/permission_request.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/events/post_tool_use.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/events/pre_tool_use.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/events/session_start.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/events/stop.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/events/user_prompt_submit.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/legacy_notify.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/lib.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/registry.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/schema.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/types.rs delete mode 100644 vendor/codex/codex-rs/hooks/src/user_notification.rs delete mode 100644 vendor/codex/codex-rs/install-context/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/install-context/Cargo.toml delete mode 100644 vendor/codex/codex-rs/install-context/src/lib.rs delete mode 100644 vendor/codex/codex-rs/keyring-store/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/keyring-store/Cargo.toml delete mode 100644 vendor/codex/codex-rs/keyring-store/src/lib.rs delete mode 100644 vendor/codex/codex-rs/linux-sandbox/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/linux-sandbox/Cargo.toml delete mode 100644 vendor/codex/codex-rs/linux-sandbox/README.md delete mode 100644 vendor/codex/codex-rs/linux-sandbox/build.rs delete mode 100644 vendor/codex/codex-rs/linux-sandbox/config.h delete mode 100644 vendor/codex/codex-rs/linux-sandbox/src/bwrap.rs delete mode 100644 vendor/codex/codex-rs/linux-sandbox/src/landlock.rs delete mode 100644 vendor/codex/codex-rs/linux-sandbox/src/launcher.rs delete mode 100644 vendor/codex/codex-rs/linux-sandbox/src/lib.rs delete mode 100644 vendor/codex/codex-rs/linux-sandbox/src/linux_run_main.rs delete mode 100644 vendor/codex/codex-rs/linux-sandbox/src/linux_run_main_tests.rs delete mode 100644 vendor/codex/codex-rs/linux-sandbox/src/main.rs delete mode 100644 vendor/codex/codex-rs/linux-sandbox/src/proxy_routing.rs delete mode 100644 vendor/codex/codex-rs/linux-sandbox/src/vendored_bwrap.rs delete mode 100644 vendor/codex/codex-rs/linux-sandbox/tests/all.rs delete mode 100644 vendor/codex/codex-rs/linux-sandbox/tests/suite/landlock.rs delete mode 100644 vendor/codex/codex-rs/linux-sandbox/tests/suite/managed_proxy.rs delete mode 100644 vendor/codex/codex-rs/linux-sandbox/tests/suite/mod.rs delete mode 100644 vendor/codex/codex-rs/lmstudio/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/lmstudio/Cargo.toml delete mode 100644 vendor/codex/codex-rs/lmstudio/src/client.rs delete mode 100644 vendor/codex/codex-rs/lmstudio/src/lib.rs delete mode 100644 vendor/codex/codex-rs/login/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/login/Cargo.toml delete mode 100644 vendor/codex/codex-rs/login/src/assets/error.html delete mode 100644 vendor/codex/codex-rs/login/src/assets/success.html delete mode 100644 vendor/codex/codex-rs/login/src/auth/agent_identity.rs delete mode 100644 vendor/codex/codex-rs/login/src/auth/auth_tests.rs delete mode 100644 vendor/codex/codex-rs/login/src/auth/default_client.rs delete mode 100644 vendor/codex/codex-rs/login/src/auth/default_client_tests.rs delete mode 100644 vendor/codex/codex-rs/login/src/auth/error.rs delete mode 100644 vendor/codex/codex-rs/login/src/auth/external_bearer.rs delete mode 100644 vendor/codex/codex-rs/login/src/auth/manager.rs delete mode 100644 vendor/codex/codex-rs/login/src/auth/mod.rs delete mode 100644 vendor/codex/codex-rs/login/src/auth/revoke.rs delete mode 100644 vendor/codex/codex-rs/login/src/auth/storage.rs delete mode 100644 vendor/codex/codex-rs/login/src/auth/storage_tests.rs delete mode 100644 vendor/codex/codex-rs/login/src/auth/util.rs delete mode 100644 vendor/codex/codex-rs/login/src/auth_env_telemetry.rs delete mode 100644 vendor/codex/codex-rs/login/src/device_code_auth.rs delete mode 100644 vendor/codex/codex-rs/login/src/lib.rs delete mode 100644 vendor/codex/codex-rs/login/src/pkce.rs delete mode 100644 vendor/codex/codex-rs/login/src/server.rs delete mode 100644 vendor/codex/codex-rs/login/src/token_data.rs delete mode 100644 vendor/codex/codex-rs/login/src/token_data_tests.rs delete mode 100644 vendor/codex/codex-rs/login/tests/all.rs delete mode 100644 vendor/codex/codex-rs/login/tests/suite/auth_refresh.rs delete mode 100644 vendor/codex/codex-rs/login/tests/suite/device_code_login.rs delete mode 100644 vendor/codex/codex-rs/login/tests/suite/login_server_e2e.rs delete mode 100644 vendor/codex/codex-rs/login/tests/suite/logout.rs delete mode 100644 vendor/codex/codex-rs/login/tests/suite/mod.rs delete mode 100644 vendor/codex/codex-rs/mcp-server/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/mcp-server/Cargo.toml delete mode 100644 vendor/codex/codex-rs/mcp-server/src/codex_tool_config.rs delete mode 100644 vendor/codex/codex-rs/mcp-server/src/codex_tool_runner.rs delete mode 100644 vendor/codex/codex-rs/mcp-server/src/exec_approval.rs delete mode 100644 vendor/codex/codex-rs/mcp-server/src/lib.rs delete mode 100644 vendor/codex/codex-rs/mcp-server/src/main.rs delete mode 100644 vendor/codex/codex-rs/mcp-server/src/message_processor.rs delete mode 100644 vendor/codex/codex-rs/mcp-server/src/outgoing_message.rs delete mode 100644 vendor/codex/codex-rs/mcp-server/src/patch_approval.rs delete mode 100644 vendor/codex/codex-rs/mcp-server/src/tool_handlers/mod.rs delete mode 100644 vendor/codex/codex-rs/mcp-server/tests/all.rs delete mode 100644 vendor/codex/codex-rs/mcp-server/tests/common/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/mcp-server/tests/common/Cargo.toml delete mode 100644 vendor/codex/codex-rs/mcp-server/tests/common/lib.rs delete mode 100644 vendor/codex/codex-rs/mcp-server/tests/common/mcp_process.rs delete mode 100644 vendor/codex/codex-rs/mcp-server/tests/common/mock_model_server.rs delete mode 100644 vendor/codex/codex-rs/mcp-server/tests/common/responses.rs delete mode 100644 vendor/codex/codex-rs/mcp-server/tests/suite/codex_tool.rs delete mode 100644 vendor/codex/codex-rs/mcp-server/tests/suite/mod.rs delete mode 100644 vendor/codex/codex-rs/model-provider-info/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/model-provider-info/Cargo.toml delete mode 100644 vendor/codex/codex-rs/model-provider-info/src/lib.rs delete mode 100644 vendor/codex/codex-rs/model-provider-info/src/model_provider_info_tests.rs delete mode 100644 vendor/codex/codex-rs/model-provider/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/model-provider/Cargo.toml delete mode 100644 vendor/codex/codex-rs/model-provider/src/amazon_bedrock/auth.rs delete mode 100644 vendor/codex/codex-rs/model-provider/src/amazon_bedrock/mantle.rs delete mode 100644 vendor/codex/codex-rs/model-provider/src/amazon_bedrock/mod.rs delete mode 100644 vendor/codex/codex-rs/model-provider/src/auth.rs delete mode 100644 vendor/codex/codex-rs/model-provider/src/bearer_auth_provider.rs delete mode 100644 vendor/codex/codex-rs/model-provider/src/lib.rs delete mode 100644 vendor/codex/codex-rs/model-provider/src/provider.rs delete mode 100644 vendor/codex/codex-rs/models-manager/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/models-manager/Cargo.toml delete mode 100644 vendor/codex/codex-rs/models-manager/models.json delete mode 100644 vendor/codex/codex-rs/models-manager/prompt.md delete mode 100644 vendor/codex/codex-rs/models-manager/src/cache.rs delete mode 100644 vendor/codex/codex-rs/models-manager/src/collaboration_mode_presets.rs delete mode 100644 vendor/codex/codex-rs/models-manager/src/collaboration_mode_presets_tests.rs delete mode 100644 vendor/codex/codex-rs/models-manager/src/config.rs delete mode 100644 vendor/codex/codex-rs/models-manager/src/lib.rs delete mode 100644 vendor/codex/codex-rs/models-manager/src/manager.rs delete mode 100644 vendor/codex/codex-rs/models-manager/src/manager_tests.rs delete mode 100644 vendor/codex/codex-rs/models-manager/src/model_info.rs delete mode 100644 vendor/codex/codex-rs/models-manager/src/model_info_overrides_tests.rs delete mode 100644 vendor/codex/codex-rs/models-manager/src/model_info_tests.rs delete mode 100644 vendor/codex/codex-rs/models-manager/src/model_presets.rs delete mode 100644 vendor/codex/codex-rs/network-proxy/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/network-proxy/Cargo.toml delete mode 100644 vendor/codex/codex-rs/network-proxy/README.md delete mode 100644 vendor/codex/codex-rs/network-proxy/src/certs.rs delete mode 100644 vendor/codex/codex-rs/network-proxy/src/config.rs delete mode 100644 vendor/codex/codex-rs/network-proxy/src/http_proxy.rs delete mode 100644 vendor/codex/codex-rs/network-proxy/src/lib.rs delete mode 100644 vendor/codex/codex-rs/network-proxy/src/mitm.rs delete mode 100644 vendor/codex/codex-rs/network-proxy/src/mitm_tests.rs delete mode 100644 vendor/codex/codex-rs/network-proxy/src/network_policy.rs delete mode 100644 vendor/codex/codex-rs/network-proxy/src/policy.rs delete mode 100644 vendor/codex/codex-rs/network-proxy/src/proxy.rs delete mode 100644 vendor/codex/codex-rs/network-proxy/src/reasons.rs delete mode 100644 vendor/codex/codex-rs/network-proxy/src/responses.rs delete mode 100644 vendor/codex/codex-rs/network-proxy/src/runtime.rs delete mode 100644 vendor/codex/codex-rs/network-proxy/src/socks5.rs delete mode 100644 vendor/codex/codex-rs/network-proxy/src/state.rs delete mode 100644 vendor/codex/codex-rs/network-proxy/src/upstream.rs delete mode 100644 vendor/codex/codex-rs/node-version.txt delete mode 100644 vendor/codex/codex-rs/ollama/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/ollama/Cargo.toml delete mode 100644 vendor/codex/codex-rs/ollama/src/client.rs delete mode 100644 vendor/codex/codex-rs/ollama/src/lib.rs delete mode 100644 vendor/codex/codex-rs/ollama/src/parser.rs delete mode 100644 vendor/codex/codex-rs/ollama/src/pull.rs delete mode 100644 vendor/codex/codex-rs/ollama/src/url.rs delete mode 100644 vendor/codex/codex-rs/otel/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/otel/Cargo.toml delete mode 100644 vendor/codex/codex-rs/otel/README.md delete mode 100644 vendor/codex/codex-rs/otel/src/config.rs delete mode 100644 vendor/codex/codex-rs/otel/src/events/mod.rs delete mode 100644 vendor/codex/codex-rs/otel/src/events/session_telemetry.rs delete mode 100644 vendor/codex/codex-rs/otel/src/events/shared.rs delete mode 100644 vendor/codex/codex-rs/otel/src/lib.rs delete mode 100644 vendor/codex/codex-rs/otel/src/metrics/client.rs delete mode 100644 vendor/codex/codex-rs/otel/src/metrics/config.rs delete mode 100644 vendor/codex/codex-rs/otel/src/metrics/error.rs delete mode 100644 vendor/codex/codex-rs/otel/src/metrics/mod.rs delete mode 100644 vendor/codex/codex-rs/otel/src/metrics/names.rs delete mode 100644 vendor/codex/codex-rs/otel/src/metrics/runtime_metrics.rs delete mode 100644 vendor/codex/codex-rs/otel/src/metrics/tags.rs delete mode 100644 vendor/codex/codex-rs/otel/src/metrics/timer.rs delete mode 100644 vendor/codex/codex-rs/otel/src/metrics/validation.rs delete mode 100644 vendor/codex/codex-rs/otel/src/otlp.rs delete mode 100644 vendor/codex/codex-rs/otel/src/provider.rs delete mode 100644 vendor/codex/codex-rs/otel/src/targets.rs delete mode 100644 vendor/codex/codex-rs/otel/src/trace_context.rs delete mode 100644 vendor/codex/codex-rs/otel/tests/harness/mod.rs delete mode 100644 vendor/codex/codex-rs/otel/tests/suite/manager_metrics.rs delete mode 100644 vendor/codex/codex-rs/otel/tests/suite/mod.rs delete mode 100644 vendor/codex/codex-rs/otel/tests/suite/otel_export_routing_policy.rs delete mode 100644 vendor/codex/codex-rs/otel/tests/suite/otlp_http_loopback.rs delete mode 100644 vendor/codex/codex-rs/otel/tests/suite/runtime_summary.rs delete mode 100644 vendor/codex/codex-rs/otel/tests/suite/send.rs delete mode 100644 vendor/codex/codex-rs/otel/tests/suite/snapshot.rs delete mode 100644 vendor/codex/codex-rs/otel/tests/suite/timing.rs delete mode 100644 vendor/codex/codex-rs/otel/tests/suite/validation.rs delete mode 100644 vendor/codex/codex-rs/otel/tests/tests.rs delete mode 100644 vendor/codex/codex-rs/process-hardening/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/process-hardening/Cargo.toml delete mode 100644 vendor/codex/codex-rs/process-hardening/README.md delete mode 100644 vendor/codex/codex-rs/process-hardening/src/lib.rs delete mode 100644 vendor/codex/codex-rs/protocol/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/protocol/Cargo.toml delete mode 100644 vendor/codex/codex-rs/protocol/README.md delete mode 100644 vendor/codex/codex-rs/protocol/src/account.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/agent_path.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/approvals.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/auth.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/config_types.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/dynamic_tools.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/error.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/error_tests.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/exec_output.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/exec_output_tests.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/items.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/lib.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/mcp.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/memory_citation.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/message_history.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/models.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/network_policy.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/num_format.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/openai_models.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/parse_command.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/permissions.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/plan_tool.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/prompts/base_instructions/default.md delete mode 100644 vendor/codex/codex-rs/protocol/src/protocol.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/request_permissions.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/request_user_input.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/thread_id.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/tool_name.rs delete mode 100644 vendor/codex/codex-rs/protocol/src/user_input.rs delete mode 100644 vendor/codex/codex-rs/realtime-webrtc/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/realtime-webrtc/Cargo.toml delete mode 100644 vendor/codex/codex-rs/realtime-webrtc/src/lib.rs delete mode 100644 vendor/codex/codex-rs/realtime-webrtc/src/native.rs delete mode 100644 vendor/codex/codex-rs/response-debug-context/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/response-debug-context/Cargo.toml delete mode 100644 vendor/codex/codex-rs/response-debug-context/src/lib.rs delete mode 100644 vendor/codex/codex-rs/responses-api-proxy/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/responses-api-proxy/Cargo.toml delete mode 100644 vendor/codex/codex-rs/responses-api-proxy/README.md delete mode 100644 vendor/codex/codex-rs/responses-api-proxy/npm/README.md delete mode 100644 vendor/codex/codex-rs/responses-api-proxy/npm/bin/codex-responses-api-proxy.js delete mode 100644 vendor/codex/codex-rs/responses-api-proxy/npm/package.json delete mode 100644 vendor/codex/codex-rs/responses-api-proxy/src/dump.rs delete mode 100644 vendor/codex/codex-rs/responses-api-proxy/src/lib.rs delete mode 100644 vendor/codex/codex-rs/responses-api-proxy/src/main.rs delete mode 100644 vendor/codex/codex-rs/responses-api-proxy/src/read_api_key.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/rmcp-client/Cargo.toml delete mode 100644 vendor/codex/codex-rs/rmcp-client/src/auth_status.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/src/bin/rmcp_test_server.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/src/bin/test_stdio_server.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/src/bin/test_streamable_http_server.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/src/elicitation_client_service.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/src/executor_process_transport.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/src/http_client_adapter.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/src/lib.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/src/logging_client_handler.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/src/oauth.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/src/perform_oauth_login.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/src/program_resolver.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/src/rmcp_client.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/src/stdio_server_launcher.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/src/utils.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/tests/process_group_cleanup.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/tests/resources.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/tests/streamable_http_recovery.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/tests/streamable_http_remote.rs delete mode 100644 vendor/codex/codex-rs/rmcp-client/tests/streamable_http_test_support.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/rollout-trace/Cargo.toml delete mode 100644 vendor/codex/codex-rs/rollout-trace/README.md delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/bundle.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/compaction.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/inference.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/lib.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/model/conversation.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/model/mod.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/model/runtime.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/model/session.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/payload.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/raw_event.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/recorder.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/recorder_tests.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/reducer/code_cell.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/reducer/code_cell_tests.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/reducer/compaction.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/reducer/conversation.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/reducer/conversation/normalize.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/reducer/conversation_tests.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/reducer/inference.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/reducer/mod.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/reducer/test_support.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/reducer/thread.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/reducer/tool.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/reducer/tool/agents.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/reducer/tool/agents_tests.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/reducer/tool/terminal.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/reducer/tool/terminal_tests.rs delete mode 100644 vendor/codex/codex-rs/rollout-trace/src/writer.rs delete mode 100644 vendor/codex/codex-rs/rollout/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/rollout/Cargo.toml delete mode 100644 vendor/codex/codex-rs/rollout/src/config.rs delete mode 100644 vendor/codex/codex-rs/rollout/src/lib.rs delete mode 100644 vendor/codex/codex-rs/rollout/src/list.rs delete mode 100644 vendor/codex/codex-rs/rollout/src/metadata.rs delete mode 100644 vendor/codex/codex-rs/rollout/src/metadata_tests.rs delete mode 100644 vendor/codex/codex-rs/rollout/src/policy.rs delete mode 100644 vendor/codex/codex-rs/rollout/src/recorder.rs delete mode 100644 vendor/codex/codex-rs/rollout/src/recorder_tests.rs delete mode 100644 vendor/codex/codex-rs/rollout/src/session_index.rs delete mode 100644 vendor/codex/codex-rs/rollout/src/session_index_tests.rs delete mode 100644 vendor/codex/codex-rs/rollout/src/state_db.rs delete mode 100644 vendor/codex/codex-rs/rollout/src/state_db_tests.rs delete mode 100644 vendor/codex/codex-rs/rollout/src/tests.rs delete mode 100644 vendor/codex/codex-rs/rust-toolchain.toml delete mode 100644 vendor/codex/codex-rs/rustfmt.toml delete mode 100644 vendor/codex/codex-rs/sandboxing/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/sandboxing/Cargo.toml delete mode 100644 vendor/codex/codex-rs/sandboxing/src/bwrap.rs delete mode 100644 vendor/codex/codex-rs/sandboxing/src/bwrap_tests.rs delete mode 100644 vendor/codex/codex-rs/sandboxing/src/landlock.rs delete mode 100644 vendor/codex/codex-rs/sandboxing/src/landlock_tests.rs delete mode 100644 vendor/codex/codex-rs/sandboxing/src/lib.rs delete mode 100644 vendor/codex/codex-rs/sandboxing/src/manager.rs delete mode 100644 vendor/codex/codex-rs/sandboxing/src/manager_tests.rs delete mode 100644 vendor/codex/codex-rs/sandboxing/src/policy_transforms.rs delete mode 100644 vendor/codex/codex-rs/sandboxing/src/policy_transforms_tests.rs delete mode 100644 vendor/codex/codex-rs/sandboxing/src/restricted_read_only_platform_defaults.sbpl delete mode 100644 vendor/codex/codex-rs/sandboxing/src/seatbelt.rs delete mode 100644 vendor/codex/codex-rs/sandboxing/src/seatbelt_base_policy.sbpl delete mode 100644 vendor/codex/codex-rs/sandboxing/src/seatbelt_network_policy.sbpl delete mode 100644 vendor/codex/codex-rs/sandboxing/src/seatbelt_tests.rs delete mode 100644 vendor/codex/codex-rs/scripts/setup-windows.ps1 delete mode 100644 vendor/codex/codex-rs/secrets/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/secrets/Cargo.toml delete mode 100644 vendor/codex/codex-rs/secrets/src/lib.rs delete mode 100644 vendor/codex/codex-rs/secrets/src/local.rs delete mode 100644 vendor/codex/codex-rs/secrets/src/sanitizer.rs delete mode 100644 vendor/codex/codex-rs/shell-command/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/shell-command/Cargo.toml delete mode 100644 vendor/codex/codex-rs/shell-command/src/bash.rs delete mode 100644 vendor/codex/codex-rs/shell-command/src/command_safety/is_dangerous_command.rs delete mode 100644 vendor/codex/codex-rs/shell-command/src/command_safety/is_safe_command.rs delete mode 100644 vendor/codex/codex-rs/shell-command/src/command_safety/mod.rs delete mode 100644 vendor/codex/codex-rs/shell-command/src/command_safety/powershell_parser.ps1 delete mode 100644 vendor/codex/codex-rs/shell-command/src/command_safety/powershell_parser.rs delete mode 100644 vendor/codex/codex-rs/shell-command/src/command_safety/windows_dangerous_commands.rs delete mode 100644 vendor/codex/codex-rs/shell-command/src/command_safety/windows_safe_commands.rs delete mode 100644 vendor/codex/codex-rs/shell-command/src/lib.rs delete mode 100644 vendor/codex/codex-rs/shell-command/src/parse_command.rs delete mode 100644 vendor/codex/codex-rs/shell-command/src/powershell.rs delete mode 100644 vendor/codex/codex-rs/shell-command/src/shell_detect.rs delete mode 100644 vendor/codex/codex-rs/shell-escalation/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/shell-escalation/Cargo.toml delete mode 100644 vendor/codex/codex-rs/shell-escalation/README.md delete mode 100644 vendor/codex/codex-rs/shell-escalation/patches/zsh-exec-wrapper.patch delete mode 100644 vendor/codex/codex-rs/shell-escalation/src/bin/main_execve_wrapper.rs delete mode 100644 vendor/codex/codex-rs/shell-escalation/src/lib.rs delete mode 100644 vendor/codex/codex-rs/shell-escalation/src/unix/escalate_client.rs delete mode 100644 vendor/codex/codex-rs/shell-escalation/src/unix/escalate_protocol.rs delete mode 100644 vendor/codex/codex-rs/shell-escalation/src/unix/escalate_server.rs delete mode 100644 vendor/codex/codex-rs/shell-escalation/src/unix/escalation_policy.rs delete mode 100644 vendor/codex/codex-rs/shell-escalation/src/unix/execve_wrapper.rs delete mode 100644 vendor/codex/codex-rs/shell-escalation/src/unix/mod.rs delete mode 100644 vendor/codex/codex-rs/shell-escalation/src/unix/socket.rs delete mode 100644 vendor/codex/codex-rs/shell-escalation/src/unix/stopwatch.rs delete mode 100644 vendor/codex/codex-rs/state/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/state/Cargo.toml delete mode 100644 vendor/codex/codex-rs/state/logs_migrations/0001_logs.sql delete mode 100644 vendor/codex/codex-rs/state/logs_migrations/0002_logs_feedback_log_body.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0001_threads.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0002_logs.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0003_logs_thread_id.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0004_thread_dynamic_tools.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0005_threads_cli_version.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0006_memories.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0007_threads_first_user_message.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0008_backfill_state.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0009_stage1_outputs_rollout_slug.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0010_logs_process_id.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0011_logs_partition_prune_indexes.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0012_logs_estimated_bytes.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0013_threads_agent_nickname.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0016_memory_usage.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0017_phase2_selection_flag.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0018_phase2_selection_snapshot.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0019_thread_dynamic_tools_defer_loading.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0020_threads_model_reasoning_effort.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0021_thread_spawn_edges.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0022_threads_agent_path.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0023_drop_logs.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0024_remote_control_enrollments.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0025_thread_timestamps_millis.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0026_thread_dynamic_tools_namespace.sql delete mode 100644 vendor/codex/codex-rs/state/migrations/0027_threads_cwd_sort_indexes.sql delete mode 100644 vendor/codex/codex-rs/state/src/bin/logs_client.rs delete mode 100644 vendor/codex/codex-rs/state/src/extract.rs delete mode 100644 vendor/codex/codex-rs/state/src/lib.rs delete mode 100644 vendor/codex/codex-rs/state/src/log_db.rs delete mode 100644 vendor/codex/codex-rs/state/src/migrations.rs delete mode 100644 vendor/codex/codex-rs/state/src/model/backfill_state.rs delete mode 100644 vendor/codex/codex-rs/state/src/model/graph.rs delete mode 100644 vendor/codex/codex-rs/state/src/model/log.rs delete mode 100644 vendor/codex/codex-rs/state/src/model/memories.rs delete mode 100644 vendor/codex/codex-rs/state/src/model/mod.rs delete mode 100644 vendor/codex/codex-rs/state/src/model/thread_metadata.rs delete mode 100644 vendor/codex/codex-rs/state/src/paths.rs delete mode 100644 vendor/codex/codex-rs/state/src/runtime.rs delete mode 100644 vendor/codex/codex-rs/state/src/runtime/backfill.rs delete mode 100644 vendor/codex/codex-rs/state/src/runtime/logs.rs delete mode 100644 vendor/codex/codex-rs/state/src/runtime/memories.rs delete mode 100644 vendor/codex/codex-rs/state/src/runtime/remote_control.rs delete mode 100644 vendor/codex/codex-rs/state/src/runtime/test_support.rs delete mode 100644 vendor/codex/codex-rs/state/src/runtime/threads.rs delete mode 100644 vendor/codex/codex-rs/stdio-to-uds/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/stdio-to-uds/Cargo.toml delete mode 100644 vendor/codex/codex-rs/stdio-to-uds/README.md delete mode 100644 vendor/codex/codex-rs/stdio-to-uds/src/lib.rs delete mode 100644 vendor/codex/codex-rs/stdio-to-uds/src/main.rs delete mode 100644 vendor/codex/codex-rs/stdio-to-uds/tests/stdio_to_uds.rs delete mode 100644 vendor/codex/codex-rs/terminal-detection/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/terminal-detection/Cargo.toml delete mode 100644 vendor/codex/codex-rs/terminal-detection/src/lib.rs delete mode 100644 vendor/codex/codex-rs/terminal-detection/src/terminal_tests.rs delete mode 100644 vendor/codex/codex-rs/test-binary-support/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/test-binary-support/Cargo.toml delete mode 100644 vendor/codex/codex-rs/test-binary-support/lib.rs delete mode 100644 vendor/codex/codex-rs/thread-store/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/thread-store/Cargo.toml delete mode 100644 vendor/codex/codex-rs/thread-store/examples/generate-proto.rs delete mode 100644 vendor/codex/codex-rs/thread-store/scripts/generate-proto.sh delete mode 100644 vendor/codex/codex-rs/thread-store/src/error.rs delete mode 100644 vendor/codex/codex-rs/thread-store/src/lib.rs delete mode 100644 vendor/codex/codex-rs/thread-store/src/local/archive_thread.rs delete mode 100644 vendor/codex/codex-rs/thread-store/src/local/helpers.rs delete mode 100644 vendor/codex/codex-rs/thread-store/src/local/list_threads.rs delete mode 100644 vendor/codex/codex-rs/thread-store/src/local/mod.rs delete mode 100644 vendor/codex/codex-rs/thread-store/src/local/read_thread.rs delete mode 100644 vendor/codex/codex-rs/thread-store/src/local/test_support.rs delete mode 100644 vendor/codex/codex-rs/thread-store/src/local/unarchive_thread.rs delete mode 100644 vendor/codex/codex-rs/thread-store/src/local/update_thread_metadata.rs delete mode 100644 vendor/codex/codex-rs/thread-store/src/recorder.rs delete mode 100644 vendor/codex/codex-rs/thread-store/src/remote/AGENTS.md delete mode 100644 vendor/codex/codex-rs/thread-store/src/remote/helpers.rs delete mode 100644 vendor/codex/codex-rs/thread-store/src/remote/list_threads.rs delete mode 100644 vendor/codex/codex-rs/thread-store/src/remote/mod.rs delete mode 100644 vendor/codex/codex-rs/thread-store/src/remote/proto/codex.thread_store.v1.proto delete mode 100644 vendor/codex/codex-rs/thread-store/src/remote/proto/codex.thread_store.v1.rs delete mode 100644 vendor/codex/codex-rs/thread-store/src/store.rs delete mode 100644 vendor/codex/codex-rs/thread-store/src/types.rs delete mode 100644 vendor/codex/codex-rs/tools/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/tools/Cargo.toml delete mode 100644 vendor/codex/codex-rs/tools/README.md delete mode 100644 vendor/codex/codex-rs/tools/src/agent_tool.rs delete mode 100644 vendor/codex/codex-rs/tools/src/agent_tool_tests.rs delete mode 100644 vendor/codex/codex-rs/tools/src/apply_patch_tool.rs delete mode 100644 vendor/codex/codex-rs/tools/src/apply_patch_tool_tests.rs delete mode 100644 vendor/codex/codex-rs/tools/src/code_mode.rs delete mode 100644 vendor/codex/codex-rs/tools/src/code_mode_tests.rs delete mode 100644 vendor/codex/codex-rs/tools/src/dynamic_tool.rs delete mode 100644 vendor/codex/codex-rs/tools/src/dynamic_tool_tests.rs delete mode 100644 vendor/codex/codex-rs/tools/src/image_detail.rs delete mode 100644 vendor/codex/codex-rs/tools/src/image_detail_tests.rs delete mode 100644 vendor/codex/codex-rs/tools/src/js_repl_tool.rs delete mode 100644 vendor/codex/codex-rs/tools/src/js_repl_tool_tests.rs delete mode 100644 vendor/codex/codex-rs/tools/src/json_schema.rs delete mode 100644 vendor/codex/codex-rs/tools/src/json_schema_tests.rs delete mode 100644 vendor/codex/codex-rs/tools/src/lib.rs delete mode 100644 vendor/codex/codex-rs/tools/src/local_tool.rs delete mode 100644 vendor/codex/codex-rs/tools/src/local_tool_tests.rs delete mode 100644 vendor/codex/codex-rs/tools/src/mcp_resource_tool.rs delete mode 100644 vendor/codex/codex-rs/tools/src/mcp_resource_tool_tests.rs delete mode 100644 vendor/codex/codex-rs/tools/src/mcp_tool.rs delete mode 100644 vendor/codex/codex-rs/tools/src/mcp_tool_tests.rs delete mode 100644 vendor/codex/codex-rs/tools/src/plan_tool.rs delete mode 100644 vendor/codex/codex-rs/tools/src/request_user_input_tool.rs delete mode 100644 vendor/codex/codex-rs/tools/src/request_user_input_tool_tests.rs delete mode 100644 vendor/codex/codex-rs/tools/src/responses_api.rs delete mode 100644 vendor/codex/codex-rs/tools/src/responses_api_tests.rs delete mode 100644 vendor/codex/codex-rs/tools/src/tool_apply_patch.lark delete mode 100644 vendor/codex/codex-rs/tools/src/tool_config.rs delete mode 100644 vendor/codex/codex-rs/tools/src/tool_config_tests.rs delete mode 100644 vendor/codex/codex-rs/tools/src/tool_definition.rs delete mode 100644 vendor/codex/codex-rs/tools/src/tool_definition_tests.rs delete mode 100644 vendor/codex/codex-rs/tools/src/tool_discovery.rs delete mode 100644 vendor/codex/codex-rs/tools/src/tool_discovery_tests.rs delete mode 100644 vendor/codex/codex-rs/tools/src/tool_registry_plan.rs delete mode 100644 vendor/codex/codex-rs/tools/src/tool_registry_plan_tests.rs delete mode 100644 vendor/codex/codex-rs/tools/src/tool_registry_plan_types.rs delete mode 100644 vendor/codex/codex-rs/tools/src/tool_spec.rs delete mode 100644 vendor/codex/codex-rs/tools/src/tool_spec_tests.rs delete mode 100644 vendor/codex/codex-rs/tools/src/utility_tool.rs delete mode 100644 vendor/codex/codex-rs/tools/src/utility_tool_tests.rs delete mode 100644 vendor/codex/codex-rs/tools/src/view_image.rs delete mode 100644 vendor/codex/codex-rs/tui/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/tui/Cargo.toml delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_1.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_10.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_11.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_12.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_13.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_14.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_15.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_16.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_17.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_18.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_19.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_2.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_20.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_21.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_22.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_23.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_24.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_25.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_26.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_27.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_28.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_29.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_3.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_30.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_31.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_32.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_33.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_34.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_35.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_36.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_4.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_5.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_6.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_7.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_8.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/blocks/frame_9.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_1.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_10.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_11.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_12.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_13.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_14.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_15.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_16.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_17.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_18.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_19.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_2.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_20.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_21.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_22.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_23.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_24.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_25.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_26.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_27.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_28.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_29.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_3.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_30.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_31.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_32.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_33.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_34.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_35.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_36.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_4.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_5.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_6.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_7.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_8.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/codex/frame_9.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_1.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_10.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_11.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_12.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_13.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_14.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_15.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_16.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_17.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_18.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_19.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_2.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_20.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_21.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_22.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_23.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_24.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_25.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_26.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_27.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_28.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_29.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_3.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_30.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_31.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_32.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_33.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_34.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_35.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_36.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_4.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_5.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_6.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_7.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_8.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/default/frame_9.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_1.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_10.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_11.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_12.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_13.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_14.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_15.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_16.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_17.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_18.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_19.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_2.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_20.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_21.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_22.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_23.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_24.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_25.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_26.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_27.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_28.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_29.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_3.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_30.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_31.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_32.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_33.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_34.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_35.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_36.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_4.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_5.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_6.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_7.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_8.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/dots/frame_9.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_1.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_10.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_11.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_12.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_13.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_14.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_15.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_16.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_17.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_18.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_19.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_2.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_20.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_21.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_22.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_23.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_24.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_25.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_26.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_27.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_28.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_29.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_3.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_30.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_31.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_32.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_33.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_34.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_35.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_36.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_4.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_5.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_6.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_7.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_8.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hash/frame_9.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_1.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_10.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_11.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_12.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_13.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_14.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_15.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_16.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_17.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_18.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_19.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_2.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_20.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_21.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_22.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_23.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_24.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_25.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_26.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_27.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_28.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_29.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_3.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_30.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_31.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_32.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_33.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_34.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_35.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_36.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_4.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_5.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_6.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_7.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_8.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/hbars/frame_9.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_1.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_10.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_11.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_12.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_13.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_14.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_15.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_16.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_17.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_18.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_19.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_2.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_20.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_21.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_22.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_23.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_24.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_25.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_26.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_27.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_28.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_29.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_3.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_30.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_31.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_32.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_33.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_34.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_35.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_36.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_4.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_5.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_6.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_7.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_8.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/openai/frame_9.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_1.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_10.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_11.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_12.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_13.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_14.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_15.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_16.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_17.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_18.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_19.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_2.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_20.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_21.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_22.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_23.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_24.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_25.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_26.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_27.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_28.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_29.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_3.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_30.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_31.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_32.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_33.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_34.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_35.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_36.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_4.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_5.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_6.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_7.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_8.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/shapes/frame_9.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_1.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_10.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_11.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_12.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_13.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_14.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_15.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_16.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_17.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_18.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_19.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_2.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_20.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_21.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_22.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_23.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_24.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_25.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_26.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_27.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_28.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_29.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_3.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_30.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_31.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_32.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_33.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_34.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_35.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_36.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_4.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_5.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_6.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_7.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_8.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/slug/frame_9.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_1.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_10.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_11.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_12.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_13.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_14.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_15.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_16.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_17.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_18.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_19.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_2.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_20.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_21.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_22.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_23.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_24.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_25.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_26.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_27.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_28.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_29.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_3.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_30.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_31.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_32.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_33.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_34.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_35.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_36.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_4.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_5.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_6.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_7.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_8.txt delete mode 100644 vendor/codex/codex-rs/tui/frames/vbars/frame_9.txt delete mode 100644 vendor/codex/codex-rs/tui/prompt_for_init_command.md delete mode 100644 vendor/codex/codex-rs/tui/src/additional_dirs.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/agent_navigation.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/app_server_adapter.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/app_server_requests.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/background_requests.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/config_persistence.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/event_dispatch.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/history_ui.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/input.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/loaded_threads.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/pending_interactive_replay.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/platform_actions.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/replay_filter.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/session_lifecycle.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/side.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/startup_prompts.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/test_support.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/tests.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/tests/model_catalog.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__model_catalog__model_migration_prompt_shows_for_hidden_model.snap delete mode 100644 vendor/codex/codex-rs/tui/src/app/thread_events.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/thread_routing.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app/thread_session_state.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app_backtrack.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app_command.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app_event.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app_event_sender.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app_server_approval_conversions.rs delete mode 100644 vendor/codex/codex-rs/tui/src/app_server_session.rs delete mode 100644 vendor/codex/codex-rs/tui/src/ascii_animation.rs delete mode 100644 vendor/codex/codex-rs/tui/src/audio_device.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bin/md-events.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/AGENTS.md delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/approval_overlay.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/bottom_pane_view.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/chat_composer.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/chat_composer/history_search.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/chat_composer_history.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/command_popup.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/custom_prompt_view.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/experimental_features_view.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/feedback_view.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/file_search_popup.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/footer.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/list_selection_view.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/mcp_server_elicitation.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/memories_settings_view.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/mod.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/multi_select_picker.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/paste_burst.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/pending_input_preview.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/pending_thread_approvals.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/popup_consts.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/prompt_args.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/request_user_input/layout.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/request_user_input/mod.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/request_user_input/render.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_footer_wrap.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_freeform.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_hidden_options_footer.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_long_option_text.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_multi_question_first.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_multi_question_last.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_options.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_options_notes_visible.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_scrolling_options.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_tight_height.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_unanswered_confirmation.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_wrapped_options.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/scroll_state.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/selection_popup_common.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/selection_tabs.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/slash_commands.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__approval_overlay__tests__approval_overlay_additional_permissions_prompt.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__approval_overlay__tests__approval_overlay_cross_thread_prompt.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__approval_overlay__tests__approval_overlay_permissions_prompt.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__approval_overlay__tests__network_exec_prompt.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__backspace_after_pastes.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__empty.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_empty_full.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_empty_mode_cycle_with_context.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_empty_mode_cycle_without_context.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_empty_mode_only.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_empty_full.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_empty_mode_cycle_with_context.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_empty_mode_cycle_without_context.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_empty_mode_only.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_queue_full.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_queue_message_without_context.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_queue_mode_only.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_queue_short_with_context.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_queue_short_without_context.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_queue_full.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_queue_message_without_context.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_queue_mode_only.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_queue_short_with_context.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_queue_short_without_context.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_ctrl_c_interrupt.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_ctrl_c_quit.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_ctrl_c_then_esc_hint.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_esc_hint_backtrack.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_esc_hint_from_overlay.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_hidden_while_typing.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_history_search.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_overlay_then_external_esc_hint.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_shell_command_absorbs_bang.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_shortcut_overlay.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__image_placeholder_multiple.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__image_placeholder_single.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__large.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__mention_popup_type_prefixes.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__multiple_pastes.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__plugin_mention_popup.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__remote_image_rows.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__remote_image_rows_after_delete_first.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__remote_image_rows_selected.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__slash_popup_mo.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__slash_popup_res.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__small.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__zellij_empty_composer.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__feedback_view__tests__feedback_view_bad_result.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__feedback_view__tests__feedback_view_bug.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__feedback_view__tests__feedback_view_good_result.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__feedback_view__tests__feedback_view_other.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__feedback_view__tests__feedback_view_render.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__feedback_view__tests__feedback_view_safety_check.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__feedback_view__tests__feedback_view_with_connectivity_diagnostics.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_active_agent_label.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_composer_has_draft_queue_hint_enabled.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_context_tokens_used.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_ctrl_c_quit_idle.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_ctrl_c_quit_running.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_esc_hint_idle.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_esc_hint_primed.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_mode_indicator_narrow_overlap_hides.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_mode_indicator_running_hides_hint.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_mode_indicator_wide.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_shortcuts_collaboration_modes_enabled.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_shortcuts_context_running.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_shortcuts_default.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_shortcuts_shift_and_esc.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_disabled_context_right.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_enabled_mode_right.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_enabled_no_mode_right.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_overrides_context.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_overrides_draft_idle.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_overrides_shortcuts.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_truncated_with_gap.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_with_active_agent_label.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_yields_to_queue_hint.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_col_width_mode_auto_all_rows_scroll.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_col_width_mode_auto_visible_scroll.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_col_width_mode_fixed_scroll.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_footer_note_wraps.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_model_picker_width_80.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_narrow_width_preserves_rows.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_spacing_with_subtitle.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_spacing_without_subtitle.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__mcp_server_elicitation__tests__mcp_server_elicitation_approval_form_with_param_summary.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__mcp_server_elicitation__tests__mcp_server_elicitation_approval_form_with_session_persist.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__mcp_server_elicitation__tests__mcp_server_elicitation_approval_form_without_schema.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__mcp_server_elicitation__tests__mcp_server_elicitation_boolean_form.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__mcp_server_elicitation__tests__mcp_server_elicitation_message_only_form.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__mcp_server_elicitation__tests__mcp_server_elicitation_message_only_form_with_persist_options.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__message_queue__tests__render_many_line_message.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__message_queue__tests__render_one_message.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__message_queue__tests__render_two_messages.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__message_queue__tests__render_wrapped_message.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_many_line_message.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_more_than_three_messages.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_multiline_pending_steer_uses_single_prefix_and_truncates.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_one_message.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_one_message_with_shift_left_binding.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_one_pending_steer.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_pending_steers_above_queued_messages.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_two_messages.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_wrapped_message.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__status_line_setup__tests__setup_view_snapshot_uses_runtime_preview_values.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__tests__queued_messages_visible_when_status_hidden_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__tests__status_and_composer_fill_height_without_bottom_padding.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__tests__status_and_queued_messages_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__tests__status_hidden_when_height_too_small_height_1.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__tests__status_only_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__tests__status_with_details_and_queued_messages_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__title_setup__tests__terminal_title_setup_basic.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__unified_exec_footer__tests__render_many_sessions.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__unified_exec_footer__tests__render_more_sessions.snap delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/status_line_setup.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/status_surface_preview.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/textarea.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/title_setup.rs delete mode 100644 vendor/codex/codex-rs/tui/src/bottom_pane/unified_exec_footer.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/interrupts.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/plan_implementation.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/realtime.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/reasoning_shortcuts.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/session_header.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/side.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/slash_dispatch.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__app_server_collab_spawn_completed_renders_requested_model_and_effort.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__app_server_collab_wait_items_render_history.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__app_server_forked_thread_history_line.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__app_server_forked_thread_history_line_without_app_server_name.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__app_server_guardian_review_denied_renders_denied_request.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__app_server_guardian_review_timed_out_renders_timed_out_request.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__app_server_mcp_startup_failure_renders_warning_history.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__apply_patch_manual_flow_history_approved.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__approval_modal_exec.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__approval_modal_exec_multiline_prefix_no_execpolicy.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__approval_modal_exec_no_reason.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__approval_modal_patch.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__approvals_selection_popup.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__approvals_selection_popup@windows.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__approvals_selection_popup@windows_degraded.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__binary_size_ideal_response.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chat_small_idle_h1.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chat_small_idle_h2.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chat_small_idle_h3.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chat_small_running_h1.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chat_small_running_h2.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chat_small_running_h3.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chatwidget_exec_and_status_layout_vt100_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chatwidget_markdown_code_blocks_vt100_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chatwidget_tall.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__compact_queues_user_messages_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__completed_hook_output_precedes_following_assistant_message_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__completed_hook_with_output_flushes_immediately_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__completed_same_id_hook_output_survives_restart_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__deltas_then_same_final_message_are_rendered_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__disabled_slash_command_while_task_running_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__exec_approval_history_decision_aborted_long.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__exec_approval_history_decision_aborted_multiline.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__exec_approval_history_decision_approved_short.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__exec_approval_modal_exec.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__experimental_features_popup.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__exploring_step1_start_ls.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__exploring_step2_finish_ls.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__exploring_step3_start_cat_foo.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__exploring_step4_finish_cat_foo.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__exploring_step5_finish_sed_range.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__exploring_step6_finish_cat_bar.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__feedback_good_result_consent_popup.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__feedback_selection_popup.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__feedback_upload_consent_popup.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__final_reasoning_then_message_without_deltas_are_rendered.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__forked_thread_history_line.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__forked_thread_history_line_without_name.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__full_access_confirmation_popup.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__guardian_approved_exec_renders_approved_request.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__guardian_approved_request_permissions_renders_request_summary.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__guardian_denied_exec_renders_warning_and_denied_request.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__guardian_parallel_reviews_render_aggregate_status.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__guardian_timed_out_exec_renders_warning_and_timed_out_request.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__hook_blocked_failed_feedback_history_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__hook_completed_before_reveal_renders_completed_without_running_flash_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__hook_live_running_then_quiet_completed_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__hook_runs_while_exec_active_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__identical_parallel_running_hooks_collapse_to_count_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__image_generation_call_history_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__interrupt_clears_unified_exec_wait_streak.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__interrupt_exec_marks_failed.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__interrupt_preserves_unified_exec_wait_streak.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__interrupted_turn_error_message.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__interrupted_turn_pending_steers_message.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__live_app_server_command_execution_strips_shell_wrapper.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__local_image_attachment_history_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__mcp_startup_header_booting.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__memories_enable_prompt.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__memories_reset_confirmation.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__memories_settings_popup.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__model_picker_filters_hidden_models.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__model_reasoning_selection_popup.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__model_reasoning_selection_popup_extra_high_warning.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__model_selection_popup.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__multi_agent_enable_prompt.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__overlapping_hook_live_cell_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__permissions_selection_history_after_mode_switch.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__permissions_selection_history_full_access_to_default.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__permissions_selection_history_full_access_to_default@windows.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__personality_selection_popup.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__plan_implementation_popup.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__plan_implementation_popup_context_usage.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__plan_implementation_popup_no_selected.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__post_tool_use_hook_events_render_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__pre_tool_use_hook_events_render_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__preamble_keeps_working_status.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__rate_limit_switch_prompt_popup.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__realtime_audio_selection_popup.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__realtime_audio_selection_popup_narrow.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__realtime_microphone_picker_popup.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__renamed_thread_footer_title.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__replayed_interrupted_reconnect_footer_row.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__review_queues_user_messages_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__session_start_hook_events_render_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__side_context_label_preserves_status_line.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__side_context_label_shows_parent_status.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__slash_copy_no_output_info_message.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__slash_rename_prefilled_prompt.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__slash_side_requests_forked_side_question_while_task_running.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_line_fast_mode_footer.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_line_model_with_reasoning_context_remaining_footer.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_line_model_with_reasoning_fast_footer.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_line_model_with_reasoning_plan_mode_footer.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_line_setup_popup_hardcoded_only.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_line_setup_popup_live_only.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_line_setup_popup_mixed.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_surface_previews_hardcoded_only.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_surface_previews_live_only.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_surface_previews_mixed.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_widget_active.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_widget_and_approval_modal.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__terminal_title_setup_popup_hardcoded_only.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__terminal_title_setup_popup_live_only.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__terminal_title_setup_popup_mixed.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__unified_exec_begin_restores_working_status.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__unified_exec_empty_then_non_empty_after.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__unified_exec_non_empty_then_empty_active.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__unified_exec_non_empty_then_empty_after.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__unified_exec_unknown_end_with_active_exploring_cell.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__unified_exec_wait_after_final_agent_message.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__unified_exec_wait_before_streamed_agent_message.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__unified_exec_wait_status_renders_command_in_single_details_row.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__unified_exec_waiting_multiple_empty_after.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__update_popup.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__user_prompt_submit_app_server_hook_notifications_render_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__user_shell_ls_output.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__workspace_member_credits_depleted_prompt.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__workspace_member_usage_limit_prompt.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__workspace_owner_credits_nudge_completion_feedback.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__workspace_owner_limit_state_messages.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__workspace_owner_usage_limit_nudge_completion_feedback.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/status_surfaces.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/app_server.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/approval_requests.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/background_events.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/composer_submission.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/exec_flow.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/guardian.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/helpers.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/history_replay.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/mcp_startup.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/permissions.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/plan_mode.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/popups_and_settings.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/review_mode.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/side.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/slash_commands.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__approval_requests__exec_approval_history_decision_aborted_long.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__approval_requests__exec_approval_history_decision_aborted_multiline.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__approval_requests__exec_approval_history_decision_approved_short.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__approval_requests__exec_approval_modal_exec.snap delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/status_and_layout.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/status_command_tests.rs delete mode 100644 vendor/codex/codex-rs/tui/src/chatwidget/tests/status_surface_previews.rs delete mode 100644 vendor/codex/codex-rs/tui/src/cli.rs delete mode 100644 vendor/codex/codex-rs/tui/src/clipboard_copy.rs delete mode 100644 vendor/codex/codex-rs/tui/src/clipboard_paste.rs delete mode 100644 vendor/codex/codex-rs/tui/src/collaboration_modes.rs delete mode 100644 vendor/codex/codex-rs/tui/src/color.rs delete mode 100644 vendor/codex/codex-rs/tui/src/custom_terminal.rs delete mode 100644 vendor/codex/codex-rs/tui/src/cwd_prompt.rs delete mode 100644 vendor/codex/codex-rs/tui/src/debug_config.rs delete mode 100644 vendor/codex/codex-rs/tui/src/diff_render.rs delete mode 100644 vendor/codex/codex-rs/tui/src/exec_cell/mod.rs delete mode 100644 vendor/codex/codex-rs/tui/src/exec_cell/model.rs delete mode 100644 vendor/codex/codex-rs/tui/src/exec_cell/render.rs delete mode 100644 vendor/codex/codex-rs/tui/src/exec_command.rs delete mode 100644 vendor/codex/codex-rs/tui/src/external_editor.rs delete mode 100644 vendor/codex/codex-rs/tui/src/file_search.rs delete mode 100644 vendor/codex/codex-rs/tui/src/frames.rs delete mode 100644 vendor/codex/codex-rs/tui/src/get_git_diff.rs delete mode 100644 vendor/codex/codex-rs/tui/src/history_cell.rs delete mode 100644 vendor/codex/codex-rs/tui/src/history_cell/hook_cell.rs delete mode 100644 vendor/codex/codex-rs/tui/src/insert_history.rs delete mode 100644 vendor/codex/codex-rs/tui/src/key_hint.rs delete mode 100644 vendor/codex/codex-rs/tui/src/lib.rs delete mode 100644 vendor/codex/codex-rs/tui/src/line_truncation.rs delete mode 100644 vendor/codex/codex-rs/tui/src/live_wrap.rs delete mode 100644 vendor/codex/codex-rs/tui/src/local_chatgpt_auth.rs delete mode 100644 vendor/codex/codex-rs/tui/src/main.rs delete mode 100644 vendor/codex/codex-rs/tui/src/markdown.rs delete mode 100644 vendor/codex/codex-rs/tui/src/markdown_render.rs delete mode 100644 vendor/codex/codex-rs/tui/src/markdown_render_tests.rs delete mode 100644 vendor/codex/codex-rs/tui/src/markdown_stream.rs delete mode 100644 vendor/codex/codex-rs/tui/src/mention_codec.rs delete mode 100644 vendor/codex/codex-rs/tui/src/model_catalog.rs delete mode 100644 vendor/codex/codex-rs/tui/src/model_migration.rs delete mode 100644 vendor/codex/codex-rs/tui/src/multi_agents.rs delete mode 100644 vendor/codex/codex-rs/tui/src/notifications/bel.rs delete mode 100644 vendor/codex/codex-rs/tui/src/notifications/mod.rs delete mode 100644 vendor/codex/codex-rs/tui/src/notifications/osc9.rs delete mode 100644 vendor/codex/codex-rs/tui/src/onboarding/auth.rs delete mode 100644 vendor/codex/codex-rs/tui/src/onboarding/auth/headless_chatgpt_login.rs delete mode 100644 vendor/codex/codex-rs/tui/src/onboarding/mod.rs delete mode 100644 vendor/codex/codex-rs/tui/src/onboarding/onboarding_screen.rs delete mode 100644 vendor/codex/codex-rs/tui/src/onboarding/snapshots/codex_tui__onboarding__trust_directory__tests__renders_snapshot_for_git_repo.snap delete mode 100644 vendor/codex/codex-rs/tui/src/onboarding/trust_directory.rs delete mode 100644 vendor/codex/codex-rs/tui/src/onboarding/welcome.rs delete mode 100644 vendor/codex/codex-rs/tui/src/oss_selection.rs delete mode 100644 vendor/codex/codex-rs/tui/src/pager_overlay.rs delete mode 100644 vendor/codex/codex-rs/tui/src/public_widgets/composer_input.rs delete mode 100644 vendor/codex/codex-rs/tui/src/public_widgets/mod.rs delete mode 100644 vendor/codex/codex-rs/tui/src/render/highlight.rs delete mode 100644 vendor/codex/codex-rs/tui/src/render/line_utils.rs delete mode 100644 vendor/codex/codex-rs/tui/src/render/mod.rs delete mode 100644 vendor/codex/codex-rs/tui/src/render/renderable.rs delete mode 100644 vendor/codex/codex-rs/tui/src/render/snapshots/codex_tui__render__highlight__tests__ansi_family_foreground_palette.snap delete mode 100644 vendor/codex/codex-rs/tui/src/resume_picker.rs delete mode 100644 vendor/codex/codex-rs/tui/src/selection_list.rs delete mode 100644 vendor/codex/codex-rs/tui/src/session_log.rs delete mode 100644 vendor/codex/codex-rs/tui/src/shimmer.rs delete mode 100644 vendor/codex/codex-rs/tui/src/slash_command.rs delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__app__tests__agent_picker_item_name.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__app__tests__clear_ui_after_long_transcript_fresh_header_only.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__app__tests__clear_ui_header_fast_status_fast_capable_models.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_prompt_fork_modal.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_prompt_modal.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__add_details.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__ansi16_insert_delete_no_background.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__apply_add_block.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__apply_delete_block.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__apply_multiple_files_block.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__apply_update_block.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__apply_update_block_line_numbers_three_digits_text.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__apply_update_block_relativizes_path.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__apply_update_block_wraps_long_lines.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__apply_update_block_wraps_long_lines_text.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__apply_update_with_rename_block.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__blank_context_line.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__diff_gallery_120x40.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__diff_gallery_80x24.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__diff_gallery_94x35.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__single_line_replacement_counts.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__syntax_highlighted_insert_wraps.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__syntax_highlighted_insert_wraps_text.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__theme_scope_background_resolution.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__update_details_with_rename.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__vertical_ellipsis_between_hunks.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__diff_render__tests__wrap_behavior_insert.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__active_mcp_tool_call_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__coalesced_reads_dedupe_names.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__coalesces_reads_across_multiple_calls.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__coalesces_sequential_reads_within_one_call.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__completed_mcp_tool_call_error_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__completed_mcp_tool_call_multiple_outputs_inline_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__completed_mcp_tool_call_multiple_outputs_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__completed_mcp_tool_call_success_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__completed_mcp_tool_call_wrapped_outputs_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__error_event_oversized_input_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__mcp_inventory_loading_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__mcp_tools_output_from_statuses_renders_status_only_servers.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__mcp_tools_output_from_statuses_renders_verbose_inventory.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__mcp_tools_output_lists_tools_for_hyphenated_server_names.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__mcp_tools_output_masks_sensitive_values.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__multiline_command_both_lines_wrap_with_correct_prefixes.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__multiline_command_without_wrap_uses_branch_then_eight_spaces.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__multiline_command_wraps_with_extra_indent_on_subsequent_lines.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__plan_update_with_note_and_wrapping_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__plan_update_without_note_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__ps_output_chunk_leading_whitespace_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__ps_output_empty_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__ps_output_long_command_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__ps_output_many_sessions_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__ps_output_multiline_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__ran_cell_multiline_with_stderr_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__session_header_indicates_yolo_mode.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__session_info_availability_nux_tooltip_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__single_line_command_compact_when_fits.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__single_line_command_wraps_with_four_space_continuation.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__stderr_tail_more_than_five_lines_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__user_history_cell_numbers_multiple_remote_images.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__user_history_cell_renders_remote_image_urls.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__user_history_cell_wraps_and_prefixes_each_line_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__web_search_history_cell_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__web_search_history_cell_transcript_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__markdown_render__markdown_render_tests__markdown_render_complex_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__markdown_render__markdown_render_tests__markdown_render_file_link_snapshot.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt_gpt5_codex.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt_gpt5_codex_mini.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt_gpt5_family.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__multi_agents__tests__collab_agent_transcript.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__multi_agents__tests__collab_resume_interrupted.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__pager_overlay__tests__static_overlay_snapshot_basic.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__pager_overlay__tests__static_overlay_wraps_long_lines.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__pager_overlay__tests__transcript_overlay_apply_patch_scroll_vt100.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__pager_overlay__tests__transcript_overlay_renders_live_tail.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__pager_overlay__tests__transcript_overlay_snapshot_basic.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__resume_picker__tests__resume_picker_screen.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__resume_picker__tests__resume_picker_search_error.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__resume_picker__tests__resume_picker_table.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__resume_picker__tests__resume_picker_thread_names.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_truncated.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_with_queued_messages.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_with_queued_messages@macos.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_with_working_header.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_wrapped_details_panama_two_lines.snap delete mode 100644 vendor/codex/codex-rs/tui/src/snapshots/codex_tui__update_prompt__tests__update_prompt_modal.snap delete mode 100644 vendor/codex/codex-rs/tui/src/status/account.rs delete mode 100644 vendor/codex/codex-rs/tui/src/status/card.rs delete mode 100644 vendor/codex/codex-rs/tui/src/status/format.rs delete mode 100644 vendor/codex/codex-rs/tui/src/status/helpers.rs delete mode 100644 vendor/codex/codex-rs/tui/src/status/mod.rs delete mode 100644 vendor/codex/codex-rs/tui/src/status/rate_limits.rs delete mode 100644 vendor/codex/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_cached_limits_hide_credits_without_flag.snap delete mode 100644 vendor/codex/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_includes_credits_and_limits.snap delete mode 100644 vendor/codex/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_includes_forked_from.snap delete mode 100644 vendor/codex/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_includes_monthly_limit.snap delete mode 100644 vendor/codex/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_includes_reasoning_details.snap delete mode 100644 vendor/codex/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_shows_missing_limits_message.snap delete mode 100644 vendor/codex/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_shows_refreshing_limits_notice.snap delete mode 100644 vendor/codex/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_shows_stale_limits_message.snap delete mode 100644 vendor/codex/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_shows_unavailable_limits_message.snap delete mode 100644 vendor/codex/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_treats_refreshing_empty_limits_as_unavailable.snap delete mode 100644 vendor/codex/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_truncates_in_narrow_terminal.snap delete mode 100644 vendor/codex/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__status_snapshot_uses_default_reasoning_when_config_empty.snap delete mode 100644 vendor/codex/codex-rs/tui/src/status/tests.rs delete mode 100644 vendor/codex/codex-rs/tui/src/status_indicator_widget.rs delete mode 100644 vendor/codex/codex-rs/tui/src/streaming/chunking.rs delete mode 100644 vendor/codex/codex-rs/tui/src/streaming/commit_tick.rs delete mode 100644 vendor/codex/codex-rs/tui/src/streaming/controller.rs delete mode 100644 vendor/codex/codex-rs/tui/src/streaming/mod.rs delete mode 100644 vendor/codex/codex-rs/tui/src/style.rs delete mode 100644 vendor/codex/codex-rs/tui/src/terminal_palette.rs delete mode 100644 vendor/codex/codex-rs/tui/src/terminal_title.rs delete mode 100644 vendor/codex/codex-rs/tui/src/test_backend.rs delete mode 100644 vendor/codex/codex-rs/tui/src/test_support.rs delete mode 100644 vendor/codex/codex-rs/tui/src/text_formatting.rs delete mode 100644 vendor/codex/codex-rs/tui/src/theme_picker.rs delete mode 100644 vendor/codex/codex-rs/tui/src/tooltips.rs delete mode 100644 vendor/codex/codex-rs/tui/src/tui.rs delete mode 100644 vendor/codex/codex-rs/tui/src/tui/event_stream.rs delete mode 100644 vendor/codex/codex-rs/tui/src/tui/frame_rate_limiter.rs delete mode 100644 vendor/codex/codex-rs/tui/src/tui/frame_requester.rs delete mode 100644 vendor/codex/codex-rs/tui/src/tui/job_control.rs delete mode 100644 vendor/codex/codex-rs/tui/src/ui_consts.rs delete mode 100644 vendor/codex/codex-rs/tui/src/update_action.rs delete mode 100644 vendor/codex/codex-rs/tui/src/update_prompt.rs delete mode 100644 vendor/codex/codex-rs/tui/src/updates.rs delete mode 100644 vendor/codex/codex-rs/tui/src/version.rs delete mode 100644 vendor/codex/codex-rs/tui/src/voice.rs delete mode 100644 vendor/codex/codex-rs/tui/src/wrapping.rs delete mode 100644 vendor/codex/codex-rs/tui/styles.md delete mode 100644 vendor/codex/codex-rs/tui/tests/all.rs delete mode 100644 vendor/codex/codex-rs/tui/tests/fixtures/oss-story.jsonl delete mode 100644 vendor/codex/codex-rs/tui/tests/manager_dependency_regression.rs delete mode 100644 vendor/codex/codex-rs/tui/tests/suite/mod.rs delete mode 100644 vendor/codex/codex-rs/tui/tests/suite/model_availability_nux.rs delete mode 100644 vendor/codex/codex-rs/tui/tests/suite/no_panic_on_startup.rs delete mode 100644 vendor/codex/codex-rs/tui/tests/suite/status_indicator.rs delete mode 100644 vendor/codex/codex-rs/tui/tests/suite/vt100_history.rs delete mode 100644 vendor/codex/codex-rs/tui/tests/suite/vt100_live_commit.rs delete mode 100644 vendor/codex/codex-rs/tui/tests/test_backend.rs delete mode 100644 vendor/codex/codex-rs/tui/tooltips.txt delete mode 100644 vendor/codex/codex-rs/uds/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/uds/Cargo.toml delete mode 100644 vendor/codex/codex-rs/uds/src/lib.rs delete mode 100644 vendor/codex/codex-rs/uds/src/lib_tests.rs delete mode 100644 vendor/codex/codex-rs/utils/absolute-path/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/absolute-path/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/absolute-path/src/absolutize.rs delete mode 100644 vendor/codex/codex-rs/utils/absolute-path/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/approval-presets/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/approval-presets/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/approval-presets/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/cache/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/cache/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/cache/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/cargo-bin/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/cargo-bin/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/cargo-bin/README.md delete mode 100644 vendor/codex/codex-rs/utils/cargo-bin/repo_root.marker delete mode 100644 vendor/codex/codex-rs/utils/cargo-bin/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/cli/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/cli/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/cli/src/approval_mode_cli_arg.rs delete mode 100644 vendor/codex/codex-rs/utils/cli/src/config_override.rs delete mode 100644 vendor/codex/codex-rs/utils/cli/src/format_env_display.rs delete mode 100644 vendor/codex/codex-rs/utils/cli/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/cli/src/sandbox_mode_cli_arg.rs delete mode 100644 vendor/codex/codex-rs/utils/cli/src/shared_options.rs delete mode 100644 vendor/codex/codex-rs/utils/elapsed/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/elapsed/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/elapsed/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/fuzzy-match/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/fuzzy-match/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/fuzzy-match/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/home-dir/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/home-dir/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/home-dir/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/image/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/image/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/image/src/error.rs delete mode 100644 vendor/codex/codex-rs/utils/image/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/json-to-toml/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/json-to-toml/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/json-to-toml/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/oss/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/oss/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/oss/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/output-truncation/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/output-truncation/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/output-truncation/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/output-truncation/src/truncate_tests.rs delete mode 100644 vendor/codex/codex-rs/utils/path-utils/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/path-utils/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/path-utils/src/env.rs delete mode 100644 vendor/codex/codex-rs/utils/path-utils/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/path-utils/src/path_utils_tests.rs delete mode 100644 vendor/codex/codex-rs/utils/pty/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/pty/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/pty/README.md delete mode 100644 vendor/codex/codex-rs/utils/pty/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/pty/src/pipe.rs delete mode 100644 vendor/codex/codex-rs/utils/pty/src/process.rs delete mode 100644 vendor/codex/codex-rs/utils/pty/src/process_group.rs delete mode 100644 vendor/codex/codex-rs/utils/pty/src/pty.rs delete mode 100644 vendor/codex/codex-rs/utils/pty/src/tests.rs delete mode 100644 vendor/codex/codex-rs/utils/pty/src/win/conpty.rs delete mode 100644 vendor/codex/codex-rs/utils/pty/src/win/mod.rs delete mode 100644 vendor/codex/codex-rs/utils/pty/src/win/procthreadattr.rs delete mode 100644 vendor/codex/codex-rs/utils/pty/src/win/psuedocon.rs delete mode 100644 vendor/codex/codex-rs/utils/readiness/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/readiness/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/readiness/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/rustls-provider/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/rustls-provider/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/rustls-provider/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/sandbox-summary/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/sandbox-summary/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/sandbox-summary/src/config_summary.rs delete mode 100644 vendor/codex/codex-rs/utils/sandbox-summary/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/sandbox-summary/src/sandbox_summary.rs delete mode 100644 vendor/codex/codex-rs/utils/sleep-inhibitor/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/sleep-inhibitor/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/sleep-inhibitor/src/dummy.rs delete mode 100644 vendor/codex/codex-rs/utils/sleep-inhibitor/src/iokit_bindings.rs delete mode 100644 vendor/codex/codex-rs/utils/sleep-inhibitor/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/sleep-inhibitor/src/linux_inhibitor.rs delete mode 100644 vendor/codex/codex-rs/utils/sleep-inhibitor/src/macos.rs delete mode 100644 vendor/codex/codex-rs/utils/sleep-inhibitor/src/windows_inhibitor.rs delete mode 100644 vendor/codex/codex-rs/utils/stream-parser/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/stream-parser/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/stream-parser/README.md delete mode 100644 vendor/codex/codex-rs/utils/stream-parser/src/assistant_text.rs delete mode 100644 vendor/codex/codex-rs/utils/stream-parser/src/citation.rs delete mode 100644 vendor/codex/codex-rs/utils/stream-parser/src/inline_hidden_tag.rs delete mode 100644 vendor/codex/codex-rs/utils/stream-parser/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/stream-parser/src/proposed_plan.rs delete mode 100644 vendor/codex/codex-rs/utils/stream-parser/src/stream_text.rs delete mode 100644 vendor/codex/codex-rs/utils/stream-parser/src/tagged_line_parser.rs delete mode 100644 vendor/codex/codex-rs/utils/stream-parser/src/utf8_stream.rs delete mode 100644 vendor/codex/codex-rs/utils/string/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/string/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/string/src/lib.rs delete mode 100644 vendor/codex/codex-rs/utils/string/src/truncate.rs delete mode 100644 vendor/codex/codex-rs/utils/string/src/truncate/tests.rs delete mode 100644 vendor/codex/codex-rs/utils/template/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/utils/template/Cargo.toml delete mode 100644 vendor/codex/codex-rs/utils/template/README.md delete mode 100644 vendor/codex/codex-rs/utils/template/src/lib.rs delete mode 100644 vendor/codex/codex-rs/v8-poc/.gitignore delete mode 100644 vendor/codex/codex-rs/v8-poc/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/v8-poc/Cargo.toml delete mode 100644 vendor/codex/codex-rs/v8-poc/src/lib.rs delete mode 100644 vendor/codex/codex-rs/vendor/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/.dir-locals.el delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/.editorconfig delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/.github/workflows/check.yml delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/CODE-OF-CONDUCT.md delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/COPYING delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/LICENSE delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/NEWS.md delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/README.md delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/SECURITY.md delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/bind-mount.c delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/bind-mount.h delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/bubblewrap.c delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/bubblewrap.jpg delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/bwrap.xml delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/ci/builddeps.sh delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/ci/enable-userns.sh delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/completions/bash/bwrap delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/completions/bash/meson.build delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/completions/meson.build delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/completions/zsh/_bwrap delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/completions/zsh/meson.build delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/demos/bubblewrap-shell.sh delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/demos/flatpak-run.sh delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/demos/flatpak.bpf delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/demos/userns-block-fd.py delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/meson.build delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/meson_options.txt delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/network.c delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/network.h delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/packaging/bubblewrap.spec delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/release-checklist.md delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/tests/libtest-core.sh delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/tests/libtest.sh delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/tests/meson.build delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/tests/test-run.sh delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/tests/test-seccomp.py delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/tests/test-specifying-pidns.sh delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/tests/test-specifying-userns.sh delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/tests/test-utils.c delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/tests/try-syscall.c delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/tests/use-as-subproject/.gitignore delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/tests/use-as-subproject/README delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/tests/use-as-subproject/assert-correct-rpath.py delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/tests/use-as-subproject/config.h delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/tests/use-as-subproject/dummy-config.h.in delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/tests/use-as-subproject/meson.build delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/uncrustify.cfg delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/uncrustify.sh delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/utils.c delete mode 100644 vendor/codex/codex-rs/vendor/bubblewrap/utils.h delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/BUILD.bazel delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/Cargo.toml delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/build.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/codex-windows-sandbox-setup.manifest delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/sandbox_smoketests.py delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/acl.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/allow.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/audit.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/bin/command_runner.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/bin/setup_main.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/cap.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/conpty/mod.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/desktop.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/dpapi.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/elevated/command_runner_win.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/elevated/cwd_junction.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/elevated/ipc_framed.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/elevated/runner_client.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/elevated/runner_pipe.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/elevated_impl.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/env.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/firewall.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/helper_materialization.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/hide_users.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/identity.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/lib.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/logging.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/path_normalization.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/policy.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/proc_thread_attr.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/process.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/read_acl_mutex.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/sandbox_users.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/sandbox_utils.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/setup_error.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/setup_main_win.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/setup_orchestrator.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/spawn_prep.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/ssh_config_dependencies.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/token.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/unified_exec/backends/elevated.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/unified_exec/backends/legacy.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/unified_exec/backends/mod.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/unified_exec/backends/windows_common.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/unified_exec/session.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/unified_exec/tests.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/winutil.rs delete mode 100644 vendor/codex/codex-rs/windows-sandbox-rs/src/workspace_acl.rs delete mode 100644 vendor/codex/defs.bzl delete mode 100644 vendor/codex/docs/CLA.md delete mode 100644 vendor/codex/docs/agents_md.md delete mode 100644 vendor/codex/docs/authentication.md delete mode 100644 vendor/codex/docs/config.md delete mode 100644 vendor/codex/docs/contributing.md delete mode 100644 vendor/codex/docs/example-config.md delete mode 100644 vendor/codex/docs/exec.md delete mode 100644 vendor/codex/docs/execpolicy.md delete mode 100644 vendor/codex/docs/exit-confirmation-prompt-design.md delete mode 100644 vendor/codex/docs/getting-started.md delete mode 100644 vendor/codex/docs/install.md delete mode 100644 vendor/codex/docs/js_repl.md delete mode 100644 vendor/codex/docs/license.md delete mode 100644 vendor/codex/docs/open-source-fund.md delete mode 100644 vendor/codex/docs/sandbox.md delete mode 100644 vendor/codex/docs/skills.md delete mode 100644 vendor/codex/docs/slash_commands.md delete mode 100644 vendor/codex/docs/tui-alternate-screen.md delete mode 100644 vendor/codex/docs/tui-chat-composer.md delete mode 100644 vendor/codex/docs/tui-request-user-input.md delete mode 100644 vendor/codex/docs/tui-stream-chunking-review.md delete mode 100644 vendor/codex/docs/tui-stream-chunking-tuning.md delete mode 100644 vendor/codex/docs/tui-stream-chunking-validation.md delete mode 100644 vendor/codex/flake.lock delete mode 100644 vendor/codex/flake.nix delete mode 100644 vendor/codex/justfile delete mode 100644 vendor/codex/package.json delete mode 100644 vendor/codex/patches/BUILD.bazel delete mode 100644 vendor/codex/patches/abseil_windows_gnullvm_thread_identity.patch delete mode 100644 vendor/codex/patches/aws-lc-sys_memcmp_check.patch delete mode 100644 vendor/codex/patches/aws-lc-sys_windows_msvc_memcmp_probe.patch delete mode 100644 vendor/codex/patches/aws-lc-sys_windows_msvc_prebuilt_nasm.patch delete mode 100644 vendor/codex/patches/bzip2_windows_stack_args.patch delete mode 100644 vendor/codex/patches/llvm_windows_symlink_extract.patch delete mode 100644 vendor/codex/patches/ring_windows_msvc_include_dirs.patch delete mode 100644 vendor/codex/patches/rules_rs_windows_exec_linker.patch delete mode 100644 vendor/codex/patches/rules_rs_windows_gnullvm_exec.patch delete mode 100644 vendor/codex/patches/rules_rust_windows_bootstrap_process_wrapper_linker.patch delete mode 100644 vendor/codex/patches/rules_rust_windows_build_script_runner_paths.patch delete mode 100644 vendor/codex/patches/rules_rust_windows_exec_bin_target.patch delete mode 100644 vendor/codex/patches/rules_rust_windows_exec_msvc_build_script_env.patch delete mode 100644 vendor/codex/patches/rules_rust_windows_exec_rustc_dev_rlib.patch delete mode 100644 vendor/codex/patches/rules_rust_windows_exec_std.patch delete mode 100644 vendor/codex/patches/rules_rust_windows_gnullvm_build_script.patch delete mode 100644 vendor/codex/patches/rules_rust_windows_msvc_direct_link_args.patch delete mode 100644 vendor/codex/patches/rules_rust_windows_process_wrapper_skip_temp_outputs.patch delete mode 100644 vendor/codex/patches/rusty_v8_prebuilt_out_dir.patch delete mode 100644 vendor/codex/patches/v8_bazel_rules.patch delete mode 100644 vendor/codex/patches/v8_module_deps.patch delete mode 100644 vendor/codex/patches/v8_source_portability.patch delete mode 100644 vendor/codex/patches/webrtc-sys_hermetic_darwin_sysroot.patch delete mode 100644 vendor/codex/patches/windows-link.patch delete mode 100644 vendor/codex/patches/xz_windows_stack_args.patch delete mode 100644 vendor/codex/patches/zstd-sys_windows_msvc_include_dirs.patch delete mode 100644 vendor/codex/pnpm-lock.yaml delete mode 100644 vendor/codex/pnpm-workspace.yaml delete mode 100644 vendor/codex/rbe.bzl delete mode 100644 vendor/codex/scripts/asciicheck.py delete mode 100644 vendor/codex/scripts/check-module-bazel-lock.sh delete mode 100644 vendor/codex/scripts/check_blob_size.py delete mode 100644 vendor/codex/scripts/debug-codex.sh delete mode 100644 vendor/codex/scripts/install/install.ps1 delete mode 100644 vendor/codex/scripts/install/install.sh delete mode 100644 vendor/codex/scripts/list-bazel-clippy-targets.sh delete mode 100644 vendor/codex/scripts/list-bazel-release-targets.sh delete mode 100644 vendor/codex/scripts/mock_responses_websocket_server.py delete mode 100644 vendor/codex/scripts/readme_toc.py delete mode 100644 vendor/codex/scripts/run_tui_with_exec_server.sh delete mode 100644 vendor/codex/scripts/stage_npm_packages.py delete mode 100644 vendor/codex/scripts/start-codex-exec.sh delete mode 100644 vendor/codex/scripts/test-remote-env.sh delete mode 100644 vendor/codex/third_party/meriyah/LICENSE delete mode 100644 vendor/codex/third_party/v8/BUILD.bazel delete mode 100644 vendor/codex/third_party/v8/README.md delete mode 100644 vendor/codex/third_party/v8/rusty_v8_146_4_0.sha256 delete mode 100644 vendor/codex/third_party/v8/v8_crate.BUILD.bazel delete mode 100644 vendor/codex/third_party/wezterm/LICENSE delete mode 100644 vendor/codex/tools/argument-comment-lint/.cargo/config.toml delete mode 100644 vendor/codex/tools/argument-comment-lint/.gitignore delete mode 100644 vendor/codex/tools/argument-comment-lint/BUILD.bazel delete mode 100644 vendor/codex/tools/argument-comment-lint/Cargo.lock delete mode 100644 vendor/codex/tools/argument-comment-lint/Cargo.toml delete mode 100644 vendor/codex/tools/argument-comment-lint/README.md delete mode 100644 vendor/codex/tools/argument-comment-lint/argument-comment-lint delete mode 100644 vendor/codex/tools/argument-comment-lint/driver.rs delete mode 100644 vendor/codex/tools/argument-comment-lint/lint_aspect.bzl delete mode 100644 vendor/codex/tools/argument-comment-lint/list-bazel-targets.sh delete mode 100644 vendor/codex/tools/argument-comment-lint/run-prebuilt-linter.py delete mode 100644 vendor/codex/tools/argument-comment-lint/run.py delete mode 100644 vendor/codex/tools/argument-comment-lint/rust-toolchain delete mode 100644 vendor/codex/tools/argument-comment-lint/src/bin/argument-comment-lint.rs delete mode 100644 vendor/codex/tools/argument-comment-lint/src/comment_parser.rs delete mode 100644 vendor/codex/tools/argument-comment-lint/src/lib.rs delete mode 100644 vendor/codex/tools/argument-comment-lint/test_wrapper_common.py delete mode 100644 vendor/codex/tools/argument-comment-lint/ui/allow_char_literals.rs delete mode 100644 vendor/codex/tools/argument-comment-lint/ui/allow_string_literals.rs delete mode 100644 vendor/codex/tools/argument-comment-lint/ui/comment_matches.rs delete mode 100644 vendor/codex/tools/argument-comment-lint/ui/comment_matches_multiline.rs delete mode 100644 vendor/codex/tools/argument-comment-lint/ui/comment_mismatch.rs delete mode 100644 vendor/codex/tools/argument-comment-lint/ui/comment_mismatch.stderr delete mode 100644 vendor/codex/tools/argument-comment-lint/ui/ignore_external_methods.rs delete mode 100644 vendor/codex/tools/argument-comment-lint/ui/uncommented_literal.rs delete mode 100644 vendor/codex/tools/argument-comment-lint/ui/uncommented_literal.stderr delete mode 100644 vendor/codex/tools/argument-comment-lint/wrapper_common.py delete mode 100644 vendor/codex/workspace_root_test_launcher.bat.tpl delete mode 100644 vendor/codex/workspace_root_test_launcher.sh.tpl diff --git a/AGENTS.md b/AGENTS.md index cd4da4bf..6db3f50a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -102,7 +102,6 @@ machine-spirit awake. ## Important Paths - Project root: `F:\Projects\Epiphany` -- Vendored Codex repo: `F:\Projects\Epiphany\vendor\codex` - Fork implementation plan: `F:\Projects\Epiphany\notes\epiphany-fork-implementation-plan.md` - Handoff summary: `F:\Projects\Epiphany\notes\fresh-workspace-handoff.md` - Epiphany algorithmic map: `F:\Projects\Epiphany\notes\epiphany-current-algorithmic-map.md` @@ -123,14 +122,6 @@ $env:CARGO_TARGET_DIR='C:\Users\Meta\.cargo-target-codex' cargo run --manifest-path .\Cargo.toml --bin epiphany-state -- add-evidence --type research --status ok --note '...' ``` -Useful Codex repo searches: - -```powershell -rg -n "pub enum ModeKind|TUI_VISIBLE_COLLABORATION_MODES" .\vendor\codex\codex-rs\protocol\src\config_types.rs -rg -n "builtin_collaboration_mode_presets|fn plan_preset|fn default_preset" .\vendor\codex\codex-rs\models-manager\src\collaboration_mode_presets.rs -rg -n "collaboration_mode_label|collaboration_mode_indicator|set_collaboration_mask" .\vendor\codex\codex-rs\tui\src\chatwidget.rs -``` - ## Session Bootstrap And Re-entry Rite On fresh awakening, perform this rite before wandering into implementation like diff --git a/Cargo.toml b/Cargo.toml index 6cf9cf9b..ea54ca60 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ members = [ "epiphany-tool-adapter", "epiphany-tool-mcp-runtime", ] -exclude = ["vendor/codex", "vendor/cultcache-rs"] +exclude = ["vendor/cultcache-rs"] resolver = "3" [package] diff --git a/LICENSE b/LICENSE index b0d7b796..d815141e 100644 --- a/LICENSE +++ b/LICENSE @@ -19,15 +19,10 @@ For this file: directory states different terms. - `Upstream Material` means material copied or adapted from third parties and distributed under their own licenses. -- `Mixed Apache Files` means files under `vendor/codex/**` that contain - project-authored changes on top of upstream Apache-licensed material. 2. Upstream And Third-Party Material ------------------------------------ -- All material under `vendor/codex/**` remains subject to its upstream licenses - and notices, including Apache License 2.0 at `vendor/codex/LICENSE` and any - applicable `NOTICE` or file-level notices. - Other third-party material distributed with the repository keeps its own license terms where provided. - You must continue to comply with those upstream terms when using, @@ -36,8 +31,8 @@ For this file: 3. Public License For Project-Authored Material ----------------------------------------------- -Except where a file or directory says otherwise, Project-Authored Material -outside `vendor/codex/**` is licensed to the public under: +Except where a file or directory says otherwise, Project-Authored Material is +licensed to the public under: - PolyForm Noncommercial License 1.0.0 @@ -66,27 +61,7 @@ entity is formed and designated in writing, any commercial license for Project-Authored Material may be offered directly by the individual copyright holder or holders. -5. Mixed Apache Files Under `vendor/codex/**` ---------------------------------------------- - -Some files under `vendor/codex/**` contain project-authored changes layered on -top of upstream Apache-licensed code. - -For those files: - -- Apache License 2.0 and the applicable upstream notices still apply. -- You must not read this repository notice as converting those files into a - PolyForm-only codebase. -- To the extent the project owns copyright in new additions to those files, the - project may also offer separate commercial terms for its own contributions. -- This repository notice does not claim to erase or retract Apache-2.0 - permissions already granted for Apache-covered material. - -The strongest commercial boundary in this repository therefore applies to -clearly separable Project-Authored Material outside `vendor/codex/**`, -including `epiphany-core/**` and other non-vendored project files. - -6. Open Source Status +5. Open Source Status --------------------- Because the public license path for Project-Authored Material is PolyForm @@ -94,7 +69,7 @@ Noncommercial License 1.0.0 rather than an OSI-approved license, the repository as a whole is source-available and dual-licensed. It is not an OSI Open Source distribution as a whole. -7. Reference Structures +6. Reference Structures ----------------------- This licensing structure intentionally borrows the general dual-license shape @@ -107,7 +82,7 @@ This repository does not claim that Qt or MySQL use the same exact public license terms used here. Those projects are referenced only as structural examples of dual licensing, not as the operative terms of this repository. -8. Contributions +7. Contributions ---------------- External contributions are accepted only under the EpiphanyAgent Contributor diff --git a/notes/README.md b/notes/README.md index 4c469c3c..da4cb000 100644 --- a/notes/README.md +++ b/notes/README.md @@ -10,7 +10,6 @@ contract docs. - `epiphany-anatomy.md`: current organ/sub-agent/substrate/protocol split. - `fresh-workspace-handoff.md`: compact re-entry orientation and current live state. - `epiphany-current-algorithmic-map.md`: broad source-grounded machine map. -- `codex-auth-spine-inventory.md`: retained Codex auth/model transport keeper list. - `epiphany-fork-implementation-plan.md`: current campaign plan. - `epiphany-safety-architecture.md`: capability, autonomy, and governance boundaries. diff --git a/notes/codex-auth-spine-inventory.md b/notes/codex-auth-spine-inventory.md deleted file mode 100644 index 4393641f..00000000 --- a/notes/codex-auth-spine-inventory.md +++ /dev/null @@ -1,198 +0,0 @@ -# Codex Auth Spine Inventory - -This is the keeper list for the vestigial Codex organ. Anything not justified -here is suspect until proven otherwise. The organ must stay honest: Epiphany is -a modified Codex-derived backend with a native CultCache/CultNet body, not a -clean-room client pretending to be Codex. - -## Compliance Invariant - -- Keep Codex-compatible auth identity anchored in vendored Codex-derived - machinery. Do not fully replace Codex auth with a lookalike native - implementation unless OpenAI provides an explicit public path or permission - for that use. -- It is fine to cut Codex apps, skills, marketplace, plugin UX, broad - app-server workflow, and generic JSON control surfaces. Those are product and - workflow organs, not subscription-auth legitimacy. -- The retained auth/model organ should be brutally thin, but it must be real: - load/refresh credentials, preserve required client headers/identity, - respect subscription limits, and call the allowed Codex/OpenAI model route. - -## Live Spine - -### Inputs - -- User authentication material from Codex auth storage or an external auth - provider. -- Model name and optional endpoint override from Epiphany-owned request/config - surfaces. -- Per-turn model request data: prompt instructions, formatted input, tools, - output schema, reasoning controls, service tier, and model metadata. -- Session identity: conversation/thread id, installation id, window id, - session source, optional turn metadata, and optional parent/subagent headers. - -### Durable Stores - -- Codex auth storage under the configured Codex home. The legal/compliance - authority should remain vendored Codex-derived auth machinery such as - `vendor/codex/codex-rs/login/src/auth/manager.rs`, even when Epiphany wraps - it in typed status documents. -- Auth token state in Codex-compatible auth records, including refreshable - ChatGPT tokens and account metadata. -- No durable model/provider state is owned by the current OpenAI spine. The - model string is request data; catalog/default selection must become a typed - Epiphany document before it can be keeper machinery. - -### Transformations - -- `epiphany-openai-codex-spine` imports the narrow auth types and default-client - construction it needs directly from vendored `codex-login`, without cloning - env/file/keyring/token-refresh behavior or wrapping re-exports in another crate. - Subscription credential authority remains in retained Codex-compatible - machinery; Epiphany owns only the typed status/request/event/runtime surfaces - around it. -- `epiphany-openai-codex-spine` converts `CodexAuth` directly into - authorization/account headers, chooses the ChatGPT Codex backend or OpenAI API - base URL from auth mode, builds a local serializable Responses request body, - opens an HTTP/SSE stream through `codex-client`, and parses Responses frames - into typed Epiphany stream events. -- `codex-login` remains in `vendor/codex` and should be treated as keeper - auth machinery or the source for a thin vendored auth organ. Removing it from - the native request graph may be an overcut if it makes Epiphany look like an - impersonating client instead of a modified Codex backend. - -### Outputs - -- Bearer-authenticated OpenAI/ChatGPT-compatible model calls. -- Streaming model response events. -- No compaction/memory/realtime helper calls are part of this spine unless a - typed Epiphany caller explicitly earns them later. -- No model catalog or model metadata store is keeper machinery yet. -- Auth and transport telemetry/errors needed to recover or report failure. - -## Keep - -- `codex-login`: keep as the legal authority for Codex-compatible subscription - credentials. The Epiphany transport imports only its required auth surface. -- `codex-client`: keep only as a plain HTTP/SSE transport helper for now. It - does not own Epiphany request shape, model policy, stream semantics, or durable - state. - -## Cut Or Seal - -- Codex app-server routing is not part of auth/model transport. It can host - compatibility wrappers while Aquarium/CLI still speak JSON-RPC, but it must - not be the native Epiphany operator surface. -- Codex apps, skills, marketplace, plugin UX, and MCP OAuth handlers are not - required for OpenAI subscription compatibility. MCP may survive as a separate - CultNet adapter, not as a reason to keep the Codex app-server brain. -- `codex-core::client` helper calls for memories/realtime/compaction are - suspicious unless Epiphany deliberately needs that OpenAI endpoint. Keep them - sealed with the transport until the native adapter split can decide. -- `codex-api`, `codex-model-provider`, `codex-model-provider-info`, - `codex-core::client`, and `models-manager` are no longer keeper request-path - organs. `codex-login` is different: broad login UX can be cut, but the - vendored Codex auth semantics should remain the anchor for subscription use. - If a later model catalog is needed, it should be a typed Epiphany catalog - document, not a revival of the old Codex provider stack. -- External bearer command auth and agent identity remain inside the retained - vendored Codex auth organ. Epiphany should expose them only if a concrete - typed runtime/status need appears; do not clone them into a second authority. - -## Extract Target - -Create an outside-vendor adapter with this shape: - -```text -EpiphanyOpenAIAuthAdapter - -> wrap retained Codex-compatible credential loading/refresh - -> expose account/auth mode/model availability - -EpiphanyOpenAIModelTransport - -> accept typed Epiphany model-turn request - -> call OpenAI Responses API through Codex-compatible auth - -> emit typed stream events / receipts -``` - -The adapter may depend on retained `codex-login` auth machinery and -`codex-client` while the reliquary survives. It must not depend -on `codex-app-server`, `codex_message_processor`, plugin/app/skill/marketplace -modules, broad Codex provider/request construction, or Epiphany state -ownership. - -## Next Cut - -The first `epiphany-openai-adapter` crate boundary now exists as a native typed -surface: - -- input: typed model-turn request plus adapter config -- output: typed stream events and terminal usage/error receipt -- current dependency: no Codex app-server and no Codex transport yet -- planned internal dependency: Codex auth/model transport only -- forbidden dependency: Codex app-server or Epiphany JSON-RPC routes - -The first attempt to wire `codex-core` directly as a standalone path dependency -escaped the vendored workspace lock and hit transitive ICU/temporal dependency -skew. Do not paper over that with random version pins. - -The first workspace-verified wrapper now exists as -`epiphany-openai-codex-spine`. It depends on the pure typed adapter plus the -keeper Codex auth types. It uses `AuthManager` / `CodexAuth` only at provider -transport construction and request authentication; no unread adapter-status -document mirrors that live boundary. `epiphany-codex-bridge` re-exports this -spine so the current app-server compatibility shell can compile it without -making the pure document crate depend on Codex. - -The transport wrapper is now also in that spine. It maps typed -`EpiphanyOpenAiModelRequest` documents into a local serializable Responses -request body, resolves credentials through vendored `codex-login`, chooses the -ChatGPT/OpenAI base URL from auth mode, opens the selected HTTP stream with -`codex-client`, and converts provider deltas/completion into transient -`EpiphanyOpenAiStreamEvent` / `EpiphanyOpenAiModelReceipt` values. It no -longer imports Codex `ResponsesApiRequest`, `ResponsesClient`, -`ResponseEvent`, provider config, model-provider, or broad app-server -workflow. Its narrow direct imports preserve Codex-compatible auth identity -without letting Codex own Epiphany request/state shape. - -`schemas/cultnet/` publishes only the exact OpenAI-compatible provider request. -Provider stream values are normalized immediately into the native model event -and receipt family; they are not a second CultCache or CultNet authority. - -The native runtime route is the operator and daemon edge. -`epiphany-openai-adapter` keeps the provider request as a CultCache -`DatabaseEntry`; `epiphany-core::runtime_spine_cache` registers that request -beside the native request/event/receipt family. The outside-vendor -`epiphany-openai-runtime` records those native model documents, runtime -sessions, jobs, and job results into the runtime spine. Its model command opens the -Codex-backed transport through the typed spine; its `smoke` command proves the -CultCache route without touching the network. This is the first native caller -for the advertised OpenAI CultNet contract. - -Heartbeat/specialist launches use the atomic -`epiphany-core::prepare_runtime_spine_heartbeat_job` path. Initialization, -session admission, job creation, and launch receipts are one prepared CultCache -mutation rather than a caller-visible sequence. - -The heartbeat launch plan is native as well: -`epiphany-core::plan_runtime_spine_heartbeat_launch` validates the launch -contract and active runtime-link conflicts, then returns the durable job binding -and runtime link. Vendored `CodexThread` is still a persistence adapter for the -compatibility route, not the owner of that state mechanics. - -The Epiphany state-update contract and mutation law have also left vendored -Codex. `epiphany-core::EpiphanyStateUpdate` now owns the update document used -by the compatibility `thread/epiphany/update`, promotion, accept, and launch -paths. `epiphany-core::epiphany_state_update_validation_errors` and -`epiphany-core::apply_epiphany_state_update` own typed validation and mutation -application. `codex-core` re-exports the contract only as a compatibility -alias, and `CodexThread` now calls native state-update functions around its -remaining revision check, persistence validation, and rollout/session writeback. - -This paragraph describes the superseded embedded-auth phase. Exact `ed7357a2` -later removed Codex credential and transport anatomy from Epiphany entirely; -the independent CodexConnector owns that boundary. The unused root -`tokio-tungstenite` / `tungstenite` patches are gone with the compiled Codex -graph. - -The point is ownership: Epiphany calls a model adapter; it does not live inside -the Codex host brain. diff --git a/notes/epiphany-fork-implementation-plan.md b/notes/epiphany-fork-implementation-plan.md index 53fa2d6e..e2f60afd 100644 --- a/notes/epiphany-fork-implementation-plan.md +++ b/notes/epiphany-fork-implementation-plan.md @@ -25,8 +25,8 @@ transport belong to the independent CodexConnector daemon, not Epiphany's body. evidence sources until a typed reasoning consumer earns them. - CultCache stores typed state and receipts; CultMesh/CultNet carry typed local and federated projections. -- Vendored Codex exposes no Epiphany route, DTO, thread-state field, rollout - migration, scheduler, watcher, or bridge crate. +- Codex implementation source is absent from Epiphany. The typed Connector + contract is the only Codex-facing compile dependency. ## Invariants diff --git a/notes/native-coordinator-liberation-map.md b/notes/native-coordinator-liberation-map.md deleted file mode 100644 index 847798e6..00000000 --- a/notes/native-coordinator-liberation-map.md +++ /dev/null @@ -1,405 +0,0 @@ -# Native Coordinator Liberation Map - -## Objective - -Make `epiphany-mvp-coordinator` an Epiphany-native control loop. It must read -and mutate typed Epiphany state, launch and inspect runtime work, and accept or -refuse findings without sending `thread/epiphany/*` JSON-RPC requests through -Codex. - -Codex remains the OpenAI authentication/model-transport bridge and may retain -legacy app-server wrappers for named Codex clients. It is not the coordinator's -nervous system. - -## Current Mechanism - -The coordinator is compiled from -`epiphany-core/src/bin/epiphany-mvp-coordinator.rs`, but starts a Codex app-server -process and uses `status_cli::AppServerClient` for the authoritative loop: - -- state bootstrap and revision writes use `thread/epiphany/update` -- freshness and coordinator projections use `thread/epiphany/freshness` and - `thread/epiphany/view` -- specialist lifecycle uses `thread/epiphany/roleLaunch`, - `thread/epiphany/roleResult`, and `thread/epiphany/roleAccept` -- recovery lifecycle uses `thread/epiphany/reorientLaunch` and - `thread/epiphany/reorientResult` - -The typed machinery already exists below that shell: - -- `epiphany-core/src/thread_state_store.rs` owns CultCache-backed typed thread - state persistence. -- `epiphany-core/src/runtime_spine.rs` owns typed job, launch, result, event, and - receipt persistence. -- `epiphany-core/src/agent_launch.rs` builds typed role and reorientation launch - documents. -- `epiphany-core/src/surfaces/role_result.rs` interprets typed findings and - constructs acceptance bundles. -- `epiphany-core/src/mind_gateway.rs`, `hands_gateway.rs`, and the receipt proof - machinery own admission, action, and verification contracts. -- `epiphany-codex-bridge/src/mutation_service.rs` currently composes much of - this policy behind an `EpiphanyMutationHost`, but its host contract still - assumes a Codex-hosted compatibility snapshot and persistence hook. -- `vendor/codex/codex-rs/app-server/src/codex_message_processor/ - epiphany_mutation_routes.rs` is already mostly a transport shell over that - bridge service. It should become a compatibility caller of the native owner, - not the place where the owner remains hosted. - -## Authority Map - -### Owner - -One Epiphany-native coordinator service owns the control decision and delegates -typed persistence to the thread-state store and runtime-spine. - -### Inputs - -- typed operator/coordinator intent -- CultCache-backed `EpiphanyThreadState` -- runtime-spine job, result, and receipt documents -- typed watcher, retrieval, token-pressure, and dynamic prompt context -- model events returned by the model-transport adapter - -### Outputs - -- revision-gated typed state updates -- typed runtime launch and interrupt receipts -- typed role/reorientation findings -- Mind review and state-commit receipts -- read-only typed coordinator, freshness, role, and recovery projections - -### Derived State - -JSON-RPC responses, app-server notifications, Aquarium panels, CLI JSON, TUI -rows, CultMesh mirrors, and operator summaries are projections. They do not own -lifecycle, scheduling, acceptance, prompt doctrine, or durable truth. - -### Forbidden Writers - -- `codex_message_processor.rs` and its route modules -- Codex thread/session prompt machinery -- JSON-RPC request/response types -- GUI/Aquarium clients -- CultMesh mirrors and status snapshots -- watcher or reorientation verdicts -- raw model or MCP JSON - -Each may submit or translate a typed intent. None may preserve an independent -decision after the native owner responds. - -### Shared Paths - -Manual CLI actions, programmatic coordinator turns, heartbeat scheduling, -Aquarium actions, and legacy Codex JSON-RPC calls must use the same native -operations for: - -1. state read/update -2. freshness and coordinator derivation -3. role/reorientation launch -4. result readback -5. accept/refuse -6. interrupt - -### Deletion Line - -Delete `status_cli::AppServerClient` from the coordinator control path. Delete -its direct `thread/epiphany/*` request construction. After the native loop is -proved, reduce Codex mutation routes to protocol parsing, native service calls, -response mapping, and compatibility notifications. Then remove bridge policy -that exists only to compensate for Codex-hosted state. - -## Migration Order - -This is one vertical ownership migration, landed in buildable cuts. No cut may -introduce a second authoritative store or a native/JSON-RPC mode flag. - -1. Move route-independent mutation/launch/accept orchestration out of - `epiphany-codex-bridge` into an Epiphany-native service whose host ports are - typed state persistence, runtime-spine, clock, and context inputs. Preserve - the existing bridge service as a thin delegating compatibility wrapper. -2. Add native read operations for state, freshness, coordinator/role views, and - typed result readback over the same stores used by mutation operations. -3. Rewire `epiphany-mvp-coordinator` to the native service and remove - `AppServerClient` plus every `thread/epiphany/*` request from the binary. -4. Prove bootstrap, manual/programmatic launch, pending/completed result, - acceptance, refusal, interruption, and recovery against native stores. -5. Make Codex JSON-RPC routes delegate to the same service. Remove duplicated - route/bridge policy and mapper-only tests that no longer protect a boundary. - -## Native Organ Boundary - -The native service is a façade, not a new host brain. The first extraction -proved the authority direction but allowed `epiphany-core/src/coordinator_service.rs` -to grow to 1,122 lines, almost the same size as the 1,143-line bridge mutation -service it is starving. That shape is rejected. Do not continue pouring bridge -functions into one core file. - -The native body must be split before further authority moves: - -- coordinator state owner: CultCache thread-state load, revision gate, - validation, write, and changed-field report -- coordinator result reader: runtime-link selection, runtime-spine lifecycle, - typed finding interpretation, and result notes -- coordinator acceptance organ: completed-finding admission, launch-contract - proof checks, role/reorientation acceptance construction, receipt persistence, - proof enforcement, and Mind commit -- coordinator launch organ: typed dynamic context, launch document construction, - runtime-spine opening/interruption, and state linkage -- coordinator projection organ: freshness, role board, CRRC, and coordinator - views derived from typed inputs without persistence -- coordinator façade: narrow composition over those organs; no policy bodies, - protocol DTOs, JSON, or Codex host hooks - -Each organ owns one invariant and must be testable against injected paths and -typed inputs without starting Codex. A source guard should fail if the façade -regrows policy bodies or if any native organ imports app-server protocol types. - -Launch-context ownership is now native. `coordinator_launch_context` owns local -Verse context, memory-graph cuts, Hands consequence evidence, Soul/Modeling -work-loop telemetry, and bounded prompt rendering. The compatibility bridge's -`launch_context` module is only a re-export membrane. Coordinator rewiring must -use these same functions; a context-free launch is not an acceptable shortcut. - -The coordinator façade now exposes typed `launch_job` and `accept_role` -actuators. `launch_job` composes native planning with the atomic launch commit; -`accept_role` loads the typed completed finding, builds and proof-checks the -Mind-gated acceptance, and atomically publishes state plus witnesses. Callers -must delegate to these methods rather than replaying their choreography. The -bridge supplies host state, -thread identity, reference turn, timestamp, and nonce to -`EpiphanyCoordinatorService::accept_role`, then maps the typed result to the -compatibility response. It no longer builds evidence packets, Soul verdicts, -proof sets, Mind receipts, or state commits. Reorientation acceptance is the -same shape: `accept_reorient` owns typed result admission, Continuity recovery -proof, Mind witness, and atomic state publication. The bridge delegates both -acceptance families and contains zero direct witness commits. - -## Acceptance Transaction Wound - -The compatibility bridge currently persists prerequisite receipts, writes -thread state, then writes the Mind state-commit receipt in a separate -runtime-spine store. If the final write fails, accepted durable state survives -without its promised commit witness. Moving that sequence into core unchanged -is forbidden. - -Before final acceptance persistence moves, define one typed transaction law: -either co-locate state admission and its commit witness in one CultCache -transaction boundary, or persist a prepared acceptance transaction whose -recovery protocol can deterministically finish or refuse admission after -interruption. Best-effort rollback across two files is not atomicity. A negative -smoke must inject failure after prerequisite receipts and after state write and -prove no unwitnessed accepted state becomes authoritative. - -## Launch Transaction Law - -Launch planning now belongs to `coordinator_launch`: it validates the expected -thread revision, inspects the prior runtime binding, prepares the heartbeat -launch documents, and derives the new thread-state linkage without writing. -The Codex bridge is a compatibility actuator for that plan; it no longer owns -those policy decisions. - -`commit_coordinator_job_launch` is the single launch publication owner. It -prepares runtime identity, session, job, opened event, worker request, optional -Research Substrate Gate grant, and linked thread state against one loaded -CultCache snapshot, then publishes the heterogeneous set in one atomic batch. -The compatibility bridge cannot write any member separately. Injected batch -refusal proves the prior snapshot survives with no job, worker request, grant, -or new state linkage. Rollback and reconciliation are not owners. - -## Invariants - -- There is one durable thread-state owner and one runtime lifecycle owner. -- Revision validation is identical for CLI, coordinator, heartbeat, Aquarium, - and compatibility JSON-RPC callers. -- A view or watcher verdict cannot launch or accept work. -- Raw JSON is parsed once at a hostile edge and does not cross native service - ports. -- Model transport cannot inject organ doctrine, scheduler decisions, or state - mutation policy. -- Compatibility wrappers cannot override or repair the native result after the - fact. - -## Verification Layer - -The proof must observe the stores and receipts where the invariant lives: - -- unit tests for each native operation with injected state store, runtime - store, clock, and context inputs -- adjacent-operation smokes for launch -> result -> review -> state commit -- a native coordinator smoke with no app-server binary available -- a compatibility smoke proving JSON-RPC delegates to the same native result -- negative tests proving Codex routes cannot write around revision/admission - gates and the coordinator binary contains no `thread/epiphany/*` methods - -The migration is not complete because the coordinator eventually converges on -the same state after an app-server round trip. The old path must be structurally -unable to decide the result. - -Coordinator sight has crossed the boundary. `collect_coordinator_status`, role -result readback, and reorientation result readback now use the native status -projection over the shared thread/runtime CultCache store. The coordinator no -longer calls Codex for `view`, `roleResult`, or `reorientResult`. - -Role mutation has now crossed too. `epiphany-mvp-coordinator` builds role launch -requests from native state plus the full native Verse/memory/work-loop context, -publishes them through `EpiphanyCoordinatorService::launch_job`, and dispatches -auto-review through `accept_role`. The role launch and role acceptance routes -are gone. - -`epiphany-mvp-coordinator` is now fully native. Reorientation launch consumes -the typed native status decision, preserves native prompt context, and uses the -same atomic launch actuator. Bootstrap and supersession use typed state updates. -The binary starts no app-server, contains no production `thread/epiphany/*` -strings, and emits telemetry with `appServerCalls=0`. Its smoke harness no -longer builds or requires codex-app-server and passes cold, local bootstrap, -pressure, Hands gate, and real commit-receipt scenarios. - -Role-board `authorityScopes` now publish typed capability identifiers such as -`epiphany.coordinator.role.launch`, `epiphany.coordinator.role.accept`, and -`epiphany.coordinator.reorient.result.read`. Source proof rejects slash-shaped -authority, and rendered native status contains no `thread/epiphany/*` scopes. - -The remaining source vocabulary is classified. Active worker launch contracts -now describe typed coordinator capabilities and Mind-admitted `statePatch` -cargo. `epiphany-mvp-status` defaults to native state; its route calls exist only -behind explicit `--codex` compatibility. `epiphany-phase6-*-smoke` binaries are -compatibility contract probes, coordinator source occurrences are negative -tests, and the distillation occurrence is a historical-input test fixture. -Interruption now has a native owner. `interrupt_coordinator_job` validates the -binding and revision, records the operator reason through the canonical state -owner, and reports `cancelRequested=false` rather than inventing backend -cancellation. `epiphany-mvp-status --interrupt-binding` uses this path by -default; `--codex` selects the compatibility route explicitly. The bridge now -delegates interruption to `EpiphanyCoordinatorService::interrupt_job`; a source -guard rejects local binding mutation, and stale unified state is refused before -commit. - -Generic update and promotion now commit through -`EpiphanyCoordinatorService::apply_state_update_from`. A rollout snapshot may -seed native state only when the unified store has no state document; once native -truth exists, stale host input is refused even without an expected revision. -The Codex rollout mirror is deleted. New turns neither persist Epiphany state as -rollout items nor inject a rendered Epiphany state developer message. App-server -read and automation paths load unified CultCache first and fail closed when that -document is corrupt; session state is only an empty-store migration seed. -`stateUpdated` notifications carry the exact native commit result directly. -Historical rollout reconstruction remains a compatibility reader, not an owner -or a writer. - -Codex session custody is deleted as well. `SessionState`, `Session`, and -`CodexThread` carry no Epiphany state cache or accessor; normal Codex rollout -reconstruction ignores historical Epiphany items. The app-server compatibility -host reads unified CultCache first and, only when it is empty, invokes the -legacy rollout reader directly at the boundary. A source guard rejects renewed -session custody. - -The historical rollout parser has now moved out of `codex-core` as well. It -lives in app-server's explicitly quarantined `legacy_epiphany_rollout` module, -where two migration tests prove latest-surviving selection and rollback -rejection. `codex-core` no longer declares or exports an Epiphany rollout -parser. The legacy `RolloutItem` variant remains readable so old files do not -become undecodable, but normal core reconstruction treats it as inert cargo. - -`CodexThread` is now generic again at the remaining host seam. Its -Epiphany-named reference-turn and runtime-spine-path helpers are deleted; -app-server derives the compatibility store path from the generic config -snapshot and calls a generic `reference_turn_id` accessor. The core source guard -rejects any `pub async fn epiphany_*` API on `CodexThread`. - -`codex-protocol` no longer republishes Epiphany's anatomy. App-server-protocol, -app-server compatibility code, and legacy-focused core tests import -`epiphany-state-model` directly. Protocol retains a private -`EpiphanyStateItem` import solely to decode the historical rollout variant; its -two round-trip tests and app-server's two migration tests pass. A source guard -forbids `pub use epiphany_state_model::*` from returning. - -The historical rollout payload is now opaque inside Codex protocol: -`RolloutItem::EpiphanyState(serde_json::Value)`. App-server's legacy quarantine -alone decodes that value into `EpiphanyStateItem`, returns a typed state only -after validation, and rejects malformed payloads. The old tagged JSON shape, -latest-surviving selection, and rollback semantics remain covered. Codex -protocol no longer has a production dependency on `epiphany-state-model`; a -source guard proves both the opaque variant and dependency boundary. - -Codex protocol's obsolete native-state test authority is deleted too. The -giant `EpiphanyThreadState` fixture and native round-trip tests are replaced by -one minimal opaque-envelope preservation test. `codex-protocol` has no -`epiphany-state-model` dependency in production or dev configuration; native -state serialization is tested by its actual owner. - -The opaque Rust variant is now named `LegacyEpiphanyState`, with an explicit -`#[serde(rename = "epiphany_state")]` preserving the historical wire/file tag. -Every remaining Codex match therefore declares that it handles quarantine -cargo rather than live Epiphany authority. Protocol shape and app-server -migration tests prove the rename did not change old-file compatibility. - -Generic unknown rollout cargo is rejected. `RolloutRecorder::load_rollout_items` -parses each line into strict `RolloutLine`/`RolloutItem`, counts parse failures, -and feeds the result into history replay, metadata, listing, state extraction, -and agent control. A catch-all variant would turn malformed or future live -items into silent success across every consumer to preserve one extinct record. -The deletion path is narrower: app-server's migration quarantine should read -raw rollout lines, recognize only `type=epiphany_state`, decode its payload, -and combine those migration records with strictly decoded Codex lifecycle items. -Then `LegacyEpiphanyState` can leave Codex protocol and all core consumers. - -That final deletion is complete. `RolloutItem` has no Epiphany variant, and -protocol/core/rollout/state/app-server-protocol contain no legacy-state match. -App-server's migration quarantine reads raw JSONL, recognizes only the exact -historical `type=epiphany_state` tag, validates its payload into native -`EpiphanyStateItem`, and strictly decodes ordinary `RolloutLine` items needed -for turn and rollback semantics. Unknown ordinary lines remain parse failures -for the normal Codex loader; the migration scan ignores them without teaching -Codex global tolerance. Four quarantine tests prove raw-tag recognition, -latest-surviving selection, rollback rejection, and malformed-payload refusal. -Obsolete core legacy fixtures and the final core state-model dev dependency are -deleted. - -Codex-owned Epiphany reflexes are deleted too. The app-server event loop no -longer auto-compacts on Epiphany pressure, launches reorientation workers at -turn boundaries, or steers pre-compaction checkpoint instructions into active -turns. `epiphany_automation.rs` and its per-thread checkpoint intervention -state are gone. Native coordinator/heartbeat/Continuity organs own scheduling, -launch, pressure, and recovery; app-server retains explicit compatibility -routes, notifications, and read projection only. A source guard rejects renewed -automation authority in the event loop, processor module list, or thread state. - -The remaining app-server surface is now mechanically classified and guarded. -Mutation routes may call only the explicit update or interruption bridge -delegate; forbidden local receipt/binding/runtime writes, -prompt steering, compaction submission, and automation selection fail the -source test. Read routes reject every mutation, launch, interruption, indexing, -prompt-steering, compaction, or scheduler symbol. Migration, read projection, -notification projection, and explicit delegated actuation are the only allowed -categories. The deleted event-loop reflex also left dead bridge automation and -checkpoint-pressure wrappers; those zero-caller exports and imports are gone. - -Executable-client discovery is recorded in -`notes/epiphany-app-server-client-matrix.md`. Only eight routes have named -in-repo consumers, all explicit phase-6 smokes or -`epiphany-mvp-status --codex` fallbacks. Ten routes are advertised but -unconsumed: role/reorientation launch and accept, index, distill, propose, -promote, job launch, and retrieve. Definitions, generated bindings, README -claims, and serialization tests do not count as clients. Those ten request -registrations, dispatch arms, handlers, tests, and README claims are deleted. -The registration guard now fixes the compatibility surface at the eight named -client routes and rejects restoration of the unconsumed methods. - -The orphan audit then removed the deleted methods' request/response DTOs from -app-server protocol, including the duplicate generic job-launch worker document -hierarchy and retrieval result/index projection shapes. Bridge-only distill, -propose, job-document, index, and retrieve conversions plus the entire -`retrieve_protocol` module are deleted. Regenerated JSON/TypeScript fixtures -contain none of those types; their in-memory fixture comparison passes. - -The final eight-route compatibility surface is gone too. Seven phase-6 -app-server smoke binaries and the app-server-backed MVP status smoke were -deleted; `epiphany-mvp-status` has one native status/interruption path and no -Codex transport client. App-server request/notification registrations, -dispatch, route modules, all `ThreadEpiphany*` DTOs, generated exports, generic -Codex `Thread.epiphanyState`, and legacy rollout-state migration are deleted. -`codex-app-server-protocol` no longer depends on `epiphany-state-model`. -The apparent final bridge consumer, the Codex-hosted file-watcher invalidation -manager, had no watch creator or snapshot reader after route deletion; only -no-op teardown calls survived. It and that listener plumbing were deleted. -`epiphany-codex-bridge` and both remaining Codex dependency edges are gone. diff --git a/vendor/codex/.bazelignore b/vendor/codex/.bazelignore deleted file mode 100644 index 2e90753c..00000000 --- a/vendor/codex/.bazelignore +++ /dev/null @@ -1,4 +0,0 @@ -# Without this, Bazel will consider BUILD.bazel files in -# .git/sl/origbackups (which can be populated by Sapling SCM). -.git -codex-rs/target diff --git a/vendor/codex/.bazelrc b/vendor/codex/.bazelrc deleted file mode 100644 index 30d9ad9d..00000000 --- a/vendor/codex/.bazelrc +++ /dev/null @@ -1,165 +0,0 @@ -common --repo_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1 -common --repo_env=BAZEL_NO_APPLE_CPP_TOOLCHAIN=1 -# Dummy xcode config so we don't need to build xcode_locator in repo rule. -common --xcode_version_config=//:disable_xcode - -common --disk_cache=~/.cache/bazel-disk-cache -common --repo_contents_cache=~/.cache/bazel-repo-contents-cache -common --repository_cache=~/.cache/bazel-repo-cache -common --remote_cache_compression -startup --experimental_remote_repo_contents_cache - -common --experimental_platform_in_output_dir - -# Runfiles strategy rationale: codex-rs/utils/cargo-bin/README.md -common --noenable_runfiles - -common --enable_platform_specific_config -common:linux --host_platform=//:local_linux -common:windows --host_platform=//:local_windows -common --@rules_cc//cc/toolchains/args/archiver_flags:use_libtool_on_macos=False -common --@llvm//config:experimental_stub_libgcc_s - -# TODO(zbarsky): rules_rust doesn't implement this flag properly with remote exec... -# common --@rules_rust//rust/settings:pipelined_compilation - -common --incompatible_strict_action_env -# Not ideal, but We need to allow dotslash to be found -common:linux --test_env=PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin -common:macos --test_env=PATH=/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin - -# Pass through some env vars Windows needs to use powershell? -common:windows --test_env=PATH -common:windows --test_env=SYSTEMROOT -common:windows --test_env=COMSPEC -common:windows --test_env=WINDIR -# Rust's libtest harness runs test bodies on std-spawned threads. The default -# 2 MiB stack can be too small for large async test futures on Windows CI; see -# https://github.com/openai/codex/pull/19067 for the motivating failure. -common --test_env=RUST_MIN_STACK=8388608 # 8 MiB - -common --test_output=errors -common --bes_results_url=https://app.buildbuddy.io/invocation/ -common --bes_backend=grpcs://remote.buildbuddy.io -common --remote_cache=grpcs://remote.buildbuddy.io -common --remote_download_toplevel -common --nobuild_runfile_links -common --remote_timeout=3600 -common --noexperimental_throttle_remote_action_building -common --experimental_remote_execution_keepalive -common --grpc_keepalive_time=30s -common --experimental_remote_downloader=grpcs://remote.buildbuddy.io - -# This limits both in-flight executions and concurrent downloads. Even with high number -# of jobs execution will still be limited by CPU cores, so this just pays a bit of -# memory in exchange for higher download concurrency. -common --jobs=30 - -common:remote --extra_execution_platforms=//:rbe -common:remote --remote_executor=grpcs://remote.buildbuddy.io -common:remote --jobs=800 -# TODO(team): Evaluate if this actually helps, zbarsky is not sure, everything seems bottlenecked on `core` either way. -# Enable pipelined compilation since we are not bound by local CPU count. -#common:remote --@rules_rust//rust/settings:pipelined_compilation - -# GitHub Actions CI configs. -common:ci --remote_download_minimal -common:ci --keep_going -common:ci --verbose_failures -common:ci --build_metadata=REPO_URL=https://github.com/openai/codex.git -common:ci --build_metadata=ROLE=CI -common:ci --build_metadata=VISIBILITY=PUBLIC -# rules_rust derives debug level from Bazel toolchain/compilation-mode settings, -# not Cargo profiles. Keep CI Rust actions explicit and lean. -common:ci --@rules_rust//rust/settings:extra_rustc_flag=-Cdebuginfo=0 -common:ci --@rules_rust//rust/settings:extra_exec_rustc_flag=-Cdebuginfo=0 - -# Disable disk cache in CI since we have a remote one and aren't using persistent workers. -common:ci --disk_cache= - -# Shared config for the main Bazel CI workflow. -common:ci-bazel --config=ci -common:ci-bazel --build_metadata=TAG_workflow=bazel - -# Shared config for Bazel-backed Rust linting. -build:clippy --aspects=@rules_rust//rust:defs.bzl%rust_clippy_aspect -build:clippy --output_groups=+clippy_checks -build:clippy --@rules_rust//rust/settings:clippy.toml=//codex-rs:clippy.toml -# Keep this deny-list in sync with `codex-rs/Cargo.toml` `[workspace.lints.clippy]`. -# Cargo applies those lint levels to member crates that opt into `[lints] workspace = true` -# in their own `Cargo.toml`, but `rules_rust` Bazel clippy does not read Cargo lint levels. -# `clippy.toml` can configure lint behavior, but it cannot set allow/warn/deny/forbid levels. -build:clippy --@rules_rust//rust/settings:clippy_flag=-Dwarnings -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::await_holding_invalid_type -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::await_holding_lock -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::expect_used -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::identity_op -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::manual_clamp -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::manual_filter -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::manual_find -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::manual_flatten -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::manual_map -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::manual_memcpy -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::manual_non_exhaustive -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::manual_ok_or -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::manual_range_contains -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::manual_retain -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::manual_strip -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::manual_try_fold -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::manual_unwrap_or -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::needless_borrow -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::needless_borrowed_reference -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::needless_collect -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::needless_late_init -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::needless_option_as_deref -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::needless_question_mark -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::needless_update -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::redundant_clone -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::redundant_closure -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::redundant_closure_for_method_calls -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::redundant_static_lifetimes -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::trivially_copy_pass_by_ref -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::uninlined_format_args -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::unnecessary_filter_map -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::unnecessary_lazy_evaluations -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::unnecessary_sort_by -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::unnecessary_to_owned -build:clippy --@rules_rust//rust/settings:clippy_flag=--deny=clippy::unwrap_used - -# Shared config for Bazel-backed argument-comment-lint. -build:argument-comment-lint --aspects=//tools/argument-comment-lint:lint_aspect.bzl%rust_argument_comment_lint_aspect -build:argument-comment-lint --output_groups=argument_comment_lint_checks -build:argument-comment-lint --@rules_rust//rust/toolchain/channel=nightly - -# Rearrange caches on Windows so they're on the same volume as the checkout. -common:ci-windows --config=ci-bazel -common:ci-windows --build_metadata=TAG_os=windows -common:ci-windows --repo_contents_cache=D:/a/.cache/bazel-repo-contents-cache - -# We prefer to run the build actions entirely remotely so we can dial up the concurrency. -# We have platform-specific tests, so we want to execute the tests on all platforms using the strongest sandboxing available on each platform. - -# On linux, we can do a full remote build/test, by targeting the right (x86/arm) runners, so we have coverage of both. -# Linux crossbuilds don't work until we untangle the libc constraint mess. -common:ci-linux --config=ci-bazel -common:ci-linux --build_metadata=TAG_os=linux -common:ci-linux --config=remote -common:ci-linux --strategy=remote -common:ci-linux --platforms=//:rbe - -# On mac, we can run all the build actions remotely but test actions locally. -common:ci-macos --config=ci-bazel -common:ci-macos --build_metadata=TAG_os=macos -common:ci-macos --config=remote -common:ci-macos --strategy=remote -common:ci-macos --strategy=TestRunner=darwin-sandbox,local - -# Linux-only V8 CI config. -common:ci-v8 --config=ci -common:ci-v8 --build_metadata=TAG_workflow=v8 -common:ci-v8 --build_metadata=TAG_os=linux -common:ci-v8 --config=remote -common:ci-v8 --strategy=remote - -# Optional per-user local overrides. -try-import %workspace%/user.bazelrc diff --git a/vendor/codex/.bazelversion b/vendor/codex/.bazelversion deleted file mode 100644 index f7ee0669..00000000 --- a/vendor/codex/.bazelversion +++ /dev/null @@ -1 +0,0 @@ -9.0.0 diff --git a/vendor/codex/.codespellignore b/vendor/codex/.codespellignore deleted file mode 100644 index 23924fe0..00000000 --- a/vendor/codex/.codespellignore +++ /dev/null @@ -1,6 +0,0 @@ -iTerm -iTerm2 -psuedo -SOM -te -TE diff --git a/vendor/codex/.codespellrc b/vendor/codex/.codespellrc deleted file mode 100644 index 87e3468c..00000000 --- a/vendor/codex/.codespellrc +++ /dev/null @@ -1,6 +0,0 @@ -[codespell] -# Ref: https://github.com/codespell-project/codespell#using-a-config-file -skip = .git*,vendor,*-lock.yaml,*.lock,.codespellrc,*test.ts,*.jsonl,frame*.txt,*.snap,*.snap.new,*meriyah.umd.min.js -check-hidden = true -ignore-regex = ^\s*"image/\S+": ".*|\b(afterAll)\b -ignore-words-list = ratatui,ser,iTerm,iterm2,iterm,te,TE,PASE,SEH diff --git a/vendor/codex/.codex/skills/babysit-pr/SKILL.md b/vendor/codex/.codex/skills/babysit-pr/SKILL.md deleted file mode 100644 index d472fad6..00000000 --- a/vendor/codex/.codex/skills/babysit-pr/SKILL.md +++ /dev/null @@ -1,187 +0,0 @@ ---- -name: babysit-pr -description: Babysit a GitHub pull request after creation by continuously polling review comments, CI checks/workflow runs, and mergeability state until the PR is merged/closed or user help is required. Diagnose failures, retry likely flaky failures up to 3 times, auto-fix/push branch-related issues when appropriate, and keep watching open PRs so fresh review feedback is surfaced promptly. Use when the user asks Codex to monitor a PR, watch CI, handle review comments, or keep an eye on failures and feedback on an open PR. ---- - -# PR Babysitter - -## Objective -Babysit a PR persistently until one of these terminal outcomes occurs: - -- The PR is merged or closed. -- A situation requires user help (for example CI infrastructure issues, repeated flaky failures after retry budget is exhausted, permission problems, or ambiguity that cannot be resolved safely). -- Optional handoff milestone: the PR is currently green + mergeable + review-clean. Treat this as a progress state, not a watcher stop, so late-arriving review comments are still surfaced promptly while the PR remains open. - -Do not stop merely because a single snapshot returns `idle` while checks are still pending. - -## Inputs -Accept any of the following: - -- No PR argument: infer the PR from the current branch (`--pr auto`) -- PR number -- PR URL - -## Core Workflow - -1. When the user asks to "monitor"/"watch"/"babysit" a PR, start with the watcher's continuous mode (`--watch`) unless you are intentionally doing a one-shot diagnostic snapshot. -2. Run the watcher script to snapshot PR/review/CI state (or consume each streamed snapshot from `--watch`). -3. Inspect the `actions` list in the JSON response. -4. If `diagnose_ci_failure` is present, inspect failed run logs and classify the failure. -5. If the failure is likely caused by the current branch, patch code locally, commit, and push. -6. If `process_review_comment` is present, inspect surfaced review items and decide whether to address them. -7. If a review item is actionable and correct, patch code locally, commit, push, and then mark the associated review thread/comment as resolved once the fix is on GitHub. -8. If a review item from another author is non-actionable, already addressed, or not valid, post one reply on the comment/thread explaining that decision (for example answering the question or explaining why no change is needed). Prefix the GitHub reply body with `[codex]` so it is clear the response is automated. If the watcher later surfaces your own reply, treat that self-authored item as already handled and do not reply again. -9. If the failure is likely flaky/unrelated and `retry_failed_checks` is present, rerun failed jobs with `--retry-failed-now`. -10. If both actionable review feedback and `retry_failed_checks` are present, prioritize review feedback first; a new commit will retrigger CI, so avoid rerunning flaky checks on the old SHA unless you intentionally defer the review change. -11. On every loop, look for newly surfaced review feedback before acting on CI failures or mergeability state, then verify mergeability / merge-conflict status (for example via `gh pr view`) alongside CI. -12. After any push or rerun action, immediately return to step 1 and continue polling on the updated SHA/state. -13. If you had been using `--watch` before pausing to patch/commit/push, relaunch `--watch` yourself in the same turn immediately after the push (do not wait for the user to re-invoke the skill). -14. Repeat polling until `stop_pr_closed` appears or a user-help-required blocker is reached. A green + review-clean + mergeable PR is a progress milestone, not a reason to stop the watcher while the PR is still open. -15. Maintain terminal/session ownership: while babysitting is active, keep consuming watcher output in the same turn; do not leave a detached `--watch` process running and then end the turn as if monitoring were complete. - -## Commands - -### One-shot snapshot - -```bash -python3 .codex/skills/babysit-pr/scripts/gh_pr_watch.py --pr auto --once -``` - -### Continuous watch (JSONL) - -```bash -python3 .codex/skills/babysit-pr/scripts/gh_pr_watch.py --pr auto --watch -``` - -### Trigger flaky retry cycle (only when watcher indicates) - -```bash -python3 .codex/skills/babysit-pr/scripts/gh_pr_watch.py --pr auto --retry-failed-now -``` - -### Explicit PR target - -```bash -python3 .codex/skills/babysit-pr/scripts/gh_pr_watch.py --pr --once -``` - -## CI Failure Classification -Use `gh` commands to inspect failed runs before deciding to rerun. - -- `gh run view --json jobs,name,workflowName,conclusion,status,url,headSha` -- `gh run view --log-failed` - -Prefer treating failures as branch-related when logs point to changed code (compile/test/lint/typecheck/snapshots/static analysis in touched areas). - -Prefer treating failures as flaky/unrelated when logs show transient infra/external issues (timeouts, runner provisioning failures, registry/network outages, GitHub Actions infra errors). - -If classification is ambiguous, perform one manual diagnosis attempt before choosing rerun. - -Read `.codex/skills/babysit-pr/references/heuristics.md` for a concise checklist. - -## Review Comment Handling -The watcher surfaces review items from: - -- PR issue comments -- Inline review comments -- Review submissions (COMMENT / APPROVED / CHANGES_REQUESTED) - -It intentionally surfaces Codex reviewer bot feedback (for example comments/reviews from `chatgpt-codex-connector[bot]`) in addition to human reviewer feedback. Most unrelated bot noise should still be ignored. -For safety, the watcher only auto-surfaces trusted human review authors (for example repo OWNER/MEMBER/COLLABORATOR, plus the authenticated operator) and approved review bots such as Codex. -On a fresh watcher state file, existing pending review feedback may be surfaced immediately (not only comments that arrive after monitoring starts). This is intentional so already-open review comments are not missed. - -When you agree with a comment and it is actionable: - -1. Patch code locally. -2. Commit with `codex: address PR review feedback (#)`. -3. Push to the PR head branch. -4. After the push succeeds, mark the associated GitHub review thread/comment as resolved. -5. Resume watching on the new SHA immediately (do not stop after reporting the push). -6. If monitoring was running in `--watch` mode, restart `--watch` immediately after the push in the same turn; do not wait for the user to ask again. - -If you disagree or the comment is non-actionable/already addressed, reply once directly on the GitHub comment/thread so the reviewer gets an explicit answer, then continue the watcher loop. Prefix any GitHub reply to a code review comment/thread with `[codex]` so it is clear the response is automated and not from the human user. If the watcher later surfaces your own reply because the authenticated operator is treated as a trusted review author, treat that self-authored item as already handled and do not reply again. -If a code review comment/thread is already marked as resolved in GitHub, treat it as non-actionable and safely ignore it unless new unresolved follow-up feedback appears. - -## Git Safety Rules - -- Work only on the PR head branch. -- Avoid destructive git commands. -- Do not switch branches unless necessary to recover context. -- Before editing, check for unrelated uncommitted changes. If present, stop and ask the user. -- After each successful fix, commit and `git push`, then re-run the watcher. -- If you interrupted a live `--watch` session to make the fix, restart `--watch` immediately after the push in the same turn. -- Do not run multiple concurrent `--watch` processes for the same PR/state file; keep one watcher session active and reuse it until it stops or you intentionally restart it. -- A push is not a terminal outcome; continue the monitoring loop unless a strict stop condition is met. - -Commit message defaults: - -- `codex: fix CI failure on PR #` -- `codex: address PR review feedback (#)` - -## Monitoring Loop Pattern -Use this loop in a live Codex session: - -1. Run `--once`. -2. Read `actions`. -3. First check whether the PR is now merged or otherwise closed; if so, report that terminal state and stop polling immediately. -4. Check CI summary, new review items, and mergeability/conflict status. -5. Diagnose CI failures and classify branch-related vs flaky/unrelated. -6. For each surfaced review item from another author, either reply once with an explanation if it is non-actionable or patch/commit/push and then resolve it if it is actionable. If a later snapshot surfaces your own reply, treat it as informational and continue without responding again. -7. Process actionable review comments before flaky reruns when both are present; if a review fix requires a commit, push it and skip rerunning failed checks on the old SHA. -8. Retry failed checks only when `retry_failed_checks` is present and you are not about to replace the current SHA with a review/CI fix commit. -9. If you pushed a commit, resolved a review thread, replied to a review comment, or triggered a rerun, report the action briefly and continue polling (do not stop). -10. After a review-fix push, proactively restart continuous monitoring (`--watch`) in the same turn unless a strict stop condition has already been reached. -11. If everything is passing, mergeable, not blocked on required review approval, and there are no unaddressed review items, report that the PR is currently ready to merge but keep the watcher running so new review comments are surfaced quickly while the PR remains open. -12. If blocked on a user-help-required issue (infra outage, exhausted flaky retries, unclear reviewer request, permissions), report the blocker and stop. -13. Otherwise sleep according to the polling cadence below and repeat. - -When the user explicitly asks to monitor/watch/babysit a PR, prefer `--watch` so polling continues autonomously in one command. Use repeated `--once` snapshots only for debugging, local testing, or when the user explicitly asks for a one-shot check. -Do not stop to ask the user whether to continue polling; continue autonomously until a strict stop condition is met or the user explicitly interrupts. -Do not hand control back to the user after a review-fix push just because a new SHA was created; restarting the watcher and re-entering the poll loop is part of the same babysitting task. -If a `--watch` process is still running and no strict stop condition has been reached, the babysitting task is still in progress; keep streaming/consuming watcher output instead of ending the turn. - -## Polling Cadence -Keep review polling aggressive and continue monitoring even after CI turns green: - -- While CI is not green (pending/running/queued or failing): poll every 1 minute. -- After CI turns green: keep polling at the base cadence while the PR remains open so newly posted review comments are surfaced promptly instead of waiting on a long green-state backoff. -- Reset the cadence immediately whenever anything changes (new commit/SHA, check status changes, new review comments, mergeability changes, review decision changes). -- If CI stops being green again (new commit, rerun, or regression): stay on the base polling cadence. -- If any poll shows the PR is merged or otherwise closed: stop polling immediately and report the terminal state. - -## Stop Conditions (Strict) -Stop only when one of the following is true: - -- PR merged or closed (stop as soon as a poll/snapshot confirms this). -- User intervention is required and Codex cannot safely proceed alone. - -Keep polling when: - -- `actions` contains only `idle` but checks are still pending. -- CI is still running/queued. -- Review state is quiet but CI is not terminal. -- CI is green but mergeability is unknown/pending. -- CI is green and mergeable, but the PR is still open and you are waiting for possible new review comments or merge-conflict changes. -- The PR is green but blocked on review approval (`REVIEW_REQUIRED` / similar); continue polling at the base cadence and surface any new review comments without asking for confirmation to keep watching. - -## Output Expectations -Provide concise progress updates while monitoring and a final summary that includes: - -- During long unchanged monitoring periods, avoid emitting a full update on every poll; summarize only status changes plus occasional heartbeat updates. -- Treat push confirmations, intermediate CI snapshots, ready-to-merge snapshots, and review-action updates as progress updates only; do not emit the final summary or end the babysitting session unless a strict stop condition is met. -- A user request to "monitor" is not satisfied by a couple of sample polls; remain in the loop until a strict stop condition or an explicit user interruption. -- A review-fix commit + push is not a completion event; immediately resume live monitoring (`--watch`) in the same turn and continue reporting progress updates. -- When CI first transitions to all green for the current SHA, emit a one-time celebratory progress update (do not repeat it on every green poll). Preferred style: `🚀 CI is all green! 33/33 passed. Still on watch for review approval.` -- Do not send the final summary while a watcher terminal is still running unless the watcher has emitted/confirmed a strict stop condition; otherwise continue with progress updates. - -- Final PR SHA -- CI status summary -- Mergeability / conflict status -- Fixes pushed -- Flaky retry cycles used -- Remaining unresolved failures or review comments - -## References - -- Heuristics and decision tree: `.codex/skills/babysit-pr/references/heuristics.md` -- GitHub CLI/API details used by the watcher: `.codex/skills/babysit-pr/references/github-api-notes.md` diff --git a/vendor/codex/.codex/skills/babysit-pr/agents/openai.yaml b/vendor/codex/.codex/skills/babysit-pr/agents/openai.yaml deleted file mode 100644 index b68a7287..00000000 --- a/vendor/codex/.codex/skills/babysit-pr/agents/openai.yaml +++ /dev/null @@ -1,4 +0,0 @@ -interface: - display_name: "PR Babysitter" - short_description: "Watch PR review comments, CI, and merge conflicts" - default_prompt: "Babysit the current PR: monitor reviewer comments, CI, and merge-conflict status (prefer the watcher’s --watch mode for live monitoring); surface new review feedback before acting on CI or mergeability work, fix valid issues, push updates, and rerun flaky failures up to 3 times. Keep exactly one watcher session active for the PR (do not leave duplicate --watch terminals running). If you pause monitoring to patch review/CI feedback, restart --watch yourself immediately after the push in the same turn. If a watcher is still running and no strict stop condition has been reached, the task is still in progress: keep consuming watcher output and sending progress updates instead of ending the turn. Do not treat a green + mergeable PR as a terminal stop while it is still open; continue polling autonomously after any push/rerun so newly posted review comments are surfaced until a strict terminal stop condition is reached or the user interrupts." diff --git a/vendor/codex/.codex/skills/babysit-pr/references/github-api-notes.md b/vendor/codex/.codex/skills/babysit-pr/references/github-api-notes.md deleted file mode 100644 index 8cc09da4..00000000 --- a/vendor/codex/.codex/skills/babysit-pr/references/github-api-notes.md +++ /dev/null @@ -1,72 +0,0 @@ -# GitHub CLI / API Notes For `babysit-pr` - -## Primary commands used - -### PR metadata - -- `gh pr view --json number,url,state,mergedAt,closedAt,headRefName,headRefOid,headRepository,headRepositoryOwner` - -Used to resolve PR number, URL, branch, head SHA, and closed/merged state. - -### PR checks summary - -- `gh pr checks --json name,state,bucket,link,workflow,event,startedAt,completedAt` - -Used to compute pending/failed/passed counts and whether the current CI round is terminal. - -### Workflow runs for head SHA - -- `gh api repos/{owner}/{repo}/actions/runs -X GET -f head_sha= -f per_page=100` - -Used to discover failed workflow runs and rerunnable run IDs. - -### Failed log inspection - -- `gh run view --json jobs,name,workflowName,conclusion,status,url,headSha` -- `gh run view --log-failed` - -Used by Codex to classify branch-related vs flaky/unrelated failures. - -### Retry failed jobs only - -- `gh run rerun --failed` - -Reruns only failed jobs (and dependencies) for a workflow run. - -## Review-related endpoints - -- Issue comments on PR: - - `gh api repos/{owner}/{repo}/issues//comments?per_page=100` -- Inline PR review comments: - - `gh api repos/{owner}/{repo}/pulls//comments?per_page=100` -- Review submissions: - - `gh api repos/{owner}/{repo}/pulls//reviews?per_page=100` - -## JSON fields consumed by the watcher - -### `gh pr view` - -- `number` -- `url` -- `state` -- `mergedAt` -- `closedAt` -- `headRefName` -- `headRefOid` - -### `gh pr checks` - -- `bucket` (`pass`, `fail`, `pending`, `skipping`) -- `state` -- `name` -- `workflow` -- `link` - -### Actions runs API (`workflow_runs[]`) - -- `id` -- `name` -- `status` -- `conclusion` -- `html_url` -- `head_sha` diff --git a/vendor/codex/.codex/skills/babysit-pr/references/heuristics.md b/vendor/codex/.codex/skills/babysit-pr/references/heuristics.md deleted file mode 100644 index 01024d26..00000000 --- a/vendor/codex/.codex/skills/babysit-pr/references/heuristics.md +++ /dev/null @@ -1,58 +0,0 @@ -# CI / Review Heuristics - -## CI classification checklist - -Treat as **branch-related** when logs clearly indicate a regression caused by the PR branch: - -- Compile/typecheck/lint failures in files or modules touched by the branch -- Deterministic unit/integration test failures in changed areas -- Snapshot output changes caused by UI/text changes in the branch -- Static analysis violations introduced by the latest push -- Build script/config changes in the PR causing a deterministic failure - -Treat as **likely flaky or unrelated** when evidence points to transient or external issues: - -- DNS/network/registry timeout errors while fetching dependencies -- Runner image provisioning or startup failures -- GitHub Actions infrastructure/service outages -- Cloud/service rate limits or transient API outages -- Non-deterministic failures in unrelated integration tests with known flake patterns - -If uncertain, inspect failed logs once before choosing rerun. - -## Decision tree (fix vs rerun vs stop) - -1. If PR is merged/closed: stop. -2. If there are failed checks: - - Diagnose first. - - If branch-related: fix locally, commit, push. - - If likely flaky/unrelated and all checks for the current SHA are terminal: rerun failed jobs. - - If checks are still pending: wait. -3. If flaky reruns for the same SHA reach the configured limit (default 3): stop and report persistent failure. -4. Independently, process any new human review comments. - -## Review comment agreement criteria - -Address the comment when: - -- The comment is technically correct. -- The change is actionable in the current branch. -- The requested change does not conflict with the user’s intent or recent guidance. -- The change can be made safely without unrelated refactors. - -Do not auto-fix when: - -- The comment is ambiguous and needs clarification. -- The request conflicts with explicit user instructions. -- The proposed change requires product/design decisions the user has not made. -- The codebase is in a dirty/unrelated state that makes safe editing uncertain. - -## Stop-and-ask conditions - -Stop and ask the user instead of continuing automatically when: - -- The local worktree has unrelated uncommitted changes. -- `gh` auth/permissions fail. -- The PR branch cannot be pushed. -- CI failures persist after the flaky retry budget. -- Reviewer feedback requires a product decision or cross-team coordination. diff --git a/vendor/codex/.codex/skills/babysit-pr/scripts/gh_pr_watch.py b/vendor/codex/.codex/skills/babysit-pr/scripts/gh_pr_watch.py deleted file mode 100644 index 2650770b..00000000 --- a/vendor/codex/.codex/skills/babysit-pr/scripts/gh_pr_watch.py +++ /dev/null @@ -1,806 +0,0 @@ -#!/usr/bin/env python3 -"""Watch GitHub PR CI and review activity for Codex PR babysitting workflows.""" - -import argparse -import json -import os -import re -import subprocess -import sys -import tempfile -import time -from pathlib import Path -from urllib.parse import urlparse - -FAILED_RUN_CONCLUSIONS = { - "failure", - "timed_out", - "cancelled", - "action_required", - "startup_failure", - "stale", -} -PENDING_CHECK_STATES = { - "QUEUED", - "IN_PROGRESS", - "PENDING", - "WAITING", - "REQUESTED", -} -REVIEW_BOT_LOGIN_KEYWORDS = { - "codex", -} -TRUSTED_AUTHOR_ASSOCIATIONS = { - "OWNER", - "MEMBER", - "COLLABORATOR", -} -MERGE_BLOCKING_REVIEW_DECISIONS = { - "REVIEW_REQUIRED", - "CHANGES_REQUESTED", -} -MERGE_CONFLICT_OR_BLOCKING_STATES = { - "BLOCKED", - "DIRTY", - "DRAFT", - "UNKNOWN", -} - - -class GhCommandError(RuntimeError): - pass - - -def parse_args(): - parser = argparse.ArgumentParser( - description=( - "Normalize PR/CI/review state for Codex PR babysitting and optionally " - "trigger flaky reruns." - ) - ) - parser.add_argument("--pr", default="auto", help="auto, PR number, or PR URL") - parser.add_argument("--repo", help="Optional OWNER/REPO override") - parser.add_argument("--poll-seconds", type=int, default=30, help="Watch poll interval") - parser.add_argument( - "--max-flaky-retries", - type=int, - default=3, - help="Max rerun cycles per head SHA before stop recommendation", - ) - parser.add_argument("--state-file", help="Path to state JSON file") - parser.add_argument("--once", action="store_true", help="Emit one snapshot and exit") - parser.add_argument("--watch", action="store_true", help="Continuously emit JSONL snapshots") - parser.add_argument( - "--retry-failed-now", - action="store_true", - help="Rerun failed jobs for current failed workflow runs when policy allows", - ) - parser.add_argument( - "--json", - action="store_true", - help="Emit machine-readable output (default behavior for --once and --retry-failed-now)", - ) - args = parser.parse_args() - - if args.poll_seconds <= 0: - parser.error("--poll-seconds must be > 0") - if args.max_flaky_retries < 0: - parser.error("--max-flaky-retries must be >= 0") - if args.watch and args.retry_failed_now: - parser.error("--watch cannot be combined with --retry-failed-now") - if not args.once and not args.watch and not args.retry_failed_now: - args.once = True - return args - - -def _format_gh_error(cmd, err): - stdout = (err.stdout or "").strip() - stderr = (err.stderr or "").strip() - parts = [f"GitHub CLI command failed: {' '.join(cmd)}"] - if stdout: - parts.append(f"stdout: {stdout}") - if stderr: - parts.append(f"stderr: {stderr}") - return "\n".join(parts) - - -def gh_text(args, repo=None): - cmd = ["gh"] - # `gh api` does not accept `-R/--repo` on all gh versions. The watcher's - # API calls use explicit endpoints (e.g. repos/{owner}/{repo}/...), so the - # repo flag is unnecessary there. - if repo and (not args or args[0] != "api"): - cmd.extend(["-R", repo]) - cmd.extend(args) - try: - proc = subprocess.run(cmd, check=True, capture_output=True, text=True) - except FileNotFoundError as err: - raise GhCommandError("`gh` command not found") from err - except subprocess.CalledProcessError as err: - raise GhCommandError(_format_gh_error(cmd, err)) from err - return proc.stdout - - -def gh_json(args, repo=None): - raw = gh_text(args, repo=repo).strip() - if not raw: - return None - try: - return json.loads(raw) - except json.JSONDecodeError as err: - raise GhCommandError(f"Failed to parse JSON from gh output for {' '.join(args)}") from err - - -def parse_pr_spec(pr_spec): - if pr_spec == "auto": - return {"mode": "auto", "value": None} - if re.fullmatch(r"\d+", pr_spec): - return {"mode": "number", "value": pr_spec} - parsed = urlparse(pr_spec) - if parsed.scheme and parsed.netloc and "/pull/" in parsed.path: - return {"mode": "url", "value": pr_spec} - raise ValueError("--pr must be 'auto', a PR number, or a PR URL") - - -def pr_view_fields(): - return ( - "number,url,state,mergedAt,closedAt,headRefName,headRefOid," - "headRepository,headRepositoryOwner,mergeable,mergeStateStatus,reviewDecision" - ) - - -def checks_fields(): - return "name,state,bucket,link,workflow,event,startedAt,completedAt" - - -def resolve_pr(pr_spec, repo_override=None): - parsed = parse_pr_spec(pr_spec) - cmd = ["pr", "view"] - if parsed["value"] is not None: - cmd.append(parsed["value"]) - cmd.extend(["--json", pr_view_fields()]) - data = gh_json(cmd, repo=repo_override) - if not isinstance(data, dict): - raise GhCommandError("Unexpected PR payload from `gh pr view`") - - pr_url = str(data.get("url") or "") - repo = ( - repo_override - or extract_repo_from_pr_url(pr_url) - or extract_repo_from_pr_view(data) - ) - if not repo: - raise GhCommandError("Unable to determine OWNER/REPO for the PR") - - state = str(data.get("state") or "") - merged = bool(data.get("mergedAt")) - closed = bool(data.get("closedAt")) or state.upper() == "CLOSED" - - return { - "number": int(data["number"]), - "url": pr_url, - "repo": repo, - "head_sha": str(data.get("headRefOid") or ""), - "head_branch": str(data.get("headRefName") or ""), - "state": state, - "merged": merged, - "closed": closed, - "mergeable": str(data.get("mergeable") or ""), - "merge_state_status": str(data.get("mergeStateStatus") or ""), - "review_decision": str(data.get("reviewDecision") or ""), - } - - -def extract_repo_from_pr_view(data): - head_repo = data.get("headRepository") - head_owner = data.get("headRepositoryOwner") - owner = None - name = None - if isinstance(head_owner, dict): - owner = head_owner.get("login") or head_owner.get("name") - elif isinstance(head_owner, str): - owner = head_owner - if isinstance(head_repo, dict): - name = head_repo.get("name") - repo_owner = head_repo.get("owner") - if not owner and isinstance(repo_owner, dict): - owner = repo_owner.get("login") or repo_owner.get("name") - elif isinstance(head_repo, str): - name = head_repo - if owner and name: - return f"{owner}/{name}" - return None -def extract_repo_from_pr_url(pr_url): - parsed = urlparse(pr_url) - parts = [p for p in parsed.path.split("/") if p] - if len(parts) >= 4 and parts[2] == "pull": - return f"{parts[0]}/{parts[1]}" - return None - - -def load_state(path): - if path.exists(): - try: - data = json.loads(path.read_text()) - except json.JSONDecodeError as err: - raise RuntimeError(f"State file is not valid JSON: {path}") from err - if not isinstance(data, dict): - raise RuntimeError(f"State file must contain an object: {path}") - return data, False - return { - "pr": {}, - "started_at": None, - "last_seen_head_sha": None, - "retries_by_sha": {}, - "seen_issue_comment_ids": [], - "seen_review_comment_ids": [], - "seen_review_ids": [], - "last_snapshot_at": None, - }, True - - -def save_state(path, state): - path.parent.mkdir(parents=True, exist_ok=True) - payload = json.dumps(state, indent=2, sort_keys=True) + "\n" - fd, tmp_name = tempfile.mkstemp(prefix=f"{path.name}.", suffix=".tmp", dir=path.parent) - tmp_path = Path(tmp_name) - try: - with os.fdopen(fd, "w", encoding="utf-8") as tmp_file: - tmp_file.write(payload) - os.replace(tmp_path, path) - except Exception: - try: - tmp_path.unlink(missing_ok=True) - except OSError: - pass - raise - - -def default_state_file_for(pr): - repo_slug = pr["repo"].replace("/", "-") - return Path(f"/tmp/codex-babysit-pr-{repo_slug}-pr{pr['number']}.json") - - -def get_pr_checks(pr_spec, repo): - parsed = parse_pr_spec(pr_spec) - cmd = ["pr", "checks"] - if parsed["value"] is not None: - cmd.append(parsed["value"]) - cmd.extend(["--json", checks_fields()]) - data = gh_json(cmd, repo=repo) - if data is None: - return [] - if not isinstance(data, list): - raise GhCommandError("Unexpected payload from `gh pr checks`") - return data - - -def is_pending_check(check): - bucket = str(check.get("bucket") or "").lower() - state = str(check.get("state") or "").upper() - return bucket == "pending" or state in PENDING_CHECK_STATES - - -def summarize_checks(checks): - pending_count = 0 - failed_count = 0 - passed_count = 0 - for check in checks: - bucket = str(check.get("bucket") or "").lower() - if is_pending_check(check): - pending_count += 1 - if bucket == "fail": - failed_count += 1 - if bucket == "pass": - passed_count += 1 - return { - "pending_count": pending_count, - "failed_count": failed_count, - "passed_count": passed_count, - "all_terminal": pending_count == 0, - } - - -def get_workflow_runs_for_sha(repo, head_sha): - endpoint = f"repos/{repo}/actions/runs" - data = gh_json( - ["api", endpoint, "-X", "GET", "-f", f"head_sha={head_sha}", "-f", "per_page=100"], - repo=repo, - ) - if not isinstance(data, dict): - raise GhCommandError("Unexpected payload from actions runs API") - runs = data.get("workflow_runs") or [] - if not isinstance(runs, list): - raise GhCommandError("Expected `workflow_runs` to be a list") - return runs - - -def failed_runs_from_workflow_runs(runs, head_sha): - failed_runs = [] - for run in runs: - if not isinstance(run, dict): - continue - if str(run.get("head_sha") or "") != head_sha: - continue - conclusion = str(run.get("conclusion") or "") - if conclusion not in FAILED_RUN_CONCLUSIONS: - continue - failed_runs.append( - { - "run_id": run.get("id"), - "workflow_name": run.get("name") or run.get("display_title") or "", - "status": str(run.get("status") or ""), - "conclusion": conclusion, - "html_url": str(run.get("html_url") or ""), - } - ) - failed_runs.sort(key=lambda item: (str(item.get("workflow_name") or ""), str(item.get("run_id") or ""))) - return failed_runs - - -def get_authenticated_login(): - data = gh_json(["api", "user"]) - if not isinstance(data, dict) or not data.get("login"): - raise GhCommandError("Unable to determine authenticated GitHub login from `gh api user`") - return str(data["login"]) - - -def comment_endpoints(repo, pr_number): - return { - "issue_comment": f"repos/{repo}/issues/{pr_number}/comments", - "review_comment": f"repos/{repo}/pulls/{pr_number}/comments", - "review": f"repos/{repo}/pulls/{pr_number}/reviews", - } - - -def gh_api_list_paginated(endpoint, repo=None, per_page=100): - items = [] - page = 1 - while True: - sep = "&" if "?" in endpoint else "?" - page_endpoint = f"{endpoint}{sep}per_page={per_page}&page={page}" - payload = gh_json(["api", page_endpoint], repo=repo) - if payload is None: - break - if not isinstance(payload, list): - raise GhCommandError(f"Unexpected paginated payload from gh api {endpoint}") - items.extend(payload) - if len(payload) < per_page: - break - page += 1 - return items - - -def normalize_issue_comments(items): - out = [] - for item in items: - if not isinstance(item, dict): - continue - out.append( - { - "kind": "issue_comment", - "id": str(item.get("id") or ""), - "author": extract_login(item.get("user")), - "author_association": str(item.get("author_association") or ""), - "created_at": str(item.get("created_at") or ""), - "body": str(item.get("body") or ""), - "path": None, - "line": None, - "url": str(item.get("html_url") or ""), - } - ) - return out - - -def normalize_review_comments(items): - out = [] - for item in items: - if not isinstance(item, dict): - continue - line = item.get("line") - if line is None: - line = item.get("original_line") - out.append( - { - "kind": "review_comment", - "id": str(item.get("id") or ""), - "author": extract_login(item.get("user")), - "author_association": str(item.get("author_association") or ""), - "created_at": str(item.get("created_at") or ""), - "body": str(item.get("body") or ""), - "path": item.get("path"), - "line": line, - "url": str(item.get("html_url") or ""), - } - ) - return out - - -def normalize_reviews(items): - out = [] - for item in items: - if not isinstance(item, dict): - continue - out.append( - { - "kind": "review", - "id": str(item.get("id") or ""), - "author": extract_login(item.get("user")), - "author_association": str(item.get("author_association") or ""), - "created_at": str(item.get("submitted_at") or item.get("created_at") or ""), - "body": str(item.get("body") or ""), - "path": None, - "line": None, - "url": str(item.get("html_url") or ""), - } - ) - return out - - -def extract_login(user_obj): - if isinstance(user_obj, dict): - return str(user_obj.get("login") or "") - return "" - - -def is_bot_login(login): - return bool(login) and login.endswith("[bot]") - - -def is_actionable_review_bot_login(login): - if not is_bot_login(login): - return False - lower_login = login.lower() - return any(keyword in lower_login for keyword in REVIEW_BOT_LOGIN_KEYWORDS) - - -def is_trusted_human_review_author(item, authenticated_login): - author = str(item.get("author") or "") - if not author: - return False - if authenticated_login and author == authenticated_login: - return True - association = str(item.get("author_association") or "").upper() - return association in TRUSTED_AUTHOR_ASSOCIATIONS - - -def fetch_new_review_items(pr, state, fresh_state, authenticated_login=None): - repo = pr["repo"] - pr_number = pr["number"] - endpoints = comment_endpoints(repo, pr_number) - - issue_payload = gh_api_list_paginated(endpoints["issue_comment"], repo=repo) - review_comment_payload = gh_api_list_paginated(endpoints["review_comment"], repo=repo) - review_payload = gh_api_list_paginated(endpoints["review"], repo=repo) - - issue_items = normalize_issue_comments(issue_payload) - review_comment_items = normalize_review_comments(review_comment_payload) - review_items = normalize_reviews(review_payload) - all_items = issue_items + review_comment_items + review_items - - seen_issue = {str(x) for x in state.get("seen_issue_comment_ids") or []} - seen_review_comment = {str(x) for x in state.get("seen_review_comment_ids") or []} - seen_review = {str(x) for x in state.get("seen_review_ids") or []} - - # On a brand-new state file, surface existing review activity instead of - # silently treating it as seen. This avoids missing already-pending review - # feedback when monitoring starts after comments were posted. - - new_items = [] - for item in all_items: - item_id = item.get("id") - if not item_id: - continue - author = item.get("author") or "" - if not author: - continue - if is_bot_login(author): - if not is_actionable_review_bot_login(author): - continue - elif not is_trusted_human_review_author(item, authenticated_login): - continue - - kind = item["kind"] - if kind == "issue_comment" and item_id in seen_issue: - continue - if kind == "review_comment" and item_id in seen_review_comment: - continue - if kind == "review" and item_id in seen_review: - continue - - new_items.append(item) - if kind == "issue_comment": - seen_issue.add(item_id) - elif kind == "review_comment": - seen_review_comment.add(item_id) - elif kind == "review": - seen_review.add(item_id) - - new_items.sort(key=lambda item: (item.get("created_at") or "", item.get("kind") or "", item.get("id") or "")) - state["seen_issue_comment_ids"] = sorted(seen_issue) - state["seen_review_comment_ids"] = sorted(seen_review_comment) - state["seen_review_ids"] = sorted(seen_review) - return new_items - - -def current_retry_count(state, head_sha): - retries = state.get("retries_by_sha") or {} - value = retries.get(head_sha, 0) - try: - return int(value) - except (TypeError, ValueError): - return 0 - - -def set_retry_count(state, head_sha, count): - retries = state.get("retries_by_sha") - if not isinstance(retries, dict): - retries = {} - retries[head_sha] = int(count) - state["retries_by_sha"] = retries - - -def unique_actions(actions): - out = [] - seen = set() - for action in actions: - if action not in seen: - out.append(action) - seen.add(action) - return out - - -def is_pr_ready_to_merge(pr, checks_summary, new_review_items): - if pr["closed"] or pr["merged"]: - return False - if not checks_summary["all_terminal"]: - return False - if checks_summary["failed_count"] > 0 or checks_summary["pending_count"] > 0: - return False - if new_review_items: - return False - if str(pr.get("mergeable") or "") != "MERGEABLE": - return False - if str(pr.get("merge_state_status") or "") in MERGE_CONFLICT_OR_BLOCKING_STATES: - return False - if str(pr.get("review_decision") or "") in MERGE_BLOCKING_REVIEW_DECISIONS: - return False - return True - - -def recommend_actions(pr, checks_summary, failed_runs, new_review_items, retries_used, max_retries): - actions = [] - if pr["closed"] or pr["merged"]: - if new_review_items: - actions.append("process_review_comment") - actions.append("stop_pr_closed") - return unique_actions(actions) - - if is_pr_ready_to_merge(pr, checks_summary, new_review_items): - actions.append("ready_to_merge") - return unique_actions(actions) - - if new_review_items: - actions.append("process_review_comment") - - has_failed_pr_checks = checks_summary["failed_count"] > 0 - if has_failed_pr_checks: - if checks_summary["all_terminal"] and retries_used >= max_retries: - actions.append("stop_exhausted_retries") - else: - actions.append("diagnose_ci_failure") - if checks_summary["all_terminal"] and failed_runs and retries_used < max_retries: - actions.append("retry_failed_checks") - - if not actions: - actions.append("idle") - return unique_actions(actions) - - -def collect_snapshot(args): - pr = resolve_pr(args.pr, repo_override=args.repo) - state_path = Path(args.state_file) if args.state_file else default_state_file_for(pr) - state, fresh_state = load_state(state_path) - - if not state.get("started_at"): - state["started_at"] = int(time.time()) - - authenticated_login = get_authenticated_login() - new_review_items = fetch_new_review_items( - pr, - state, - fresh_state=fresh_state, - authenticated_login=authenticated_login, - ) - # Surface review feedback before drilling into CI and mergeability details. - # That keeps the babysitter responsive to new comments even when other - # actions are also available. - # `gh pr checks -R ` requires an explicit PR/branch/url argument. - # After resolving `--pr auto`, reuse the concrete PR number. - checks = get_pr_checks(str(pr["number"]), repo=pr["repo"]) - checks_summary = summarize_checks(checks) - workflow_runs = get_workflow_runs_for_sha(pr["repo"], pr["head_sha"]) - failed_runs = failed_runs_from_workflow_runs(workflow_runs, pr["head_sha"]) - - retries_used = current_retry_count(state, pr["head_sha"]) - actions = recommend_actions( - pr, - checks_summary, - failed_runs, - new_review_items, - retries_used, - args.max_flaky_retries, - ) - - state["pr"] = {"repo": pr["repo"], "number": pr["number"]} - state["last_seen_head_sha"] = pr["head_sha"] - state["last_snapshot_at"] = int(time.time()) - save_state(state_path, state) - - snapshot = { - "pr": pr, - "checks": checks_summary, - "failed_runs": failed_runs, - "new_review_items": new_review_items, - "actions": actions, - "retry_state": { - "current_sha_retries_used": retries_used, - "max_flaky_retries": args.max_flaky_retries, - }, - } - return snapshot, state_path - - -def retry_failed_now(args): - snapshot, state_path = collect_snapshot(args) - pr = snapshot["pr"] - checks_summary = snapshot["checks"] - failed_runs = snapshot["failed_runs"] - retries_used = snapshot["retry_state"]["current_sha_retries_used"] - max_retries = snapshot["retry_state"]["max_flaky_retries"] - - result = { - "snapshot": snapshot, - "state_file": str(state_path), - "rerun_attempted": False, - "rerun_count": 0, - "rerun_run_ids": [], - "reason": None, - } - - if pr["closed"] or pr["merged"]: - result["reason"] = "pr_closed" - return result - if checks_summary["failed_count"] <= 0: - result["reason"] = "no_failed_pr_checks" - return result - if not failed_runs: - result["reason"] = "no_failed_runs" - return result - if not checks_summary["all_terminal"]: - result["reason"] = "checks_still_pending" - return result - if retries_used >= max_retries: - result["reason"] = "retry_budget_exhausted" - return result - - for run in failed_runs: - run_id = run.get("run_id") - if run_id in (None, ""): - continue - gh_text(["run", "rerun", str(run_id), "--failed"], repo=pr["repo"]) - result["rerun_run_ids"].append(run_id) - - if result["rerun_run_ids"]: - state, _ = load_state(state_path) - new_count = current_retry_count(state, pr["head_sha"]) + 1 - set_retry_count(state, pr["head_sha"], new_count) - state["last_snapshot_at"] = int(time.time()) - save_state(state_path, state) - result["rerun_attempted"] = True - result["rerun_count"] = len(result["rerun_run_ids"]) - result["reason"] = "rerun_triggered" - else: - result["reason"] = "failed_runs_missing_ids" - - return result - - -def print_json(obj): - sys.stdout.write(json.dumps(obj, sort_keys=True) + "\n") - sys.stdout.flush() - - -def print_event(event, payload): - print_json({"event": event, "payload": payload}) - - -def is_ci_green(snapshot): - checks = snapshot.get("checks") or {} - return ( - bool(checks.get("all_terminal")) - and int(checks.get("failed_count") or 0) == 0 - and int(checks.get("pending_count") or 0) == 0 - ) - - -def snapshot_change_key(snapshot): - pr = snapshot.get("pr") or {} - checks = snapshot.get("checks") or {} - review_items = snapshot.get("new_review_items") or [] - return ( - str(pr.get("head_sha") or ""), - str(pr.get("state") or ""), - str(pr.get("mergeable") or ""), - str(pr.get("merge_state_status") or ""), - str(pr.get("review_decision") or ""), - int(checks.get("passed_count") or 0), - int(checks.get("failed_count") or 0), - int(checks.get("pending_count") or 0), - tuple( - (str(item.get("kind") or ""), str(item.get("id") or "")) - for item in review_items - if isinstance(item, dict) - ), - tuple(snapshot.get("actions") or []), - ) - - -def run_watch(args): - poll_seconds = args.poll_seconds - last_change_key = None - while True: - snapshot, state_path = collect_snapshot(args) - print_event( - "snapshot", - { - "snapshot": snapshot, - "state_file": str(state_path), - "next_poll_seconds": poll_seconds, - }, - ) - actions = set(snapshot.get("actions") or []) - if ( - "stop_pr_closed" in actions - or "stop_exhausted_retries" in actions - ): - print_event("stop", {"actions": snapshot.get("actions"), "pr": snapshot.get("pr")}) - return 0 - - current_change_key = snapshot_change_key(snapshot) - changed = current_change_key != last_change_key - green = is_ci_green(snapshot) - pr = snapshot.get("pr") or {} - pr_open = not bool(pr.get("closed")) and not bool(pr.get("merged")) - - if not green or pr_open: - poll_seconds = args.poll_seconds - elif changed or last_change_key is None: - poll_seconds = args.poll_seconds - - last_change_key = current_change_key - time.sleep(poll_seconds) - - -def main(): - args = parse_args() - try: - if args.retry_failed_now: - print_json(retry_failed_now(args)) - return 0 - if args.watch: - return run_watch(args) - snapshot, state_path = collect_snapshot(args) - snapshot["state_file"] = str(state_path) - print_json(snapshot) - return 0 - except (GhCommandError, RuntimeError, ValueError) as err: - sys.stderr.write(f"gh_pr_watch.py error: {err}\n") - return 1 - except KeyboardInterrupt: - sys.stderr.write("gh_pr_watch.py interrupted\n") - return 130 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/vendor/codex/.codex/skills/babysit-pr/scripts/test_gh_pr_watch.py b/vendor/codex/.codex/skills/babysit-pr/scripts/test_gh_pr_watch.py deleted file mode 100644 index c6a5d256..00000000 --- a/vendor/codex/.codex/skills/babysit-pr/scripts/test_gh_pr_watch.py +++ /dev/null @@ -1,155 +0,0 @@ -import argparse -import importlib.util -from pathlib import Path - -import pytest - - -MODULE_PATH = Path(__file__).with_name("gh_pr_watch.py") -MODULE_SPEC = importlib.util.spec_from_file_location("gh_pr_watch", MODULE_PATH) -gh_pr_watch = importlib.util.module_from_spec(MODULE_SPEC) -assert MODULE_SPEC.loader is not None -MODULE_SPEC.loader.exec_module(gh_pr_watch) - - -def sample_pr(): - return { - "number": 123, - "url": "https://github.com/openai/codex/pull/123", - "repo": "openai/codex", - "head_sha": "abc123", - "head_branch": "feature", - "state": "OPEN", - "merged": False, - "closed": False, - "mergeable": "MERGEABLE", - "merge_state_status": "CLEAN", - "review_decision": "", - } - - -def sample_checks(**overrides): - checks = { - "pending_count": 0, - "failed_count": 0, - "passed_count": 12, - "all_terminal": True, - } - checks.update(overrides) - return checks - - -def test_collect_snapshot_fetches_review_items_before_ci(monkeypatch, tmp_path): - call_order = [] - pr = sample_pr() - - monkeypatch.setattr(gh_pr_watch, "resolve_pr", lambda *args, **kwargs: pr) - monkeypatch.setattr(gh_pr_watch, "load_state", lambda path: ({}, True)) - monkeypatch.setattr( - gh_pr_watch, - "get_authenticated_login", - lambda: call_order.append("auth") or "octocat", - ) - monkeypatch.setattr( - gh_pr_watch, - "fetch_new_review_items", - lambda *args, **kwargs: call_order.append("review") or [], - ) - monkeypatch.setattr( - gh_pr_watch, - "get_pr_checks", - lambda *args, **kwargs: call_order.append("checks") or [], - ) - monkeypatch.setattr( - gh_pr_watch, - "summarize_checks", - lambda checks: call_order.append("summarize") or sample_checks(), - ) - monkeypatch.setattr( - gh_pr_watch, - "get_workflow_runs_for_sha", - lambda *args, **kwargs: call_order.append("workflow") or [], - ) - monkeypatch.setattr( - gh_pr_watch, - "failed_runs_from_workflow_runs", - lambda *args, **kwargs: call_order.append("failed_runs") or [], - ) - monkeypatch.setattr( - gh_pr_watch, - "recommend_actions", - lambda *args, **kwargs: call_order.append("recommend") or ["idle"], - ) - monkeypatch.setattr(gh_pr_watch, "save_state", lambda *args, **kwargs: None) - - args = argparse.Namespace( - pr="123", - repo=None, - state_file=str(tmp_path / "watcher-state.json"), - max_flaky_retries=3, - ) - - gh_pr_watch.collect_snapshot(args) - - assert call_order.index("review") < call_order.index("checks") - assert call_order.index("review") < call_order.index("workflow") - - -def test_recommend_actions_prioritizes_review_comments(): - actions = gh_pr_watch.recommend_actions( - sample_pr(), - sample_checks(failed_count=1), - [{"run_id": 99}], - [{"kind": "review_comment", "id": "1"}], - 0, - 3, - ) - - assert actions == [ - "process_review_comment", - "diagnose_ci_failure", - "retry_failed_checks", - ] - - -def test_run_watch_keeps_polling_open_ready_to_merge_pr(monkeypatch): - sleeps = [] - events = [] - snapshot = { - "pr": sample_pr(), - "checks": sample_checks(), - "failed_runs": [], - "new_review_items": [], - "actions": ["ready_to_merge"], - "retry_state": { - "current_sha_retries_used": 0, - "max_flaky_retries": 3, - }, - } - - monkeypatch.setattr( - gh_pr_watch, - "collect_snapshot", - lambda args: (snapshot, Path("/tmp/codex-babysit-pr-state.json")), - ) - monkeypatch.setattr( - gh_pr_watch, - "print_event", - lambda event, payload: events.append((event, payload)), - ) - - class StopWatch(Exception): - pass - - def fake_sleep(seconds): - sleeps.append(seconds) - if len(sleeps) >= 2: - raise StopWatch - - monkeypatch.setattr(gh_pr_watch.time, "sleep", fake_sleep) - - with pytest.raises(StopWatch): - gh_pr_watch.run_watch(argparse.Namespace(poll_seconds=30)) - - assert sleeps == [30, 30] - assert [event for event, _ in events] == ["snapshot", "snapshot"] diff --git a/vendor/codex/.codex/skills/code-review-breaking-changes/SKILL.md b/vendor/codex/.codex/skills/code-review-breaking-changes/SKILL.md deleted file mode 100644 index d0bddf28..00000000 --- a/vendor/codex/.codex/skills/code-review-breaking-changes/SKILL.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -name: code-breaking-changes -description: Breaking changes ---- - -Search for breaking changes in external integration surfaces: -- app-server APIs -- CLI parameters -- configuration loading -- resuming sessions from existing rollouts - -Do not stop after finding one issue; analyze all possible ways breaking changes can happen. diff --git a/vendor/codex/.codex/skills/code-review-change-size/SKILL.md b/vendor/codex/.codex/skills/code-review-change-size/SKILL.md deleted file mode 100644 index 4e8048dc..00000000 --- a/vendor/codex/.codex/skills/code-review-change-size/SKILL.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -name: code-review-change-size -description: Change size guidance (800 lines) ---- - -Unless the change is mechanical the total number of changed lines should not exceed 800 lines. -For complex logic changes the size should be under 500 lines. - -If the change is larger, explain whether it can be split into reviewable stages and identify the smallest coherent stage to land first. -Base the staging suggestion on the actual diff, dependencies, and affected call sites. - diff --git a/vendor/codex/.codex/skills/code-review-context/SKILL.md b/vendor/codex/.codex/skills/code-review-context/SKILL.md deleted file mode 100644 index 7faf3d7c..00000000 --- a/vendor/codex/.codex/skills/code-review-context/SKILL.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -name: code-review-context -description: Model visible context ---- - -Codex maintains a context (history of messages) that is sent to the model in inference requests. - -1. No history rewrite - the context must be built up incrementally. -2. Avoid frequent changes to context that cause cache misses. -3. No unbounded items - everything injected in the model context must have a bounded size and a hard cap. -4. No items larger than 10K tokens. -5. Highlight new individual items that can cross >1k tokens as P0. These need an additional manual review. -6. All injected fragments must be defined as structs in `core/context` and implement ContextualUserFragment trait \ No newline at end of file diff --git a/vendor/codex/.codex/skills/code-review-testing/SKILL.md b/vendor/codex/.codex/skills/code-review-testing/SKILL.md deleted file mode 100644 index c8d99e13..00000000 --- a/vendor/codex/.codex/skills/code-review-testing/SKILL.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -name: code-review-testing -description: Test authoring guidance ---- - -For agent changes prefer integration tests over unit tests. Integration tests are under `core/suite` and use `test_codex` to set up a test instance of codex. - -Features that change the agent logic MUST add an integration test: -- Provide a list of major logic changes and user-facing behaviors that need to be tested. - -If unit tests are needed, put them in a dedicated test file (*_tests.rs). -Avoid test-only functions in the main implementation. - -Check whether there are existing helpers to make tests more streamlined and readable. diff --git a/vendor/codex/.codex/skills/code-review/SKILL.md b/vendor/codex/.codex/skills/code-review/SKILL.md deleted file mode 100644 index eec0787c..00000000 --- a/vendor/codex/.codex/skills/code-review/SKILL.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -name: code-review -description: Run a final code review on a pull request ---- - -Use subagents to review code using all code-review-* skills in this repository other than this orchestrator. One subagent per skill. Pass full skill path to subagents. Use xhigh reasoning. - -You must return every single issue from every subagent. You can return an unlimited number of findings. -Use raw Markdown to report findings. -Number findings for ease of reference. -Each finding must include a specific file path and line number. - -If the GitHub user running the review is the owner of the pull request add a `code-reviewed` label. -Do not leave GitHub comments unless explicitly asked. diff --git a/vendor/codex/.codex/skills/codex-bug/SKILL.md b/vendor/codex/.codex/skills/codex-bug/SKILL.md deleted file mode 100644 index c7a688e6..00000000 --- a/vendor/codex/.codex/skills/codex-bug/SKILL.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -name: codex-bug -description: Diagnose GitHub bug reports in openai/codex. Use when given a GitHub issue URL from openai/codex and asked to decide next steps such as verifying against the repo, requesting more info, or explaining why it is not a bug; follow any additional user-provided instructions. ---- - -# Codex Bug - -## Overview - -Diagnose a Codex GitHub bug report and decide the next action: verify against sources, request more info, or explain why it is not a bug. - -## Workflow - -1. Confirm the input - -- Require a GitHub issue URL that points to `github.com/openai/codex/issues/…`. -- If the URL is missing or not in the right repo, ask the user for the correct link. - -2. Network access - -- Always access the issue over the network immediately, even if you think access is blocked or unavailable. -- Prefer the GitHub API over HTML pages because the HTML is noisy: - - Issue: `https://api.github.com/repos/openai/codex/issues/` - - Comments: `https://api.github.com/repos/openai/codex/issues//comments` -- If the environment requires explicit approval, request it on demand via the tool and continue without additional user prompting. -- Only if the network attempt fails after requesting approval, explain what you can do offline (e.g., draft a response template) and ask how to proceed. - -3. Read the issue - -- Use the GitHub API responses (issue + comments) as the source of truth rather than scraping the HTML issue page. -- Extract: title, body, repro steps, expected vs actual, environment, logs, and any attachments. -- Note whether the report already includes logs or session details. -- If the report includes a thread ID, mention it in the summary and use it to look up the logs and session details if you have access to them. - -4. Summarize the bug before investigating - -- Before inspecting code, docs, or logs in depth, write a short summary of the report in your own words. -- Include the reported behavior, expected behavior, repro steps, environment, and what evidence is already attached or missing. - -5. Decide the course of action - -- **Verify with sources** when the report is specific and likely reproducible. Inspect relevant Codex files (or mention the files to inspect if access is unavailable). -- **Request more information** when the report is vague, missing repro steps, or lacks logs/environment. -- **Explain not a bug** when the report contradicts current behavior or documented constraints (cite the evidence from the issue and any local sources you checked). - -6. Respond - -- Provide a concise report of your findings and next steps. diff --git a/vendor/codex/.codex/skills/codex-pr-body/SKILL.md b/vendor/codex/.codex/skills/codex-pr-body/SKILL.md deleted file mode 100644 index 76b37b87..00000000 --- a/vendor/codex/.codex/skills/codex-pr-body/SKILL.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -name: codex-pr-body -description: Update the title and body of one or more pull requests. ---- - -## Determining the PR(s) - -When this skill is invoked, the PR(s) to update may be specified explicitly, but in the common case, the PR(s) to update will be inferred from the branch / commit that the user is currently working on. For ordinary Git usage (i.e., not Sapling as discussed below), you may have to use a combination of `git branch` and `gh pr view --repo openai/codex --json number --jq '.number'` to determine the PR associated with the current branch / commit. - -## PR Body Contents - -When invoked, use `gh` to edit the pull request body and title to reflect the contents of the specified PR. Make sure to check the existing pull request body to see if there is key information that should be preserved. For example, NEVER remove an image in the existing pull request body, as the author may have no way to recover it if you remove it. - -It is critically important to explain _why_ the change is being made. If the current conversation in which this skill is invoked has discussed the motivation, be sure to capture this in the pull request body. - -The body should also explain _what_ changed, but this should appear after the _why_. - -Limit discussion to the _net change_ of the commit. It is generally frowned upon to discuss changes that were attempted but later undone in the course of the development of the pull request. When rewriting the pull request body, you may need to eliminate details such as these when they are no longer appropriate / of interest to future readers. - -Avoid references to absolute paths on my local disk. When talking about a path that is within the repository, simply use the repo-relative path. - -It is generally helpful to discuss how the change was verified. That said, it is unnecessary to mention things that CI checks automatically, e.g., do not include "ran `just fmt`" as part of the test plan. Though identifying the new tests that were purposely introduced to verify the new behavior introduced by the pull request is often appropriate. - -Make use of Markdown to format the pull request professionally. Ensure "code things" appear in single backticks when referenced inline. Fenced code blocks are useful when referencing code or showing a shell transcript. Also, make use of GitHub permalinks when citing existing pieces of code that are relevant to the change. - -Make sure to reference any relevant pull requests or issues, though there should be no need to reference the pull request in its own PR body. - -If there is documentation that should be updated on https://developers.openai.com/codex as a result of this change, please note that in a separate section near the end of the pull request. Omit this section if there is no documentation that needs to be updated. - -## Working with Stacks - -Sometimes a pull request is composed of a stack of commits that build on one another. In these cases, the PR body should reflect the _net_ change introduced by the stack as a whole, rather than the individual commits that make up the stack. - -Similarly, sometimes a user may be using a tool like Sapling to leverage _stacked pull requests_, in which case the `base` of the PR may be the a branch that is the `head` of another PR in the stack rather than `main`. In this case, be sure to discuss only the net change between the `base` and `head` of the PR that is being opened against that stacked base, rather than the changes relative to `main`. - -## Sapling - -If `.git/sl/store` is present, then this Git repository is governed by Sapling SCM (https://sapling-scm.com). - -In Sapling, run the following to see if there is a GitHub pull request associated with the current revision: - -```shell -sl log --template '{github_pull_request_url}' -r . -``` - -Alternatively, you can run `sl sl` to see the current development branch and whether there is a GitHub pull request associated with the current commit. For example, if the output were: - -``` - @ cb032b31cf 72 minutes ago mbolin #11412 -╭─╯ tui: show non-file layer content in /debug-config -│ -o fdd0cd1de9 Today at 20:09 origin/main -│ -~ -``` - -- `@` indicates the current commit is `cb032b31cf` -- it is a development branch containing a single commit branched off of `origin/main` -- it is associated with GitHub pull request #11412 diff --git a/vendor/codex/.codex/skills/remote-tests/SKILL.md b/vendor/codex/.codex/skills/remote-tests/SKILL.md deleted file mode 100644 index ee35fc2b..00000000 --- a/vendor/codex/.codex/skills/remote-tests/SKILL.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -name: remote-tests -description: How to run tests using remote executor. ---- - -Some codex integration tests support a running against a remote executor. -This means that when CODEX_TEST_REMOTE_ENV environment variable is set they will attempt to start an executor process in a docker container CODEX_TEST_REMOTE_ENV points to and use it in tests. - -Docker container is built and initialized via ./scripts/test-remote-env.sh - -Currently running remote tests is only supported on Linux, so you need to use a devbox to run them - -You can list devboxes via `applied_devbox ls`, pick the one with `codex` in the name. -Connect to devbox via `ssh `. -Reuse the same checkout of codex in `~/code/codex`. Reset files if needed. Multiple checkouts take longer to build and take up more space. -Check whether the SHA and modified files are in sync between remote and local. diff --git a/vendor/codex/.codex/skills/test-tui/SKILL.md b/vendor/codex/.codex/skills/test-tui/SKILL.md deleted file mode 100644 index e58e6773..00000000 --- a/vendor/codex/.codex/skills/test-tui/SKILL.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -name: test-tui -description: Guide for testing Codex TUI interactively ---- - -You can start and use Codex TUI to verify changes. - -Important notes: - -Start interactively. -Always set RUST_LOG="trace" when starting the process. -Pass `-c log_dir=` argument to have logs written to a specific directory to help with debugging. -When sending a test message programmatically, send text first, then send Enter in a separate write (do not send text + Enter in one burst). -Use `just codex` target to run - `just codex -c ...` diff --git a/vendor/codex/.devcontainer/Dockerfile b/vendor/codex/.devcontainer/Dockerfile deleted file mode 100644 index 8c3a8597..00000000 --- a/vendor/codex/.devcontainer/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -FROM ubuntu:24.04 - -ARG DEBIAN_FRONTEND=noninteractive -# enable 'universe' because musl-tools & clang live there -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - software-properties-common && \ - add-apt-repository --yes universe - -# now install build deps -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - build-essential curl git ca-certificates \ - pkg-config libcap-dev clang musl-tools libssl-dev just && \ - rm -rf /var/lib/apt/lists/* - -# Ubuntu 24.04 ships with user 'ubuntu' already created with UID 1000. -USER ubuntu - -# install Rust + musl target as dev user -RUN curl -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal && \ - ~/.cargo/bin/rustup target add aarch64-unknown-linux-musl && \ - ~/.cargo/bin/rustup component add clippy rustfmt - -ENV PATH="/home/ubuntu/.cargo/bin:${PATH}" - -WORKDIR /workspace diff --git a/vendor/codex/.devcontainer/Dockerfile.secure b/vendor/codex/.devcontainer/Dockerfile.secure deleted file mode 100644 index f5f4d016..00000000 --- a/vendor/codex/.devcontainer/Dockerfile.secure +++ /dev/null @@ -1,74 +0,0 @@ -FROM mcr.microsoft.com/devcontainers/base:ubuntu-24.04 - -ARG TZ -ARG DEBIAN_FRONTEND=noninteractive -ARG NODE_MAJOR=22 -ARG RUST_TOOLCHAIN=1.92.0 -ARG CODEX_NPM_VERSION=latest - -ENV TZ="$TZ" - -SHELL ["/bin/bash", "-o", "pipefail", "-c"] - -# Devcontainers run as a non-root user, so enable bubblewrap's setuid mode. -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - build-essential \ - curl \ - git \ - ca-certificates \ - pkg-config \ - clang \ - musl-tools \ - libssl-dev \ - libsqlite3-dev \ - just \ - python3 \ - python3-pip \ - jq \ - less \ - man-db \ - unzip \ - ripgrep \ - fzf \ - fd-find \ - zsh \ - dnsutils \ - iproute2 \ - ipset \ - iptables \ - aggregate \ - bubblewrap \ - && chmod u+s /usr/bin/bwrap \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* - -RUN curl -fsSL "https://deb.nodesource.com/setup_${NODE_MAJOR}.x" | bash - \ - && apt-get update \ - && apt-get install -y --no-install-recommends nodejs \ - && npm install -g corepack@latest "@openai/codex@${CODEX_NPM_VERSION}" \ - && corepack enable \ - && corepack prepare pnpm@10.28.2 --activate \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* - -COPY .devcontainer/init-firewall.sh /usr/local/bin/init-firewall.sh -COPY .devcontainer/post_install.py /opt/post_install.py -COPY .devcontainer/post-start.sh /opt/post_start.sh - -RUN chmod 500 /usr/local/bin/init-firewall.sh \ - && chmod 755 /opt/post_start.sh \ - && chmod 644 /opt/post_install.py \ - && chown vscode:vscode /opt/post_install.py - -RUN install -d -m 0775 -o vscode -g vscode /commandhistory /workspace \ - && touch /commandhistory/.bash_history /commandhistory/.zsh_history \ - && chown vscode:vscode /commandhistory/.bash_history /commandhistory/.zsh_history - -USER vscode -ENV PATH="/home/vscode/.cargo/bin:${PATH}" -WORKDIR /workspace - -RUN curl -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain "${RUST_TOOLCHAIN}" \ - && rustup component add clippy rustfmt rust-src \ - && rustup target add x86_64-unknown-linux-musl aarch64-unknown-linux-musl diff --git a/vendor/codex/.devcontainer/README.md b/vendor/codex/.devcontainer/README.md deleted file mode 100644 index 3b07f2b4..00000000 --- a/vendor/codex/.devcontainer/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# Containerized Development - -We provide two container paths: - -- `devcontainer.json` keeps the existing Codex contributor setup for working on this repository. -- `devcontainer.secure.json` adds a customer-oriented profile with stricter outbound network controls. - -## Codex contributor profile - -Use `devcontainer.json` when you are developing Codex itself. This is the same lightweight arm64 container that already exists in the repo. - -## Secure customer profile - -Use `devcontainer.secure.json` when you want a stricter runtime profile for running Codex inside a project container: - -- installs the Codex CLI plus common build tools -- installs bubblewrap in setuid mode for Codex's Linux sandbox -- disables Docker's outer seccomp and AppArmor profiles so bubblewrap can construct Codex's inner sandbox -- enables firewall startup with an allowlist-driven outbound policy -- blocks IPv6 by default so the allowlist cannot be bypassed over AAAA routes -- requires `NET_ADMIN` and `NET_RAW` so the firewall can be installed at startup - -This profile keeps the stricter networking isolated to the customer path instead of changing the default Codex contributor container. - -Start it from the CLI with: - -```bash -devcontainer up --workspace-folder . --config .devcontainer/devcontainer.secure.json -``` - -In VS Code, choose **Dev Containers: Open Folder in Container...** and select `.devcontainer/devcontainer.secure.json`. - -## Docker - -To build the contributor image locally for x64 and then run it with the repo mounted under `/workspace`: - -```shell -CODEX_DOCKER_IMAGE_NAME=codex-linux-dev -docker build --platform=linux/amd64 -t "$CODEX_DOCKER_IMAGE_NAME" ./.devcontainer -docker run --platform=linux/amd64 --rm -it -e CARGO_TARGET_DIR=/workspace/codex-rs/target-amd64 -v "$PWD":/workspace -w /workspace/codex-rs "$CODEX_DOCKER_IMAGE_NAME" -``` - -Note that `/workspace/target` will contain the binaries built for your host platform, so we include `-e CARGO_TARGET_DIR=/workspace/codex-rs/target-amd64` in the `docker run` command so that the binaries built inside your container are written to a separate directory. - -For arm64, specify `--platform=linux/arm64` instead for both `docker build` and `docker run`. - -Currently, the contributor `Dockerfile` works for both x64 and arm64 Linux, though you need to run `rustup target add x86_64-unknown-linux-musl` yourself to install the musl toolchain for x64. - -The secure profile's capability, seccomp, and AppArmor options are required when you want Codex's bubblewrap sandbox to run inside Docker as the non-root devcontainer user. Without them, Docker's default runtime profile can block bubblewrap's namespace setup before Codex's own seccomp filter is installed. This keeps the Docker relaxation explicit in the profile that is meant to run Codex inside a project container, while the default contributor profile stays lightweight. diff --git a/vendor/codex/.devcontainer/devcontainer.json b/vendor/codex/.devcontainer/devcontainer.json deleted file mode 100644 index 1bed79c3..00000000 --- a/vendor/codex/.devcontainer/devcontainer.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "Codex", - "build": { - "dockerfile": "Dockerfile", - "context": "..", - "platform": "linux/arm64" - }, - - /* Force VS Code to run the container as arm64 in - case your host is x86 (or vice-versa). */ - "runArgs": ["--platform=linux/arm64"], - - "containerEnv": { - "RUST_BACKTRACE": "1", - "CARGO_TARGET_DIR": "${containerWorkspaceFolder}/codex-rs/target-arm64" - }, - - "remoteUser": "ubuntu", - "customizations": { - "vscode": { - "settings": { - "terminal.integrated.defaultProfile.linux": "bash" - }, - "extensions": ["rust-lang.rust-analyzer", "tamasfe.even-better-toml"] - } - } -} diff --git a/vendor/codex/.devcontainer/devcontainer.secure.json b/vendor/codex/.devcontainer/devcontainer.secure.json deleted file mode 100644 index f5268698..00000000 --- a/vendor/codex/.devcontainer/devcontainer.secure.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.schema.json", - "name": "Codex (Secure)", - "build": { - "dockerfile": "Dockerfile.secure", - "context": "..", - "args": { - "TZ": "${localEnv:TZ:UTC}", - "NODE_MAJOR": "22", - "RUST_TOOLCHAIN": "1.92.0", - "CODEX_NPM_VERSION": "latest" - } - }, - "runArgs": [ - "--cap-add=SYS_ADMIN", - "--cap-add=SYS_CHROOT", - "--cap-add=SETUID", - "--cap-add=SETGID", - "--cap-add=SYS_PTRACE", - "--security-opt=seccomp=unconfined", - "--security-opt=apparmor=unconfined", - "--cap-add=NET_ADMIN", - "--cap-add=NET_RAW" - ], - "init": true, - "updateRemoteUserUID": true, - "remoteUser": "vscode", - "workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,consistency=delegated", - "workspaceFolder": "/workspace", - "mounts": [ - "source=codex-commandhistory-${devcontainerId},target=/commandhistory,type=volume", - "source=codex-home-${devcontainerId},target=/home/vscode/.codex,type=volume", - "source=codex-gh-${devcontainerId},target=/home/vscode/.config/gh,type=volume", - "source=codex-cargo-registry-${devcontainerId},target=/home/vscode/.cargo/registry,type=volume", - "source=codex-cargo-git-${devcontainerId},target=/home/vscode/.cargo/git,type=volume", - "source=codex-rustup-${devcontainerId},target=/home/vscode/.rustup,type=volume", - "source=${localEnv:HOME}/.gitconfig,target=/home/vscode/.gitconfig,type=bind,readonly" - ], - "containerEnv": { - "RUST_BACKTRACE": "1", - "CODEX_UNSAFE_ALLOW_NO_SANDBOX": "1", - "CODEX_ENABLE_FIREWALL": "1", - "CODEX_INCLUDE_GITHUB_META_RANGES": "1", - "OPENAI_ALLOWED_DOMAINS": "api.openai.com auth.openai.com github.com api.github.com codeload.github.com raw.githubusercontent.com objects.githubusercontent.com crates.io index.crates.io static.crates.io static.rust-lang.org registry.npmjs.org pypi.org files.pythonhosted.org", - "CARGO_TARGET_DIR": "/workspace/.cache/cargo-target", - "GIT_CONFIG_GLOBAL": "/home/vscode/.gitconfig.local", - "COREPACK_ENABLE_DOWNLOAD_PROMPT": "0", - "PYTHONDONTWRITEBYTECODE": "1", - "PIP_DISABLE_PIP_VERSION_CHECK": "1" - }, - "remoteEnv": { - "OPENAI_API_KEY": "${localEnv:OPENAI_API_KEY}" - }, - "postCreateCommand": "python3 /opt/post_install.py", - "postStartCommand": "bash /opt/post_start.sh", - "waitFor": "postStartCommand", - "customizations": { - "vscode": { - "settings": { - "terminal.integrated.defaultProfile.linux": "zsh", - "terminal.integrated.profiles.linux": { - "bash": { - "path": "bash", - "icon": "terminal-bash" - }, - "zsh": { - "path": "zsh" - } - }, - "files.trimTrailingWhitespace": true, - "files.insertFinalNewline": true, - "files.trimFinalNewlines": true - }, - "extensions": [ - "openai.chatgpt", - "rust-lang.rust-analyzer", - "tamasfe.even-better-toml", - "vadimcn.vscode-lldb", - "ms-azuretools.vscode-docker" - ] - } - } -} diff --git a/vendor/codex/.devcontainer/init-firewall.sh b/vendor/codex/.devcontainer/init-firewall.sh deleted file mode 100644 index 92757244..00000000 --- a/vendor/codex/.devcontainer/init-firewall.sh +++ /dev/null @@ -1,170 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail -IFS=$'\n\t' - -allowed_domains_file="/etc/codex/allowed_domains.txt" -include_github_meta_ranges="${CODEX_INCLUDE_GITHUB_META_RANGES:-1}" - -if [ -f "$allowed_domains_file" ]; then - mapfile -t allowed_domains < <(sed '/^\s*#/d;/^\s*$/d' "$allowed_domains_file") -else - allowed_domains=("api.openai.com") -fi - -if [ "${#allowed_domains[@]}" -eq 0 ]; then - echo "ERROR: No allowed domains configured" - exit 1 -fi - -add_ipv4_cidr_to_allowlist() { - local source="$1" - local cidr="$2" - - if [[ ! "$cidr" =~ ^[0-9]{1,3}(\.[0-9]{1,3}){3}/[0-9]{1,2}$ ]]; then - echo "ERROR: Invalid ${source} CIDR range: $cidr" - exit 1 - fi - - ipset add allowed-domains "$cidr" -exist -} - -configure_ipv6_default_deny() { - if ! command -v ip6tables >/dev/null 2>&1; then - echo "ERROR: ip6tables is required to enforce IPv6 default-deny policy" - exit 1 - fi - - ip6tables -F - ip6tables -X - ip6tables -t mangle -F - ip6tables -t mangle -X - ip6tables -t nat -F 2>/dev/null || true - ip6tables -t nat -X 2>/dev/null || true - - ip6tables -A INPUT -i lo -j ACCEPT - ip6tables -A OUTPUT -o lo -j ACCEPT - ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT - ip6tables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT - - ip6tables -P INPUT DROP - ip6tables -P FORWARD DROP - ip6tables -P OUTPUT DROP - - echo "IPv6 firewall policy configured (default-deny)" -} - -# Preserve docker-managed DNS NAT rules before clearing tables. -docker_dns_rules="$(iptables-save -t nat | grep "127\\.0\\.0\\.11" || true)" - -iptables -F -iptables -X -iptables -t nat -F -iptables -t nat -X -iptables -t mangle -F -iptables -t mangle -X -ipset destroy allowed-domains 2>/dev/null || true - -if [ -n "$docker_dns_rules" ]; then - echo "Restoring Docker DNS NAT rules" - iptables -t nat -N DOCKER_OUTPUT 2>/dev/null || true - iptables -t nat -N DOCKER_POSTROUTING 2>/dev/null || true - while IFS= read -r rule; do - [ -z "$rule" ] && continue - iptables -t nat $rule - done <<< "$docker_dns_rules" -fi - -# Allow DNS resolution and localhost communication. -iptables -A OUTPUT -p udp --dport 53 -j ACCEPT -iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT -iptables -A INPUT -p udp --sport 53 -j ACCEPT -iptables -A INPUT -p tcp --sport 53 -j ACCEPT -iptables -A INPUT -i lo -j ACCEPT -iptables -A OUTPUT -o lo -j ACCEPT - -ipset create allowed-domains hash:net - -for domain in "${allowed_domains[@]}"; do - echo "Resolving $domain" - ips="$(dig +short A "$domain" | sed '/^\s*$/d')" - if [ -z "$ips" ]; then - echo "ERROR: Failed to resolve $domain" - exit 1 - fi - - while IFS= read -r ip; do - if [[ ! "$ip" =~ ^[0-9]{1,3}(\.[0-9]{1,3}){3}$ ]]; then - echo "ERROR: Invalid IPv4 address from DNS for $domain: $ip" - exit 1 - fi - ipset add allowed-domains "$ip" -exist - done <<< "$ips" -done - -if [ "$include_github_meta_ranges" = "1" ]; then - echo "Fetching GitHub meta ranges" - github_meta="$(curl -fsSL --connect-timeout 10 https://api.github.com/meta)" - - if ! echo "$github_meta" | jq -e '.web and .api and .git' >/dev/null; then - echo "ERROR: GitHub meta response missing expected fields" - exit 1 - fi - - while IFS= read -r cidr; do - [ -z "$cidr" ] && continue - if [[ "$cidr" == *:* ]]; then - # Current policy enforces IPv4-only ipset entries. - continue - fi - add_ipv4_cidr_to_allowlist "GitHub" "$cidr" - done < <(echo "$github_meta" | jq -r '((.web // []) + (.api // []) + (.git // []))[]' | sort -u) -fi - -host_ip="$(ip route | awk '/default/ {print $3; exit}')" -if [ -z "$host_ip" ]; then - echo "ERROR: Failed to detect host IP" - exit 1 -fi - -host_network="$(echo "$host_ip" | sed 's/\.[0-9]*$/.0\/24/')" -iptables -A INPUT -s "$host_network" -j ACCEPT -iptables -A OUTPUT -d "$host_network" -j ACCEPT - -iptables -P INPUT DROP -iptables -P FORWARD DROP -iptables -P OUTPUT DROP - -iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -iptables -A OUTPUT -m set --match-set allowed-domains dst -j ACCEPT - -# Reject rather than silently drop to make policy failures obvious. -iptables -A INPUT -j REJECT --reject-with icmp-admin-prohibited -iptables -A OUTPUT -j REJECT --reject-with icmp-admin-prohibited -iptables -A FORWARD -j REJECT --reject-with icmp-admin-prohibited - -configure_ipv6_default_deny - -echo "Firewall configuration complete" - -if curl --connect-timeout 5 https://example.com >/dev/null 2>&1; then - echo "ERROR: Firewall verification failed - was able to reach https://example.com" - exit 1 -fi - -if ! curl --connect-timeout 5 https://api.openai.com >/dev/null 2>&1; then - echo "ERROR: Firewall verification failed - unable to reach https://api.openai.com" - exit 1 -fi - -if [ "$include_github_meta_ranges" = "1" ] && ! curl --connect-timeout 5 https://api.github.com/zen >/dev/null 2>&1; then - echo "ERROR: Firewall verification failed - unable to reach https://api.github.com" - exit 1 -fi - -if curl --connect-timeout 5 -6 https://example.com >/dev/null 2>&1; then - echo "ERROR: Firewall verification failed - was able to reach https://example.com over IPv6" - exit 1 -fi - -echo "Firewall verification passed" diff --git a/vendor/codex/.devcontainer/post-start.sh b/vendor/codex/.devcontainer/post-start.sh deleted file mode 100644 index fcc42ad1..00000000 --- a/vendor/codex/.devcontainer/post-start.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -if [ "${CODEX_ENABLE_FIREWALL:-1}" != "1" ]; then - echo "[devcontainer] Firewall mode: permissive (CODEX_ENABLE_FIREWALL=${CODEX_ENABLE_FIREWALL:-unset})." - exit 0 -fi - -echo "[devcontainer] Firewall mode: strict" - -domains_raw="${OPENAI_ALLOWED_DOMAINS:-api.openai.com}" -mapfile -t domains < <(printf '%s\n' "$domains_raw" | tr ', ' '\n\n' | sed '/^$/d' | sort -u) - -if [ "${#domains[@]}" -eq 0 ]; then - echo "[devcontainer] No allowed domains configured." - exit 1 -fi - -tmp_file="$(mktemp)" -for domain in "${domains[@]}"; do - if [[ ! "$domain" =~ ^[a-zA-Z0-9][a-zA-Z0-9.-]*\.[a-zA-Z]{2,}$ ]]; then - echo "[devcontainer] Invalid domain in OPENAI_ALLOWED_DOMAINS: $domain" - rm -f "$tmp_file" - exit 1 - fi - printf '%s\n' "$domain" >> "$tmp_file" -done - -sudo install -d -m 0755 /etc/codex -sudo cp "$tmp_file" /etc/codex/allowed_domains.txt -sudo chown root:root /etc/codex/allowed_domains.txt -sudo chmod 0444 /etc/codex/allowed_domains.txt -rm -f "$tmp_file" - -echo "[devcontainer] Applying firewall policy for domains: ${domains[*]}" -sudo --preserve-env=CODEX_INCLUDE_GITHUB_META_RANGES /usr/local/bin/init-firewall.sh diff --git a/vendor/codex/.devcontainer/post_install.py b/vendor/codex/.devcontainer/post_install.py deleted file mode 100644 index 205e57ce..00000000 --- a/vendor/codex/.devcontainer/post_install.py +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/env python3 -"""Post-install configuration for the Codex devcontainer.""" - -from __future__ import annotations - -import os -import subprocess -import sys -from pathlib import Path - - -def ensure_history_files() -> None: - command_history_dir = Path("/commandhistory") - command_history_dir.mkdir(parents=True, exist_ok=True) - - for filename in (".bash_history", ".zsh_history"): - (command_history_dir / filename).touch(exist_ok=True) - - -def fix_directory_ownership() -> None: - uid = os.getuid() - gid = os.getgid() - - paths = [ - Path.home() / ".codex", - Path.home() / ".config" / "gh", - Path.home() / ".cargo", - Path.home() / ".rustup", - Path("/commandhistory"), - ] - - for path in paths: - if not path.exists(): - continue - - stat_info = path.stat() - if stat_info.st_uid == uid and stat_info.st_gid == gid: - continue - - try: - subprocess.run( - ["sudo", "chown", "-R", f"{uid}:{gid}", str(path)], - check=True, - capture_output=True, - text=True, - ) - print(f"[post_install] fixed ownership: {path}", file=sys.stderr) - except subprocess.CalledProcessError as err: - print( - f"[post_install] warning: could not fix ownership of {path}: {err.stderr.strip()}", - file=sys.stderr, - ) - - -def setup_git_config() -> None: - home = Path.home() - host_gitconfig = home / ".gitconfig" - local_gitconfig = home / ".gitconfig.local" - gitignore_global = home / ".gitignore_global" - - gitignore_global.write_text( - """# Codex -.codex/ - -# Rust -/target/ - -# Node -node_modules/ - -# Python -__pycache__/ -*.pyc - -# Editors -.vscode/ -.idea/ - -# macOS -.DS_Store -""", - encoding="utf-8", - ) - - include_line = ( - f"[include]\n path = {host_gitconfig}\n\n" if host_gitconfig.exists() else "" - ) - - local_gitconfig.write_text( - f"""# Container-local git configuration -{include_line}[core] - excludesfile = {gitignore_global} - -[merge] - conflictstyle = diff3 - -[diff] - colorMoved = default -""", - encoding="utf-8", - ) - - -def main() -> None: - print("[post_install] configuring devcontainer...", file=sys.stderr) - ensure_history_files() - fix_directory_ownership() - setup_git_config() - print("[post_install] complete", file=sys.stderr) - - -if __name__ == "__main__": - main() diff --git a/vendor/codex/.gitattributes b/vendor/codex/.gitattributes deleted file mode 100644 index 0f1c1b41..00000000 --- a/vendor/codex/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -codex-rs/app-server-protocol/schema/** linguist-generated diff --git a/vendor/codex/.github/CODEOWNERS b/vendor/codex/.github/CODEOWNERS deleted file mode 100644 index 190bc00e..00000000 --- a/vendor/codex/.github/CODEOWNERS +++ /dev/null @@ -1,5 +0,0 @@ -# Core crate ownership. -/codex-rs/core/ @openai/codex-core-agent-team - -# Keep ownership changes reviewed by the same team. -/.github/CODEOWNERS @openai/codex-core-agent-team diff --git a/vendor/codex/.github/ISSUE_TEMPLATE/1-codex-app.yml b/vendor/codex/.github/ISSUE_TEMPLATE/1-codex-app.yml deleted file mode 100644 index 6e294ee2..00000000 --- a/vendor/codex/.github/ISSUE_TEMPLATE/1-codex-app.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: 🖥️ Codex App Bug -description: Report an issue with the Codex App -labels: - - app -body: - - type: markdown - attributes: - value: | - Before submitting a new issue, please search for existing issues to see if your issue has already been reported. - If it has, please add a 👍 reaction (no need to leave a comment) to the existing issue instead of creating a new one. - - - type: input - id: version - attributes: - label: What version of the Codex App are you using (From “About Codex” dialog)? - validations: - required: true - - type: input - id: plan - attributes: - label: What subscription do you have? - validations: - required: true - - type: input - id: platform - attributes: - label: What platform is your computer? - description: | - For macOS and Linux: copy the output of `uname -mprs` - For Windows: copy the output of `"$([Environment]::OSVersion | ForEach-Object VersionString) $(if ([Environment]::Is64BitOperatingSystem) { "x64" } else { "x86" })"` in the PowerShell console - - type: textarea - id: actual - attributes: - label: What issue are you seeing? - description: Please include the full error messages and prompts with PII redacted. If possible, please provide text instead of a screenshot. - validations: - required: true - - type: textarea - id: steps - attributes: - label: What steps can reproduce the bug? - description: Explain the bug and provide a code snippet that can reproduce it. Please include session id, token limit usage, context window usage if applicable. - validations: - required: true - - type: textarea - id: expected - attributes: - label: What is the expected behavior? - description: If possible, please provide text instead of a screenshot. - - type: textarea - id: notes - attributes: - label: Additional information - description: Is there anything else you think we should know? diff --git a/vendor/codex/.github/ISSUE_TEMPLATE/2-extension.yml b/vendor/codex/.github/ISSUE_TEMPLATE/2-extension.yml deleted file mode 100644 index 599bc08b..00000000 --- a/vendor/codex/.github/ISSUE_TEMPLATE/2-extension.yml +++ /dev/null @@ -1,61 +0,0 @@ -name: 🧑‍💻 IDE Extension Bug -description: Report an issue with the IDE extension -labels: - - extension -body: - - type: markdown - attributes: - value: | - Before submitting a new issue, please search for existing issues to see if your issue has already been reported. - If it has, please add a 👍 reaction (no need to leave a comment) to the existing issue instead of creating a new one. - - - type: input - id: version - attributes: - label: What version of the IDE extension are you using? - validations: - required: true - - type: input - id: plan - attributes: - label: What subscription do you have? - validations: - required: true - - type: input - id: ide - attributes: - label: Which IDE are you using? - description: Like `VS Code`, `Cursor`, `Windsurf`, etc. - validations: - required: true - - type: input - id: platform - attributes: - label: What platform is your computer? - description: | - For macOS and Linux: copy the output of `uname -mprs` - For Windows: copy the output of `"$([Environment]::OSVersion | ForEach-Object VersionString) $(if ([Environment]::Is64BitOperatingSystem) { "x64" } else { "x86" })"` in the PowerShell console - - type: textarea - id: actual - attributes: - label: What issue are you seeing? - description: Please include the full error messages and prompts with PII redacted. If possible, please provide text instead of a screenshot. - validations: - required: true - - type: textarea - id: steps - attributes: - label: What steps can reproduce the bug? - description: Explain the bug and provide a code snippet that can reproduce it. - validations: - required: true - - type: textarea - id: expected - attributes: - label: What is the expected behavior? - description: If possible, please provide text instead of a screenshot. - - type: textarea - id: notes - attributes: - label: Additional information - description: Is there anything else you think we should know? diff --git a/vendor/codex/.github/ISSUE_TEMPLATE/3-cli.yml b/vendor/codex/.github/ISSUE_TEMPLATE/3-cli.yml deleted file mode 100644 index 4aff813e..00000000 --- a/vendor/codex/.github/ISSUE_TEMPLATE/3-cli.yml +++ /dev/null @@ -1,70 +0,0 @@ -name: 💻 CLI Bug -description: Report an issue in the Codex CLI -labels: - - bug - - needs triage -body: - - type: markdown - attributes: - value: | - Before submitting a new issue, please search for existing issues to see if your issue has already been reported. - If it has, please add a 👍 reaction (no need to leave a comment) to the existing issue instead of creating a new one. - - Make sure you are running the [latest](https://npmjs.com/package/@openai/codex) version of Codex CLI. The bug you are experiencing may already have been fixed. - - - type: input - id: version - attributes: - label: What version of Codex CLI is running? - description: use `codex --version` - validations: - required: true - - type: input - id: plan - attributes: - label: What subscription do you have? - validations: - required: true - - type: input - id: model - attributes: - label: Which model were you using? - description: Like `gpt-5.2`, `gpt-5.2-codex`, etc. - - type: input - id: platform - attributes: - label: What platform is your computer? - description: | - For macOS and Linux: copy the output of `uname -mprs` - For Windows: copy the output of `"$([Environment]::OSVersion | ForEach-Object VersionString) $(if ([Environment]::Is64BitOperatingSystem) { "x64" } else { "x86" })"` in the PowerShell console - - type: input - id: terminal - attributes: - label: What terminal emulator and version are you using (if applicable)? - description: Also note any multiplexer in use (screen / tmux / zellij) - description: | - E.g, VSCode, Terminal.app, iTerm2, Ghostty, Windows Terminal (WSL / PowerShell) - - type: textarea - id: actual - attributes: - label: What issue are you seeing? - description: Please include the full error messages and prompts with PII redacted. If possible, please provide text instead of a screenshot. - validations: - required: true - - type: textarea - id: steps - attributes: - label: What steps can reproduce the bug? - description: Explain the bug and provide a code snippet that can reproduce it. Please include thread id if applicable. - validations: - required: true - - type: textarea - id: expected - attributes: - label: What is the expected behavior? - description: If possible, please provide text instead of a screenshot. - - type: textarea - id: notes - attributes: - label: Additional information - description: Is there anything else you think we should know? diff --git a/vendor/codex/.github/ISSUE_TEMPLATE/4-bug-report.yml b/vendor/codex/.github/ISSUE_TEMPLATE/4-bug-report.yml deleted file mode 100644 index 4de88414..00000000 --- a/vendor/codex/.github/ISSUE_TEMPLATE/4-bug-report.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: 🪲 Other Bug -description: Report an issue in Codex Web, integrations, or other Codex components -labels: - - bug -body: - - type: markdown - attributes: - value: | - Before submitting a new issue, please search for existing issues to see if your issue has already been reported. - If it has, please add a 👍 reaction (no need to leave a comment) to the existing issue instead of creating a new one. - - If you need help or support using Codex and are not reporting a bug, please post on [codex/discussions](https://github.com/openai/codex/discussions), where you can ask questions or engage with others on ideas for how to improve codex. - - - type: textarea - id: actual - attributes: - label: What issue are you seeing? - description: Please include the full error messages and prompts with PII redacted. If possible, please provide text instead of a screenshot. - validations: - required: true - - type: textarea - id: steps - attributes: - label: What steps can reproduce the bug? - description: Explain the bug and provide a code snippet that can reproduce it. - validations: - required: true - - type: textarea - id: expected - attributes: - label: What is the expected behavior? - description: If possible, please provide text instead of a screenshot. - - type: textarea - id: notes - attributes: - label: Additional information - description: Is there anything else you think we should know? diff --git a/vendor/codex/.github/ISSUE_TEMPLATE/5-feature-request.yml b/vendor/codex/.github/ISSUE_TEMPLATE/5-feature-request.yml deleted file mode 100644 index 55ff9fbb..00000000 --- a/vendor/codex/.github/ISSUE_TEMPLATE/5-feature-request.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: 🎁 Feature Request -description: Propose a new feature for Codex -labels: - - enhancement -body: - - type: markdown - attributes: - value: | - Is Codex missing a feature that you'd like to see? Feel free to propose it here. - - Before you submit a feature: - 1. Search existing issues for similar features. If you find one, 👍 it rather than opening a new one. - 2. The Codex team will try to balance the varying needs of the community when prioritizing or rejecting new features. Not all features will be accepted. See [Contributing](https://github.com/openai/codex#contributing) for more details. - - - type: input - id: variant - attributes: - label: What variant of Codex are you using? - description: (e.g., App, IDE Extension, CLI, Web) - validations: - required: true - - type: textarea - id: feature - attributes: - label: What feature would you like to see? - validations: - required: true - - type: textarea - id: notes - attributes: - label: Additional information - description: Is there anything else you think we should know? diff --git a/vendor/codex/.github/ISSUE_TEMPLATE/6-docs-issue.yml b/vendor/codex/.github/ISSUE_TEMPLATE/6-docs-issue.yml deleted file mode 100644 index 456602e6..00000000 --- a/vendor/codex/.github/ISSUE_TEMPLATE/6-docs-issue.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: 📗 Documentation Issue -description: Tell us if there is missing or incorrect documentation -labels: [docs] -body: - - type: markdown - attributes: - value: | - Thank you for submitting a documentation request. It helps make Codex better. - - type: dropdown - attributes: - label: What is the type of issue? - multiple: true - options: - - Documentation is missing - - Documentation is incorrect - - Documentation is confusing - - Example code is not working - - Something else - - type: textarea - attributes: - label: What is the issue? - validations: - required: true - - type: textarea - attributes: - label: Where did you find it? - description: If possible, please provide the URL(s) where you found this issue. \ No newline at end of file diff --git a/vendor/codex/.github/actions/linux-code-sign/action.yml b/vendor/codex/.github/actions/linux-code-sign/action.yml deleted file mode 100644 index 12e52118..00000000 --- a/vendor/codex/.github/actions/linux-code-sign/action.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: linux-code-sign -description: Sign Linux artifacts with cosign. -inputs: - target: - description: Target triple for the artifacts to sign. - required: true - artifacts-dir: - description: Absolute path to the directory containing built binaries to sign. - required: true - -runs: - using: composite - steps: - - name: Install cosign - uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0 - - - name: Cosign Linux artifacts - shell: bash - env: - ARTIFACTS_DIR: ${{ inputs.artifacts-dir }} - COSIGN_EXPERIMENTAL: "1" - COSIGN_YES: "true" - COSIGN_OIDC_CLIENT_ID: "sigstore" - COSIGN_OIDC_ISSUER: "https://oauth2.sigstore.dev/auth" - run: | - set -euo pipefail - - dest="$ARTIFACTS_DIR" - if [[ ! -d "$dest" ]]; then - echo "Destination $dest does not exist" - exit 1 - fi - - for binary in codex codex-responses-api-proxy; do - artifact="${dest}/${binary}" - if [[ ! -f "$artifact" ]]; then - echo "Binary $artifact not found" - exit 1 - fi - - cosign sign-blob \ - --yes \ - --bundle "${artifact}.sigstore" \ - "$artifact" - done diff --git a/vendor/codex/.github/actions/macos-code-sign/action.yml b/vendor/codex/.github/actions/macos-code-sign/action.yml deleted file mode 100644 index 200b2390..00000000 --- a/vendor/codex/.github/actions/macos-code-sign/action.yml +++ /dev/null @@ -1,253 +0,0 @@ -name: macos-code-sign -description: Configure, sign, notarize, and clean up macOS code signing artifacts. -inputs: - target: - description: Rust compilation target triple (e.g. aarch64-apple-darwin). - required: true - sign-binaries: - description: Whether to sign and notarize the macOS binaries. - required: false - default: "true" - sign-dmg: - description: Whether to sign and notarize the macOS dmg. - required: false - default: "true" - apple-certificate: - description: Base64-encoded Apple signing certificate (P12). - required: true - apple-certificate-password: - description: Password for the signing certificate. - required: true - apple-notarization-key-p8: - description: Base64-encoded Apple notarization key (P8). - required: true - apple-notarization-key-id: - description: Apple notarization key ID. - required: true - apple-notarization-issuer-id: - description: Apple notarization issuer ID. - required: true -runs: - using: composite - steps: - - name: Configure Apple code signing - shell: bash - env: - KEYCHAIN_PASSWORD: actions - APPLE_CERTIFICATE: ${{ inputs.apple-certificate }} - APPLE_CERTIFICATE_PASSWORD: ${{ inputs.apple-certificate-password }} - run: | - set -euo pipefail - - if [[ -z "${APPLE_CERTIFICATE:-}" ]]; then - echo "APPLE_CERTIFICATE is required for macOS signing" - exit 1 - fi - - if [[ -z "${APPLE_CERTIFICATE_PASSWORD:-}" ]]; then - echo "APPLE_CERTIFICATE_PASSWORD is required for macOS signing" - exit 1 - fi - - cert_path="${RUNNER_TEMP}/apple_signing_certificate.p12" - echo "$APPLE_CERTIFICATE" | base64 -d > "$cert_path" - - keychain_path="${RUNNER_TEMP}/codex-signing.keychain-db" - security create-keychain -p "$KEYCHAIN_PASSWORD" "$keychain_path" - security set-keychain-settings -lut 21600 "$keychain_path" - security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$keychain_path" - - keychain_args=() - cleanup_keychain() { - if ((${#keychain_args[@]} > 0)); then - security list-keychains -s "${keychain_args[@]}" || true - security default-keychain -s "${keychain_args[0]}" || true - else - security list-keychains -s || true - fi - if [[ -f "$keychain_path" ]]; then - security delete-keychain "$keychain_path" || true - fi - } - - while IFS= read -r keychain; do - [[ -n "$keychain" ]] && keychain_args+=("$keychain") - done < <(security list-keychains | sed 's/^[[:space:]]*//;s/[[:space:]]*$//;s/"//g') - - if ((${#keychain_args[@]} > 0)); then - security list-keychains -s "$keychain_path" "${keychain_args[@]}" - else - security list-keychains -s "$keychain_path" - fi - - security default-keychain -s "$keychain_path" - security import "$cert_path" -k "$keychain_path" -P "$APPLE_CERTIFICATE_PASSWORD" -T /usr/bin/codesign -T /usr/bin/security - security set-key-partition-list -S apple-tool:,apple: -s -k "$KEYCHAIN_PASSWORD" "$keychain_path" > /dev/null - - codesign_hashes=() - while IFS= read -r hash; do - [[ -n "$hash" ]] && codesign_hashes+=("$hash") - done < <(security find-identity -v -p codesigning "$keychain_path" \ - | sed -n 's/.*\([0-9A-F]\{40\}\).*/\1/p' \ - | sort -u) - - if ((${#codesign_hashes[@]} == 0)); then - echo "No signing identities found in $keychain_path" - cleanup_keychain - rm -f "$cert_path" - exit 1 - fi - - if ((${#codesign_hashes[@]} > 1)); then - echo "Multiple signing identities found in $keychain_path:" - printf ' %s\n' "${codesign_hashes[@]}" - cleanup_keychain - rm -f "$cert_path" - exit 1 - fi - - APPLE_CODESIGN_IDENTITY="${codesign_hashes[0]}" - - rm -f "$cert_path" - - echo "APPLE_CODESIGN_IDENTITY=$APPLE_CODESIGN_IDENTITY" >> "$GITHUB_ENV" - echo "APPLE_CODESIGN_KEYCHAIN=$keychain_path" >> "$GITHUB_ENV" - echo "::add-mask::$APPLE_CODESIGN_IDENTITY" - - - name: Sign macOS binaries - if: ${{ inputs.sign-binaries == 'true' }} - shell: bash - env: - TARGET: ${{ inputs.target }} - run: | - set -euo pipefail - - if [[ -z "${APPLE_CODESIGN_IDENTITY:-}" ]]; then - echo "APPLE_CODESIGN_IDENTITY is required for macOS signing" - exit 1 - fi - - keychain_args=() - if [[ -n "${APPLE_CODESIGN_KEYCHAIN:-}" && -f "${APPLE_CODESIGN_KEYCHAIN}" ]]; then - keychain_args+=(--keychain "${APPLE_CODESIGN_KEYCHAIN}") - fi - - entitlements_path="$GITHUB_ACTION_PATH/codex.entitlements.plist" - - for binary in codex codex-responses-api-proxy; do - path="codex-rs/target/${TARGET}/release/${binary}" - codesign --force --options runtime --timestamp --entitlements "$entitlements_path" --sign "$APPLE_CODESIGN_IDENTITY" "${keychain_args[@]}" "$path" - done - - - name: Notarize macOS binaries - if: ${{ inputs.sign-binaries == 'true' }} - shell: bash - env: - TARGET: ${{ inputs.target }} - APPLE_NOTARIZATION_KEY_P8: ${{ inputs.apple-notarization-key-p8 }} - APPLE_NOTARIZATION_KEY_ID: ${{ inputs.apple-notarization-key-id }} - APPLE_NOTARIZATION_ISSUER_ID: ${{ inputs.apple-notarization-issuer-id }} - run: | - set -euo pipefail - - for var in APPLE_NOTARIZATION_KEY_P8 APPLE_NOTARIZATION_KEY_ID APPLE_NOTARIZATION_ISSUER_ID; do - if [[ -z "${!var:-}" ]]; then - echo "$var is required for notarization" - exit 1 - fi - done - - notary_key_path="${RUNNER_TEMP}/notarytool.key.p8" - echo "$APPLE_NOTARIZATION_KEY_P8" | base64 -d > "$notary_key_path" - cleanup_notary() { - rm -f "$notary_key_path" - } - trap cleanup_notary EXIT - - source "$GITHUB_ACTION_PATH/notary_helpers.sh" - - notarize_binary() { - local binary="$1" - local source_path="codex-rs/target/${TARGET}/release/${binary}" - local archive_path="${RUNNER_TEMP}/${binary}.zip" - - if [[ ! -f "$source_path" ]]; then - echo "Binary $source_path not found" - exit 1 - fi - - rm -f "$archive_path" - ditto -c -k --keepParent "$source_path" "$archive_path" - - notarize_submission "$binary" "$archive_path" "$notary_key_path" - } - - notarize_binary "codex" - notarize_binary "codex-responses-api-proxy" - - - name: Sign and notarize macOS dmg - if: ${{ inputs.sign-dmg == 'true' }} - shell: bash - env: - TARGET: ${{ inputs.target }} - APPLE_NOTARIZATION_KEY_P8: ${{ inputs.apple-notarization-key-p8 }} - APPLE_NOTARIZATION_KEY_ID: ${{ inputs.apple-notarization-key-id }} - APPLE_NOTARIZATION_ISSUER_ID: ${{ inputs.apple-notarization-issuer-id }} - run: | - set -euo pipefail - - for var in APPLE_CODESIGN_IDENTITY APPLE_NOTARIZATION_KEY_P8 APPLE_NOTARIZATION_KEY_ID APPLE_NOTARIZATION_ISSUER_ID; do - if [[ -z "${!var:-}" ]]; then - echo "$var is required" - exit 1 - fi - done - - notary_key_path="${RUNNER_TEMP}/notarytool.key.p8" - echo "$APPLE_NOTARIZATION_KEY_P8" | base64 -d > "$notary_key_path" - cleanup_notary() { - rm -f "$notary_key_path" - } - trap cleanup_notary EXIT - - source "$GITHUB_ACTION_PATH/notary_helpers.sh" - - dmg_name="codex-${TARGET}.dmg" - dmg_path="codex-rs/target/${TARGET}/release/${dmg_name}" - - if [[ ! -f "$dmg_path" ]]; then - echo "dmg $dmg_path not found" - exit 1 - fi - - keychain_args=() - if [[ -n "${APPLE_CODESIGN_KEYCHAIN:-}" && -f "${APPLE_CODESIGN_KEYCHAIN}" ]]; then - keychain_args+=(--keychain "${APPLE_CODESIGN_KEYCHAIN}") - fi - - codesign --force --timestamp --sign "$APPLE_CODESIGN_IDENTITY" "${keychain_args[@]}" "$dmg_path" - notarize_submission "$dmg_name" "$dmg_path" "$notary_key_path" - xcrun stapler staple "$dmg_path" - - - name: Remove signing keychain - if: ${{ always() }} - shell: bash - env: - APPLE_CODESIGN_KEYCHAIN: ${{ env.APPLE_CODESIGN_KEYCHAIN }} - run: | - set -euo pipefail - if [[ -n "${APPLE_CODESIGN_KEYCHAIN:-}" ]]; then - keychain_args=() - while IFS= read -r keychain; do - [[ "$keychain" == "$APPLE_CODESIGN_KEYCHAIN" ]] && continue - [[ -n "$keychain" ]] && keychain_args+=("$keychain") - done < <(security list-keychains | sed 's/^[[:space:]]*//;s/[[:space:]]*$//;s/"//g') - if ((${#keychain_args[@]} > 0)); then - security list-keychains -s "${keychain_args[@]}" - security default-keychain -s "${keychain_args[0]}" - fi - - if [[ -f "$APPLE_CODESIGN_KEYCHAIN" ]]; then - security delete-keychain "$APPLE_CODESIGN_KEYCHAIN" - fi - fi diff --git a/vendor/codex/.github/actions/macos-code-sign/codex.entitlements.plist b/vendor/codex/.github/actions/macos-code-sign/codex.entitlements.plist deleted file mode 100644 index d35e43ae..00000000 --- a/vendor/codex/.github/actions/macos-code-sign/codex.entitlements.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - com.apple.security.cs.allow-jit - - - diff --git a/vendor/codex/.github/actions/macos-code-sign/notary_helpers.sh b/vendor/codex/.github/actions/macos-code-sign/notary_helpers.sh deleted file mode 100644 index ad9757fe..00000000 --- a/vendor/codex/.github/actions/macos-code-sign/notary_helpers.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env bash - -notarize_submission() { - local label="$1" - local path="$2" - local notary_key_path="$3" - - if [[ -z "${APPLE_NOTARIZATION_KEY_ID:-}" || -z "${APPLE_NOTARIZATION_ISSUER_ID:-}" ]]; then - echo "APPLE_NOTARIZATION_KEY_ID and APPLE_NOTARIZATION_ISSUER_ID are required for notarization" - exit 1 - fi - - if [[ -z "$notary_key_path" || ! -f "$notary_key_path" ]]; then - echo "Notary key file $notary_key_path not found" - exit 1 - fi - - if [[ ! -f "$path" ]]; then - echo "Notarization payload $path not found" - exit 1 - fi - - local submission_json - submission_json=$(xcrun notarytool submit "$path" \ - --key "$notary_key_path" \ - --key-id "$APPLE_NOTARIZATION_KEY_ID" \ - --issuer "$APPLE_NOTARIZATION_ISSUER_ID" \ - --output-format json \ - --wait) - - local status submission_id - status=$(printf '%s\n' "$submission_json" | jq -r '.status // "Unknown"') - submission_id=$(printf '%s\n' "$submission_json" | jq -r '.id // ""') - - if [[ -z "$submission_id" ]]; then - echo "Failed to retrieve submission ID for $label" - exit 1 - fi - - echo "::notice title=Notarization::$label submission ${submission_id} completed with status ${status}" - - if [[ "$status" != "Accepted" ]]; then - echo "Notarization failed for ${label} (submission ${submission_id}, status ${status})" - exit 1 - fi -} diff --git a/vendor/codex/.github/actions/prepare-bazel-ci/action.yml b/vendor/codex/.github/actions/prepare-bazel-ci/action.yml deleted file mode 100644 index 78f5aeb9..00000000 --- a/vendor/codex/.github/actions/prepare-bazel-ci/action.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: prepare-bazel-ci -description: Prepare a Bazel CI job with shared setup, repository cache restore, and execution logs. -inputs: - target: - description: Target triple used for setup and cache namespacing. - required: true - cache-scope: - description: Logical namespace used to keep concurrent Bazel jobs from reserving the same repository cache key. - required: true - install-test-prereqs: - description: Install Node.js and DotSlash for Bazel-backed test jobs. - required: false - default: "false" -outputs: - repository-cache-path: - description: Filesystem path used for the Bazel repository cache. - value: ${{ steps.setup_bazel.outputs.repository-cache-path }} - repository-cache-key: - description: Primary actions/cache key for the Bazel repository cache. - value: ${{ steps.cache_bazel_repository_key.outputs.repository-cache-key }} - repository-cache-hit: - description: Whether the Bazel repository cache restore found an exact key match. - value: ${{ steps.cache_bazel_repository_restore.outputs.cache-hit }} - -runs: - using: composite - steps: - - name: Set up Bazel CI - id: setup_bazel - uses: ./.github/actions/setup-bazel-ci - with: - target: ${{ inputs.target }} - install-test-prereqs: ${{ inputs.install-test-prereqs }} - - - name: Compute bazel repository cache key - id: cache_bazel_repository_key - shell: bash - env: - CACHE_SCOPE: ${{ inputs.cache-scope }} - TARGET: ${{ inputs.target }} - CACHE_HASH: ${{ hashFiles('MODULE.bazel', 'codex-rs/Cargo.lock', 'codex-rs/Cargo.toml') }} - run: | - echo "repository-cache-key=bazel-cache-${CACHE_SCOPE}-${TARGET}-${CACHE_HASH}" >> "${GITHUB_OUTPUT}" - echo "repository-cache-restore-key=bazel-cache-${CACHE_SCOPE}-${TARGET}-" >> "${GITHUB_OUTPUT}" - - # Restore the Bazel repository cache explicitly so external dependencies - # do not need to be re-downloaded on every CI run. Keep restore failures - # non-fatal so transient cache-service errors degrade to a cold build - # instead of failing the job. - - name: Restore bazel repository cache - id: cache_bazel_repository_restore - continue-on-error: true - uses: actions/cache/restore@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5 - with: - path: ${{ steps.setup_bazel.outputs.repository-cache-path }} - key: ${{ steps.cache_bazel_repository_key.outputs.repository-cache-key }} - restore-keys: | - ${{ steps.cache_bazel_repository_key.outputs.repository-cache-restore-key }} - - - name: Set up Bazel execution logs - shell: bash - run: | - mkdir -p "${RUNNER_TEMP}/bazel-execution-logs" - echo "CODEX_BAZEL_EXECUTION_LOG_COMPACT_DIR=${RUNNER_TEMP}/bazel-execution-logs" >> "${GITHUB_ENV}" diff --git a/vendor/codex/.github/actions/run-argument-comment-lint/action.yml b/vendor/codex/.github/actions/run-argument-comment-lint/action.yml deleted file mode 100644 index 80fb23d4..00000000 --- a/vendor/codex/.github/actions/run-argument-comment-lint/action.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: Run argument comment lint -description: Run argument-comment-lint on codex-rs via Bazel. - -inputs: - target: - description: Runner target passed to setup-bazel-ci. - required: true - buildbuddy-api-key: - description: BuildBuddy API key used by Bazel CI. - required: false - default: "" - -runs: - using: composite - steps: - - uses: ./.github/actions/setup-bazel-ci - with: - target: ${{ inputs.target }} - install-test-prereqs: true - - - name: Install Linux sandbox build dependencies - if: ${{ runner.os == 'Linux' }} - shell: bash - run: | - sudo DEBIAN_FRONTEND=noninteractive apt-get update - sudo DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends pkg-config libcap-dev - - - name: Run argument comment lint on codex-rs via Bazel - if: ${{ runner.os != 'Windows' }} - env: - BUILDBUDDY_API_KEY: ${{ inputs.buildbuddy-api-key }} - shell: bash - run: | - bazel_targets="$(./tools/argument-comment-lint/list-bazel-targets.sh)" - ./.github/scripts/run-bazel-ci.sh \ - -- \ - build \ - --config=argument-comment-lint \ - --keep_going \ - --build_metadata=COMMIT_SHA=${GITHUB_SHA} \ - -- \ - ${bazel_targets} - - - name: Run argument comment lint on codex-rs via Bazel - if: ${{ runner.os == 'Windows' }} - env: - BUILDBUDDY_API_KEY: ${{ inputs.buildbuddy-api-key }} - shell: bash - run: | - ./.github/scripts/run-argument-comment-lint-bazel.sh \ - --config=argument-comment-lint \ - --platforms=//:local_windows \ - --keep_going \ - --build_metadata=COMMIT_SHA=${GITHUB_SHA} diff --git a/vendor/codex/.github/actions/setup-bazel-ci/action.yml b/vendor/codex/.github/actions/setup-bazel-ci/action.yml deleted file mode 100644 index 7c605c60..00000000 --- a/vendor/codex/.github/actions/setup-bazel-ci/action.yml +++ /dev/null @@ -1,128 +0,0 @@ -name: setup-bazel-ci -description: Prepare a Bazel CI runner with shared caches and optional test prerequisites. -inputs: - target: - description: Target triple used for cache namespacing. - required: true - install-test-prereqs: - description: Install Node.js and DotSlash for Bazel-backed test jobs. - required: false - default: "false" -outputs: - repository-cache-path: - description: Filesystem path used for the Bazel repository cache. - value: ${{ steps.configure_bazel_repository_cache.outputs.repository-cache-path }} - -runs: - using: composite - steps: - - name: Set up Node.js for js_repl tests - if: inputs.install-test-prereqs == 'true' - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6 - with: - node-version-file: codex-rs/node-version.txt - - # Some integration tests rely on DotSlash being installed. - # See https://github.com/openai/codex/pull/7617. - - name: Install DotSlash - if: inputs.install-test-prereqs == 'true' - uses: facebook/install-dotslash@1e4e7b3e07eaca387acb98f1d4720e0bee8dbb6a # v2 - - - name: Make DotSlash available in PATH (Unix) - if: inputs.install-test-prereqs == 'true' && runner.os != 'Windows' - shell: bash - run: cp "$(which dotslash)" /usr/local/bin - - - name: Make DotSlash available in PATH (Windows) - if: inputs.install-test-prereqs == 'true' && runner.os == 'Windows' - shell: pwsh - run: Copy-Item (Get-Command dotslash).Source -Destination "$env:LOCALAPPDATA\Microsoft\WindowsApps\dotslash.exe" - - - name: Set up Bazel - uses: bazelbuild/setup-bazelisk@b39c379c82683a5f25d34f0d062761f62693e0b2 # v3 - - - name: Configure Bazel repository cache - id: configure_bazel_repository_cache - shell: pwsh - run: | - # Keep the repository cache under HOME on all runners. Windows `D:\a` - # cache paths match `.bazelrc`, but `actions/cache/restore` currently - # returns HTTP 400 for that path in the Windows clippy job. - $repositoryCachePath = Join-Path $HOME '.cache/bazel-repo-cache' - "repository-cache-path=$repositoryCachePath" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append - "BAZEL_REPOSITORY_CACHE=$repositoryCachePath" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - - - name: Configure Bazel output root (Windows) - if: runner.os == 'Windows' - shell: pwsh - run: | - # Use the shortest available drive to reduce argv/path length issues, - # but avoid the drive root because some Windows test launchers mis-handle - # MANIFEST paths there. - $hasDDrive = Test-Path 'D:\' - $bazelOutputUserRoot = if ($hasDDrive) { 'D:\b' } else { 'C:\b' } - $repoContentsCache = Join-Path $env:RUNNER_TEMP "bazel-repo-contents-cache-$env:GITHUB_RUN_ID-$env:GITHUB_JOB" - "BAZEL_OUTPUT_USER_ROOT=$bazelOutputUserRoot" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - "BAZEL_REPO_CONTENTS_CACHE=$repoContentsCache" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - - - name: Expose MSVC SDK environment (Windows) - if: runner.os == 'Windows' - shell: pwsh - run: | - # Bazel exec-side Rust build scripts do not reliably inherit the MSVC developer - # shell on GitHub-hosted Windows runners, so discover the latest VS install and - # ask `VsDevCmd.bat` to materialize the x64/x64 compiler + SDK environment. - $vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" - if (-not (Test-Path $vswhere)) { - throw "vswhere.exe not found" - } - - $installPath = & $vswhere -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath 2>$null - if (-not $installPath) { - throw "Could not locate a Visual Studio installation with VC tools" - } - - $vsDevCmd = Join-Path $installPath 'Common7\Tools\VsDevCmd.bat' - if (-not (Test-Path $vsDevCmd)) { - throw "VsDevCmd.bat not found at $vsDevCmd" - } - - # Keep the export surface explicit: these are the paths and SDK roots that the - # MSVC toolchain probes need later when Bazel runs Windows exec-platform build - # scripts such as `aws-lc-sys`. - $varsToExport = @( - 'INCLUDE', - 'LIB', - 'LIBPATH', - 'PATH', - 'UCRTVersion', - 'UniversalCRTSdkDir', - 'VCINSTALLDIR', - 'VCToolsInstallDir', - 'WindowsLibPath', - 'WindowsSdkBinPath', - 'WindowsSdkDir', - 'WindowsSDKLibVersion', - 'WindowsSDKVersion' - ) - - # `VsDevCmd.bat` is a batch file, so invoke it under `cmd.exe`, suppress its - # banner, then dump the resulting environment with `set`. Re-export only the - # approved keys into `GITHUB_ENV` so later steps inherit the same MSVC context. - $envLines = & cmd.exe /c ('"{0}" -no_logo -arch=x64 -host_arch=x64 >nul && set' -f $vsDevCmd) - foreach ($line in $envLines) { - if ($line -notmatch '^(.*?)=(.*)$') { - continue - } - - $name = $matches[1] - $value = $matches[2] - if ($varsToExport -contains $name) { - "$name=$value" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - } - } - - - name: Enable Git long paths (Windows) - if: runner.os == 'Windows' - shell: pwsh - run: git config --global core.longpaths true diff --git a/vendor/codex/.github/actions/setup-rusty-v8-musl/action.yml b/vendor/codex/.github/actions/setup-rusty-v8-musl/action.yml deleted file mode 100644 index 871c73a2..00000000 --- a/vendor/codex/.github/actions/setup-rusty-v8-musl/action.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: setup-rusty-v8-musl -description: Download and verify musl rusty_v8 artifacts for Cargo builds. -inputs: - target: - description: Rust musl target triple. - required: true - -runs: - using: composite - steps: - - name: Configure musl rusty_v8 artifact overrides and verify checksums - shell: bash - env: - TARGET: ${{ inputs.target }} - run: | - set -euo pipefail - - case "${TARGET}" in - x86_64-unknown-linux-musl|aarch64-unknown-linux-musl) - ;; - *) - echo "Unsupported musl rusty_v8 target: ${TARGET}" >&2 - exit 1 - ;; - esac - - version="$(python3 "${GITHUB_WORKSPACE}/.github/scripts/rusty_v8_bazel.py" resolved-v8-crate-version)" - release_tag="rusty-v8-v${version}" - base_url="https://github.com/openai/codex/releases/download/${release_tag}" - binding_dir="${RUNNER_TEMP}/rusty_v8" - archive_path="${binding_dir}/librusty_v8_release_${TARGET}.a.gz" - binding_path="${binding_dir}/src_binding_release_${TARGET}.rs" - checksums_path="${binding_dir}/rusty_v8_release_${TARGET}.sha256" - checksums_source="${GITHUB_WORKSPACE}/third_party/v8/rusty_v8_${version//./_}.sha256" - - mkdir -p "${binding_dir}" - curl -fsSL "${base_url}/librusty_v8_release_${TARGET}.a.gz" -o "${archive_path}" - curl -fsSL "${base_url}/src_binding_release_${TARGET}.rs" -o "${binding_path}" - grep -E " (librusty_v8_release_${TARGET}[.]a[.]gz|src_binding_release_${TARGET}[.]rs)$" \ - "${checksums_source}" > "${checksums_path}" - - if [[ "$(wc -l < "${checksums_path}")" -ne 2 ]]; then - echo "Expected exactly two checksums for ${TARGET} in ${checksums_source}" >&2 - exit 1 - fi - - (cd "${binding_dir}" && sha256sum -c "${checksums_path}") - echo "RUSTY_V8_ARCHIVE=${archive_path}" >> "${GITHUB_ENV}" - echo "RUSTY_V8_SRC_BINDING_PATH=${binding_path}" >> "${GITHUB_ENV}" diff --git a/vendor/codex/.github/actions/windows-code-sign/action.yml b/vendor/codex/.github/actions/windows-code-sign/action.yml deleted file mode 100644 index b79c790f..00000000 --- a/vendor/codex/.github/actions/windows-code-sign/action.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: windows-code-sign -description: Sign Windows binaries with Azure Trusted Signing. -inputs: - target: - description: Target triple for the artifacts to sign. - required: true - client-id: - description: Azure Trusted Signing client ID. - required: true - tenant-id: - description: Azure tenant ID for Trusted Signing. - required: true - subscription-id: - description: Azure subscription ID for Trusted Signing. - required: true - endpoint: - description: Azure Trusted Signing endpoint. - required: true - account-name: - description: Azure Trusted Signing account name. - required: true - certificate-profile-name: - description: Certificate profile name for signing. - required: true - -runs: - using: composite - steps: - - name: Azure login for Trusted Signing (OIDC) - uses: azure/login@a457da9ea143d694b1b9c7c869ebb04ebe844ef5 # v2 - with: - client-id: ${{ inputs.client-id }} - tenant-id: ${{ inputs.tenant-id }} - subscription-id: ${{ inputs.subscription-id }} - - - name: Sign Windows binaries with Azure Trusted Signing - uses: azure/trusted-signing-action@1d365fec12862c4aa68fcac418143d73f0cea293 # v0 - with: - endpoint: ${{ inputs.endpoint }} - trusted-signing-account-name: ${{ inputs.account-name }} - certificate-profile-name: ${{ inputs.certificate-profile-name }} - exclude-environment-credential: true - exclude-workload-identity-credential: true - exclude-managed-identity-credential: true - exclude-shared-token-cache-credential: true - exclude-visual-studio-credential: true - exclude-visual-studio-code-credential: true - exclude-azure-cli-credential: false - exclude-azure-powershell-credential: true - exclude-azure-developer-cli-credential: true - exclude-interactive-browser-credential: true - cache-dependencies: false - files: | - ${{ github.workspace }}/codex-rs/target/${{ inputs.target }}/release/codex.exe - ${{ github.workspace }}/codex-rs/target/${{ inputs.target }}/release/codex-responses-api-proxy.exe - ${{ github.workspace }}/codex-rs/target/${{ inputs.target }}/release/codex-windows-sandbox-setup.exe - ${{ github.workspace }}/codex-rs/target/${{ inputs.target }}/release/codex-command-runner.exe diff --git a/vendor/codex/.github/blob-size-allowlist.txt b/vendor/codex/.github/blob-size-allowlist.txt deleted file mode 100644 index 9375b49c..00000000 --- a/vendor/codex/.github/blob-size-allowlist.txt +++ /dev/null @@ -1,10 +0,0 @@ -# Paths are matched exactly, relative to the repository root. -# Keep this list short and limited to intentional large checked-in assets. - -.github/codex-cli-splash.png -MODULE.bazel.lock -codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.schemas.json -codex-rs/app-server-protocol/schema/json/codex_app_server_protocol.v2.schemas.json -codex-rs/tui/tests/fixtures/oss-story.jsonl -codex-rs/tui_app_server/tests/fixtures/oss-story.jsonl -codex-rs/tui/src/app.rs diff --git a/vendor/codex/.github/codex-cli-splash.png b/vendor/codex/.github/codex-cli-splash.png deleted file mode 100644 index d0f50e55bd2fb212496fb874718ab1eee82add11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 838131 zcmeFZXIK;6)&`6fE1)Q#R4Jkq5l}jbh=NE{kzS(o-g}FP3P@ABQi38NHPSn=0HH@} z=urZM76JqaA?+J{o^#%FecyH7_x${RoXj=MWM=lB*=wy?`(F22A?AUe=IIj`PcSht zoz}W{=MfVVvojOZ;eumFfg=Q{cqbFnDQzcp^#@w&>H-hEJ?x!a?Uz(oPRU>z3g1O z8*h8W{d^7=FLBIECbPYGOaOU$8q5e;gQAGdq=ZAy2Cly8+I%3%w3&Zov;OC;owk(6 zaz)%ff9bO>9#V~Xa0%PdcITkUt35U#mlKCg zf0*$0+`7c9b*@t7TPZ`9m(etbyBan6DdteakfY7Y*#b+9?yCw>%Uc6%)=a!HIk z16+Ok(O3OvV@$IbD+Cq7e=gLAnoa#|l$V)TSrcIB2=K3~=-HqEQvSfQhCgRd)t9;(ZE+hvJyh)2&`J2~c>@r$EUqS{VR z5W0*{wI}eR($@2iZlpe6eR18d{0s8-w`Yv&9Hqt*^OsqcqR+DnMOmMTiF`g%fwir; zA#K%%JzDwvtHQR$lv*06tYaecYvOIg<|A##Uw_~I(D3qzr%&*l8$v-(?wptmd~i5C z>fWhyKZpmJHQIC8HeniH#Pno(i_AseC@K^@>N=t?(9e8EfR%2{az!gj_1?k6OG4x* z&4VT{ufI|;F~l-*_^lDwEjsV8$aH@=KOT2U+xoh6G?&JyOA}a)dj7RY&F^wdM#fo@ zA*b6n+H=-l{8S6PSFg7yJe4DMH7#-7`{3e>y-Shgu3aT?{pn#}hi4)?=Z zp7Ql9oTMo6CiOJ=#X2$Z)iV>&*k2{$Hyky+KIEPYyU*0_KBuG0tV?=&-mo0epE!Yz z`yEPrrKwSlqKHuh$28-r+tRF=E2_qhud0kbzj;v3|CG!3i7!H8D$Q6v*46qCBeO@T zT`!e{NWJOeCEcIC=lADN&gTV}-cqT$qN%E7St<>1&jSN#V41p9I$(G z-h@@`o6(m;!_Nrc4*Wc3_Vu{uQH#Ur-~2q8*K)3{^K3mw|2p(sK=?(%^)u>irz$jf z&KSRl+`aVep77bIPXbH#I0Wyebn@7qdGxAOP3$fHp5*2sZ!X1%EKQ|1lbwe?ag*7D z60NVC9=WUgfZO*}w_1ba;rGw2g|{3H>mlc5vuXk*bxVc#%c32#|8yu~6UaVH4xpd`%8 zo&ALOZNGIkuac-ApR{y=NHX%A45xH}jJ|A>Z%kutW9T%`w9GWYZ_+Ph+jnbfD{0Gq z*>H(>V8!;S1UCmP6=~L`^tJI@Fx=xKYJ_t|Y6y--d}MSyNl|+iF_t_01oq7@lJv^; z$CDoxKSo}~zaqtX3Nh!I^mIs5W$t#!P4Q?Q57G+Rd<2( zF5~@+_nkU&@3U?!N!z_Unz4{kF01N1;ns13D4U#7CaY|}!)>0}XNRj0A1fSdS?E}J zx^SO}U%)T$OSnp&m3%F^V>(s!$;?|qRuXMmYqn$d&Q$lydmBTC?bw^`?`^W(TE6X- zZgX>+XWC|p$i>T{Tu-}_Ywy!m4S8*{}$$mSd$_CU_ z-!#{->f0b|Za(GSAUiEuFXiRo z$C&%Qbcyttw765fsY9BY3rf!GiTN#o%OVN}9trLvId25x@V_m8g?**4@{7VOV5%Tg z$7BL$B1Vz^7XA|cHK56(kbhEY+9MNEh-g53MNBZBKC^pv<%#iEgK|~*sHSv^;7^eU ze1TWiPopyB(*snFojh?`?6foM=yAPM<)>QttCn(ek5A#m$(vDQS;0w=OGQ3DWh( zwMnz%^qMoQQv|h~?u+DK&R@Ha&pfB%MEg{JgH)YV&7JHfipmNNe?5@Wd{whRrr<;Y zpN{A!(L#b2<4QEgl0EnI|Ht=wcFk`h`2`m>0vN&74Z;sWlOwNEL2&@spH$b3E6zvNqfa!Gr1L~ zhxY~osy4>IkC*xM;v}+&Pp$>5?F4l;#|4!UC2>+Ym>L0JwZ7ZS-=|)JIh)SGuhLx} zZhl;7zZ}ac5x%9nDDNloUSu;VQ#&-x)$+Aes)QRv&V9VY4yJuKpR?PdySoQ;jq@5} z9Y5wF-in93ZTJ|LkL;E#i7xq6;$FG~v8>Vv(H(fN=^|R{W`eXbZd`+J8=zrQ0pgg( zh(@)B4^@JdAD!|>It;nNM)t;5@DrsIbzOl&mAW2sv2u{{vtRPVOS(oY%LsK^wbK)P zjV&K03K~P1y)=I(h$<)h=g<;}miTLVmUc}beA?PtX-tWt;fkqw6EYChtyHaNif)m2 zBg_*bTRn;ciZQK;HE>t(7<`H`$+`rdQegAS-4?(-p(T!j-Idx@9#1^G(d)eE*6Y6N zdf#bTfhWAaX1tL6Q@KkKjsM-e^%-fS#U8 z5dQIM(azABLR9u~MW0Ox(rSfIE6%Jx1O^U`@cFRu5!wDqj#R4-ZeoOfp3ZCeorKFT z=&?%ARPG4iX_W4G7e#9kyN<0r+1>b}w?1t8X5eUfTHz$vRj$F@Gny@{%j&o;P zyvlU_cf(sHtuPSJmFPVk1I`rrGK_;dsC#J)HU!w?&Ij;OJ)XL z1r8kdyl3je#Ka-8zaG$fB)ksvKj!q<#MeYuN6E&+?b=gY4{N(?fo`7r{V=HnDgnE0 zcD_#q0^MBQeUt)K1^-;31nlo0mJ$^BbBV8us-TJP0|9jpZ#x0GYuB$`7X+OU5D-xD zwzXG!bVuXw=D;^qK}TO-PbDd-fPjE&0kYRTyd9*Z6%`ewuFFWt$VdWLNcsf1`#uen zboUYZtCN59bH~od#@or$*U7_OV87p|)*gPos)B<1H~Q!2ujjN2bo!q=x%>P*EMS0A z`)8!2uU(h=XWu|mmHnei51az+TutvdxdAc*?g5gPR=lqAr@{Z{)c@S_Uz(cyOH&0! zg@0}OFQ@+BO$~kQywyG2fSdY){zqYdH~!a?e>YT-+8_JB$l@YrKz zofuNIB>{@$ak``b7}x@4w*NV30Q|Y~*B016!md3fHEzqqbc;#rj@skE1FJ1Ay>64H z7=?dF4_+jkC#rV8jjD$>p0vPqE=5XpbN`{v#i zGTV0Yy^T+Z$Yc3W zl)-eeX6n#?pfsk#{yNWIPVgSm% zi`X_F_YZ@H4c&r6A=xF_Bto%+%Yu~J7vTE4Dhvwz+^V?bhmio&074ApJcbAjn_U^zg50%5_k|%R9k5i&g zsPD!eC&6Ix8?C>{+=wuoDAHd9rKek80VWII+~H(IGDPTKT7>BrIfJ9YVa9CG1h2FV zHt1RCGKh`X%!pNmLSHN5j_dfe=KOjPW~H~* zc{_MAM2>&Lb#bHkcbF+nOOSPN#hFcHW@y^+9h0%jt7Uf?zf#u9T*n}*@Z|M|x~w-H zbXO2$3^pYM$eyr3j9|Pqwxi=&^)G*4&mn_}414KlFmB2$hh>()EJW|8^zCc@YuTA6 zA9hCT2TmMR7J9&bOLX8~i7VgWF^NH;><Ir29&T+5R>N0lFYvhewTyqN;D4B}y$odcp6Y zvW&}&TlBlK3lfjOT;%k*lS$%FSPvXisR!&c%o7u$5k7mEC)9QTsTOoZaA~IYWx|Ge zW$Ikf-O0nd?vwpSu`TbJD22smskx9|*{d(09D)rDoo6_Gp0tzkW3bRosD5|5YB(lYJOUNzOT z|0v{Fg?gch9`Lwd^W}@;RlbIo0o~p#47Vw7W^ab_xHXFkRImOC^b2B_pPG2=7u4ot zEqP#*J4QYl+$*dSji{ZLua#^tt`wyU&^xmu7&ngtdXA#T=Dc(Zf3d4>;p}Ci5)E#9 zv0JisQdKpk>}+DO1nK@xQJ#1m7V7fUENM)DDT4AAa7!d?Q+I}5+%wR0VHxQBs{TEs znhU?Eo9N1mh@P`scU~Q|huZYW@ZKuX$((T2laOGgksr%YS3pByKWIpzvD|n6uG%~P z?a9|x6IV+_&BidBPP_cmoV$=&*6AZ{kTzHwMmr=U@Hv^8$ch~AMPxviIGdY4=d123 zc-mzPVkCVM!@jR+II0efO5ZrTfmTZF9Wd-adf?a;E1=~T{+YWSp4Nx6O3js!6}?Ek z<)UQlr@n7a9EVk2h^^G%Y;)((cW{e~f%M5rI)%4K-`&)>`zOKH+N(^*O`4V>xK(otBm4$JYt~=pkoKz7 z4%&;0&J1{~4HXtfRWE<1%P;6nT!79~jyC@D#%~#p0qP<5qrodV0`#=$VIv)1e*zA1 zv>if4IjPdp9J>8@9iDUoDh59 zs9B<=F%hqX#2)4l8+sMK>u~Tp4Tp=yu~OKT#X{bBoV0bV>>#@M! zi>T~Ot#``uNk9S;WUPb>03K6n4$=v&5s;CKphi-Uk<-Jv5o3BACje<`?@Kd%MshD$ z@UYl=cVVE*nNp=W5A>o6dl;|ig>tM{&+`cOHmvBx4MqPi#$f(}w85BguPX)Zee;)3 zF=ii?b~Nde@;OWE8PwmeetJFVBjPBR!5C4cKQq$4pd?{t;c2^(yT-B26M$eEK0CC# zZr-PAQSl)WyCF_e8H{A$#p$9B5#7AjJE)mtQg${p(?L*X2XL3IX92nig1NBg_wn#q zfss#YUCc*x^=?bBpI&zEKL0@Er@LfuR_YURt*q@vvPM}CIypRb^%m5NkDYg2>e>`^ ze`cK20hFuRdVnE*V#1bNKJ3UwR7OVp6-iFs7zB^OuHyaG`_z2pc2YbkxUc0oV?b4i zFZ;FC-YeQS`YhC1UDo&qV-}bUqYVJ)NSZQ1Q$tLYX$N}0qDSOU%4J-m%RveT~ zipRlSO{Krl7vFuOFF0KGbJ)F5=`ldWavfq|+iH*fX81waplpDj>f*B%0{o{SU6@|0 z`hW6l5G+fR4-ju>Z;JbrmrQ* zqolSlS9IvK$S?621-` z0U)W#L$ir}yAiuRI?>?t3gHcTVq)7vGI_=%ahDzX`59T0rga7|Z*T^*&An6aI$$zq zpkAa|LYrrQ*B)Km<0iz-5iNNFd}+Y?bX<_VXWB9euG zSFo!>lX(1W=i#D;#+g_J`BayZHd?oV$1w4Q0sCp_bH9||l@e|KG5CBCzL|CJ=FY%C zNqSGXB6%g&j!LfRy?nWa*-8*yeTy}Mfh?VZP}WUW2RtZN?hgsWlj^O>wQG@O=kdj(Hb!QOzI(WI>=IxafjXq`6wMV=bT;F z@|NnbtN`XTbti=C+FpZSg}%*tN#t4~>(48!l~Jp>z5s-AlL#;#_nM&JF~=JfN7FgU1s^VCM{Av4#_crO>>R(}6sQY=ylrp=guc zZ(tHD2}U>$&J7CZaU@blo~O8(<-l|)F*GO4m3F`(?9Hj7nCXbg5x(f(fLE9W{6aKB z=h<%ZZWYK=hnlSzwXmkB7ygl|IUBoK)P`xp^ny2g=g0!|%XD|r_YSHMNpoBud8saw zVL1b}bTdYztXOo59dw;;qEUT5RYWlzUIPKZiU6{?ktGlj>V5CPov`mk+1qy?;~fx6 zltCS%VLScB$H>_9qz}4o)m_rHXw$UF8<3K&^$e~rf5=s5qX>^;&r@KfM7`54?`nnib$N%+yH$VR*Fj zCS;#8WrOYx5m%%iQ;WFHKt=3D09Rs9f6FyVR9}Fu)XGXTZ-{O&)=a(>!pKw8uinFPi@b-RXjxT-0o9N^jV(+8VM6T_ir zPt&KM;T(bVFW_(vYw?PGEG4yXyqrJJ-8~Cc0--_$yaIM&N@5Up^8a`_&2u8DkylD7 z$2VE$_&dSF%oo`qJEHS^{m_XSvU%l2?b*A?LyfqARH#3QV!zeov3!&Juz+VFkbem& zj1eTQGYbzQXkFn;LxDYLwS}%O2`S%Xwp( zke$tLG3Xa~#Zr75e@nEr+{47t2SWMKzi=q=>VfbbuiYgNvmn?lCYmWz6qv-1!Z?b2 z0gpkbiPS^%^j-C|x4Yuf4u#UnCjpf#V{>-RTYpHmh31`72Hr-7Eif(_Mz2(`G{csz zSbuC2B2MX~V!vfTCD!Qnrz&qj3pY_+r+fMp=$%;$qnntw(mR8!8Eaf*j5IxkAFqU#1d z0EbK;!-vs_6c;D^5dJBEm{W6n8^a|Bi|rL#O>ZCe9Zys4HXDU3ljg!D zVrM|;l`!oGLd?nuNUQ;L3WUwp%*(0WGy7Tg!hE>^N<7x=^LQvh_Gp(sxOum!9OIp@ zX>PkRcB&=7{D{z!Hv9vJl1Ys=Y;ctJAbZ^yk#xQHc1?Ghx7mR`-XedNbu{rWe_bK9 z$l?9N-5NS?&LbPmMi*^8&sgC~0H9dxt^w*f^kGMZA~4Oe25B!qTUmqWzEZWhGN84T zXJmPz$0jSuir!9qI(}VBi~ymJoE+R}!cL7eR(vq~Cdy zRmNWa{@&8#FKu@#uNUn;H~1kV&&>!cWQJ)6noj%%cu;XOYZS ztXI9g2dIHD(R4#9S_=LH+KfYD8xd)mzfJO|p!>#9AwF&cy~9KipZuxy3mRNn6AD^K z%!&DNsuaC$zA49X6E2K4Sn? zvrdcFSgJCxAtH3q29xZP__~c8?nGRPTRK;V+nOz1zH(UKZDr3!yqRD)q22M@r^}Q2 zZiNriH-~^1fX|Ktz)F4}SY=}G;#)4gvDIkx8@EVk=_-zz|Ga7u_SE;zRruWpF>i!o ziM-jco;(LjXpN~~u84&OuH3uFV0zKt4Q(DCGP1qxQ$udBWj^<|XoKvK!tOXmHn-mP zDC)r)XU7%#6*ssjuf~CC!-dP+P6Mr+>8+m4)R_1Jr)&J%=B?Q~3PxM+Njz=@9-Go{|#M7>@!$xus#+xpo;v|0{?q;NBU3P^IpUPnWDn?SNCwnp+U`QN|PWb z;l$Lt-JPDQJsTyqB{O?QEYe^ows!6PydT+nVh?T^Ey3?__I#lg=2)6gs(P6m_e4kp z$NiR{?-AnpvvC-m@1IF_3)RB}x#i3xYyUa1lQ3)Z$_2T_D5#KUXfF-NdU>~DQ6EJu z9g$_{W;cI>gNCQ=PYQq&MRiO3f+928x_H7U#a4x!({&HlO?yBCUrI;a}2;Bd{V*LxGSkWmMF%Q8C`y}nuLOTEWn6aqVn@N zu;N;;lpB9KdQPpmNJaW?x3IB!Xzb)@b7^_Lp6`zRKCL2u4=@+*!*^?vMc5p2t%U0< zVfTJXin0~j6h1<;e=5P(dn$&%E^7EN`Xp#N!UA;OFrldRo0%K6Zzc;_RK&XG!8106 z97X>i<6>{i!E!3q%PQu~?~0{|hJ6eabe{bXdt%?Tw!&i+j;R<1L z*;=|L*;~bX{u)W_4Op)U!*|Q6hYT9zq%7`3FTa|pn`oS%+r35UUEMYSDd}{@CQ#d6 zc6YR!py3klHM>4L`FHn<9Aipq)0nE-8vr^MS(vjS2C+G zfH2u(yvJYu7xaBg8{;fgLC)xo8ue{p_O5ZQ%#IrARqa6dHB=0^{WX9vGXcsZ(GOhA zrM~mD8rBAzgU&+2q^3|C=~%IN1C&M%Yc^(_TDW~hZh%8|91|U`nrB0oN4b;zReNTv zSCA^P-H+urzV7lBhL;zDCtS3_Lhx?iGOhRI?QVQK{&nFbq=&Ag5mTDvL3`T+@RehF zfHC4NuBdt)^iuNX(0Vea*m=A?sBOISc$xC4(`t4zD(`$uIX0Ky+ZD9Vl@##CWi^7O z^Y`3saCIqp;S0%z{#i*5%$co42(QkD1f0d1F8OPe9$8d8@Ak5OWF|QH*Dih&W#wS4i%mf1pdSx(dR}3 z;}?QVC6jUVl4qu<$F7k%(v!kD;7Nm3{m|n(0qcr+Qr{WB{zUGa0xv6n!*gEZq8s-p$@p6y8rF z$eqxFga(g(u)2=`SENecO`B*xP?AHYICMTjWBE;u7z3=(KV+A_1Z`s#U=eq`HpTv+ z-zZmGYq42)+xLB5uJZIu26XpF<1Cx`H);>RSf}cDYC5^jrf2R|22>h|RZ~??k-_s2 z_)SIvxMI3tjBBFHP2E$2Hieuq}5HUtJ zmwA{Eek{fX1s*g88vw$%2tz6_z_jHx0l{4c;J^I42j0&Q&oa$&sca4m&CLGQ@+?=}Hl~{~$o6T$;TPht@#jf@=Mc@tUyti|Lat#yXugE@>P3Q<_RmnOn|k=ezexE8xBsl7)Fzq7DI zIz_`$_>KM~c}ftXQGe*4xt@(b^W&sV*Y+-KcgQPf;n=&Xxn_=)Xa>%-N5xne2f${94@IOpKzrLQ_H4ps>kf_%s#L(OqqVsW)=2P7}tDW+pN6XT2ws! zLUsU%;Z7Uu2B^(Az==;U zA`gcj4<>GSS}gd4VXoY9us|GmJ&rt1W4TEyG*O_u&7W;fKDzM>+DiR-V6st zgU{O3MVD?oM#Y5Y_sLDI^QNdPsEdIwzeZ{U zvjH=y1=I8vxfCcBDaD-YuJnz=21XpnDA9$FU)&A!y*Gc)yHBaQ-nmdj^;#7+g=J}I zhUGFiEVN#UR8#IxH_|1nmO{MD0+?DZS zbmK@n-g#>Se?JPQW;?-@u}wrJjW}?(UI~QHA*;5VZ3d zqiw3s%eCZ*?svhNN9vN})X;+vf@a|boUx5BZ1s+aIwQqIN^z868?uzCEYR2DzVo&& z%Q1mgB7OhW3RyHc-`u-n!x&tf2+=Jyz&Eym!X@vaQ7Q{z1~0>gU?g;$8DXJ)ZX>K$ z6ng^{Z|oQ5YQ-Yf<{Sxymo_dehv>@m8f^C+r_tyD;{bum1=70{pFmd&U48!MP@;}s zDF-m$svaO@)ec=Zt1ha#0lZe4;eDz`XG|908g%JuLAN)hx5pUZW0llXx54jh5M@DqGK>|v2;_<}$DXstTADby(Jbf? z4q+grXj@akV(As8T{h*~{;(pkhYEij#NvSxa0l((76eNs%^9*vl;oyb-f(>yp{NJmZ3Xj~vrid0&or zDPd_mR+AiVD6>^1mP9BxuJ`?ZSjvs9OefJ}&^5%4#X7Y;V6kY?=pcn%c3`Kr$NmMa zhEYT40PxMW?_YHPS!j>3ea=H-KA%0j8*B28ah+j9@1erToJ9QvSpW3QG`TLcYV&!& z`5K7fL=$IVe5P}hcWDsIC1T8$f%MCA+!Rs2{ah-cb%rXGq)N{UV##cuNC}1n4PH+M z@ur`ezi)xE>;F(9HDLipri!m|TIP)m?9y`L=F=W-`ayPSVy~9;_a5LCpMQ;1-xoKo zWhVJ;!Yk8PRvnfh7kvDr^+u7w@x-J{iQmdAt<IZG$2Gj?;<_ zx=X0%_QunY4iMRdMaO#x7S~s4FeBb8b^d2;)be;l6J-7v_A9b>)Nb70vv9&rd9T9b z?R+izBBK1=2Ml)&*F4T7tW3JtsDlueoftOkHA7lewZgC`MTYNEtahfq($XEuSM_tU zH!k4F$)^XZ*cr1vtNN=gIijl`s>(Z0cVTT;D(V1mlo+bJ#!S_(%PL{LAtyeeBenro z=tM5izXCXYKf!Vqn(lEAbfrIKw<%O~qs~%vBfzylsNb>|yrmLswL0aaPX#3&AW zikS$4t4ifIUWebTn@NNASvy$^*9@8<@g19pRCc~e_gI8Vd7FJLc<_UFi5|?umAcf_ zA$l1^;@Xrb(O=W1Lf4jNOO+-zt&As!M+{}*Uit9Gj-wIGQ2^d#?GI_;6iOZFyKF;% zSw~}Io~9qDOP*SI;C#>mFYJ@z#yema3DFB^ok+Qt*1fG2#NZuQSn@vMe}7FstHT?{ z6q@1^g-wdH8`o6!St7}wzmG6)KrBaP6(-sjd6X@rmwB7=Gf!k%H z<*NLm-pmsn;dg+5%}{o=IWg<9S774LzhLG#%lMI1*1r=T51K!{5%*%>;M^$u=uFny z&r-hQ9L*u8=fsZONG0RCjXLey5*7LrB<<*Z0L1{XPYamZSTqV;N|_upNDYZ~%hoqm zh6IGnr?&)^2MCcNBk8Mc(5_@DB0R0Q;fIXI{UCxz@=$(n|E9(!W~VGq2gz*%{gk(G zHUFVzhs{x&?8z>M)J@N$0580s;3iR;=%2Sx=okZ z8P3?2iBynsbmwS|LgAvWayHIn8=wJoTf0W5vppfZa2{AKkl%LLD^*e;U$x zggz^CG`j(U4b1Ps9d9--192!CYyS+A+m^y3>DvC=A~k4Ux3Hw*7kb0N4oJNKlO7lN zIzyN-1Ut6LN~`ds%fv>>r$Kv(pB%dI**!WlMsjuDPm8j73fPN^OLoJT>hhrPpf#uU z*G4NvMm9V)NBRxzRh$iwHvAvKKGEG^pnBs?73Fv9$n!6s94*F2k>KUHQ>3twkK0|y zx9s5)6m30Il{CU=!N#lXttK6~GgkNIO_sWG9)zDq0+i!B%R!RrKH*QP3xphX%yVUa zg3ZcFWsiP}u}?|Ym}dE5mp2qwk-n;+(p5KfrSM5q)AF}afuM=i=oTh3y>Y#E%)zv9 zTC%&_3R27mQH|OjP}EF!wkHPqF4Uq=oalJ@AihV7l{8Q}UDs)`hTK4NO&NDRc*mJ3 z8{R`wP)*Rdb#r8L$0H5HstpbJ>0_!$ny0`w5;7@R>7vjU%l?0aOMlrg-v8OI`Zs&l z!gHEupjV%{GJ;FPTXvglRx02ZMKtu9opQ8mCXM)ffL*9Q~i{)NFp*r`Jfg zsY{`GKkN&AvWYxISOuZKD)^y{T`I;;VveV1jWJwO{|HTe6L@LF!MRWpy}7!m;w?vn z7eTz7=CC3Nd4&oJ*%JFgS|)^a~>z6&RG zhH$&ZOTWTY4qa>9B3_;bmwR4mAEfUs{kk`eQdo4`%g!~8F;V;`w!tNA$|9<#6vL~0 z(dPj;lRhJbmZH&LBz2^CEjp+PRq^-s2k<~UmRAP(FR#UJ_m??vk&EoQDkPSw=?Xes z1M(f!4Pe^6X%|6Rqoqd;^NSN|l*w8}xYv$`PeTVmKVmyg_t{(?Kb`*U#oB8(R9;U5 z<05koc>2_|`xEG$gOtgz>i}NXrdCukw?SgsW5Dx5tD@0}{mMIU8M6;JfVmC>q-hXu zpqCgQAy-_VKI(ZX7yC0baub$GhEU@CyShHFsrwe_)>fnLQoJ^&&N@T#!rJG>h__vH zz+JwrhTbWRz6O?&k|b=fqQ0J-G`v_7>T;ucl8>Q);hvrd`KIJ8p&qINBK079RJ^>ksnMQptrbo7-Sz6{=zEB|My#kr8#`-Gv=yEHU zcv<+rznHuovs?Ufm&6SHWQ4Jn|y65=9k zz6kv2r7efmQ#5s%^qS8PKv-(S4-R zi|7If;)W`+sOBeQ6xbewQ!oljP)=qvFHuXplU&I1B*`#L4)nr`@KLl$$6c#=2g$oP zlhCpbxEqhlgQjb8z+M{%i=0D}ALEQeoJR{=atJmfl@`2Lb(@DV<+ZQG^ucK)1n&Lo zcU6Who%h4#gXM?}8%pO>)(A?>zNHT}HE7xt-F-9Q)%gTBB$M|;hYh|Wvnw~1_Ap`k zN9?!Jcbv1`^*v|Ce~+t4FgQ}OqQR2(QS(^u2TtM+AF&qcd^Pc{TX0ft$aPC}Z8-*K zCEQm5=AGA@f5`yY{^@0AFN zz9Gb275d#JE`$IZtUlL=@2>Gm>_Ox#|idl9mdIV{K<-yu92|$-N5!^SANGNX^-x<$;e>;wmzn*2xedEUHvdYwOyiUjt<8V^jU@9g9hex~AaC;F>Mf zwPycJ)$O2^8J8YozNVlKMTR9ACCym1s9S(cltO|gN^szicEj-Mg)g-TCCCC4UIy(& zB#=Ggb;Igvn;Tt$f)?osh8s2j(R^$LR0JP=O1HP;c%&lBPp*4ZwUKp`W(_DMeqSk* z%8d@#m>(ttBc4~MJWo|Ek9|)6@#WH*apREFO?#~C557Zuk#4GXTZRbbmkL#Du7c_; zoqO09qub`NPZJwyITaZHj#0OFE3|SS^u=t0thDmd6}bNo1v3Xtd+R4bC4AK@Nh2b` z)C<2X+Jk+QHYQItO?`Wn{fWWh4!`=r%>Z^EYJ$=+Pc<4`$#;LAZTK|(VJtBdiz$He zLHVP2Nn^~3;Q7H%pn842sP4f4f~8DrqF4Z8*nbthsS+&HzpmdPoCoO*g)6L|I}Zzi z6Q`gcBSoqY!ILr0vOB{CL#jBaK*LV>-cTQTB zm8A#68f|FI804Ksg5draq9{Z8{#R$+o!&a|(s&)wgZ+fO<CQHt#L{~^KSTuPyYO6O6t0U@PSxHv+f8~G0sI)adeA}S^I}L@2k7r4DY3A!0Gwyk< zB4t(--s;3%c%J6vISTKx=7@_rZf1x@Iu#D0UoMOp#vsl^wQ7!Ts|^kiLXOb4d6rv$(b zO58>ZMbEiKIuHB|_E2TK%gPsGqTK4)%FxKH>vd3u1Y=Q%)xtfz*9~3OfY35(z(`Hs z1&Sag50r>SnYarxR(5)*M4lsk1iN^!tFzb5#u4~D5f;8Jj(@+y=dwJWXkx#1!G~}& zB+N>{6AVpSYqv+>4tk4;>cQa%@z_Xr}TUS3&U6|vLM?e;nBTqNY^_c42p6D!Yi4G55ydMYTo92WBhT(7N7vk4)4$2wq zs>F9FxpOm|2U;@D{G9&9v=w*0w7mQW3?Q@Msw{sMpwIGvS$Eihdc?#Mk&tM_R-ACT z2t8$b@xaT^rG1LgU?13G&QfSJA_hUhT0>(QesqzIdKmkDqIH%P$q_E7!9S_01#xxB zpF>wa8H$c@r0wFRlhh(yIUFYo}OLbaYG3H`p1yznM6_b!G~7Tof9B;?iuJgXg>6fA?81@K)IuNo>kF(oUU>P2xRw{PL}J8 zOMpw-ukZO2FYE-GzV*Y@_9MhRO#OXj8IA|8rK8H)2i77|X<0r@3BTEUCN-5iNR+(L zQi>_s`GXB`G&SGNk9I6alq1jRF zKT}<&TRSyKXapg0!bw7I(@}FieGv32V~9|U7h1Wuq(JZ1EyOG(IwvBXfZBPI%s!l& z5AZ{c?~XaoGX#EFNvtZ8YjS6z&#RL$_DhO4s(WkbBs1P2BqV=8t;o`x zjh9nMM9TbvKdGW0fV0V4;^-j|ZFSEv2U^cjP#9~ji1!kkr?FJSb}ep;E8j;@Hs^0q_ueCI4Gj_%hStufD{+=z+vPi#!UyzenfUFADT4qvAk);8g9Fd}<*mZrtFbBx9VuHSx5L(XZ=)U?l4sx|?o1 zUf|Dh_}o`ZE!;B>LP@g>eJ^16yUjzz6I;3vTiV9y6MLnSewwuK#H^^D3gjqvFAZHW z;W~uD>FMgvV+@->aWx>u;{*_Pt7e`mPKIiA$>;N@_LHunx&J$k>0366*i`3V)R zn>}XhYWK@d!EV@)Pcy%N&&18u(GR5b!dX;tWjoB>;bHJ&lzCi0e^niJ;9Yh;Pdv{{ z9-~vC%g+3oBimgK+eg~s^8X*czC0}Hyl;1=y{E;NDKodG&B~Nfb6;rH(v-~9T&dLD zHTM;$v2@IZ%G6w`Oi@uOcU+({CB-F0MM0%fL_|bEKv@sYJkPn#dCz&@i$C}eFTcOv zXS+Z5eScR_A;Km=u-qr$A1{D6)6qUri_5LIXj4_Po@@fw&<0%%gt&2PrBh8O&j~x+ z=*$9Y%CPFj43=<`YBYZK>;0Xh2*D(z08PsPM}6$gVe^It6I6B|nV3jF3vOBXXk)p8 zD#rg76({3Ld63pQnty~GWZea+wSAP@GYCljp_Hkegkvu!#y=MU2JS5?PHK?Dsd9i# zp}xI2QUsSQoBt{4l${#PkSkKwi}gP-LHO{TUYA<3AD|;U#J!T|`-jX|dPVBnE9eZF z0CU-`S+EsALC^p!xnu!-pPe~atImQ)c-53}hLr@`1ETsKpjz=zpD8`m5!cuT8`Y$q za-$di8GwPE=Kiegk!&t4H06F5GJ^x9H1YDtiZhkOOG$-fQ55CK3kn)O+>av}rkyZ# zn}3ztb(;;lNnxZ3l-OgWvg%#1m&$7kzdt~)>kK>-@cj2U+QXbKo!v)Ble|Norb^kR zQ?tvuM(PyP!3xmv?2Q5UU53cG1)uWZnaRe;Y&%o(p~zf{&g@usefDE*JzF0<3MfBG`rLmNh=_JrQ($$7|x--j9{_wByV|i83~(Phm(ud z&8ZF56mT&v-|r6W%LY;FqHJAT^%Jh<@sHj@Pfj2m@qO0|JD{f_50lnDlLWgb|KLRZ z;KfVQPZ&#Tmbom}ZEe6oqTJAp$dN?k_^fOn8o}bo++0cJPkP`CFc@eitD2q(4FWfO zOl%jU6ZU!dgQwv^eF0}=AKDg0hU#S*Um6chaB;44j<6tEd;h$&VaGmdV<6L+^4=8- ze36Ci)lIk-i5c)p@Q9YWi+KEY9l)Mu-}NXNz($F_g(2DA--1;d_LM`%&j+#tT~^%< z-|BYx+!+~4rXa$5sNvxpBLwz?*vVllN*E0dp>yU|?xA~z6vvl+mR_T#-hzF@%1J}$ z_~=L$(LVg^mT#1Jarg_DS5dH$mB}iiHJIulN>R~<{f>)*)Op4YcA9D^;DNuU z!?UBAYmsATOEzoVb>mq{wx8<#a8P+(5`(kGO{LIgMF;*>DAlqQ0z)8Uog~^2NYu_B_4ty)m+=i|s{~-LJs% zJ);D+`C1q z_kQU0K#Q=u)9$*k>#?WG^NiRLd&0|Wh=J-D%=tNk@ZFWiC74D28Hd*Eg*QRFzqknw zNgh-=OsgvDINI_?qK#`RL*t^R&KXGb8&yo-+)X)wvAw6D;)-ka6Tln|xHrrRZkec+ zYGzEkww10EkQ6MhHhZr2YH1sV zOmfXaD^Xr-XGk$Y7okjH-sVkc&_CC`E)u>_b-8b<-5fu7E9$MGsQwz_Xs82Dqc~R?f|~G6m^2m@CrbNng~8*{(Q)_J(7LJl85q+Z(htUo09 zZJASuuSSW*JasM-Z=x?X!Wkibz`eK)FVY*>1t06@$(sm@|s$xKSQmyK(oOQc2-Z6H})Efx_@>?p{~+x5^jHsbjum2q^7upv+4Kc2#}k8tBxc}hI%6hXwhEuga}}|^juUxkWvce9EOEU z)NBsWPj;;e&MN5XOJmO7clx0P8Db0U(hUv4Bz?I50y@y@{=gf-6|ZcPXdzmO-8|41 zSTNOBd}G5S$hw#U+kQ-N73O``=T>Vdv#SAGd}NE`rHXii7fj31F8y%wK89HDU&39| zDE#b^ku4s)DmPc}zoIPWjYiM_Ag=_`@ZMd}m#NKipS^N^L|MbyuI(CD^-|Z!t+b0o zG)^fH|4zsF*?Wub?A?+&ciFqgJz7Z89LapQr1vqe0A6%AgIZWg)rXF}+-d9*QGxR@ zorileiOuJpo%H<<%)|+9kSJqkH4r)T&Mp1JF-09Cu_xSut#QJ#>J1sum|(S(gTHauvDZ-#XO$ zqGH%UqayOEI8L$#7Vna?;nzRD3%@RFtSPMB-~eZE(K@o1lVLl<$2d=O-9j3nU4mH- zq91)NXBs%!QOkU~wMdaQ-VJqMYZ^j`LyKYf=hIOFBnKC7S=$|w?98J;mH_9Rq#&>1 z9H?~)IZ)j2wQU$7oSja@@}lh9AwnYIL>*XH0e(zZQ)ZC~;`X4H74b7Nb8Nbyuv$y9 zQ`Dx;*X(8#e87iN15eAd;MDqaYZnw3`N6$bhqo(z&rWjH`i)^-XtNWQj_k<|b_Ycz z4yK`_AC$bw`4!%A3KE_EoY5F5} zujkP_C^^MNn`XwUcW#YJG3W_X<$ZKt_*i#?CAds-2YmXzT0D0<-W?Co^hHIJhJcMx zI5Q~kQgE)g)JGx-O+42>nt?44NZp#l-!szITJ3~j2xyuKr$WA=M2ekrDY)X_saq#t z(_78X+@P-!<(=Ad$%179Uv&(;_DARM90w8y_aj;MN!GvYVpu5$#{LbC)oxr@V(@;A zm{rfzJOI{}Hx!-X2>qBt;km`|sUWEi#!DwyK@L}vRJ4tIY$8-`UQC#)yd>JAGRgYi3k%(#E+ZHr3Cq z>qp(!A*i-X2AJL+h5J@iv55g@7V6LMzqWSrz4rLB>rf-<(ezn!lS=ra9FJN$ua1!nICH-tLCy42elb@8=B zR5%(Y^FZLdT{CAA_UESKHthAd1e@aiG{6Gyozqo^M+H;lFf&k2v|cAB%k`~5{DBhK zC%NWMHDVv^c*tRd!rC{T*~4%GP8)s{X}yeF16I9FdSh@U7Xf2(vvRw8g|}32Vw=t zbVz6gwLa(kZ)ODT=e=KDvU|5aFKFkX0~&sv^Ss>!K7%S`$4+odY=@h3t9D7|6V%&Q z=HGW^Ehp?8J>jH;W`>fePk6asVoGdL;xy5*Nu?$M6qgh1i0lfDn|_7&5(H<#cxlJB zEdb;btU%B{-dfy!DxmI7=JS^&N(20M zDb=SLQSo~u3`Ea#P|!??SLE%m^NUtOeUoQjpH1)(zL_DcD07xWaihh+q2D%TcSN_Q zUy%&{L|N$jq?ENR;)>qlHFEsxUSNeK0_{N*zVujAgv$!$IT{Bj5RUMhC0f*uE4X3j z4=;O}aGkuEH^1}D9#!jFHU7H3sO-2EF=_%}c970lg7Iv5U> zFCbO8c|G>?Z9OVUM(`prQW7T03=j=nlX23Z+8D_8I0H;^_HM2Kx4eL5 zC*m_go`IqaTL|kyI|H+~swKrAK

lf#H6olmXMaPM~K}9OLC&SJ67TNdgJwSNa+Z*-X!NdmA4F zq?ct13`Q%aK_@YunO>JwU&2Y=?`b<(=UB%#`9yl_wpBYNWGCgxYHov`y@V#cRFhQw z3EN8T*RiX!@i0DN{DeGg$FqicWF=|F5wNW}lnOwOgV%=$6*M#d&)Olh0a*@jJK=`N zk5h2A%rI0&BZ^Dn#fjS!C~Gml2MS97B;Cd(bhzsHS`E1z2T50gb&bXA!NH&4jcTC2 z2{Ca<$qhHbY%Lb5SytQ0s8OY)0z6%Kx5|VdT{Ex3{cdJhOob7y=S2n(#+=wbnxm3e zfs*rrxkRu_N>{nboMOuJH?m~Qsir(nn6!8JMD+o&>C@*PIArtR&lu(F)p%r`7M}?E zE>lhW57T5H46bud&UVE0`x}K1GXp}vSJuf>g4VnBs=c@b&X43-YX7)nu@&9rC0~yO zrldtAFxQHA;|3y5T#A|}Z4!yTX`Y={?riVJo#r=C>;7WWfs<4hRK6gYAO?pgj*tSG z@S;KUnJag-tSQo(o4FpPcs~|5%&L8{RWpVq%}2BC>9`17iwrZ>e^|D1DL%5wmey}0 zsPoJTXB|Ux@+Fm?PE`)b$QnAViR-L50f<<*NLS1bOk0QtJDPaf6wPGo$sEiLwk-hH z<5EuHNmJ`ORHOX6&z{0|a?)fOuDv6iS zJG9sLZOeSbLFY+8_Y$>*HO-D6QD5HXm4Tc=slRZUZrUkubmmI^sDT3AZqT>4H-kH2 z-Di29VZ#9P-8G!<8XsBjxrGU5Ubk?htm|h>Cobyhu32cmuB(g1_^gEu0*|<|Xqz`T zAo)&Tm%GKEjFlP$Z{}<8l|*Us!YHShOOHwCb$*jKDgtreVY%Q#Zyf;d7E>@PbUy?7 zZ|f?zQ}l~cW(XZ|1{pY&Pna(#omSLXs0+Az%inS&4G@8i%7aBioer?r@o7`<#Rz<3 z4lLN1dGHTjbbtf+Ot_R39C-yBnJ2Ra;#XURbIY_g3-=jmc_M~30l6l{tiY$ixs$@u z#O0^zqF*e9-`>Z>U@@_ZieKSk9Zmz zD!VX1;Cp@%SPUTL_YPJ1-b;)8ByQoZIH89y!8w_4oXfR`S%Wgb5VVCGu4rVUg-h5_ z9fgsu`qw7@SL2 z+o#TG3+|W-Y=*RY0w5kSl%(~~y||v6f~=fzYmz(_jtdWAZ0CL^I%?Yo6XN(vuzo#k z`0yO~k4Hc`jkY?b7{~Xn8dsLHXJS^YXwLrtA!Z74X{8VLyAf<}U{uxxG3L%i`QG)K zczoJ!-5F(8ov^lri#`GW;!+Hmz%BcB<+=xQo{Tp=Z#t9Npb`->036i^3_k&P=W!c$ z)m?Uyjy3w37u$-aaK_GiROdlL&Aa`^uGsn5h_zQTM{rrOz*d6B*FYdX^!v~XsycSTWuwQ*S_4Cp(($6ak>P7r4>{g%+__VEXlhyc7NiC z4MXK2HwaEJ?lL;S(3V8!l!Cqb4BgUfy2_)cSNjHp4p!!e;88WUKKf8ozoOO&NqPJ| zGptpOx(9CG%X3n#zp%D2*kQVAH1sqEJb6{tt%0_V5IFIux%t zx%erdu#&_^HlCf7ML&)eL9^1+Kd9>4R|jVi@nfxjaGhObmeJ%l>%v6VU4~3RPotv? zj&6M3owpJ8Hz$gya#GGp?FchmcK&&F-L+vr=RaE0bs@MS2c#v7-O35=)->tz(|bng z2b#bt7Qn$hhWvi(PlX$=O7(zN6E#hNYX;@vE%RAqe+1M-R>i2Loj7T916xa1-zqWZ z9i0?vEca)bfEO%WYHH4OeT!oB{W(*0Db7`*HCd*oE0iFe+OOlT=HZMBpl)SRZn>ES zPvf|HDwv!Sixvo9U-~j(Cu&&%a&yX=HGCg)1!q0^E3aei9-I(t9c^R<6J~MdNKwon ztBp;=Zu}&@Z3~L)d6X#`LruMWo^>~qmJ^n}ocUa9V|hQ^@!TU>qC!==~#*@uIM$q6h=JF$TtvZc{yAYK?6u&n3*}xfY&OW zi@b#wwrz9c=u1l$BkOVDw40;|xl%M&wV~6`_(20MJhEc*2BoBJm+x;K6BSC+{8#x? zJB58XV|s@H)~Q&E!X5-GE9vv0SK=eY|I)3!p{W|MUlMR%BC#e7Chc90q8|)CVRJYE z{LWJr6{lA4Zde5NQS#~vl*CheyS%b{-Ve1O^N?bKR0YA!H4%jDLh?5RT|tV`l-pla zEsMwR-+|2l|E9#U9jAf+Y#H%_FVx*9@?iC%3*2Q?A1+U}F1^irvUe77@}pSvYXJ;l zGFj%-FPq=pth|PYf+o*P9fYj|H+R-8QAx$JmLg6;;F>SZ6n-u=e38iA%3Ok2*dpzU zSR_!92{9AY1oLfCX$lLujqi?eCAmr?76T!#bV)=zNsKx<8+z85A|5!^5zoS9D-1OR zahNWb*^ofeZaTEmPG~BWr2}=XaZ%-o-mk)1p>m~~3rT%SEo(j@aR}gY7{^t_&NjAP zyaQejS2Vk~c!iMMbka#@!Jt|9p$^uh2crmb)No5j%@}X%+kiT_MbBRu=u@Yy8MSa* zTv0guq4>}w&thP!(~oREr+4rKy0YFl-UG3W6dMX#cZzBhuiPADlob# z=auFnZE`&sY4yZN|9D~nSg)OtfiCcrIimADMPz4Nki}XhSP$%3m+0oWfuD(JcjJry zyN#tTM*N*+{|^t9SFj$%KV)`t|D3<$afVu0cU<;xS>D_r^6Rn zM^_8p(db)7WFfdq{RJeqXIF-2M!B7*MsCzl)X&*M80y?fJzq2y!0Wuv1Zy8==AW>Hd6x|gI@5c&q_OZK^G*D9 zevxP;WZ^D2$dB+Bd8wjAn{qDQ;N9Bgw2Z*?8p=$*_gXwZgi_iBV#U_oZJL_9E*U?A zGECZ9b>(|NLD-kDtDf28sf-EQ3q{F%>q>lts)sY!F~{PTDic9AbOhKb@^+C401!JC z?}lW{9SEDUq*yWwnUKiY%43no{5yR3a9SwiwNS zBz(h7*WzhqJ8xT1UoQu2bK_;T@rUGXWGRhkpfhIyK5V7DPAL$=TL zO8Ks%t@xmtxO3(d0F3>1&hU1f{<`5PM8)5>J4y|wqiuq@mvvSe?e{Yt2 zWJ8Y^P&kKSyh-V|gNgCrd?`sF<*bYkV8{B^*}#-4m6&i&HkXe+H}6U-&w6Mv2fVZ} zfuWg#uwu@$h#BoVxwHi5oj~}rB7Bv{#rMma+S<TWNB$&WAM(-H|ubVWp6C&=J*IlUp;jT1xUsM|#V5)h^FG)3t z(Me3aXh}NvxKaZn^?+o%VfmH&i(cd*4ywV5KfM*A4ma82LzocFyj_x2J$z0p=FY^4 zdSSb|1H~|G$U~?nO~0g7k5OQt`Q#xx62Lt%uH}JLlNbXLP|5^t^Z}3}z|$X=@I4Vt z)Z}jXZ#|#aUEluoC`H}E++4hbVfeykHxjo3S6Ye36o7-+u!I^|>!`6mtu}jqOo(fo ze|Ewrr;B)TWBAzg(eem>cLy_n-m2KO6&o>q25#1k7Pt0PQz5mx3AIoUb@XX?4R?mv zF8vmG?Zs~LY+>sFu_@gbBDq^2b?K?HVs0T@=c2j)dIb4>9d~ZqpD?JP9HDex$vW6G zaU`rL)Kf693ICCw%q93e_S(aY--%9tx2utNt+-}nLk;EYp#d1YQGZTdB2@a^~ez+YK;4j03SBAAqftn*b5m8rS7r8_RVoeq{9 zuMHnbiYzknnW`OMGybk4tL}0AGCUQyq5lo@c6dP8E#JKc+Knc%PzgbPQZ3J>bb|{) z15NjB$}-*YX_Z4o+_UdP++YvvfWhr2za40N)H=EIwc`EuPfVp6yyhmmb&p96nc9NA zLQs9s(y*5DknTgD;mYg0pkFAiK6+4-(Ajq5Cqkvo2ZRo~HPaEQ$m-1c&O4&(^tC>T z@LfjD6&$~TVFXcwA)zi{lllsVoaP}Z$iNAwnw)HR2Q?T?;Qcl9p#fJR&kAkil@Q&= znOHf-j>E6?$4FCHtKsxJciS%hPk!|wg%88Wg~l_mHGr&dB?2h=ATRBnL}?idbMibe zZ~>tfZRdfBq)##@jFE$M%-joa4pnK%*V!)}Cc1GvW zgK;CmF9r^y(zS^$(=Fe2ylqd`?2mGM(bqL#X@vMI_4zQ;xBh)XscDWFLO$fd!&Azj z+4w!qs=1|TGTgFlrlMF>1I?DsBPcxfOl5f1{;m2ZzmRZ=E-)A$!|(v%qJ*E+6XW9< zrD==%(Emd=`sI<^@z+3&)vw2Vk>J%Q3U)Z*4^ZQ@h7fc_6U>sQYj*bjrlWM6BqlgZ zW@lk8iabr95>cA^Q#1h|4l$`qam)I;M=KiRjfP(_}tL75V@fXoXk7rjlI`@UsASId|Xz70O;e4@KH z>Uc*nU((ZdC*PzcM=ROfXFBenE6uyBb2@tH@*2Ec&@pa&i!w(#8Ym3acWA-$dBC11MTCT6f)7!IvU>eRX=FAQt;f5mJy@k?X(%#OM zy2M85GY)fQ?Y98c8C_g$m+ApXl!AH650Q!~L#5n8ldjIwdEwgnNE7Bp} zK&jla2KAP7YC@6p{lEs%c{wl$iB+^~Q!u#WGZr-2bBg>|hGidVxJKnsdUSeG^6?~O z{F%lD-KV^55q1DrSUMVmEq$9l4?N)&F@7*r57SIn?IXW)y4&9J>hT1c*YB1fjlfS4bN z&qBu(TST>?#W>+Up2Nc+KwkTJy|d4sV!1PO7;t_AHq@;r~T#L&635LA1vz z+qLYM9#2h=NPiRWeaSb;gD$xWs2lVwMyDraohUh#RF1g+Y;TnoO}Yz`jsIqYlvytL z#nzqD%$siXM81qw8Jynil>vaf_>C9H6Zmbt1m5wb61@!H(KYxc(27-1my6`m5eR8k zD2%(JDErw;e#@dQ-ad|4_jvv9TSeb(DoqG8i$du*Q1or30Jn@`Ok9G4kh?*G(9!#M zb>qSqrhaSehhU>Zr7vFf4B;@u2vgFvg3_uv0HnR6?fm!0>-I<&zY83L z)2o3#FF@ZSQ4=i-?b6JugT_8H;?uun2WGul`Ml_N3UxLaocsrGVw4wr1f@_4^zpEf zox73lr$nE^jV@1@EIXKDL+Dkb>}vrk!>7WN6<2D@4X6IyK|e4H)8AeE%9C}5_WzvLqoWVzhb#D`bE!zVSeMrQrfJJ1DWqmHx+_Vgzy^mW{H-) zVDk@Wa+5z!S`7yQ`Oa8$9U)5YCi&0HV>Y(wx3p6y2e(etGunQh$~}#}as6HUG{Q6c z|1IYqoi-E$?TElNs&s&ng-CoO*~CG)n)jV%vgKwfuraA!HCHr!w2~_UK4%CS?@Q#~8bAA2CplA~o69f9Umr5u!#y%GEcz3MWr?8R%L`4#Q#b=8LJq8Pl#^|Fwf8 zoqUaR6fMJH0Yao~<`}UAZed(x0SPI&!1>;vO?NBnPcubKaV90m=frbsvdR+8;*$Fx z>T>IK*;$&Tw+pXANsb=e*()=Jt>71m5ZBNL5E`Ss;^Ph!Ij~M_e?L34z)AxhYFra& z>|&NF)h<@tR(NW?qWvc8J_9J31J%F0kQP?|yPdf*@z8m|ovs@J#|@Tz=H|&92S5cA zaigF5E-JyJZg6DqRNX;`Qam+1N|lisaY!*gB8vD|Ot&pu=t^ylg6TyoL6ifPqcSMF zFIK}dwVQBO33po_{1|6w$mqDnRnuQu)@^G4eRekA%Oy(5I~4mtvRRwlvT45H&-hz| zmyprJe;(}AN->XJUcQtopIi7sJQ-ncM5(Db8ZBP!ybKA(yhS~fVwD^9Uubu0fpx6Ew(U{lM z5##Ss=2<(|^0EMUp&T1WIQ(#41H=}$`dr4%_?eN<){Uws)@Z6Z%)gV)u9g4;f61wc zmdEY2^|(DQ*+1-&e50#-M}AZrz@NT;I&alEO z^Q9B?Ftrz|Ui0mE`(&f=kr1=Y34@{N3o=8O>ObPEz`)7xIvBHXujYu5aYX>utbH+R zE0HR=e1o@Y)qi^< z?fN!8y@TkcW?opFxH=IzTMx6dj%vGs5F2tzf?60ihJ~5s>dVI zvyT-HDMX+!1qg&Jr{P(lBNjumc`Q<)(8wIt>t4&D_Ec-gAZD=TQ{b+{zxLfE&*<$a z$xpj)(?3Z%u1BhM?hEUmN8ITzGzjkke_GI*jSHEH146S%TGcpg97?A;lwe#ZjFRx+ za~`>!#+#zoYpBPKDK}Mv8+O8sXRKlX`Y9Cec3}hYhchnDB#~fv z9f|$nR+fasN=JX22tg@AL-UJeMU1(%QCzNto^396nEfOv0*%tuh#xQJ^Frj{@OB;yaFkY(eHi9??x*Hrfcx zlTHr3_S^J#m8{MzIQEmEDW0%;Kc+ekTqVL z-?bPigcN`S504)+}}`3F#y#k_=D%njpVP<+M5!F7CNpC)X2`=J}aWiZ}}_D z^>lBi!x#X`ZBhMd2P$Iskq4+v7R#yB0w{}Q(H0=hpsxCs#k5VEI@47awmuS@JSrAJ z-UkYuQlO*k=teFb%uw&|9+;$No+bZhlv%p7|Jy~D+~EuN3My&>QfIHhn+{E1FYq<7 zs=h*r9{R;Nbg}dL06?>*Coy8Syt@)vm>*P=IoYUv9E3X?%FAvJ5tc^x%G_>XvrU=v ztrxmSBS<_k$;%#Zjhh{*_HMW_ajwrRnmP={gxpExRSHMkC3llPcFX4#zIQXC*-0r_ zSx5PZa_QOo-t=6 zk1=J80=q|#k6XF|3-%a?Up{Q2dd#>F!>QKXuV+F|Udclp9lDL42H ze~r9N&JCGAVsc5g|-Gy8Xo_?1_#OaqTeFLPvF-<*!X-kifIyy@ME{n=WlrRB_Kx7^YeOr1Qd^*~4jmUSY{BE!q8*9< zT*Dy0sLj14GAv%YMn{5WoN)$+#uo$tzzjK1=N8L)e%0;O2yE?juJnHO!N3D)a~jVN zWcrz!dGO+||2)&~kp@*c-OzlMWT)<4jO7Ln*eL+3Hp`jj%qgmLlqxI;{v^^wJrWOt zBpr-Yjbitri1pTe3564C5=B#jDMxM$mfKpUF8Uygj_Ut(^4C6`#nK~iadF&i1S(Aq zbdwn(oDAn$gjS!hR)&0~T~Zf*Tv5g?e_-qYuO`-|Sh19k(#s6n85InWqylITVGE?W z#A!G#z+=S27#F+zb7c??jTNpSfg@50R9U1Bf}8VWnFKd7PL9s!sh>^<|FUz&Kq+S#6a}|D9st# z)VC4ghZ)F0u-pn1`n!YajrzVpb$xMfE82T_1NdTKOXdkbySU--g_K~NC;0P$5-mk9 z-;vk)WyGHVkdaqWe5~eGgU5*o0%C|&KD;hzG zS|;_cP@!Mk{i#c) zHJo-n>aE4GM?kr@-itJ zP4!Xac=ZHBVpH@R9y^;3&c`m%_`48>Fj?f%2$jU7R_DT@%eiF=vSm3!j4%S4i^oc| zJ{5uB4GGSI;wj4*OpI`@XK;nH17JtTa=xvsILkh+^pmKQ(#h(uV~T%|PW-foSbI@6 zIx$Yz04U1KtU0F;iRnDYqSOhUsyC!|@E!0^_2PR6+sd(FlqRPi&BmgV#%9!^kJPFt z<<3i~hR0DN{p@m2kwMMDC`1TGYNZwzX+pGk9SIDQ+o3A3e?l`K$-OQUz}TfHzGVWe z0G0=p34j>C)h`L;f*&<%A{*sZ<#nX{8Ra6Z3B55UHWU{a0l_3)Jx*d}z06Rl*01-jb#466+<)7E zUQ{qP95LC)OR?}!TR{QT;Pcj2U4ZQ`oJ}CXxVTCQr}|8m-UII+)gd47tqBAlHN${A6;XEP5*W z(ZA7Rz3Z9qJouJGGds~7CX#UxTrN?Tb+jUp#VvY>huD=z;8)txp@Hk5_GMe*Ft(Je zn*7@t6e_H-!>+>P#y;oWS9dhJs+#+4|1lsQRJZk&as}6YrJof_3t}Q+E8_wX(HD9@ zp5Oqw?jTBL%Yl4^cMuz0=uc1*>@GuYtp?-!x&vXu*v;ZRU~Gs$i}Z$gTVxc!^rAj_?KWn2StHYMXy%20#Y{vs_Hk6GgK5Kh! zv1$<8_8FK3Jz=0oB%+--4%lwSyUu~eEcWI_^e4guF=d6OdPHRCbnDe4i~;j^ zCHw)2vP!EESrXlWQ+|I>nUg&VUQ}R)4`-J3w#7BQK zSoKndFROI=7KS~ohI+JJs4C_bD!#|s|6EKtKGMU+A4Juf|_)nvz2QRnL6H! z^*Jf7UiLkjf8{I(?0V;aeTR8itj+-FFXM!nJqo@dFH`o{W8aSUBq!2rfHv=%pG0-D zJ1^*#62C4-zt_@P%iA{5u}%Izs%=TE`YY?g=Rfi>UurOSk7a(y_R`-OVsuuSNgBGD z`x+#m;=%N*a~8ToOCR_8b&W{lmePK{uz_B`{larsJ83z|#4pW0k6cM1!opvZ~ElaL>uD|5DxVJ^py*u-l2mj)vK)N$$fwY%PE54y-FS zl4#WvE$3~;?KIdQLM@vqInp8wCx7dn|0w9|oO>|3TVYo=rKZ5yvzhV;Q`>k!8<2Yb z=(BCdH7st7()Fk8X+vjXfTPog=| zm4lZie>HO1VCU-L>;k4~n}**ZWvBHRP=dTP<@PD_gAAaPb!ka-RpNeFT)g}tEaDux z&MSfwLoi|v7@gHjwKvVz{Un~rqI%BuwHk-??atH$#eU8rcqXviLfWH>gD;59DHX3x z!eYkmMjJ1Gi4nc}pjDrDR3>F3w7?>Au4_n8yI9^U;G4|uH$4u8iImHTTES92W#BBb zDB3Oov zmNWSBLypd+FeSiFx6&OOT`~YZZ?Z2PIHrBio9 zw2JmL%siviNU|3=MEyGqdb(a4}NqSooefCw1swlDq#1znsTF7 zE7N)w>zun&d(U_ley!PITVwUJohWPX4JUNp>|8WOzGM{8d&z;h z(wan}g5pd4#`kfbFT17oZt&l@XN|>8#^!wA@$8ymwmYh_c(Bks@RIYT&xenLuLatZHQ2GY z^F1cn0l|kfc09Aontf!@d-UaOXhY0z0V*l1N=FpIjzFjU0-@LkLlXP+aR9@Kr4$Yl zD5c%q?-|MycnRPnHuIHb_EVK)-VXgKgW=%n$U7jgL*Qn?usMtNEg^?US;)tu$ zOHUyjQ(KzPh_V~2~*z_?*Ebjox*y$^auYa2L zPsUI?n2|An182e5Hu0<>u9hABs7REUf>3CY@b!9<)Y}kv_U;|Ufe&UdV|P7IZ`WpKAWmO@bfC&QynHAl=h~^ zzgB^XTPLn5m&O&p{&Dz`*6UBlKBoW^KOpLq1!h~>@g!rZNQ0H*7NTplXnHm|%6SYX z%SFd1(_Rw-|IT^;j`t%UUxh9IJVEn7Lf_);mE$~K&KF`Vb1ZhV_B>GMQddB)hwO5D zaW*-t`*J(Z^_)^oLC)4=&H#GC(7HO#${dVyTsM5A{oQ_er{_yJG>dyNS%Q+L)FgIi zpVb_hheN-5NfFQWhm$UQA8$?8>e*t8+xzawN^QoEht*qNB`&|ec0ED)uhb2(o7D%bpyl89 zj_jI7)n;2YxoiElrNtSWf71D*#jU0hR7%zF?liKZBD1RNvEu~> zo_Tw%tMWux-H1N;bzF7ui1wzkXTfn3L8lgWe|r}C^)z|OpWJqXT==H+Y^$Wd_Q6t^ z&z*rJ%V&+t*AVT}7vXCkL4@JprVm#-x9ovG0)Fe-vDNU`#0^$ggDBHsRRNz*+Zh;f z26Buh<3y^o3p9J$iB{E%-8=txQnozy@hRD~%DfmiV#jx?BOhusoi+O9aG^MPDN4x5~-v{7E3STPI%Y8;jqN$h~YKZ$u-D?!#YtV7W!1IRtIdu&Z0; zVgt#77KKiz3pIb*Vfr~?D&mu?UA9a-0LYcC!U3)lmJbU1u!H|`qk;jREupA1K9I$5i@5a)c0W*3&zu&@{%cgqq=?c zyN^jY=`&8bl>`_;t~rB{iIJmm#k9+&sEZO zGnUg3Z9vZ=^&I=*Mis{2^*Pp$lb#<(nzP1zWD@Wwf+n!ZIjgPc8QX|U{C47(4te7S zd!M`aWHu=AXG!oulQ!W9I+UII{q}6rBL@iUj~i;-SNLoamcNTd_$6pO;b$uT6_((} zk^0hofud`em7z3BqDrbp;nL!tdeEvTHN@-@)K-?`2-pPY`;|YN+GwkMi(~(JvDW*aDurKXfzDO8{UzP- zYzDEO@LDC`sj_HCa94rtpR>$7=ljQ9oJ*(MPuKp(3*e|#1lORye);5Dl(fj5Q~fx( zQY&LMt_E_$ps@Mfm2Il0f~KdFfh9lV7k*sj{MZb)^t;tFZg3!o7>Ns6JJ~n(7;6vv zaX?&wnE!s1^M56UPPdcQpA3#^lstZP*);t>F8-TrgyL*SlPo+%vx$np1cgf@eINw@-_n)U` zs~2O>AiD03RMLEwUu>qO3)BvR6M^ihTHvF-AS%eU` z(0nL!$dtJMpV>lMyZ6o&EtD*z@jyeNt*Kw=nZccLOC$9Gdc2Fz$&Q@1R9$PQUQ6X! zQW@a8ncru>nuULvQ;yaB7W4J+>^Na|EnsN-{*zZnClhNo@D}PoESEP1H=nZ_DOmaJ zbRFK2J(5)QkQw4=a?_=-G!(*Iu0D3oucrBD6Yb9({T!&xyC}5Loo}JzwJpL1sy%^U zf{?D@BGal5`0AhSw|6qw_rRhkkwcmI@!J=8{IHjs)lSND=z^De`q_x@L0&7qV`*{x z&*W1VVPMRnK7uf3R?f-s6lDvSUz0z2fBw zj)H87qt?QP3UCAs;M#z>|FOyR$D1WG?f{VJd=`Eyxn4BMeq_ET$#hj|ubT2EO!A&s z0fk}Go4?{5J~!bc;Kje-x+^*$qaTqn)@xF#2DbYBJ=4!})NY8g;0pwX;D_~98bEP9 zdXvBR&-e5HGEHepI&hDw+*16jKoEZx?d5$ z>azv2$|2sUFlH)c^hKDwVaQXh&b;6CiC)N+Hq6BzqS^kR6@1qQo%@MQw<)@2fX4M# z-d>$kSDXw2>UEs;q~351bsOCn3v8aD?@i2>9*5-ATXO6efx4*M zTMxQ?!t^Kt`eb_Y+h9Nn!ByqEluk|f{h}daa?U%?;KjfQv7;fO{~Pm-1h&UN)jz1dW%SiAX@Ym5hW2sL>)DZ-g_A)i6Ds<(R&0T z7=1=3BHCc|Iv9*G+9;zA#(XEwz4y8I{?`4i_4&iHEPt@hoU_l~@Aqr(GvocI(9CW> zwn(}e`-HVb6k$En&}q~uOKo_M6Vpgx8bNO%?jjx_?sq?OAu%@!Z%(kz=M}Mi%&Xy% z7|9Q6pwTKx`zT3}k`=IFZ}@$Q-^cp1JaDGSe|>@*rKZ zT4C3n>m@A5uvRZ@hW&Zk6}?dg0f{*zMUpoL=^t9@Vsiu$n>{^I z`AjP0N%=m^TN59ugMNA-<}kTC@D1(qn0OFgo5b(F{|>*GWg-5ozsmR@AL36-i3=qg z_uh3xxl3z6vKVYd^k_^kj?l_D=9M<8c^6ouOyAuiu{aD(d=-mH?z3DJ=bCdFvb=Qx zQZNY4rQxVDziWpa?_zKGc7TviVd4mL;h(0F->j=%A5;X#pArv(-^(j}sOA*bnPzuy zibYCQ$i+acPqJz=QQc0}t0S(5*Qs3MLDP<1%$d!^+ylWA?`NxWPA5iuk7F1Tac{AR z=I_{3O&Euo(lLD~ah$cicj7mF?Krs z8oDS;(m5H-9UrGpZO>>=TkRAF$>N>ADYx4f)wO4mOccB`#M$gW1@sSgE3UFc|AcqbO3@>+}<*SMEQiYBw#M=1gCj)WIy>BT=_KNF)!bD(7NW5)TYdZ*kekC`L-6X6SyFFB9Ek>b6koaPHBNZWmV1e?Cc?2(LV zG*K zT?-DJ+g+<$C&vmE0v3Gs=)*Ryd_d{s%YoAE$zSB7ui!=u`gL_{2Z9W~vCH=_rRa}f z1nR9C*h7ek@qe`dL35$QJAAsOHiLpUxgo0ak9D?)Ma$2P36;d9qJ zearES?Fydr>TVHFta@*Mj-3{c+DcuVBac5r_{4}tJda51QN7G6He@vIbSVk-GUF{B z@3{NMeeGT|!AJ5J9W%@9?#{j_R#}1bm&`H5$@RSP<18ICH2(~#f-rHldH7S}d8&sa z%B)i{N9WvVH_VGFeZF~N!hpLHa=odt`$=o*seGVcbrOeXk??sl& zH1}nL4AScMZ)OplVr20|7lqfbMEkGtTOEYZ(i;c)bvpTP3v_h=nN=<#O^anf;2HiT z$@5T|>5E<@I6F9~-V-hf93I!#R?hGc+X1m(JeUo;`u4=_u#KVT@faT}$9)2DEZn+V zR<(|AhAZRh9gpivPyZ?L9hIm)0&t@&+|v5SyUqCzJA^rQ+EsmKZA51OJ(M%+q8}GV zY%}`Z=W2rixpi|~GSo#f_+W}TML-{RU-_u5wzo_9ES@XW9fZ!rOM`bEbkSxnILv32 z#=Wz5FCe`PMI2&kZXB=<1n2}FkB|^qfyyL;ZZt_FhIwW5daUU&6B%Ns-`tLwDa(6* zO4cSH1Bi#!-F}7qND7Sr(#e2G>+#qCdK|$qTduJEmhM3gaibOLNEg`M-uKqqCs;YX zTQhb#QgI``#dWK!annu^pDg=bhN-bc_s_Y_*xjjzXu`BMvt5tlNJnz=B75gu&y1rg zE_+PGcfdPUX=R7AtYsc6pY3S%4ul%kf?|>?LH;sjlj<@TkUd%b0F9X#%WuLPQFi`y+uox}zz$Gg@bE;44`raxpN8nN=46}1`dYQI> zCXt*S{I2Ta3clQv)3LwF0p&G#tqS)z6KP#_3m7Y*z4u2{o4y01Qr>EkI6d8x8oDjx zbCT8L;yeRYF8yk^FX2~m(!6cP1=^F=v8 zmQJKr(`kI~1PqF94$pY?5xg-2*f)^4vZ{Q?GtTV9p;LL!#~6(NjV&Tj)+DRDJ9;i4 zVkQVGbm@|b#2hgC#Yiyl0A6^jMrdhq+6#YjfRJzznxmD@JA1J=&I4bPq@Nrn-|l`| zyb5+lk(l_(c%EWMmPS!4Ghm`ENBg`$Gn@SIRQAV`$1LKrAGsq;y?jJuX~G{I2wc3D zGk2;PCwTd>(JCVzSYiHBA7bcEU6WLTFDPHT*i{Bv$&VaPqsFT1Q#Tt} z6{geaONIK`Yd@uFRYf1j?}ApkE7_uJwZqVU&SlDcb+OA z9wPlCbuLxh_|o6p!yIvorS0{m%RyA2kLy^1cD6*Dl1G&GO{E$)2-971R`gFrb%yhT zr#h}b!T%n^Hf;KlXC_pnM!7}}o#83a$OQ1lxY7~NZB+)SewT7-YBr{1&kfEo5b!C=TlQV*x3LCQ;iBj5uOjBI$UHIG`K}cHQo~f19AKQwn>!5? zvpG75LNf`vO4ZH$zmj`2xCq~+T#>F@XhAPt>-^m(vb8=KIHS(Hi_5aJ*IG zq1|-j7RN8bO=^R;n%!rn;R|yTPM%k)gLE0#g-r;H%*y&Q?$Q_RFSf23l%w*Ke2vWa z8@cTLw&zCIFLED!_VeA-Y?@>`_`o|iX;&$CR5OBD6}Wf?ifnIku(uvB4LRFh&3$+M+WO z?Of6{34G?=onGi4+sV*X4AUBKQt-+zSrOv?(OEq{Fjg6t8kQW27!rHrzj=Gs?$gk0 z;LlG!9!_hv`-xoNQaA<>aZl#C{*u$((RoWz{w$;SRn<*t$DkNh<{+6a9nRT%`uSpe zi@6b3ro>l<>-FY_UB=*|_5;HAuvy>_vis>%`l;@=#(sT*y>5*g@S$R<5hrjNrFPui zNs@oaCaU+EH=Eq~hq07_&hY%UtC%biSZytCeBcN4q5JQRYf~}Ov&P>uO;AhU_c|jM zxLfl#S|wm*0WmN>}W8hvT5tTZ|=$NA*W0ySr0kmI)??RvLOSKujHY27xD z7=RS9FoU6-`I#4E-IiD*$})Osi0SNwJ~t+M+06@$)ShbrcAN?7{z&pv&a}9rrVjDH z{SfxZb0udUEVB;-HI(y`5BOrwe~qzL6UJdhaV^BCvn&0jwaK=oRu0d?fH%)%U0j%{ zt$lu+502#4NPG5x7>I2y^l7y;bgp)4ZbJ!-}(@)MFbU7QC3 zDwVf0LibDPd`{H4M9e`$7A+qtCddt_aFl%e|RJFSc5bsls@du-(xk#04&C*$9S ztmdWh@SpFmhG9Omi&UlD_OGan6{ZlU;4X4VFA4wSgc4E4@360iGpEe%p z`lcim6FBzOQN1|3E1(9S1d7pPt-mc|dt^M$)FVnlkrwZ>`Cv))MkaA$_e{Kn!&x~RiUZmYw^j3 zuE9?_oq7}|N!0?6r8mXhlzJRkd3YTbxe_KfRyBUZr|)aCuSiMFVjSiLFLL3tzKR_^ zybg`#6YI!Hf|?Rc1FZ&wV?ZTQyHUrz#*IP3T-HDH+|1%5PkE4QeH>6NrpZrVWHV~M z`Aq>VP5h>Ojds367YEqYw*@ex10g?z?0pLh%B^1-J!6}aL7oMG0IwB)`RW>6`5&B~rml z@JPtcRkmemoow1uEBP^SLP;l!RpfVVDv{NYBPiX;*{R^(rPW9##kTj2=qZMwK1N?6 z1!!?*&B+m*Dc_p8^Fe#0T*GbdpGWg_?ACQbC-;SDQ<&0s;e4JNhXS(F^m2vi5;68qi%X^}xR#mm16*?l_rx$#*;JzZeo-mdtk9*jtk>@+h z5wvn12P+?JLUR@-lf~7%NKnt0j^$LDeEt{-Hdzsv<$*kk;3g07o8U5Cqckt|xGTW{ zwIm&b6GcD^`igt(UhM}pnG5W1uf8LTS8W5&V;+{t<7%oQlb}P>1j>wdy(Gt;d|2pO=Kr7sGR&) zj5ZpHK3cnjkxDa0fZD6tO9?rr*k5Vo^x1p)g(*f&i%<+Z>d1+3ighM2W2I>8&jv}< zzMN3+<)%4*qg9dWmSETluw>4SWmU))Z?o^7;uo^>*Hu_Z-L-#mSh)4*xZn7D$gUBfsQCT(Xy4k}Lj=D&#ls@^)UP&nO~&q2zPuN}orX+{@(aJEpDOs$KJtW9R6(u`XE| zskVW%WsTbvYJXfPrf`2Dv56#(3}J_F+XuDy$n$^6>cNewtMXAI-Qvx zMc>&T;G=wGtyEh$^2AdYUWAKN3+?NL{d`~WbVnh&Z0{=TQ0gNQ^p;s^>Dt|FNeDcS zqtJQJh;xd~zaCPQG3-8AI&lCf&S+48ouE5HoX2u)gu3aE>6(bP7!%QGLC`W)pUrf2eTti$0y~jP6 zL>M|dqjiJ%;ZykNhePVrD2?5$a3z|n2)hZ-fL)gm(6Kx1eP=&YG-v!+sJiQ}B5!MT z)r6#^qIpY*c}r5w#GP!8-iPL%qp{V(s)i6_lg|Fy>UORwM}UO%o29#do6T>N{4SkG z7SBD5uTAetx(bUF6Q&ipK<|)pWV3>NsNrXTq{}iT3)361DZfXtJGz20nkP`Iifuk6Wt~C1m_jAp?zq%LF3uWZ=X56&R9f>OPz|_$bSNj?$HJ z;imUI7g;4((nM&%gt8>CkH9J-sbp^pMX#xZ{csQ|zj>4(A7R5NTq0Mfn=|)i;e|3L z(f5=y)y88GQM;S84t{om3I_a z95T*+QYwua-fMx9Rj8C!P?~E$F}!ZyHOlkCjpLlHANqyJt$>PxyT7W{K43S+;t0qp z(wWF^&C$^UU8^(Vkgm%$xFao6-(9u6d0#O$AJr*io_E@r+!jh^K*qw8rpUuIvRch5 zcM*+8tknSbW+*azGr7|~yXV>$*T-hT82`P>xRCBmpg)p2ssbuAaQVQY<}GAF79e-w zfIoQgALFs(IDI{*?2dJS zgMQrBnIEeScjvr{)#K+L-jhV!X16KaT`bV|u^~F#P`qf8oBC#_K1`EBfZPZNiZ+rQd{$U`@MR0jjIr$# z3o<3Jk)`FqdedyS4`ss9xa;!_RY4eiK5G9l!Qpuh-=8bA$WN1=kexz~oAg0$Lh(IA z3)!6%E$zz=OVQI*4;1ebiq+pW*Onq@9NC0Kahqu$QrVy>%_p_ew_FxM_9k`hWx!wOyIg8?W-qiGH8qmw zZJdZ(PbXH{U7;*}It=b1&s9>=O|j{*vAMdUE5~wUcPo+3Im$@b++rD0XUXbMvdMZ~ z!_8g4T;sKC2)>u_bAYd?AXl=k50vrv*lj31)9tfP^2XZRteX$zGG17QVzYn~nBe3I z93j>%H=6%nzz+NSbF_~TZB35DwB)ezhPY5P_Q`lUlVz@I-}4ejl@qzhJqvCGx;7k! zqz5}ML}#WHIKW0*cD$GYx4hMHh~*++$30}&oVm=x``QB+?x3INDeHOj0kJ`UUt>$`rBEG=D)Ba?Gh)`ovc4we*aO;IfV) zw3d@rLm2zpB51Wkm=JoR_zRJ)@U0m&*v))`2*)L}f8-DOC0Kr%)spbQlOHkuyV`zh z`1_uFNRyI=E1>%}_;`ey3aRSNB_eo1b_B|9@h|arHXphu^LFxGus0>_wVf}z;g>G> z7>$pQGaI%;zfjsAtwx@FmlS-#KiH1h6~RUiklCwq37V@b{=bGlsP@?a!_(%I1n{6XW!_^_L%Eg3c0 zh(_C}&vd4EQV+CkHlqAhjg$VmKOpNA)qiN6q324sQRPhs!`|m$1T3teh8++bK-+xq>JdrZ)i)8x^5;iEE*F)LqEZ@T19=HwqF%6z1Alud9Ktun;w>kit^%*2+V8Fe&9N~)(~nkGJ) zavtx)M-#cs?0$c`UTl>gJM?C)^|xW=4B-fyyrT<_2gWLu))RJt$BP3guCUrMehTH| zdb|180G{A0gzp*UuQ7oY)TBLJYCXL$GZI=a)Z*${A3}b9eCB}&Q=DGt+2QFxk~?Z& zZDe5E23o!j6tBB|BTJj>_(-R=Z0z`#U(`oS}T$h|g#LqNc3xD&J6#f>%PQ+>eCkYM%NCY$&JAMMFc<&Lwn4 z%~O|-LH%N-;&vUU7Hm=&Ya8(n+f_qw>j8v=PVE6~=`xS_lCd;oI-? z7TUR6erHB1$J)v(`&xQGt|PIF&ne>qWyYd$LF5)Jo-Z+O4597)JO5#e%42hgNC|dS|?P z`(ZB$IK|fiN(WQeGgmfje0J#ZN567=x$HQ?u6yNJU$daY$-u4VozC@U7m&YbjC}$# zRjkY+4TR%%IS8{3Ctt;*QZ$rDWI=b_+t1N|9esukzEdaz2+k`xl#P)<0(GmI@A2-r z*K3_M1xjm>>zoNimwn7rrNB|XGu9{SXrI~7;-JDzU3P1DA_U~SHV)8@xr1^eE+xd_ zOwMx){s7#L+H;qG&SkH$D}L2}{B;iRMrD`9W~rLR`!nw^o-1VC=PGWCJTHaN6E}5$ zL`4IXV+pA)4!%7&u0EF2+Ke6jj*k-24~>M z7<(DNE{jQ^g1xy*%=(J6^O>bLG9FQPQ)4-x*9goZ+b28`yo{2JLoo6?U7GFvD99#j zAH3_!1ljvc8$Xa#=_d1zSCON_ynZE4$9(oNcbSSHN@cVljif>Pe#XOFRt%mX=~dEG z_?mG5$ttDG(@Vp8jdzDQd7Ij;a&?{`?H9&RNIHl;HCpuq!Mi^q>?qh(Bdw|OqIkk+ z(VR%msM_d^x#hMioyDdr3wLcaO?LM045(VjgsR5wT_aDBVtcH+gL8eQnMZHziYG#D zCq(M-75xB1Qr2#F*>`J5|0*`wnr+-v-cgo8cg! z@#zrgH#5e%$S+i4h`7V#UU;cEKT4<9Sg$dL^Qy-ofV=t`gZ)eC`8_LuAuN!XLn2t$ zZ&c|*r(8%u%W2F3%Ee%S?gtN11vD!dTQwC5YlH|9$ik*GTt6F6{S8BgH{)fwP}rTL zN$2tqkb!W?Ta(qJD9ck_Tj+$x=$FB*a~(r{#a6IK1@6Z&?x*$xvanJw#fA4HSmy#5wDQ?j3J=lk5PcJ{!pW##SWXxCFJ#2>=caBGv0 zO{SDV1NChqxEahJx(c|}yk!qqumGIlP-jzyKB(d34n1%uEB2)N=_0x8PUf=b0$A?4 zEP7-pgR`@QkN5r77p;bUM-P-y(Q0$s5vuTZu7fKnV(xRo2gv#&Z00CghZXgw__alL zaiFf=0Hf=>w=baNbvh@-SsNw`8^~_lqZxfqn9cf@O70AgnxU zn-SWUv$emJFmO-8uJ6+wq#Ou``!35%*e_S^Zf*P{zL}9}IYoQR-3wiM8qMu6g`6dj zOl0ydv=M8gOfDe=$TKj`V5Xs1JlUKZs^uqjN}uH=Xz0@5p;YKo7Z+RGf4Yc&eX~-fw`%$!;bcE;>{8X4)i)(he!%TYnbNeas8e2d>TaYm zk?wIH#@S-7Ged`8LugMa8H!i2>=o^DTUC++X7=72>nuv<;}>#d!+q1jFp9JAOBhf$ z`}Mr9U0QGHl~^o}JEa>oDY&OmgfBth8Cb$s8Gyfa_nsZL)p>r9)5ywn4ZU*#aPzIt zsGD9u*9C7@rD(l!v6x_v0v3Vjd!3Y7j9n`NpYOF_a>d-W>9u9aWvdl^O`clj6Jx_9 zcaq>OJ@@-6XCvM-WvW@f-TdKir>Xm`g7OXq{M14e#t7Rn1DZ#ptl1ADp3@DpD}AGL z@d-B~*Q*O^8k4s|_hLd;N?^RnMcVlZ+kFW0%i|J8YZYOih(6Tzn(%qOJc3 zDnfqMfPjnY%{iDYe;%-!kv^Q^XQFucMclbx7oNBZkfwd%A*S;EjuA&U}B zRRQr+_pd^LrWzrR02kI;X5?Gfpreg_<`fj|X{k#yL^fgSjHM8!xaH-+4ql@8%;|YY z-fGDtr(?_Y^)UkJE<$IryMkYwm5vMLjAzyUM{mcGpvpN7VE_V=QI+Q!tWZXst~!3g zX$Uq&1hA$-;_3@K3OQe=+_+HU)*R?GJ!owiu61IUHh$)%E=-gHJXtqdbm5T?CO|?d z)+1z`Sg9?8R`2r4Ju&~-61Q2O-hFb^rM!s!aX^0MqL;P6MVrIEgLW#O7MtlEG%yb3 zW!li%kaKc}F;?2=5X-U|D?b0>l`V6}eXBl)l2dx*I3n(@X$ukOo=8raEfo-yCF~|c zTHFkjyd?l$1&qMJL;l?ov|nC1`&toh;;M?wrzx+)aRByk%=417Sf9v~nxmRj5!f8llLsN$){T{w=G`aWJ(xy5TM- zl($*o-OSw6>cRX(GHpq~go}V2wJTC#h?d{4*G{YPr*AIKZJ@NTS3!2vn44>Tf8#Hl z1Kje**^yYg_593@d_X5i9LCW5SpBC?%OAnG_i{X}MX;pBgqZbDivAz1IWa0$zuxa) zw%ZZ4o?i_|X(z4p^Pcs``4P{5I{Eq%t-oGggv#H!?`0F)ET`-FA-2}jzK_&9Bp?SD z<1?sVlkm{7;4|#`5_%v2@Ek`DOVY+rNLhBUnh9Z53;rO%bw5h7 z?2-W>fTg%WgQn!@4e+J6BQPhxS8;YF!Z0}_8FD|tBD6yGG55I=ZMrD1Q3M!lJr#0r ze`J8RfZMI&k>bgO5_4|iQy;S)@39Seu|h~ID^Lfwj*SxuJLwYu9$%C;mqvTw$gkn( zk`^8#c`Fik82FEz?w-RlcK36ADbbGiTz;jlCLoE}bfvjb7eD&^D;*8wp0mqNSMQd5 z;f5?u<%RvQ=|3<_`p8zFn2mN=#e+jnz7gOlVzY6930H%%5UuBtI0b}F!{)k1_ozD&CD z4HM1v=AIN{L`B1nMKcpit43ryZLo73!=)gES;xnE+a69{CVSs$$%)ez{?_%Pg24#6 zi#hwH*c9ewOdLZ^z*70qwaM6}lh?x}FG7?eo+oLVsi< zLrr1DEQrvXQ)@75xuJUyY{3$+VUsftSfWrNbCjw%?uI8-S-5CciL5burCm?UN_LPe zGI1>ZQb5)0Zj7`A_7LQ8wn|2s#^&PoyOVuJUtc6s9$*nN@xd50>1Awir5Z95wv?VfaHIZ$92Yz5_GDPf@ zMpQzYwe9qYp(0fei)3B3y%u9jxz7n`| zxX|H!Ugh%*CKaLF=Lt%Y8zIU`BOyz?g`LfxcQhc|%CFMCC4f46`FeZRn;IQxrdgu$ zXdiYPHI!-Uv$-Vdn*QOQZvEk&!q%G+P|47cPN8T3OLkfO)x3N`^=D(B-_|63a;q7a z`uZYV-_VmWQDyWNAR_0frXf7&ytGFWMY~{F50w3L+zt)#F*mE0{c<4mc@nA`BK8GB zyS+MYd8kJj9nc+V7%{nja9lF9E#Z_RbdTBW=Xh68UJ)F1G&x9jR$bb(!3(T4_ZM{T zj5A7zD0_IL+gDBD{&MmIZK3|#GZ0p``_i*MHfh`6!1vMIB!Bku-^b7TNKPgpxB_4; z+3=!~cOI~dHs|M=?RNKZK|VxdgL1h6RLJ{D?8|d@v`ZKJe>4Q{pDes9PX@Q{3|GyD z_*aa{$v6jE+{xibkY{@*+xaV*xG}dL`c3WuTmkBHezQ&ZU$eAAVEJ9y|2TQ-;cw)f zm{EFenGbuX?>b9EoO7i!#<~WRPsXV|wdCD#*Ks#oncwm~%SpDEZt@?UV}L#)g-i99 ztN$c?Z=@3zLb^0U=myn%4|6gXj>%ztx^}F2y-Z&IGKEX;P!@=BjSMcmqo@4dlzUnr z5;AAV6W%ue3>+)-+k5xRl>3uvW?KaU6de}%ZZz1%TPhFe7oIIg$oykTLOGcgC zkQnk%a2+)C{p`i7ttYeYGuCqcIrtrYBfR=^@ve79(2bx!Hcxodx z*J_%^h$1r%(?R>Qlj2r;?xX`fz*8l6;g(Wy@UldXGqOn8`$@*l%O1b0e8m~wuV0(Y z!PVvrg@Sp97WOcQ-N{q?!Hjp2ZCm8VEDU3L03?S->1E(B69BN?ArkuibctWNM$C1q zE*`t`LpQ`OaMRnePR}pcyh>d0-z?+V@%2=PD8prrpt6_*zlxNW?+?$7dS1HPG^0*3 z_Fgl6-u^&mrXIP~`vTc=P@_ z-f=t4cT{xL-y5L?RGF`ZS6)ListXR=1fLt~tr(XPqc&ve{@~A<^=%Vg7@gu{)BDH( zlj^k8H(6I0Jr_+M!eS}n!p$Q+d{;HrB8dSw8eX#4{kd)IkqQ2(#K@+xXDCEcR!YEh zppvn6-m%2c1%p|PejX>1?uz_XrlgO_L)Oyy2N6ZsqQ{Lr)3$rGJk4Yu(A~i zdw|}!TqxNzZ;OkeBg^a7Q8v?h98jmIhcEUYuAlooM6vl3nm+t%_#L$EhM|Ne%uidS z;0LN^>!@H;G}TJp%EiU%^3*pqs@Wfp2;^2koQX=KQs~}~d%gEfj%{T`?GTyuZLyRb zj`O+dyTGCn}Ch~CGpUGuD^vSlIqe* zeBO01pn3v@nl(+vE+372`vteow3+o*oA|z|ZPMWLv>pdj+w{m12YzyQ?>G6)ej`9? zsyJ2nM8g9+shDQgM1uP=>s6<0;!eoJ zey86$NPL{SCDjD-?iH3MNG$=}6~}7tpeF6loqX_4#nQ|7c-N4L!DB69_WUO|{_~0x zy>J2D6;}<36R9{`jRj^3TUgH&$)2sffR;rLNJv!KGP?M4nR{<2z4YB&+NaobJ?FIA zH!HDak(Jkd-92e!#^Z>k&Z*b7@%YG~0RjjmbxUvhGPX7hmXwqPOn;c}9N7mpryjbm zSxH`Ag1~&w95Fcm+87Y%?kgLE8>7d^AtJ$6b=# z6B20@9eK#~4%+rvURnCjS0+xETP+9=pMRlD!kcEl0Nn7sMLosTu0=N6Hv=PGq%7>H@{*zwbI#?@IKSW zK9VVG%c>S|9H!N4I06$-EzJdjZB9^T9Q+HB@OI$T7YwisC#BciyX$%vmu&vyIP5Y> zuSJ>E3+#Xi!V`b!_s$1o2lK3O(hWv;&5g3du=a#u`QCgae+vJ`(JB7O>}jJKSBC9h z(B4l=_6w$Zjdf;FuV<|8fJX7J`)Ya(iUEBiu%Cf{{H2PBW&BK-#C34|d8)OdYF?lI6>j?xfNBd|i`~0nzXKEJuHnzquh#w|`7t2&LPyjF- zsCh|>|H5j~Y^FmjkA?LkOu%oC9urn|@mB_N6g{pvccY~6z@Hf=s$TLGLJo_jz{yK_ ztZMF8*y@+muIp~LU)NGPBvME&1v^gAhdI)kA2saUq#NEV1g*Y|@eX!(-+F;~CR;x& zJiRgj_cn2$=4z(kBJ&v*uL0aS;I@U9v0I55f~747pTtjhw^9}?Lt9-W9KYnGJ)DD` z7h>?3HqEng_bIPpEbevf=*9^eCbvZ@mqmj|6X11<(j#d#{zmlj)qefowvrbBtwu1U z-_N}aV?Ld#Bzc)6noyXPMg8k;!#Ab({DoleP2xl@N@TyH_>PjWZ?R}x!sDZqLu*g* zaVWvCk*<`h`h0{bXc$_yd>}i^Koyv@TDMk)0q%b>z*rv!J`VhSpeqop6EZ(Lrm*`r zh)eU>s(YH%FwDGqUKfbjGRr$%-Km7L%`S<2{GCx55_NtU+bY3zfPL{T8 zQ^)qA8n^QJHAhpFdUlLz!p^)G+h zFDrZc{@bej^>g@cy1>M!heKnyD~U$?pMuL`Bo7@9RU58mc<`zAJu{KK11nCxAPg!F zX0h?fiQpb{nh$jiDcep(oQrbz8Z9@Mj0p~YHz(gO6@ zqD*?Lcz|PS#4eKcUgymtSCi&Z1P35UmDSicgJUJZ#kmFIFMLt|kX&Pi^{WJvf^`aG z^VgFtOv+5~8D1k*CB04Z?m}SG`kyVUZ>w;>S%F;;Kfy-VX7{P!Y1Q6Mzy3dSApUa2 zU34x*L`L?)ll-2)b3F{gW@*9kNvgnZKhME8^iTVLz8Hd`R1U*J0X}G-WXQhS>FKR? z3E7LhUXQPN`<&K^Pr>eIJIQ-K&yeb$`<88c(TAd!Y?=L!Kydbjo`r+so(4x~Zp>xb zW8h1PuN$#~Y4Tk=PDm!?>B)TEj#O!>&QRG!sQeaPGo3$hr{Hvo+ZMKUN zL`%efanqaalC}TPKc6>2jFXoGXf-pQsy;SpH6KLd%)-f9Ao^t1AYZ)d6}9QR==A7@ z%oNjRwx$yAu^t>RNA`X8PI_K8gl>QqGn(8ZW55(Ip59H@{EZ_Rjb4foU%B5N*LP*O z5nqnakUO8)o5Cx#=6LtHDr-={Do35WP zxQjT@+qfeB@u!2qb~6+OJ)KlQxLL>TBZnCwl4^7qMkuCgwmxJhcSG|mat^P;&}0BJ3O%~~ zI+Lp^NHpqQp!OvxhCi|O`J-4#DeIdh7U@UrENQDdSATa?0Y1%cu&K$a0gc0QGK;<7 z>TIB6bbil=zz5v@A>9)u<;|-)%iM{;4p(XJ+0^;bHVm}snHq7hK+Zd_Wm-ukD9Rrk zSof3nnM0CrP4@Dw%bg z%sKrNA>Otp6Jeo@xd#RB#NkdAtOV)+laSt@V#g2k$ROfBCZYWIH*ngOmFVeRkQy#P z{s1CpFG=T?_pCgClV3{bl~z*q%c$fApLFcRr)fWgR{T(_JFNJjrIRRl9OATo6g`uFO9NbEazi00_9RibQ zW-M{&NXVD;dw_#i1@u5L7raMlX=0Z4XoSgU<8S`=zZc{`e(zfmg_wI79ue?_zUN`V3 z^UzP;_^Tu1t6W4tgxJ-vS2RVL8AWUnv2`o9HFaGT@D-Dq%IfL0N1f$btQ1tL%wCV( zB+nAtW!WfRsF$&g2aMc}wsvv;D!#&CkEC$78E3d-xgSO$uahR)w0&zYF|vDa^Qm|G zeIuapn7o-GIY)_N7O7x_Mq)pizUlcpO#c6`kVhPkXy~bxtP7$Z*x(wX-~iy3;OE}O zD+$cW*z0}R+nn*A;D3Sk)tO^9Szvd_N|cf9hz!>ry9z&*M;P_DlDSJN<@1P1|J)RoUhEPgxGO% zxUYXpO^I{;oaViSPj+wH)qZ1lV7_;STa088*iE9}zrqh$CdD&&eT)RZhBWvxWvXQx z!P?HLEoHng*LWe6aN}+NJ2K26O%-jE@|2|~l%~YHicQ+#m+U8%Yc@V4gUUsmw1@qCue?X3fq2sqGld-O=+mF((~P3-@*7ex<_?& zi4nE7?_1lvO&ji8hF*NyKS0(Hc>ZVzk+^2KN#~`o4{R~MRmPI9mwM*wN2#6*DO80vv!QRX(|{A({50etL-i0;T>lR{uL#{Y=)d^6>b| z5jsf#PS==tjW$$Q8@X|~b~h;^Ca;V+3Xt9`@3f0pRWGA8;|M-U#X8!CtKxA3r=eS* zkZpU|oNTJM@$T^=Ct-ovK?ZsE^xT-({lH35t;E@&_uM=I&u;s-Q4v!~_HN3VZQsg# z^%N7?OecbRH1xLAQgS~2Tvj9F{u#^zV*SEo1BO4mliuB=U zS&ubE6vYJYcp#?pVcM?FN;90vecnjr$1w|qZo>4;jvsH~x6rhX6Rb#}S52txCC5F`1&snA*!S!|=uF4jV@m$4m`{JwMBq*;asnhn9$dL@B|&oY#?4f3Q)$>^ zKRiN&`#R+WN9Ld!nlvNrvq*8W{^Wns>|S2!DRV`bf7ZH@Z2zGVNwpl*Glsj(u zsiUc7*Z^#6pxBg}R1##ER=KVHkUZSa#qCe-UQf>{aoYDD7D1u$+D4$i;s%}S-HVK! z{E1ku$ilfds|7~s)Gphv$KrvnA_`-qr;-X zx?fy)7fM6XDYN&+n8`?AyUTfF59=SM6oQ z|LKC$x-BZx%?kBZbM3ySVPERvng!9hzI)VH?tG@OyeEkjd4M}r<}%K)Pw`G590t)r zmS=M(n&kBNrn6q+)4&rPt@;vR)SUi1<<%QOkC+=6;$(vs&Dj>|6U*cm`$%zjT2n0W z=7)CHfV!KHW6PY&Z_z6K$;2uDY$lF-v3lgTm%8!mvAVKCPwC`3fIhFj533VI*SvgQ zU%?DUgUYObi&j}L6<_-zcqYC{Y_c8ge^b7Ufc+-e=7%Plr#*(I~0Z8+}(E-_(AX7`WTh(7;><)}Ir@H6=m zsbzc;Wz5RGn}|WT^nfon@X#BE4;Lf`-v=MjnJJ_D6v$gIDMH9W^?OGtSNsi3%+IjX ziwp0|@aF9BdR4=t_aZ8%0%Z+yWFG8OZz0dsKfCE)m7pp|zmRmSb~FvS?|~*P(sSWi zdfDK6YhL9!)3yMEFeE_n$gu>yd2MDstSXd}GVJXPMsj-9{Nb=Mp9{ycIqb%hP7CJuXk5WO5$ zPg*N_XqvbC<$%5=ELFoO-tKG`6X`7_v*>VFd6}@I9PO`|2KEnK{C|wSWmFV?)HN!N z(jrKMpn!Bp$A}0hjR->zh%`ud42X1hhje#Hj(~J`Ni#IkF)(q5|MR@-uKVe|i?!wp zYd-zvoU`{n=j`)OJcv>De1ihI{@jUcZe+!~>|Rn_UrN(`ml~K`;zxKx@pkf@l;>6% z|5oLwzH7?N}9rcT7gXpi)|;lXGG-fe7_8( zlRuO}h0EQzb0&K8%lwU;6njD_I^6&ALkt`?;wW#vz~cV@FqOY7_=Lp7OVo`g+{?E0 zvea~$>}k@BRWPSfXAxB`)>bItsh~v~Teb6UI)J4ARpgg!z-D^6MG!Z!=4g_jnri49 zh)L&4*3Y~b-2Vdcysm<)e9#F!WmWWvf;dz*ri2a7q5|gxO~Dkxw}&wZvW7xBPfM(R z*5Ar4{zALW)p-6#=(-%09l91sYn%mG9V_j92h?3>i2|PmhkA>>fu<5IS#PhCd47vj z$<1h&mwxq9A-HCBi&Rcw|DzXCflPJX=`oFAq3LZQhzi96=>7TfLvV4LpZH$;oYtGW z3dwiKCA1h>TBVJ*yp}EKmcpg0&eOj4LEkVVdxrVZS5?pN|WC6XcA1T+VP_((6S9lqWxHbp4+@Lq69pv(%Pf!b@OG3?WH|=fW`x! z)aVkve&R}>VWK`Ul@($Bw7lyHUde7#A5MK(V2W0WsEq4^o2a(dnl+W#NV`8R@5*rK z;LneAUbm#73BiGane9|vaaXd)*lA7($Ztkzf3ND!x$@lVu{H@wn{Ba+uW~13Qa0S~ z!1xYFID3ppJ zv`!?!+Bd7MC?av%cF;n|>0fPk76rj$pG4@CMri61$)6r3(fWjoSpa|KU(cg%c%f*2 z#nKUh|ifXPB7pR>_O@gEkK6*j55U=u{Q)&pKH%^Nl99~r99F!BQ zgJt9e=#p1v>jm6qfBo2;tyK&syrAtFwM39@i7nYKf*8jL1M^}v)vs!@JYuwkJ-2s zXhGDPZ8FTRUx>`YwRALbIY!O%7!GlF&uFo<8K?!psj1z=y+L@(Jb14qO$xmI#`WlF z&3ugXv%V*%Xm1Dd@DW>EsPq6BGS@U#ejM)#+x689x)cd^Xsx<0wo|<9V4wN}! z=BSM0?O^|yhPLrUVhlb9z*y#9B?zD^UzEbbk2q#Al{3JR*@cMmX4aBDr-4tHz9?9~qSN0el z4$@2y1#t~~>}!)&cz;vN48D&p-bkh_M|q4r~B zuOaoQtSyqo{-P7(EPN5-zv6Ei`DatP`XNl)qha8kTb6!CF=TA5rR@hH>P3{>hdR{j zz>gX6h!fXn!1bzkih%RZG@28)<~4~k&nox(lr~}Qq-amK5GYuSfG$wVByXa1cq#ob z{92`Tn&98`hQ*kVDbSlp@HSlSg0qUYwV%2xv=`^ID1Xi5<1iun6E#^D+MR-ss>+&R za0jpgwtg*H-B8yOvsg_e7k^&3JoR`eoI`pb?0tqS+-m(Mj_O62}U67B8n>{5(|>S}{W;xT_XL#3Zj8?GW4q!Cb$6bK@H=Bg+ z*Wh|}D5)i6vxK#UWTA4ipfw)e;+<&I)ohujpLhC}wl~Ag2&B2I4lYr%_6kP!teI~2 z=bGao&~iw9>UyC8z01+!+u*ntoB;Q(aJ*09OEzu^O+@>O%0;L zGt&il1e7%>2p>#@J^Cr6HyVzG)V=EEU{QpTARDSltdAz2XLWu}&q!1X+!?Owd}-p1 z-Oz4{1-T|mzv0;oatv<5-RFS`@pKMEsC$}zo%P@2bKzW`!O+B{^z8a2-#DclTZb_7o?*rZU9(;GZ;U@zttgX*W|I}n;^k**MOPvnzb+y#_Kpl z^$~c|CEeGUYvbp>egopRuR=J@&BP!cLE`Z6l8{S@4TTxFdU{S=UwhWt=O#c@7Juen zp9O^`z#{T=dhmbp=Nm&b;Q#hKowCqbV-;kLvZg46dllBV!QpZi~qTT$B12kGE>pH6?0>{9}oQ51pqLa1~n z0Zn6UAq+hEoA>rYPO*PT$t-mm2zqhe@^qciN&`GzLo(!sV3c9Y*1$Ww30iWq(V)FPHrBDSjS^fe799G%!g*tjAU-3iQjZMQp-()7+7q+) z9>WDRTGVCinpx%Xyt48zhXFSzi{{3&m5(YoRV%|n)Lz1T1oS;6Q zV#MgRLeYz5(4G1s>c1dcp`1|uijsK9bK%nDfKWQ{_wRT_GZ`My5NCL0fcY4TujwhJ z7-}j~u=c4KD)xfpvJ#0&Yt;dX_lJ?hmr3b?f zF2<1FLBi){+|GLDk0V(#Q$?LAQf)~3tx`Y<1hUn&FkEF;_fQ&9SPg2NR<>oeZz;`u#8XdxGb4~BXWH5K&kS1sDa13vWp927_nyb& zN7A5YNup_5Yqj|ZfvyXACPI9(d?6V7JEg+kgfqg)fX4Tm3;EJRmN=aI@oYUoXJ|8a zY8lHw>94^ui6%)GNp)noAw{&U_AS_e!OG|_gHKuvdh^?c=FIf!XurX z#;AdnfkSJb*F!Eb)jl< z-MTZgulepVGtphEzY@Z52bM$(08h2sx|>yc;MExPQ!`fT&05b5Y`IqkgT~79oEEEb}zC!WL22(uJ+$ zV#u2Q7yTeO>z4r&68UHVCgIQcE#4kkT$Wvc6MRGM-5A)jZA0fPs?AEO4%JbLIO(`v zY#I5BES2N5?$1~x!YkS7Pt#{raXw5nTQu95!}H}dtyfdgOT21YneyQ=sAo$*iLoEe zUOV_v=mS;L{k|QiK$rDWWGbyZ#dIMX1M9^eyx0Vin5!u^=+Ji^U=&|1r!~KUlsY{i-Aqb zPn{+!y@F@syS!kq6}Z(+;J8|Za}hbAO?p&69cg~Q{5uXoB1PMf8#Q{`i4&uI4SCze zkT^!t|E(UCh8RBryDufsfw%t$3GOu|h#^mj&7;xp^mEm;xZ_g#Yczl^MI#z=y@*DG zrhN&+GggAbKh6?xilTsDW^F`2BW^6*J~|@>6h|gCfA6k^>5Dx|NhE_&(118|DGrIea)I? z{U-3{bdDSsQiTfe;U4%dFO4_#%--dq6|JYW;+Rix{42aw_f5YGF&H0+d2gKfP`?s? zM-_gd;-(gf{PCt7_uY$4P-aLJ_Zg~7$wNE6cX=|niqA5D1o zM!7*{dX$J--uuL)vqGy_&!oS(2jVgO1A2zEK7k4y3Vx!2Jte{UY4`ZulmC8q(=b9^ zYXd$-uPoeoOxmq+I#;(0eu|1os*mUMpZLCM7e2_$fN_xg#xm=zKvuLsEG)#)wzHh0 zPavzBLKzkY_T@V|n@lKH`*s1l$N^qpjjVx|avC6`F)wU`P;cuH8mOY$v_+&jI@y6% zful$ZQ`%)!t!s3pl7TESplcWOwtQcq6!?l|GCiCQEG9m=HF5@whB(0~Ai;gw4z-|< z(SW1o4fSpKuH`QH=C8L~ni+c0F^_V$Lc4TIrS#%_wNxatJYlM$4thbT=L|g?ICM8U zzxpBD;A?b@cifBM5HswzJgq?D{rV97C43(3>_>9`T1{8X501|Ly~-?9sc5LF(_dAJLoKPYeSQ}lriT{zsie?BL@(uLn)j8efsdJ;LS8-i zC1ETLijT)omdk6eyJW))d3%V&F|*s^xbY*H!oeUs}MWi#9u+muAob z>g94Y6@lAhV?SV=cnqopR&#mOf0|1($@QJBIbg&UKb;BJ`#=k$@`@lKvO3&C8*dnn zmjwOjSwB8F=l;hl`;)-&e!hXcs<>ZD9%G+4Um9JM?W7~|*!kK3x= zlkhMlJ64DW_>Sak**8BEL&aSH#862WV3qz-Vjf9zd4VNTmI0XBoi;_@&Suy*FRP>ZBhATlaJ1x*C0U|&vAoy($pqRK z6eD(ZSS{gM04~s8{a6pm$wRaMw_?t0#QM(iU-mD`;Gl$*%g_kbbJ)?W#CG58>m%9m zvb|S19uQPe10kAIJ@g7yWb6r(lK8uSSJtP_IM9PYe*dR_J0j4ySTNY37siDcpsqphVx$x*Jx>m5_ANGW zzEV*&WqiWZ-tsd&ZuP4-rnqps6mr&$ro#@ji%r4}mmpADOwTX;xpEUh`b!Jb> z_x2n%yp|({TbG)e@_^cVY^%)p>Jfw2Ks$vCmO-S#HRP}2gvd>2i3sbc;1`lG@w!FS z`C5c=X-+UYkm^uS05yuj48?h$!`~nxI4Ma!Ypg>kJ7u7kVRK{mmywn2CvVQRh#%1S zrOrX|s{(||{UIRDL)8g>Xh;!~-&KG#=1RWq->`gp=S+n<>X;uhyFbqPT(mgXPtK+q zcQ-meKy-085_d5h%$R%lD{@+#l_G$u_Y2sAfz?)jM2j{mTa^?xw}ZwU zW5&o5?ZuL{tzHRQqBqMUDIWkLWeYzVqUR94Z~w^5LV0az*vB%|nr0XI8A@*7H$XMW zRX$}B+MW8E0;@L}8@;?Jrq$tmbgkYOEdcMz@t2ty(x?6a73yo?@2(XPxg^(A?BP71 zlAph9Olo*Tyz!^fOIW~?F5O7N>-Sm!9&%cz@NhJ9->J5E zRnaw0V58Qb1IgFvO?NS{`#3FW`~1J_tmw@Qa}@S0K21N@tFpNhZgF&_B$|5-@!WZe z@MhU+MYG@=Lk6C zm`L{TA3IB1E5#WtH}=f>)0nZUVZK0|#wqko>7;lCR!T0H(9&m0 zf}JM6bFF3_aMgq0vz@Q_Gw-i{5?VQ}YIl_T+zxqk^ByQlJ9Z?IN9$fjPW1L~-*@e8 ze{5N||D5~|5z@XsF`=lh(N@A`a9Jtf{*T*8K~r5^G$_ekNFvpv0cF(c~ffiJn9j(BZN2ySB*!+hQ{qS}0 zlsV+JAW_2U2$Fubd+;Las%ggW#s6|M7=6hsQ;{V~s%Y9vcP{uVYTDtnsIjSb5jBFe zxCYeHFQO8m6-_Vh*CvaoSg(E1h_M+JmG5>>t;X{pOQ8=bh;Tbf0v5EyUif~VZ-A_q zxa`sR5gBIn6jvbgj<1nCum0+2Xgi)iuI12%Wp6t@3)GHY;Q{FE8zG5KSQ^G=V?hXV zBH;Xs+aK@=L&<{a53K@gYOQqdiUc%}aw~P!38??_pZ*{}5$CGc%9$rlH0s zSo1mepAD(!9Ot>T}N9QpSX z#kDutp`({tZ5n@~tbin&9h~1>tDAq66uZcG*2qHS^9pN6YjN&l;lJ3luIA_ZMXk}3 zhc>oycBTWpJ$sj+{b$bR<`XKsxF941*6meuY4G(jIJpQ)5oOsi_w+U3?1qge2jG`- zY|r|D2&a(d_X)@L*MJIwWCXAHuT{KgB_rwhljIY-@VuHY$`s{#m^00@FxwQlGP0V5cf2msiQ#VDHD_xHos(Zop#}C zu%7%VrG~Agc;sl&dt6%3W@iLxu1c-oa7(&XO$FwuKD(h3wGPS1cf;<~SjN**A(jK= zpF{lyUpe*KZE?)D1}0ohUs#WD`h}wpD__SRHrShTG0*|p;3=J;SUmi5x533Ve{Y`X zZd(BPN0WBXBA>nh?D^!RN&LJmAMoPb!ZMZT>zufy#$89h0=vZB&Ooo#K7PQ3@WG@l zBTJ~PPHqAvzJeVa(Y#?D1?dZQe7WjR_-nBEk@FHnLp$K)@$awY#D}W-X)T69 zx0YW9_Wr!AS8u0c8ruG(IzV!-fQYzOFyJp?>c&C7S?BtO|1vJMEeHKHfp?XZEVbyY{nkMoMT`l0m&YP!u7Y%Q|W! z8Jyd9y|fK2lC6Ws)uIk^!=LXky>wgQRNJx)PgYStN8A3Q`f1%4v1`LnF~kv#I=xXn zTko$Yz#WqHMi{^+!wgkac^hxk<@!nT;@11L90uYz8qC~$M!6S>)2*>gUG7>hNlfXN z?6pb_mFS_th{kddTsZAKb#OTEe$tRS#zZ4H)hr^O#`p9Br>YLzQ1 zBc|Iu#|zRNW>hnfq68`XsWBMWPMQ7m7kcwa`ARS`H8rh-WNyiq?@y<8 zLkhZ2cyip0qTM_aiWra`or1vB z1-6%7q?CG+`D<~VaqLe@g4B7$FcVY>coG>(5CC}F^BZ*NbwrAYvE6VpMy1~`m&HUO z=W(g{k)db6NI=`oZJU|$>fM6&%#=n(R;cjC>sXd5t%bhiQEyuj+bygywyjQX3tRf< za>M*dyBF?H=Sb_+RZLp@vU@-3O+~$#R%FX@=Dl+~`lqTjvUai3??Rypgx1FqK|e)P z{EQ!F3#Qs)39ABm0t8$+X_{kpH5Wf4zsM#jK`WR0%>IaRO;8Y^9V$8J4kHmrRI$P5gU^vzVqUit{Tqb}X^=rl|noh++1gLDSf)=o_;&Z&UsK(#qg{ zgGAN%*Dy?_2n?xCGJ+ri<2KvmcW*W~%FSuF+5?Tbl)lkFs{6$2dnnwGk@;E{%4Uzr zJFEu7$sIKPc$oL*Ij6P7XsfhJ)-^j-eV`^~G1Lx0BQj9x6zgWS^HH3YFX^njN}QeE zYe9yx7$jZV^QLvF%P*9`7dFhQSR4hPZ~4Yq4-gkrP3+MuWu|tGJ9#B!n1-u2J@a&; zWtX^(b%{q-TABR6gur{sb}I6ai%sDsfq98YcyYv3{kYV8=^0}#c0eHCXLj01sI$_n0i?G(w_SF?)hNoGq{9W8k-(AAyA zX(pd_4zpSv{zR7c_W9JXy^90=OJejHC`$)4(<;SRRV55*@1Us1ZNqubDT>eAPyv#? z{eb=f7o4m@LDL~AQR=W^F3&{4Xp?|39VWWQtXe&hp{++iU@60{akn5A#(U#;k60f) z`AX;!CGS#TrjG2BjN}{xPD%KmJ@vV`?n>NpLKti(xYxs5^OL3wrN>*@)GEuk*V#{n ztV72+0i}4iZ3cs%V2GvZf$6Jnp@Oig{Ab4E0p5dCy;job;pXk|rP77Fg`|?4Qf8o| zz!=uIl^4UeFJyxYMw=I&(I1djas~Y|>hLP?L);a#v9#1c0<)EIl6Z@Ckp2ck1mZ-PhkbM=R4;&hihvMI`6%Hn8UVB zUZmt){(6JtaHMQix7_m7fzzyqiDBcsKC9q2?KjQulxJ1 zqX8{fXA>_ZiUY8IT{$vl)ZcIi`*yDFY)xWVO;YZ*Qg7$Z7^keHWC!NJRC^4GbOFap zbgi#)`X7%_REwU^maQ_cT@3cGyHFCe1U)x>rkE)nF$Gq%A3M<`-j`%28UEC1&neEE zG40LJTTf{8Z87iy)!8ekPP6^0qbg_DooJJea`!PHr*$T5A^WFBYKl|^ezcz^|+ObEP3>|R6mD+Moz@w&| z?uCr5fySZit*t)0YOp(J>R-;V0glSVA^}c$v$@9MdF!Pm5o;BUvkNCK!zJq`b-$vI z(lM2l1REt;j}?v^7w&F9zRYW9edknSEwmv2IdCNvH>US@0M?WY-oKo?Yv`YXx(sZ( zZ>?uLE+{O`)Ja8^s-5DO^gJVB}N;>~OyL<30$UiO}RGKb7Z_FzsTu~5bsSH~s9sr@Ca4Z0%M7et(TD8^&J5_laH ziCWz|J4sD$oI2fTE5s-#{OEhhf*_L{G z=ggBSRedGG5i)EN%nV6MQiG;2z7%|uHBf5@+iO?md(EDG12>KJiE++g=YGg9`VaY~ z*-&KoqeHwRadNv2?Kbv1RW?#Bb1^&E;ZyfiaS(9>1+TG_dZIEO+kvr;RqluEE1x{G z%sp4o?I+%VqG5MqEioFXgh=*Bys9D^=rCnszSA?rXVu-|_6Dr!tK#VQ=j|+?()W_n zqm`14<&J&Ct$pRVVe#2;7Zq2oRB4!8?=w@2_^F}{+r*}2ljX}1!SMq0=`haGEQuH{ z{F{B)Zcd2cFD)E?#K7~km%m+H^%4@y+}?LC4krDmD*Bdu;snp^4Tjf1wBFmOX&K6N zMBXW|Z0}5UUNauYq$bD+pew|4?vhKZ64JT1F40JZ9d-o&aW_hIUEp*+a)SG`S?$Eg zDhZ>!L||)!P{%B(0jjNEAT&o6_pRfKalcC9#6$&nMGP0zpCI)4UZ}dovjnzl=XQR7 z59|m%V>|wh3P9n~ogq!usZUUUK3>0UG2E8!-E}4eq{%;FdBKgT>J}v0`1-FLiX5RP zw3dHBil|hral`d$;>oO6RU_~_!W?g4yT2TIp+`nz9C+LjrZqA@rsVIvNja#-knYg@TDV!wWNE*KhISEBF} z>O1>UKY1iJF^vRjMXi$L@A=J6~P1l4CnPw<$^}#_Mg% zcKY+=_HS6kn@1eYR_aWZ5^6ZzQ!!3*ve_KY33PElpAY@uBEB!W=5FGB{ZaDP$!pta zRN>Ut(8N=wJ)@d+t%H=Ih#G6Z9meJF7>MbzwPwqg@PcnN9iJ_d`i60n zI1d$d7820S842;HMVq@ust{*7kF^LRBhH>H=<_3I%HKtzpN3@>vWejQ?*n37V_NdA z9o&2We1d-!u!WH536$yK904>$2IaezpoNq+cTmP*lcez8j^vx&{l>=HopH}<7?JaY zcKzhFQ+`Eq2w`T^K`nPQuW)Y+6LoI#R;8y?gtc^;NK4kpOJ{^&~UVqA6b6myU0V^8q0o zv(<+j0-gS()gOmv^Qc|Ov>wU(L=F&Ra_w>(6|m`qS3fF)zw5P1&GKnk(w+}WnHCKt zxWP}vG+EIXo}T4f``lkMdL>tv6c{#=0^D;lw&+r0FE7I9Vz1WObiQ)HHC(sb|;xU%iD*y{3uumL>O1`$LSe z-GQPQ9U{*Z+WJ8KkpO|KzNP_-tSeet)Sw?fk|R)efqCuEEoUEy9~pj@Li%DAyoJcI z!@!E70{0M}A<0e{&yYXQ1f$Q8lRNhzcD_f^OVS8Jk%gSOX67b0Y~{w<6`nHQE`pQRG6mXHOg}vI`JfNk@%>Tr7RXH+y;P-lN;C$- zlfw&r8iHYnBaA7IY7A?VxV9t3=HUuIe?pj*6J7!jXPMZSUGJRb#~7|o>fhUz7d9!f#uGf!tln`%2j& zCyIhHxnd^$LqzeYqzCNP2eXE;Zm7%K&g~k>P5buOq0MPAgG4ZMT!wCBi;+G~*d1^- z#1h;c_nWaN{CXX{UX5XW37ABcjXsjKds+8A8qmk+jNRvbYqF{fkr&hWz-bW)`2x3U zG%{6c`a#iv6oH`LBVv#-uFOl|25`602%utNE9W<=4+hyo<)OT}?;*9O3TU4NEL_4K zlJ^@Waw0uRbx$(;x8UH>pF=n5*ZoW`cm-Kx_9vXlWI!qYlMp#z=fN!O*IIx@A#{+* zY2@S=kJ^QKJa4V)GCQbMo$u??QHx6g%D?rn{>S#=1*!_qIVsGRs4T)~eAm~$DEQx$ z)@9=G`rW-x&hV+ARr>TxeOMa93$6*>2VPvCd?*jYr*wTwW{mHQ!-okdt+4r?j#U|G z{yN_B50FXgZKzdbd9~uJJ@0SstN6bPo=;Pp)FpRME(>17(w*=PtU>3iHRSupGI_*@ zOkkdFhKOt!^#L4vLMgc+5033#QD^4I`zSTBPC!NSnF6&UsP1d6Z@wEPL_>l?pHWjW z`Q(5?n#SK*Bi+>_t+=`-)t{pADTsQqL3mWgW<1u3%;Z^8Rk%9doFk0&B_JhM&E^N9 zQgw#dC`7ju((RiYQh|>+_JyNTqv8)-bSAMU( zEns9cIlLx`6rz29A9HPgB05J^X1?*99~pTA@j%Hzs7^p<$j9oDH@q}2Rv{JO$Qv~q z(lg}B^}YLWY9qRhfPocKEbV&-v>dS=PMfI;4f-7I~9vLH+tReiF?p?ZNz@^NO`8eCe4wF+XRo_A%A8lJY+ z9YbkKZzav|lbLuzQ4?^;;h#4+2Rd-tF{Re9yuHC2krahhsBg6One;oI-0}yM0_0vG zIwvT>f8w7>BYLY;Rjf2Cj{jJP-V$5D>8n6A>~Gp(?=!W^5(OC}~4^8R)#HsEY#gtPXm}Yr? zp=g4>ub4s);VLGKq-f+V@Vu}nT&!O&fr?m{;(x~_YOPw+m#nwQ8a$w~_5CYRT~qU& z4{)ph?NpQDubJD-LM#1*B0-~W;?>dyA0#^%OaDGC9;gb34Y=JuS<9W`UdfYAZ?l2yUW3XkHMST;)k5VoZ` z_ZzRHzD6)?mvNl2af3S$tbxi$;3094%b#^G!IP+b*-+$3;~}cQX+opTM$atiMN^)( z^GuB=l81YD&et!?BFD1Ip2z@1edzr66-jL*+QOw2W^q0tbdrI<3+MD?hm0`ZHV*IF z`~+RBOkizo3$nuu-KU-ze%6MGNH$LyT1?#?7!11SVEu4zFiIL11)5Q)B_*|UHF_o1 z1r68y5&ePFY8>D&9%{CWQ}Hmw6Vn?$Fi6>lGM&~58uy(K zKTkPH))rsxV%$~66bzTGfo@Tfe9%y1YwOMdmqzkaM6mqkI}E_&nt*5Nnc$3ZMq zlX`+Ku=4bFRG_lN%&539)j)n)3ZyTvciYEV3%WQe>ekQQ;GZvuB5;SVuw520uz_p?J-&!9?B z4~!5Km5=h~yadm}3Dzp@s+dm!|NDn({EbSkwJClP=&p=bn4%d&uN&P}sxk|?#vE<@ z=&6)RyTP3?x0wJ_?=Lru@^yYr$QAs^*ix5Io2m3^=OmUg35Dhsd>0>xabmM!;m)7; zJ&{XO&|5P}sHU*1D=Kg?EZkh`WsccTzh2b(g$xEo1$UX~pOvmG3 zgxwH-+5Gs{@KZ1OpAY)}MvqR;dwKh*Ws9C6Qh81r=p_9?7)W{8jGS?`hc!1W@}_QI znL67D-3iFfX;{MjK64}*OCrvn^;1DairQ0CA02OYC%2)%V-w&a1KW_T!C zNUZsc212>c6>YN(TZtBS-s$%z?MX4x7{w;ysFxXH2kjBxl*35>U+E?x6Nmi?=^_JFCL7>jvKFk#}1LrNGC;dQ~i z!-zT12UDu_5}^@iDQOtyk!Qsi6|+&+KNu1Amyk)+5ayg@XtUN~D6$v}K{68j`f;9J zU)mnnIARZ+kJ3sAJyVDT%uM1_tR7udb01b_1rsx*;1W^=XZhS=-a{>~JpIPhQrMzx zR<~jh*xc*H+8S|B9UCbclBpXucazHQvs2N%P<%S9OdLHoc>ABo+{b2mwwFRCbD)`Rp5 z;W{v(+WwIR=MNwCqWKt8e6!hYCZA^fA(Ll{)Lpjh)R;ZpHj2=IEFfbC_|0Ki}ew z;$Ij~=k^RgD_-nAl&|{2k8HkC>bQLWAevkPs0AlqE-j*yQgLPc%!@ZM@~=Y5saPU^Jb#p)fAt0XJ4ZOu!;5mhbEl(>*8tCTBRCElVRSP z#RM|djEK0YO_;QwEc2*4zhwdAG4DLL-!1q4ZqR7wh^s&KG1>A@|JI-S(|Bp(gXA8% z>Q2li(GNJW1#few(o~7H4_@gF3UXLtB6El3x*E4BX!1)kn?@R+EsNJ1-0^VN56B$u z&dmim%#2NiFIlO5Acel|#1XMpHQ~xIKyV z;2Z|e6Z8tlfLE=zNbUoeS^1NBg6u2_v2Q(&Nw)w?FPa(aAAhrx9JVg-diD^Q{75G2 zT&Z<%Bw(Tc6ml96YC`sgtoG#{qh2>A_oem;I3I5N!VDQk!P3VlfF|z(Z}HW2H7crV zqW|0~A%-*T;Dh!vPKTx-4I3%5f8=7#hTtaQ`Oy{^QO8-JgIuYE3wPh15`&nCu2Ld! zH=G2zu9l2N@jK`O8fh9-sRc0*0xO-g**IB@CP#csg!j`NzPNQ zmUF-x@x(&S-YH8fg<$b&^zsUoCtWvYR?|Zl)~@wmoW>)WbyANRjC?;8J9>Q2Yo?mB z*;;HyF@?j1DF2u0`I6`E;%Blz`5F<1#9|xF7lD?ZO%f3-+*uV-0X_$w*hTS!9tXKT za?%&E&5tt9{8Uz3@i26Bv*~ty1~kD3d>(e5b^o?yxQ`^7)(z2=VJ^yQ=~6)^`m<(& z&(S+JgA7SGLanD)B`XPH-!Czxke&*gtu%tWsQC8v=jZi{oGc*-T~HpHB48O&XMa{< z`Jc{M8Gu!p`8|pt(-=(l&}@K)MN)z5RQT2h2s*$1xutcB{b)(u7IqW!3Gi9NCC0`^ z_DX!(oIV^)+|fFVDV*$K=49u_^}52xy;)kgkC7i)_hjXUy5Q}mIL_2*Z{!`~cmREipiU7IpYI#tNxaeCf1N_Y>(N$!K#uQJMAQcN_S zJ>{UL(_^0Upwt`UGJOpx@)>e6M7uGhwYsf1>6e}5QteM4p_tUB^QLBpch6H(=3Nn7 zMdzOC+4q1*(Fc9&KmA(R@MiEsjj=;$TTpRnb60!hKb6;f^YL$tp&lZ3`+Ge63u-M(!Dr z_m!fcxHqlnL%p(SJie1l(bza6~EsG03JqDw%te(ym&PHNOjkB|Nm5x%c^)HmcF$IDFkGT_g2B5Wi5r9N__`I zM76!KU@Gm;?eb}$AVpmcy(ygjVVr@0OCb2!Kq$I8{&=J>WAjiHcMklAG)}R2mQlGM|aG#-Vr%xdZWZ~B<^#F)juFz3bj@}UNhbRHq*j?5;? z(Pz`+{g3^$8P>j~on*x3Se1sj-Fy{~^KYFbQ{r+!VQswzzRIJ+-Lgkw6beSa;Q_+A zrnWtOw3w8v(E>d?$jwPwPWqLGpQyE2n5f$<=0?eJ8BUvwA0CxEpJE}6&c>8XkW~Ro zs+eV%QLbi_q;|#Ih;@0kQmmiFXCtC#EJOi~4BKBRL!)zlRmND1r=!{2!d>dN zxkd7%=v4Q!V&hhG=07!pUvi~B6yA$t{aH^gRW5IWf02G-?11%wDU6$AdpO$!WuR73 zbt~iefJhRR8h68AT~7Um>efN>=uEDj~a+y~%bQ zdvlUdW|2Kk$|`$j9wU42ad51IW1qvpan}9xyZ86F5C3@h3y<@DzhAHCbgObq-uY`eknWz#{5%__o_)_>x=Dz{ZHFgVX z9m587%nFmTc@nK03%@F2LuC1P!A+e_^Zs{@ccQbKRMw8(^ok{i^1IE76XcUq?LDbk*pa%td$}19x{8# zLVBToMZ(##-?pcO$wwfdD5`*AzQli!4M4oy{vlqA1>0pGiBoi8eGi8@|InsUU;Uth z_o3HZWi&Qt__%(5s$3`df#Aet8%D=QRtV-%o1o$`m!Vt0?)&XVOwLvp)Hlv+EJnZ_ zb)PRz-aOr6onbOLelI>fC4l{UC*#%0@Dg;J-JwKGeNbQ33qTfTIR87zlg`sT5}V|g zFxluI2Bhyf3~SfnDluXW>}k)so3DOj%HPch@RGRs^qKEHJ%u&k4z8i0pj>RXItB-mBoLd@mg2xX5QhiLjeIZ3%S^blY#1z@KxBCmWhwi#G`J z%C3&iC~q<(?JO1>nz#%}j>p8@%4gRd`4SJQJaLHFe@fyIwRy2USL~1x5m@VwS>0xb z8)FK8qAbS_rTdu}yuXusjw~y?c>w%{tVTFkI2&2Ao_)Xc_kd@N{BLyxKsV+`wBi1g z7(AV+@567hV;HML*x&G@i4AX52zfFW^8j@AU}4Pp$`|<%7JT)m6S-k2M{I4fC|V*) zS36DB^22&%ZDV--8PEMFdbV|SD zLj=RbMQ8@VE&m!Rh+w$&IJcmQe@43>jwByw!ze_4r)(djz0PqIPk=v^-&qdZ%4Xra2|=VUGVj(yjws3r<8CXIDWf zp`?k2O87CL1sC?kz{2T4wJE6*MCo8~T8&7}W2PK2mm5*!utZ(bLLXWjMtZAX3&d|E znV3j{*LAhGqYqD5wxMe4es$#Xy7}Kuo!6wbY-c!<&T)H51v=R|Kv+efqw3XSG$QOA ze$rbz?nvCS!c9f3_1qa42RcN3w`i+`7M7zjhQ&3+pToqd+c@7--jA|dXj z55FXi92#Tq*U!Y=Ro?soHhJYXjKBkL?HeQ>m~FqFt3E3w$w z@WcWoFOT}OV2P_a=rD;BlN(5A(9SMRtg1r=Wf)mi*&8s0c zPGmJ_RmZ-*IMZ_W^3ob!_)hCLyUEelD4UG(-elN^_PQ= zP|*jg0HE^YpB6@irgdy?Q5GF|7D6RLrx^C@+}ZDrXlmh6hE+H(XBlJL2bD3|S2wb< z;77I@9#22|U1I!zVttZ#Lk*4Y9rWt6^gFx#MxMR`U<&e?iv4QDfMUuAu zOp02_Z}IZ`Y=j3B=>VCE7i2=m8Dzbcs`|>~WtYh!&9f>}pbB6$Zc#0~7>O=Vj0VDJRlKtMRN#B9sW-^0MYXG;_UHR{chi-Xsf$9RGZ1sxEIsX)i8KA)oblO-w_OdOqLNL}R|J z8@uPlNATj3w=LCjC=M%minz(7Vw=GnMfuuTDricZ&-*R6H`whOOnFhY5W`-i7CCA#xbvPvXhso^|(;1B)Ii{+zPGL6NAZti|&{;L;$kj`Gipk+~<{mOn9u z)xk9VhG+mSriM=Dw&IbXA7mQyUGo@6<-8S=KmzFhJ`W>xH_uqtAT=M^pw&mCMpH`; z9zQqQjTR4csOlH($x-LcT}Zg;G)H>mGDof1YecaFBu#l(GaI-2CoL~}gqc6f^x$$} zi&w^7j}cj~^)PLGdEm((F-xi(g*7}8Jvl{eo==e1ZCULFJ+(0F6WIKv-Up6j_;ugX z3$MY;^(XVnq{RaP=S7j8m9jN0VF1r`_OmM9csq#{n zT`xXT-w}Ar^(nb0Y`9(j&M=E3U=ffwhOA?6JHHp9VrHcuZ?EUIS1=s9;?Ey-ntuHt zM@3r9Gdo1GRJ2|}Lmcm}^+#chB`<|DtfjxZWtU&M@io~7P|Q#QfDP1>tXi62ke7n7 z(p?|xy@J+nc&VZ$B;PL%_0i!g9(!|J|K43r$;L#XE-CTh6KY#MgIq;ysZ1}QiG7!L zoVFnfc8p=3m}w<hfd*<5;i$*ROaEEqNbMq*u;n$L z&=Q$uY21LohinvsNNZYm?2=J&*y}oN>A5F+4KqRG_L<-h`dK@L*QAUrRo2(SD+nv= zfmZ$D=zaME^;8O~|F}G8zZUEJm&`nT9w2x4J|wQ(xl7EIm*jum!P=Tqx8ON(ywq~4 z5mTYPM>^G2=fNNLL@PGE3Y~_(0R?HC5B`ElGzh}Wi)uCcXWa}azKcE%GQZWTyVAWd z(+D?Bk=8%ob4j(Q_#gs@l&j-Bgc4Fx#H0&~b`nhMX%fCA9*f%gCsqN}-L#a%xj-wx&K9Q@2`o@hUuaXE4D z56vEQ_AnRy-psE+myTlUrmdOsp7MulLT;x7oZz|o;t=+^wA%RgmKHzBa65IWa!AUl z<(kR$IhsameXQgRhqhk`d69~e!b(yFuC%qSIU`}(81(A}X zJpJWF@;_T36MeW9wBDaVv}l+&$#k0!xK`QzKYE{;MSF?rQ(Jbl>?fH|a{hnD_uo&pSS()_ydtUg z=w3!xUs&?7XJG&9$8w(T75Pey(~pg*dF{ri1il-}IkGv`=!mG5Y+dZuS#9gDX$(#> zTU$9z?Ac?yQq(jwdqcf!$7EeT4rkMCC{eSR_#kFNp`@r5GN}`C)$Hx1m+y^yHLj+! zmI+=`U|U9pK0nvAEVZ~4C7kycKU(5^5SYH=4x_n&`d|p#CBqhJ8HrCQlSqeGT*d%WZnnia{ zd{yIy3Bz~GE4Z(OdE$?dYl}^VNXjz-2Zf&8DDLdCX6$YFMF1FwujwEP)sx6?QJY;q zRAMInWG{gkmm7m`JS)`THItfx$M;eee!+Ci^mnXJb{#5(_W8OkgE53iM+{#&b8;Qm6}p`;x?KlO9{&r(${&)|s%8WP z<&VdK)=p`?Mc~Pt!$btDMOKP1RrftYMXvj@Jqd67fujsQRxwUHeHewGL0Sn`9Y5jP zj}qqkicCJA`ML>_QxBNX)ul=`FQVMFG(wR)9JVcI;gysFda^1h=x7E+u;%Wj-!F>W zEO&5zwHNZB{q~GhckO`m=2?BN)}LqUKLMP5#<^kp($0%XsN_`_PMJfJ*~}REn&?ON z5~Fef_j zm3~Q6aF&xV``h#lnnYC1R1j!YJyLZ$Udzu$4BqoK0U4xp1R51(s8dlwv2|t{k|M^d zi5k+Wzas4R>8I1lbji8#JmcE<$CPl*8nJaT-eFut@%(cMO);)~=>wGJT?6?8LoEE0 zGH2)i*F$|twQ7Irest%KM`6*02zvB|tqap^4;woY?)2X|ED2|}&1RkW_2I83otzlX zg@w*^{8Pd^J?WA!4|p`%YIpv+bpKY!VR~)MIKtgKfff?ZwBk4TtPaBJxi{X6aT@== zf5u`i%rl{VDd45>#9bECU&0zkn?u0BRW5=olJuSI)3A!aXL>aTJL>dNui@pJZU2&@ z{1ra;2o)Sr0sb}ZZGA0Eg7@U*zV#k~xyQxyvU|x8Ev>68!`-}U6L1%7J;FEhI2Eo_ zl2$>46T6Jj;)PZbLN7v2gOC~&OuOwbMTihkT1H8gns*EVdT0yy-xS#3_9l;WPMZb5 zmH3Tcey}Ap@bS@_(P_OKa^zAtC;hC2_|G-5*L1MtL=;sk(3VEX;Pw!#0$izigo>fP zIfv}b(2(JPGjG!PajP<)B>H4jXahj;{1+|khTen6Bvqz>%27rJn^`= zgxYwZ;x;kDdj|>8hM%Ei(ftBtfuDmnWH-`y#}SoX*x%s>+5)A`p4*EY#p`!JZ@cWQ z4H=p01?_?w?cT~^J~CMkY?OXirg$SsOsj;ytnGILF8>kIRO9yXpNGI(R)}25If2fX zT6yK!ky7N#{d%23DOmk&kRg;iaO>GGOL(YbX7xnZ#w(RfmGqrG$l;gvUzRYXv&ya` zG#-CssTZ2^)zq)rHHLL1X!2+yAAlSbaNCRWi`aV8@kOI+d$a-!4Vy~5QnKk5oc0NP>)jMR!i4L!UXm`$1_0ERkgzuy6MhdL z!eT07*a{?yd)j0yUk@~}XJ&5BDJ^_3qkhhdYWKf0P7X`hpw#}f&lW+?a=NMrY}g8w zW4!V4#p~)Jk6yksMYj)s=GW^e^Es@#o`ceT6rlcklb5b`;}$CBi$b0G_H&D>D1W=) z;^Vs@bjp;|Xb(zWL{E*L!Mp1pj2w+?d~NZ8Iy@}b+~Iv`m-r%@^F94b>i^L4 zJgB7(@Vr=ZP2+M;N}f*@3*hpvJpB`>P0b#!dRLV#VAJR&-Ta$cDQ0Yj8im<@=;ENnFGcmg(%08>y+I3@*04g)9P>li){t z;s6?_O-*UFxq$!sjfT-5Cc6PN#=RfrQFg0axUNOq>8R z{u=$#|0o0`MHX-t%*?v|8N1}v!&R>)`0<^xxqo}t#(gOd*)pIpG!Gn1R<10?hRqtJ zyY@nt6l4-^0GLPku}%r&CF(WZz4hl?^2`VU)5?r~NcyYPGonu%uW$ocyk4;&ZbX{w zRZ0falI1;dqJ4sv9~SxYjjQbipg#9iI;wAf17Io;VdXElp3J-GGou&@a)a_ZE4OwT z(mk4dOFo%|V!A6Idy#G{czx|FZXhN*HqisZvF;OAT)E3yf+M9o9%S}<;PQ2XDtOs4 zst0swar$*jFhwMzjj~0-TD5I!+8#h?A{?P(hh?+k>82o{za5?{MXV==kGH>t-}iX8=GqJ{-mTsc2!v|qI07I~jY%y%Dt&dcl5ny9ku)8me>6GF*Ws4JlY z8@J3IvONa5-oyCgk-vR5pG3ToqNHniNleV$ZM!ww|2cN(zn5AlEeM!l4|}oSLg#vh ztLbZbC|{jYtEi%kcDzXvF441C`5shm<4g9ByhI&s-)sB*y6a(+F19<}?G7KDz%>)T4;5FO&SisUT)O91Vj2+SeaMK6%!mtt2M`ooo9m0vU7N^j&y<0+NwD zgT0k+b9HFGs@(ePLl|kF?#XnE)Suw0ptL=sna~XlR;4+Ro!zKsGT3Hhd-BTn*|yhN zZu{`sQZ~1$d7n^+_o+)gEXcQIL4n8fFzj=&-2wc7?7bET4VpWLpMSdH1P{R}&Z;K? z3Iy1gc!96KBT*PbU%d7Y0&OF-oBU?^7ul<(-Ua3%K`g^BIHzSy& zUC|eB4=sBiy1vr0E30SGLL8nzw7~G!=KaD!&{tLhjo&Gc1RrJ;&v37yl! zSD~bxsk42|&#LUMia*1$58T>YRw6kH=Dh3+8OREi=2%Mz5#vdaUH_R=s6uZ^%l+xVtcCtuBrlM?`kGJI)!t^5&uEpk|tEZ7o*6BC#v9L!d_ z1I(lCZ3)MJbVou9WK`4%!Y#!FBVC+Mcg!yyF?MRd#g*z_x6vlSk@l`SfMnggf$K|% zx5VIryV$R=e;Gk91ahKfrgH`RMgk=u@pJ`%mEJik*J?t4qGuQ&I!#a+%*snRwmKd?N5=C!CETailbX z)mCLsOGcnfccMV?HOo@J-8U;od)v!<)Dq2tr|0(U21aeKU7qS5N{4@05@rjRSbFZT z_I5nBRORF)iE!F^t3C5U+2Pu)eB#CNNxH&9sLg}#<-^Q09#q98OvXFxZ=O4#-hdth zXMNbOHC>6g!t_?9@K5cub7iR>yX*x42cD338mKedbAZ6m1Gt3%CzKsNrK8fj_vN|TWWPZ9$I@VQ z(U4Tz=kU`cC9)G@!_U-pW)}#j;_{tU3?c1U>hKWGE_0h_yBO4zM!~Tth{QK&f+BXh zC)iBZQDsl^&%oC*Rry_jRmd<}3CgUlx@qR$u7alNp@5PQt`sVoOIAS$#Q68AOZowS zG&~;$kE8$=gOz@XcZXm4$s>x=(jn*pOI^_U%IOQphV!n1`dnB;%yaIe8AQdOE9%0*1Mu<5Bp;l%ZwRx*nx|DKMsH%D~hLwe4C$ z%=z{Qdz>xr7PVK;ns*c$q|}h_2M?;R*)Q@L;tzU|RlU~36CqSXNDDs;buBLKF-I*(&LZ1@j z6v3ZkObFF4#7ovSDSPddh-1W2FV8vLW#$JZdFDOk#w=qaWSWO~W4?-FQWO)k*FqOP z!%MnV=YPXA5}rXEyy`58P(~d*CPxqrL&?_A;=zBSgWP-T+z*waff`B!742V}jrgg^ae^VW39}s)a8bryH_b0|O|($~STm3E+vJHI(B@wp z-(RuuFb0M%moRlz27FHtqe@*3eJ-TW54p0c*lgk$2XB9n4^1Blf43Untd%4PlGjo< zoH52qQbd&2RbbRUhSv#Zj~AYRB)#aWCNK*{F^;lGU0JQ_5(6f{`PO;ZtfL#MVz{J2 z&maf_7;9hr9QNA!H+hyU+P93iP2wJp-gwFSN&N2O|G2g*Iu%6s)?11vXx28GqH z&*Y_t8!PV>8Aa)0K}H1f)a&wmZB6IH>wt|7!?%j`EO zH7CzP{q-Y_^NC(xHI?E&kFTi<;0_X!i!sRO!cU_26PoA7afP#{+Rr+vfhq53q0#!g{Op` zgFw2Ll=B~}zCatEwe)^y!Mq6P)P`|jybjUIYfes$0oMODj>1CmRtilL6x+w6)&OD%oM9Z^?UObr ze%$AXS?xmaA!5bVRvbVMAWx{M6Xr%8){ zt3(sZkkS|jI_aI{5y-_~Lj(cti?$~{JBFP+p-llzdv)3)il>6d@F#J%7keoeW!&*` zn@Xhf*==_>f;p3LOvI`Nk~g7SI`b}NHAX~pMBym5-`MWLS8{z5u?%X6(S7_+M62Ik z1m#TqE<2m+M10)?bA(nT89U))q4Unro{;xzcXu7zbj_cd&GN8RPba{qPaxdTC?FN( zHN_(H6kc}-9QHK=6iB)FpD&yn>2?B$28uK}lfM){4|oqcHh)Lj>J%r0aHQC}w(MXo ze)Lm7f52oM%rqzFw>b^Sx=eHFiDtL&l)$AEQ*syNg#sFQo(Jqmr1W7m3MOt@tPilx zs*;5*@dIN40$fMPWJ;KTuQ`*zBw5D)lK|mYkzT?Oyos5 z$UkeylJDZZLiwk^VlQmuJ6~4#c!!#6OeXDm@K)AjxdnaN`V_q!H80lv`UG%PA!qg_ z>3kt(b-HbuYWWD~1!6IG|7Ok!3Q?V|7P|IEcIVEv*uq`S%UiDm=O?^{AWeWx?H=9Zlkyy|2otO*eDb^1h^K0o47Sq-6Vp_MftGlw#!#*-6@Wk%W?VNVw~tx8geO=Cw*c}aXEeh|B8 z_R%hO@az9z(zQMB-9#I>v*+Apl zih1;}lvWlYVeZiN8zufrmq(&a6aAXW<$8YXc@)- zOfQu;_xGbA(o2bCA7o2_y&$()vS5p zOtMd|U7&ERT!kM1dO3lOWPq^flXWH*>dbfrrl06e%%JLPzEE_Q;cc7)QJjI-4bsZ5 zIuL}=7TBn3@z1k!TW2h!*^NXOk5A5L-h&i_3Ycs-bh|wS4xk`n#atY2X3IDsb6w!a z7#WAnwAv`%_UM5@|HnpKZU1Xynu_@OMD2Sh7!w8iZ&cbDNQf||dTmD2k_YzzF=|!X<227oEbRKaocs2LOr-%EzYhS0%O0(`Ouj5CaIjAVFiH5)`&G z(`%Ckz2w4tJE7p8x8moiIz{OgSV=-$QPY^;#a$0Ji6~B#f*e;S{hVOzNNRLJCkrKT z{-isAJ7axa^SQ4G{cpqQM>F2kGoQYMd7aPi8^u%x+Jw<=Qd%sqS;ilvQ7oi%EA*#S z8iOjIcf$QgGUhTZJ$lvxy!0r_mfg{Mq6qhJ`JkF}%!a3K$S+p?k{W#}&aUFdxR{Ek zh5xpEo%GTmJ5PsFSbnx&H=dEL!}}6lp?!sQV-Np~W&$-YRn|a~R}$Rd7tr3wQsFhX z`e@Wwjlcd)fsPNJF>qY1;Zyjq+ILNM>R=E98~Z~C-QmwczM}7zm-%lOuqyUXk67r; zgnM^~Nzs;1KZvQ!KfEea;-)oG0CMxlugO#0eC6|>R^*T;=g$D>0;b2P;o&+YW$Nft zj;k2+sK6IU%14>C$B}|2+V{~nIn%?(spxj;3XLEG!w2;im{fs@wFECyqsYOLSpg>7 zrpJ_7+XNjDam=sp_m!r-M(H}6)&cK@n}~jk5Zr^8;e(txFv@ciy9=DPx9YDJ+rU$G zKqR`9b8yKQ5`AmKcEozULC{aF-8`1Jfm2K-^YVB*r?DSh=ytlo`2c~EBFWEpD2sUL zOUl7V-KPs;GReB?-oj1q3t^#h|Ab0|!`9aw=*E+D6)tiacKh*MYIw{?cCjSfYCSk- z#;6W*AM}~>Xv)fS2R>?j9W*7Ws!VuXgCr*?oL{(PjxsG15jOfV&D~((`_g2uY#nw; zQKBV;l=3O&FZvP}Xw=gFcb#DTsb}Gebryg>7J_7AG>*;?v^oi$TJDt`0rpI+5tu)Bjtq7x% z+Kt;z2dDc^DCicFDPQ!bT47w-&D}bj>bXS_yr--Ie3Yb%rMv9w5|x@H5|NS* zpry>i6vfg8U1fYvtg-Y^ny9#TmOndIgoYw{mxqY)7jD`0#6Z*te%Gcyh8{$agBvN` z1|vV!;xxqVhc7_4naD1s$tO!YihR)V2a^=_U&u>99Sw5E0C_V+B-=Y6@Cx`M)1ZIq zy|v#9>zlu1RGUaG#FTV)PwqK}kKkT_+6xPhFsz357N&OqZ};|Ig#HibFB%nciG)v# z%epmiJHUQjX|EHyrf`_x^C>JX+@VeV& zBFA|cn^&MkaUPs7@Vxc~HDJXh0go^5Kk=bj$<#F`1|xcjq91J^->=`vmkHCLO4Z{m z^m4!Xgs`o*F;VZx(XRgVzHnI-4a}y`P(g7qECo~MFxH6@za)lNGPZnI5f_J>1hZEP9D0jUE$H)Yp3W(h1F3e#fK=yWnR@<#O7;(~pnX6cO zF<8a%lFay#{I9&zAQnmZwWmLeNufhUJfS>x`4o z(A3jUolKSUPdrv1%qIFp_CtKK#^36sAot*6byq;Ey~^OjKtLF2n@l9WKzJle?)1cn zv^oa5qfV@&xM*)Jht>76Y_pn6hz?~)_V|OV`c$0=d-b(q9vrC6jUh>oX*bJftsu&? za4|{=N^A{undp#C)ULo`84>W#bqcqs$Vj$4@?DD=0a8Yx!IZ9^as^gke#mLTw>n}b zT!ZV=Vx{KZF>f)E=_jE}%>n5tQnp|BoYI3sXHs!=ThVglhu~jsZ&9OyFe&lyCqOp6 z#XlH-O$Qan{MrmvidO}o-rHr{9 z!dnht(-{%;TZ)^iAgIqD+#zbgCH=@rL~ByN%^f@msVf4ZME8^;of^E$enI z>@j|&_Oe)>|88&iDh3R_IvbrU_WY8t?jo9TmLe7;chod!->MY@2*dt2TeMh#n&J1` zws5PpJ2*Y7ce;Pg$S$`~EZ1+ExemN~F-=v>_#)5nQB|D7B}*Ub^L&Q27~#Q)Nv)oQ zl(p{tE}p(g4o1C1nbC$fbqnHg#slT{X~?ZdBj1=uo0fzp>P4l$+N2<3 zKlBTA*{90Uy9o2aFAToDSbUtioTGHOZJ|hOsyaSFf#~>;g6iNGFMdYW%WKe1uTWU8 zzVNLNf?D#Ua5>dZRY-am_-%(zjGxHwIx`&@loWAh!%6+?vS%Cod*bh&)Q#6-ZB>K} zymI38vwLg@+Qi9(V-x(FbF?n>Yv39_gss?BJP5ILwiwhby@*MWFZP_;gHEv|jZY)o zcWf_Gx&;n^IJ6MmmFW3FS3spzS1KYO#8g^Z>c3x<`DqIQ{HBEO5=(DRuSw6|M)rhs z_ro6=Okz1|Z;6d4Gs!+SzpN$%9=_*0Nsi+3bw9_CKm~K~XA+$Kz{o7Dc)HvCd%t3k zShl}M`Sbd%Fp2JqtJY9QaLx&Qi8ypjbrE12i=W}u_omkR~p zxq+M6eu(JV^P|FGJEt1Tu>3*Vv?)Z;pl77L-pcYNBnZ*#P5H);j_i{*Hn&sS&P}c> zPQT^1=%d?+OF;>wr~V zQxp@x&lN#GeshF^R}Ng_Ks_xK$Ey(8rHT3-`FRS5j-1i$(VGw#63+xRlj2_{n?9H*)qdw?HodmS zvqsz%u*KiAmT?ND9TX8SN6lmvCWt65v3ceUQfD<~nU0*U8h5X!(;Ek^j2}JWY6g>G zt@L^xD3^4vRIRujZ}9Y>M4q3;_L^Y#(#1USf%~^n0(L@cFR(Zjr@Wb#VA=wn^m|V% z4%mGiJRX;OyThW6Yu14<2RZP+jeXvGk=HgvuS4>8k8GOE*(BAA;XdkMK;4qX*|zTO z<9^Sas+2nZ(ns1Sp%5vW=ABi6*Ia@Z-=B9~X`es`3@LCcKtG3@ey>Yt8UOXr>+tD? z(t%X*`u*S&ozHUm?Z?y8J<+@@&!@ZgueVnnK`sMcauC!$Lvb@w0{pm6Nj3CmDa^@4 zMq5x@OIxLHM%p>O`*YLdBKjKYrpqw}SKejDq>kJlq&ivA?3$7aGPZ6~GGmD*sI>j&7rn$Y^Pj}lRMwyZC_$Bz2vYpSTi6TR8V2sk!V=dNF^SF~6%+^Dwr+x_Ge_y*IlpbzqY<+!NiG zkma8Ei;N$E0R!0sJL8O)sh03dj1m_W_d}w%GRxjqCv9gR_c2cx!m$y07tBIV#4WW9 zEyZO^ThHA~t}F_LtS0fOxK48zB0+0C=-V>Ru)hYCx=NV)1}?%|Ur0gLK{wnCo7r0x z&6sAM^BJ}>T7YY7kW_@U-X87{!M%u5&(kLku4QVy$DQJ#i79QB{@B8b#6P$G>F?I$ zZT=qileI!GAqb2-7BK@OzEYe!2cQ%IZv=z_BOQoL0C`>(b1)+MaQ!qoiZLRbyB$m# zOUQ9Wu$pq-vn(ZZPrrqVu6$C!OD)E!Xu1!Tp&2p1zb`JgfIchA`b>7D}cO zp80UiZ_)1I`tH}V7T+rD^mIBn=iMm8 zC0u(H=a)-Y%^r|;a)MTNTO>geA5=qMg}Nm|=0D`kkxyK`UVr&iC3}tizq*_P@ylKn z3V;+RA-b*qKj5LaItqxusELz}T%u1-Ggd}CdYtHzEv@NTl%;k6pAu(3=b8m0ROqK7 zFSlm}!K4Kc=;2^8Z2v@hhwvL#VaY%O-7NRrbC`3{mbnv<_rtoRT9Wb~$D9le+IQnF zU6TW!+26CK*{}@;A`o|xdH9|W8;AofoX`G?bVd{#@ z97he;@%rPU?!(zSI!rk4aYvojudr1!#^R3?p9_z^Fmi873=g1o5OrlSo06p7`VAiU zP^|IG)}2icAceeHN9NkyUnrWp^=TDu!dcTm&z!Ga( z<@N39X5-6N|HS0uTSDb=@UXn~S?C9*VnI=i#sY`D#E`IY#p9y;~q|2tHg;;G;|4ai8S+> zw?5~@&bJs%wD*pN7ds?>;|5FQCivU?kr@EkWs=-P8cmVKpI1_mX)iJibrQ(gfxAuF$}Ci9rY4ST9m(6 ztkd{H)_Hke7KUtcU`<;}KG~r$JvlFR6_2z63Db5!y6Eem4z=Z?F8ByEEPg)8%+cf{ zBxM{wRQOWG!k-*aa$!kA$gE~`7f!xpJAowoX6MlGKRr2PPUu9--1HmDt-Pw0?LJ*T zQK%H~JBNW`et2_4$X6u&_+iOgi=lo9?gH@<%vHf1g~|!y{!-Smft~k*D%N5Ycyxw< zjUJKJNWqns^H;7Knj1AE$3Dy2AM@?iQQqh(+77o+6@M!&-5i3Y`UY<{O*p!i2DeAR zl{4Q_z5N7utP1>ETwurL(8WyHg`AIxgXAF`a))QHBe^`dV1g&`k+~P{o$Z_ffj6#e zt$Cz1C|?p2XPR<=>49mbcHY>D8ypzi`-^NEv2dFGlIt|Ks^ZlD&FL4&paMVv-)_^; zZIsMa--I8`H~LrVb3pp6Ag0#k)x(IvNG96|0*j$V#MV6+Qw4+vi{qNphc!0uZz{lZ4c41VpKGl(@C8v8`P=md?b089Ekp~)20e~Jh-5h+e*D79( zq*e^srI3`)LDes~4J%mn%a?L6ut)!IB>1Px(~T1vyY=uENmsYftMF(fdbYtD(p+#ic!!@bFQRSL1xwmziVzSFH&b`qIzm#>##*(QO#A zv#TwgTa*!`zZEoumhq)nejhy04E1;}o*ha(7iH(EKKaZpC0O@+a2)zqwc`sz&u$>g zWbJ>lOu*CHURFjqn2u*3qvhy#d{S@dA=|(D(LUjO0`C#9{LFfIc`~~YD`z#uRX{7) z#|IAKpj{Gw6;BtI*|p*S!JG<{MeScGxNR&)x7jYUX`aBVSpRDDBr7GeLp(u?-%bc5 zPv?8z2fsc5{U##Y`XeRY#PYSKtX83-5BLZFJw!)NOtPhvJhydET>F8U?v;}WonHPrAbbGF@@W;9DK8;2a!@@5WtSCp#f6R44LJS;xc?iSGHi6K26fH~AHtXYb?>gKE<^i9Etsk1>9z7v{a*6dzzKRC8y0;QT z$l21JA64IO0zx116@(C!9m^K=KFJ&<){spygOY74N-?_7lkl2F--8N;vY%{d8SwmZ z%@Cp||MkylbqClHgQ*Y#s5fcd%#q+0u;mHevUW`vmk%KvL-LqHmr30p&t(qM#T_1& zDd5^R>*nmuNOMXA5OCxClg<^(B%XS#Ro?R(f6$Eua#J-diK`AA{a%>7f$_?o;OiRx zE!0j@FGzTSq#8Ty2?CrXwdl&c7IZWO)jeGTL`5$h-Jm5SZqU%EQ}d>S=#x=ibB`{4 z1D?_jL#);{!qSn&S>)d6igM|$+fR0*fM7hzupq*y9brH~dJYI3hO7&Hf5U`G#KZg+ z9-I^?4A@cLz{#YW_+oHJqcQnv$vw(|W!Xz_D{)&deEodjQH><@;{~OEhOOff=+cA8 z8tQ@cfsq6KBaY_I$ZHd+idY&ck_Zh{=DQ^$RBDb^AiDBis&CUy4s_1hWK1to@UBm_ zzQ0XTU;Sney{dTYFQQhUEIzNE2>u2F;=+u*evm88RS34`?v9lMu~5i;@?lhfVwkxD zHYy+t8b%qTs89~>TD6LVr9M6P2_aFU!!#(yyrR9Pbg90V2aJt5?ls#M zN9Nc!Uzj(sS9CWXW>fducGW1W>>ODpd*8Ym7Lbf|t5(3K#C90g^rvjz#8>=&pDtJ_ z5vuQP_VHp$I3U((;*330t-5~UHBFf6#g|X7QK!(vT-$xA4>T;qo!WKr2hfAJkK?TP zWd}Q#@2DC3SmeMY8iyZs)B7^^F2fzij4=v{7Gf+tL4EvIX005Ww=YpiKovW!7%#9a z`J_1@PYz2^?#E4NTZ)s(azOM!rF`_rEWu&xBIP z(_?Fw8v-V1;z2UbUneVYqDe)5)A{Rm&347ZRSaw5&>XR$;y$EJ%+R0CHbTA1}Bb#o_Y~;|8Jma5BzWW^8|; zDoNHk3P2M6TDZ6WJ>Ic|rRMl!(Z`UIc(Xt65wm*SWOp}Vkl}y(jRV6@lSTFEo#<)P z{kD3I1C8nmy;sjrW3~OeJ_5||#70}XPYj>GR{a0L8yeWcrXjMO}gbZ6fz-i>afMotuqvW)e7l&vf?{rLo2e(gUI0q zT})h&Ox4cV!HMeeg$A##@g2U{w-8E=C_F?nQ}JYWZTj!8u7N4|v*I#m;;#+yk-@*W zmX~1xga$Y08k`aT@DO?x9_ji`*VyKJ@iSs>_ot~}Pcx{+E%+;%wl!f76+-}@!DTKH;8|E6UIeVo`4 zbE_}%G+=KLL5(!`wHnj<2f|KWqU$(10O%K++Aa;P&MgrT75QYJtqaJq`?V~Jz$plT zolOQE9+_64tK93SDb7q{`^{!+fm)1)&yE&t>#$TWr?V(2Y>I;KI3rNic=F+CEW z=-g45fGx~?S`&7W6fS<`f|!H7T{Z@044P^Q%wL;3m|;|qkTI{!7~4%roce}%_e|?P z!!)OrXA z_gSqbK9`~n%!g!KcW$g3%B7rRpF`~Jo1pJMP_$|NgtS!o(U-#QSFivEfS<9!+xrC# z!Y0@)cw4v<=hzXjT$M6<<%uq1_78rp*8=y$SH8q}VTa_)Z6!`xAYI1P#0Cj{dfC#I zIObP&KJq!QBFGcwML)A2hk%2>csYy5@jm8nV5}Wk2u@A!1(B5jbCrkR1eb{QW}#Tz zrdM+#DOi%oTX=IXYEH_gv_XoJ3bk`4vUL8xj@As2ifDKP1ma}+Yi{+VTl9B$jmub$ zpwulBbXOI9`ymT)lr!n#fGw=nK44hgygHq8o9-LhdJ;ZA{&Sqp|MRHUNFpZn7sZF4 zx!w8PK;!KT;Du{rCqrM%h~j#_F)=gU&ysH!SffmjpAmdTx9+HL#&gC?j4A*rJD~O{ z|84X&@qNp2r$5jx%v=fD{c&+KR0a6I1tY}bG*}MxMluHLI{hCLGw_^WP@e^#^+q{! zyEUVcghT7=>G0i-6$$$>LeDe3*lvS`C-wdv#{YQ3n^k9*f9wdDQ1RyWy_2`YjhGz~ zm1I($*EJ>g#C_2J#N_KR0et*zhhtB0jPft-H}#1nsZ{p%M$}5G#kuqBJ5Ho_)HuT!Far$(#nQ>2*u&a` z{qe~Xt_=E=wZ~K?uA4NAI*hbce^s|r{f;gYPAiCq6xyYCYZZxyRs|08Ge2s1u7Mq! z`ZxtE#UeBY0}I8;emb1w${f#P)uz(#eJ2|%Z=aVSSMQr_(}33yNsfXn%BXyhb?e~#p({s0GjRG_HvP6>G9>^64MK^wVGT>J~J#; zKY?Bh1-;Fc^*N&dleN&WTYPiU3DWFMTdeu=&@|`Nv9~*a#|$%~X7ft1ZfcX`G|TVd z74SBHk@}E`hscpQ+@*SKIB^1l+q#CgmG6h8+U{Ia>x4;Ab5cKOSWiLMASNYG9B1o& zhk-`CQHT--h&5xyCT;#&^jfnl8gmpxTwtM`dRaVqkCgATm}EA6P{?Ye|^LnN^sBN9{hGFC-4MAI~0iP z|54ZuKjA?tmRA$p~LZ1ro#xZ+lU4^5qTV*2Tu-a4M~eUoMNj z0lbs4(Q*~2HCwlpEq#~c`M16KSj>_k-eXtY0WmB6lF+||1SUlqlOze~K5uRPsWA5d z{Q@-X+8L;xZ0RJwnq-RnQVWBJM-79fo*mVj$^JUy%I|ONLK!_~ZbDf9V%3?AGw5u( zS1?sdOTtqqZwMo<>BLshSPD<$q93_rZJR4edu%NuyEn4~{7)kTDP3y;6j;-hOrs7V}1C#aIv{Pld? z^xLQ3$41_~lKP|j;Z|n6Y;=tk_5&Einlv@)6&mQb9k!QdhdL-dnfVe{lvAjosw2tv zB0-x{mzdmx*_$$ajK>IF{1U>g-s}5bH@+5iGdDaJf1P%G&0XI4jqec2{R_>nf2(Tk zeOx~r$FIJ@5yF6VlBpTugx&V5l={qWzJc7-w(foua#`No5e0AgA52%Y;XkrL?OR~T zBtC&^lhB;Cn5sZj;vA^9Q)N*C?T}|ZP5cxsrWgvq;IK`zTotrh%0Ql?IkB(9W-U}L z;==-_PG;|0!n1lz;LbnD{ioH@$ZS3=C&AzxG;+9i(i;#mjC7Td^bZn*06fv{<8>L_ zfVvvRl+kYTT(6$DqW%}fR(aALfmKN77pynT(mvn84=S(Kq_yS$BFi%_sjn*w7a!Zo z#3BQSyaS8DH_X+jC?GmJK$SXb> zdYp@!2!6TNVgIgGOALgcb1uL)yqM|0zzc*|SfqsCJZR^uIs|h>9Cmq>s~;I!9F|Ic z8WlcYfA!V}k2PO)*c$hsUkG&~NqptAlZ?rcXc&%RpiZ&Jn)I?e1y$G2@|?;H9SneJ zD)2ox62l%Z)yGNdzP{x2ldH3=5-P0AQd9M3PpCNp?5nLKd6dy@S8>NgS3ZB=SwH0Q zU2(T--HbO(k2(!9p0n?+1(~X1P956N#+Y{W0y>Z{;j;7QyP+Z`{VM%xF7Pr?I%^Bq z_{FgMO6&yFjzM5;lI7wc9;oD7iwo=uP8iBCceY2MBJTdXJWt$A47jcz669DN!c5lk z+`5lfUnTbKJfeKhT*h~8Wnt3($UmYVNL)l5;x<3&;KQmR$+g*;bCr|U zZE&V$0tJ2A@Kmy3>_CxF4Vr!LK*0pRqD8tn7EfwQaHbJ=@U_7WDaBi`6%YAC;Ay|O+fARjSm#mCoLSMsc4UORsaH;)Y~g~o9B~^ zbbsmyt2#%qMfrgrZoU=k1OJh5)T=EABz27a(iBR}f3%D=A9R3i3yh3;q8AZkx_SMK zhQZ=OnJOlQ9|p?!yS3h=TXp326x+AFHXucpOT)HH+-F`gKx^7`?4|;~S=e3Gp?!MMq1wd z#@+kUdmo&oh!6e>nFS161}*9Th>Nn$Fyq>+17`^T(DEaB4j_mAuBz4Rp zV0EX6OHme5n7fT=F~M6>go3b>2nc?_YZ^sQGzZMW18vJS()mx*s3OJ``~{vh7sJn{ z5@)cc$!R~5dKk=+gy@(73-!zA!R)epm)VD=5+x^%_)X|ue{%bm)f|^8knp)aC%mO0 z9n4jgs!eoGx{~=KA77BF^DR}w#k!yZ{EwZL$H4%Gr8D50EPaG<2AmDrUd}VMWE4NADGYE8C7WpK~@_by%-fu8_h$6j_fAA=ogOA7X_cN254IA6;#T^JR+U z39bkcU6@7)8N%drGBEtz?|*h-Uqhq+?Jn@F+2WiKymXv7EtC#t!WEH&K3*E~l_YP1 z<5nxF?Azy>*zvT6@uNu+x;g(H&aPc&)sm?J)4E&iZGne&3q**gT0v(Q)JRcN;FRvL z>+}<)U(SXcGmR$NVUmV|I!aBy4tm}UeLFuaeaTb`GW{^4iFBwE(Q~YAzU}&Jk8y(d zV>r<4XoHyQASzbjoBSh)Cu(Aq_&jgm?2+piA8F-=e;)x5(LbXA45BrrrpTFJ0)5d? zd6X~)M4}S^_h^bAfW`lPo4FA&vzK6Ys=g+VvDyH|djDHrU zj*ejW4mz?yC0_4XlfZNVV}h=ll0lcLg68+3nJs7Zm%W?ZsqUgzrg>VrPq*L54G8nU z9+zK+H}gXCTgdy}ti85 zkxuk>cj1z77cP$}#k@Y#YEV@0xmCs!f9Oe+o0C)t?`Wao1BNBZmwE?eJrp6>yACof zZL+jA=3Qa}ujX6Ci{J)lPf8k*p8k~^5IvwV}?3*t8-`0|n4@~X!pnQw*^y{1<^sFO__DtX83ec@KqxuXL9_CddjlV0c=`sPFIil6wKTb(f0oQ?*iuCQ3BRo zRj$r{`--POUjhwa(WOs1k)DF0Ha4>V_@|3uY|FDBr0<( z|L8f!XDmO+@ta94&p7?N*Mm0x>LGdn7X|+%V#-sO|$>ep_OP^;od`OiQUT z%$!&NDcW|bgz{6m)mNQFNQc?FqdRLLJfMHG2_%Exnh#k3@QjD_F@%%4QuI}n6+(P| z1OkKwx}&p+_Bxx~(|=7lM_fba|BYPw^bu70=-Z!iTAUn0GeWtpbbLZ`_S<{E+nxqC zH4x4d&5y^YPyj|OPyE|k5gJI`XlavGg?&Nk2^{^{8Z%N`SM1)rg91}PbijDkt`UcO-^ zmgJW+r`9ibgeS1RH_VwS7S2kJ8?|+hoQvg(1b=IwOKyu|BmDhFF3S26FD-hXuFAGM zXWe}ArE=xqkQ6@SJQKUg4~Rc?v3eAqt#mcSq!ubh$u_cWaRFMul*@~Zh9@3Dygh9& z*|)WS$$xX6BoS$Qq7t|GeM%f2xBw*3BiP#!#G`VL?`&?J16S{V?~Vg`qAG|cM5t9f zP!-wMq4W@~_1XTdW-jY~-Zv_-n_>WMHYmDihSQoLE#*R!6riZEaBO$4MPXqiBWsCF$3WSt$d;ZKV8p-ucHV0G2Qe!>i zv6sV9&@0_;OFs3zfZWlFhx!^%hf|;tD8IP1jJV#wDXm^tU0i2E$A1IcRD$;$K{z`+ z{XPT`xG?1w!z3Pm9QMR-Hs{Z5wQr|>%HU(E9(C9N@&!w-!r@@-lxL{w~Fvp zIHUS^r;lmrIGy-DrEVR=Dy>{o4z%q*rAfY<6^IBF#&o6HE=*iW<7AM|i{pwc_lX}o z^tK~SBTYEjiQrAG8mQunE5d&#Ayj-cZhdi7HZ-D&UG(Rp+i)%zT|nEUKtc#E)qDCf zN zM^_qnch@wTcHBNsldROISg`~@Ek?{O@g!&2`%tJZp!=J7&$q(_2Fg4iX_-f|U~rLV z7B!}U6hX(2ECb#EXTAi;F)`wGOGd3YaUu#m#d8`;k7rFI5S)AhYUIU5J_(Ub+`Vm3 z&4X=Ed==N6by`a%)$nKgiGf3AiXXI%ucm+CWQg$2%`!;1T`+p-D$G=RI0n`HT&t(G@CKyWGmj+u zr^=@aKH~ATOJ#_c#!)>kv4z+8h7#a0GJL*z>+PmGUH?_KfVBBrfnS4gB40-QV`jQP zt@F?--pSX&jzA{v-dx48lYQ`LJmS9T7XfB02>VA$HkQs6(O zVYO(_(7!O%s<-5fIMbgs`Q{rfd+!lEkTS+!r+B3ie;hqH)(91*3CzYzseH_J@Ae~# z3s%1ilx&&aW(Z+!JELFX_?P}ik~T&0(Gcg!x|*tUw)X84o#q|S8|$*9_!g6j3R;sj%SIOYz-9iv?iwke#1nkVL7?~RBP^v%?b%^J@Bp zG(;yg1k9|=J8D+^EAFA%Y&q!5%k8f1H_9oZkd#O1De>xQ7h@NOt|lw2KZO0l&&)UY z1`C+tqS`U{AP%1NkFhQAq{{;4M|y2R((MV}66V{_zl#UrE^Yho&7ICU7SIUv*v;B) zS@3<#LnG7_y-BQD_d5WKd-gu=(QsZwrx(_1-70G8cshqFr4;y-kF&{d!Gby zKn`?Im0p~Yp8;>8jRs~gU@@$2bWjKq>RA#SnT$T>Py(2}0s^s(qB!IiY8&ITyt z6LTUhHO-b_SL*uxR4?`+fmB6D&yyibV;7K)Cp&TDk=KKfe4~d{dQ*(20f%yK){^AS z@Sp>P+9PFsQG;$Me{?K1v#~UTJ47K7-k9*y<7Vu_oU2 z*W43bvC7|)^}NR`1QnyeGC@pN_ys@Pc%p{%h4=(dtrZSgLQ<4ph4ioiu8oEX5&01x zRU0h%q_DIw#+>LG=szV)XHR~Q#Xk=0NkK-?b6b>DEFLI%o_UtrC~X8igxPQW=AY$S z+@+C7zXi+8g_z}CPRraHyDJ-o?~0p|vlb$gt8Vd7gc*edx{=uftvwp{rfT%xzI5Lj zC2cm<67BCWX>?kV&l%rvMjh5J{gsyC7zST^r}11ma9MkKCCPKitD_m0ji!zZ3S%q{c8hIm03|(;E2pMC5wad0h z`IOUtJzPE*c(SY9woVtuTUG-Sp<5Q0DG%%1Nd_LS%_Kfx?QGG@DPkkJ1N|vHPRc+Me?{I&%IgzAkaswQ7V8H}pp6pxEP@;@54Sk5FkJ6x>|!GM4DwL&gzCYx z!@~8x9MoAX?zM!D#IhT(s5OXUK<$r^$%vBTe!F6L@B)=OkhF0#wEp6SK*m|Ilkdc=Mc`YTcyJbJ}Bud_t^DTykrD8&D*~=i_X=g@>>Drsuxjsf<)z5^@8?? z!>xVqLu+=)wLLx|H-ma79q)AaT&%0S*YvwhDjtVyFO930c)=O{!Vl@tJ;HY3_qd$n z01#Jp+J{0Y7Gr zQnUTHZwE2uthZR}#**4ez^WDp4o z??BycLt@UXwqsI!P7_wK8zi`P49<%5Y9?p?2DQT{WAO?eXuPWFxy-S_x{#7bP4$7-RLsiFCuM{w*(q{Hq|Bp4QRC21>I;B z#%(ydF;~hIn+{k7DY_g&z8>9m#-S@CE zQ_&=AbzB5l7rClHXmo*!F|H0#wORuim+E*=ryEJj`lH9o2RxDIWmUDqG~mG~xXCzG z2Z13TfBc5!@hs2YfclE|d^CJs{WL>ftlbN>8559!N^C8flH!o3j%>TZqBwmrLv!mZ*5JM-B z{JQX0E&Q4&ZB!XyJ;qaN-1QEBoXf_$RF;M8APmQZ?`NruA?UKnZYHQAFScQbbVeFy z1-A2fp?;u~jEu8t>`Nc{@K>mpC}q>VR=e@H0jCki{Vflz$z+h&tsR*HR=q-Troi|L zQ{XV^p?}~Q#`ABSLw!)7i@BXfH7w5pRymniS;ZZZ&ox%W<7~>stWuzu4mQJ-J{a;} zl^uGMGOD0_1=_tY(?6D!Q$`(-Cw#TkxZ!H~`4%WY2YtynUrvmuzW*p;p>8ON_ILVv z{d9y!`v<QR`Tk#06bSxZ97nU!Ds*qztVmsQYWmQHiscL z4M`aRg<;&U)iaem2DGs;hKU0&S;}V&cL8Mo z@vX^LTZQyw-{se3CLx8pKBIXn-*D+_>n=?Lo&il;WP_V#Ea(%qv@^Q#BiqsEnQZx> ze~n)a62~mOs}sgL1KJMW5pJC)s`rZv=5X=ngFY01(XW$r0taEWVDx9Hu&c8JW=Q8^ z9~LrrcevHt!fl;R*95*^KNa2$lo11>@yEP9T=EbnZ1N1bl+Dt8fIwm5N+xdjUSrc6 zgAv_6ExmtA^ur0hDc-W%$#YX9A+vPR!-^6`^x*NH+y)+&~S6<1Q~g|l^1XGZ}JXG8MSHugp?Z^o^Wr^lfr{W*etCvXvNhu$k025T2Qi%E5f?yA z`(hsuHBHFL7q?UPoZbUfVx=4hT7rG1pRMvQ2r5q>JOhm+Zq?q^N!SJ?GAsu(0HeN0 z99=e-g$w}BlJC&Cy4{bdLqFV2v8&L9M#UVE6e^tTCrna$3_D;M8htd5?2u{>{U2%m z#m%d5TN!OAyiQYKtGE}!BH-f8oU8F&c<#;2u2tsSjaSH=Ej!~YwkwT~G|)Al=WD^C z2Bkq159qIjwL~3m*6H?xN8Yg*ASOvoJ2jckOTg(I{BtFv4FLGTu5wPBBsAl2@c`gs zWggkswa#}}*ekNbM2JYj1Wgadj&0AjTD6uuPdG(M@0Kagj zz?)%i25OA>5)khBC#sz-7yKmLo>vOCZ*1Gg_Gai`6n}Wph0DN4y*+{&Ima%aOf9k@ zA+g`xSO;3D{gW2iZ#!U8Nt`huOEC>l!EcGfiO*I!VB+Wbi=vgK;J5hA&&+chI~OxF z60s27f9l&yx&;gtyxEHHj_qte7c?KKidzIgcCZ!f8o);As`Xj_TC;LoXDFo*_R8Hx zsQ&NahK)fBBq3Df41bmywHX})#k@(=H={w4k{VjldfQ+|J#U@c)Gl_L+wbN3mQzVnzH*;Hu_ zx;RsqIBt>QO+crv`n~pBt=HZkq7QBT4!XqAUq6rNiIbQD6?HNPK1p53k?G1}H*Tyb z$x9x5avCh3`~Fb*T}rLcOOhe~!AHql8E{+D7IKpjc^|Ets$07o#q5C_{{H}PKn2{J znIp&xSzXr(C^n^yiK3;hx-N$e`VV@gjWn!R64_ zz5n5EGv2%Z1zIoKt5wJ)&?*@Etujeig&=lYiGj8#eBMDG2pQIua^Zm#`D}AZIq2?N zndmw)&C3sqZX<(BJ=#kUlCva?+tVPHPaU+}L43o=vw8G9Vvmp6IuA1!kqDSvIvadz z@i^~IhJOS*ORn}zj`j*ei}epatl`RFSu-hZQXbF8<7nFzUbelAwOP*X!%Qj@xv37UG4Y6Y@tHE=?Cjy#&%8nJUN&pVs<97u@^S!2=+Kw1M!*MSn zVam@qd1ECA#0X zUo}(i53qUJ=QbC|wj~I!32nBv7{7n+7*l_xDocwsW;{Rplb-UjWtoo=C9b3GO(xE< zrB=J}N=~)gHI4EQ)}1n5hQ(`}r8iHvK&Ub*AXa&%$Ngcic>$PzvL@nn@EtYu%Xv#B zOg^jY=l!p%#lN}pV7GS5Pp>{M+=Ji^&3AvbH3EXtHzql zd)~{*t_bzq%qr?{U1HsBJ8T|!HBln3l`CZ@7;KR?CV*W5?|C0#!9LYUk9Yy>BY9gk znl|VIP2w(%ENl-V5bQruetT;;@R^gNKmcpM>8^G_nsy>7O8#3;K9}Kl6b)k(m|LS$ z@lyK3$W$=?5EX;83Q0#|e|_<2!b3m7yD)q7=QBSWwbTnz^RtUj%t^8>?-Er7SZQYT zaFc2DaTp)(Ipa}89zX2=rBBh-qyZ;kknZ#OL%@UIu#cBBsP5%a81`9-+475||4D!^ z*@zv9oCtqj3)N=AQmL-&;m+~Bo^Vdf86J?_d>2!d-!Gv#c=xB@l~mg43k~^L2Vx-a zRGGzVmrN&BKKo_o#OaF|wqcKVS~KPS;Zy-2Ng9`kOSZGr!WdnO4|=l_%uuLsEUBUk zz?glz&)poZXh_a(!5x`^?Jn+m3${oG+ItX2n<)7Y53Fo9`D1BswEzn?g=?RzFF@b5 zrd*bT>oLv~5zg2rkX!*PWpI(tFg&YnYZyym^ein=;`?tqo&RPhFG22q zEQW-5&TXi6`P%qrD{w+Hg}vepnsy#l*@pN1yO3}T4uLMIZAr`Qi>uPu|I=jj@3o^m%9 z9%D+aIxGdG*Y50>DCjuDnYW$TGc0+;Z?zE8eqOvV~JMdXF*`}O1 z#g%@~PD=5Iz`w3(RuP1Nrh3r1WiuJ~yU}Wm89B~(a|sjW;RzNDCUyr}_E@xLO@y~O zU==1ndO~RYbO~5fNK^XXE7Z5^)`BqQ2qOM|0R3pxs+$Gkr_9IPG%p{~&Fs*Oal-gx zIMIBkS9a}H1$W|y{M-D}fUMT#u$&qu@GRrCl$I_jYp_DcR&jKf7ypmX4~BGe9mDcEjWGvK z=Mut>gfyO6w`97ad&R1+s+yeCSuz2TI@8G7p}h{S)qu(EA+Y~S`0HHz-+ zecjI(Kq2(cZy4IJktBcAG;EjBx9?#2XlnUf@R#@m&se50L;!6e?NqL^Qsnu zvWUaLk(iPkj1fMMLwe8WMM3PUob7=Lnw^=il5k{ECT#i>w6#f)$mYjw!k4;d_A8u- zI4?%;r<$jplKszj89XO_nxDk}8*z-oj%E&tMEIa$as|!$pjN{U=LeE%OYj;B5PyBg z^FIhTbR^4)2QBrA@qMEFrEUOBT6C;PI+3C@(VXP+adWWyA`Y0CKJo-+; zf*_+alq#^U#1RgoHT)c~gp21!F3G2jpC|w6!vmbX9kg`I)p$3o`^%5A*ZQjPCUAJC z!R|W#r5T7QWKp2e50=h>WlpE=84DsRP9T0mIe{`ufC)6uTVO0}aL-kjgqeDlCet z%3NResMj*+H%2~~cZ!L(Q;ctH5)c1B6^KI}tD1Hf>32#Rjt{hA6ahquIQJ&$Z75!? zz=?*)lFA)T`|M?@6B?)LO;@{=U{=mm`FkYkv`m)yNAO%v{q8 zRc)n96XrB4?kO^tvpLJTm4@yCr~?1N9S&Xj28KtD^Q!>{o9TEi}P4HS*P16VU zy_V%uPu??}OD}8IU9|8S_@9o5pH=7v=>4^+rTmuQhCIsu90QgAbOf=W+lt5L$5V|FX0%QwZP~BSZx#-;LF zG7N617j37s9EP`1!2_=Q&!pyiJel@29XrFvj-%>kw`WpMrcs*Y6n$9uggIs=QYZ5v zFNpvh%_kZXcc>qv&CO3JUT&LaUCHwENnMh5NM`Q0k%m8$C0xxLW9);RwetZ5$<#O{ z?FO>@Tx<1|F5=2rfQlG>f8FQMXH#E?5oLSmh57%(z`IkP99$k+MlirS}65tU8X@H+32QI8s+fxEv6SVRLgg!LI z$9g^95w=*zE7~F{p7++~EJEk1{TwIU%WpofN5fLC-dc(a{*hoXC8<*K4hR_7gimy2 z+Zj+gL|ZYp=E`dgOq(&ocRbfQsgLzy+sh`*f44dzuXm^wcr5G$?W&}Q%hp2Sg%-JD z%(1kx5ou+^3k-+wrrA`BX)(Wkf4cmr#;$_9>?WV>QvN{1NGJQDG+s(Zzt)5+q>*tr zb`swY*OK7TH*Q;!0@5<49ABikmL zk#!ELNVg4aa!hGh_12MF$zWwJ3igpxUEq2|Ws)Z>J?gssiuL?`(u+W7vh8lnGwi60 zt?lIY&je~YPQl;-ey5pOb&~>4gcWV$r06C zS*c&+$$c;X!$SNR{7uphLts&oPd*7(rhEyv@i%twlrK6Z(CdHs#z1K7HltgS-P~xp zrlWTrSSlUM8O_16?xK(1=yBxgUkgucumL~NVl_&hAMQHtDBl0H+sbd1to`C(V|R+A zAH8Dy))vC%aVAo)4*5QMEFT!nSDL3=yGtrBDI3e4K)1rppPW^*wYHPROyR0~m+Oet z%s#*{VWu-DVmRc%umO*GM2Gd`GY-i6oDZrsuFb{cvy_A#sk>v%l9lj zBarN`0s1Q$`%=(bOUwK`cs5w@SU_d@^|P|3(C!zL17lssVjf0e(hMd@z_8ar*N+FR z&Ns&Rppnu`E5+Ab)YK*;Z`wXAA{eUz)VQDh z_@HP-Z|M4XHA8{(nS}~G-Z|$Y>P7wS1c5&WSDzsIPH}dmzKHIlpUAVr6y-@^Rhk3q z(O(qf0gw+@5fbn_WGmU4tc94m&lAO$a7rEX2Xx6UfqrKi%IAUFVTyES>j(begCjvO z5FXoMIg_}q^&OPLDMjT|a-fe5%Pm)v^$1x=^+bz;vBO}^aN!p|W0iOl`mOklti$)6 z!r&`4k(#zxeuJhbB@FrVq_3iO0i(%3Z_h{*ek1$E^FtjlbjIsIDnrr5*|GIH?JK}Q zX(~_}D;Cj>L!4}!I`?TQ_0y}$6JG!U_K~t_-JWxr-hYjYRV?I2Fmu;)NC=z*BxNOo zSsR+GDX&M7GMgY@=?4^NmNJ$-%S>$S>bko=LzkSQ)8wMGzzQTZRyhT%IQKFHLn|~m z)fkjW-j7%!)qEv7NsI6XsA(wjv|8HT;v{3ieC6uHejn$dA+X8XU5OQsC9i{r@Z${1 z6}~8(VK0p|FTCN8;Nc62;dzPCYo8t8snoA6o@#45e`*q7BXM+CF zan$I4U@yZRB{>xsCk^o@lP>y1TIM2Nu)tn$ng zMSDxiL|__S5dI@HB>Wv^={oP8`v|&!mqc;TzqyX?DE&&E%?4An6zQAf@*LnOawc{r zb}Di<*P?s@+Vh+_e2*a)9=NBO|GD9Zh56SlYV5LE7pxZdt~*aGa-VDPxK;-3BL$%Q zf$02O0#_0#{u$>1{sPmIRep0PI)6dpT5WodkVv_|TEzT>QnHHXnoipdO4V>%^YKK} zOVh>?auDHGl2Q=I*iOpZu}t&Y@*!^|ciA=BTSz>U(JGqyMloaV{MmQ&Z|`%}Qz+C+ zsvW{iFlu91$^dBX`qXE5Y<+HL>j&<)O+axZo5(iy2yqik81x7WevhQ(wWd8fC$n=L zSeJmGJ_?-qNtHPE9B`(>aLBuE$B8HPapgmD0S9$IALJsZY`r|_yGFK;d!`8T@3n$( zgbCR8-OmOR{O6zj*|g|RABs5A!s)HZrm`sd=ycLrw?jQA1Z1wTy|`FkMdYrxqf;tY zvlMmnaejVTEQUMwQtQ83_uuL(Y)5)eY%s~Uu5qBd6sJwug#XaJ(7pYhM5LUGWm#Xg z1X>TG5V&(k=KR3^OKc#kTe$AR$NB#!t3Kc_q_*w+`v0WX`2Og=?;xN&2)CH- z1si`8JC)vU5el@2^YRG@+`(R!7mW4OW(E6wKgp)f252lt{KP*{1`sh6lT8nBhLn%m zJ&VNQ!b{($_(-p#FY#oG+8(Jg0yragvoY}9sZnFwoG^=k8--zU3)oSC$vM z{8C9gtD+C}qrWLvt1_o#DMI@q>f-E=mWrV8ew*Qpmx*HiOFx$TRqB3wdnSl83pa@Ss2!WJ>0VS#8 zb0F(miqKBCf*gdl3mH8>!XNG`i0P?`Z^ar!Eb3w}@;cH{_bU>aUB|t+z!cB0jd7bC zRxrT|f=kaXPECK9=x-pCEi}0W)uZW^=UE1pw0jml8s@j5-%-qt71_P{7c2Y3z?_fE zWY|75l4^Cftm|Je>TyPuSA|?ryiJ0O`9C$4@%9Q7<1S3EO!#krcr6okoAm!7!Oe6i zLOx8H2ozRAa> zsE3<(HMp>Q1(kaaTt1`-zR$TWJbJTqqsfp`|6nGueap0wm08Q`AO?VVEa6q*N*)1* z>#ij9*Te&Z{(Tj4zV5Y!+c*VjtP-GTBBGs`_H90izh>y>kNZ69G34XIVMQ9XXne+g zR;Ej>knNHRghOrm10z>}Qjw~@tkbA17stcmAWIv@5!vDW}t{f1`iqjpUa{9!L zCWGVwF1;VP(%!7#MHhXBagDf`#X~uBRU#zqshZvOH*mV4O6n3G{l3}7ewkf3@nycN zVQW@;@R_v$dr(i23z%eD7J0tZ>{ZTf#C+N#5z36z?YpqNr9AT79WhWTwUST_$DO@#@Ay}djc$Fk%f3I1VNPk{*K7yAylllqec-0Dfe84NtJbmVr zjr?`_-Pp9Y(t%pik^eSn?Z@t%Jwab@DpxJq&F&a&*4J>APYGC1E8Z=PGVIp}*8!~P zuLJ=3kD!Q-)dS_65aVue*Nr_gQTiVZx`VKjh2T@1XYAK`LNPPQm-Fl}(2T%h)JVD; z`m1X!-OxRCr+JN4`i9 z9s2q9nA(5FdW6DcQUv}YUu$)P=0g0pDe#S0x^vziCS#u;@W$-9p_3TZfs!Gy8sE!C zOsG)6p-SGa^^y)T^hP+g(OGs_B3?wx6^6(@OYneWwaiJ)#^OdHg~ioADN7IgpHTRn_BJ+q&MgX)%Wv?+BN@a_fCW-swHzEY=&(k;p$6=NAQw=d@-K z!xRgE1pCG3D2VUyJ5j5tp2Q+hZM8FVo(&TMoi=#Z0NWp3Yje{Wg!|B|XLIKx6UOu# zQ2j8k#p-4t+zr5{^}vz2BZ)Wf0`!Bz9y@f~zD>-hF7+|^!uTV2SC?>z!YtstvKNu? zkpAP{kO@f)8MoUt-P*0T+U|=}E=r3f zAYwDxX1<3^x#klL-0!MR@0JGqO4$bh&g|A5b9*#mv_jpd8Z^kqS;IpP!IDNxGi|@l zJtgLV0L6|YR((C-5LrSR>Of%kBR>lJqEq_-%yUP3qOjMp%7WOZI9;9+@|B+`*QS`{eMiobySmo{Qj??U=SA4Afh0xgfzn-loF7R z5dzZPF%S_I8G?jT6X|Y{99^TkM-31dF&MDCe|vvE=W~AFzxK~|&bITq@B8(7Uf1=w zdRvu+7t7g34(F~wI2d~sKnEyGwIZYDgy?&FZ2=y^*NBaOd{^-h|AHs-y z&0~qEtwmD0DnL!mtQA|pu>LwX(zhmC>cmee@Dsq}Q~a=0@@-vQwvbt9V7|E-tz5!C zo$#t_3e))YZLg=lUp>$J=ai*DxgEOxx9ywvd6E75V)VV$QSN}BJ2f6&f|o%T?^6PE zTGuUUWc6sS;MAkVE{YC(w5>5xax}OLeYJHieSUj`CErp6>>e@b70(sY6?3vGd>Jqn z*u{jr3D+bxltg4QOk0LcFA8vpxHk#7(u4bzyHF%G@uTD_W zjo3q&KOD&!BWocd3fpA&JNsKIDHdgeL3?AES!zbQA`;vlm88KM;f^l=C##~41Q-+Z zxk4xTiJ?qjK$ll7IX+vpF)nkx^0%0S>MCkF#>Wy zyX}6XXtmeq{!ft?pAFqs{2 zuWY}p8|p{icyD#kjLBTj9DMBNZde)nmf}cNjwkFj@4nXHc|7y#hK&$5Ci%4L zwOh$%BhMb3-~L(rQtQdc-Hn2nV++vqL#21a3i5UWGdPi!3FB#ntEpM#jw)lDFL?7P zJi6T2PghsgMiWs37GVp1swD+2D6XS7Q7?DoFjOBo5ULsS?!0inj9R;o?C!*B=$<6+ z8`{k3kRL@?!g8{``oAZ6TzM{3(!7;$;Fb6>yy}=2(vj+%h^|}8TLjs?#&xqg7=&gv zkx3{@Q{BY^D01}c!52%fe|D%mcDJ2L_xID_Ypvf-!8cF`%@bw=ND7qqmv?z&tX15k_MfDzRmnRh?)mbi8>1$ zxTDV1zOXB&bDE86q`7NlxCuMEe-BeSpjRu9yH5?Ui#IG;XTaA$I>52b0;DsNQKT5% z>>YTR$Bs~e0mAI;sULz;;DH3Q(EJPpO?24r!RD<@Oj8`t8IGD*ZC*IyZ-3dvW)SsV z-%akQ3zIUTqcT3a0|{+e(gY08kf#gqSAPSil4cT%%Ue$=7a2m&DOGIvd@E`e!ujn? z#=PlYURr1txd(F_2;`pFei`tw2LA1yMB9TgU{12UWQ%c!BL(Xo1>uO;`ILN7KWrXc zdUzQGc|abugfx+*37`(9c0mGYsjvg>0ug^fv7RiR=eui_6)gSv###N%aMH;w$sff1 z{PRW6ACKio5;#Adrjg@E!4E4TZ%osW7P$l>(!~rz2zr+go*#a?S&v=uTN(zhAzG6mrSfm+Ue5 z6k)^ax>Gnwe07~}`9CG68U0DU|E>bvPnLiS52+N))bgHvDb@@|%2iS`Hx%iFzj2Y~ zfNI&(Kzdrr<)i0>U)^)zY)^I%-!G$}VGn&@VZOL8B?#dT6;9h2N1t90gx$jN(~2OB zsSyrAE>m>M4sI3(8n5qfO&I^{40<2HXNr(!-hDwBy&2>0T*Se+X|7W~9=cP=PqFqF zn(E45HREPaS8RxIQfKs~dRG$uS#wa6JS0NPNep|am3~D{KX?7BSx+{#wRlXFmVq8l z(`VCs@E)UTSlKixa+m5MLsWYqW3t3B(T-wPdi#6)TMhO=3@CM9Dx_nN zkZ$y_NHz^B6c5@c@anfqNuji=6{4bF^O|8fUt=K+XuxX#7)Sw1_aJS-h$v?Bx66dg z$j~pI@tNhMGdS6WbLsRfi!tms5s?q#*(y0umgYusKM+On=ck)0kt=oRi%1Z>1WcHl zNO-X%e5AqZ(?eJ8>Nj0tVmGsNDllW=PZBC4ae8*CT?cevs%jz}@#1U@Bc8yMdS^&R zQM6h|Y4fBVny!ubHv%?LWw5DMN7SqW1w9VV~w&-8KbtCE@nr z5#~U*5xB+WED6#(YxAz*@H$LH-~F$3>j4nacMu0DM*r2HJG>#|bkLHYPB@B-U=lq% zJ^>{d5#X!FB8^k<5H=wvwW8U-t*zoz!wc-%pR!MD^rNJmB=&|ks{!<`Sqr7mA{DjY zbRYm}BnK4_Tr+X*cb}K|$dE*KC!p&@oR!at$ye0SQZsn2th%ax;yUoA98fL?B52`^ zd91p8T)`aWYcW9p)*a9a4!ld$polok6akG?$*r9Bny5h>A&;DWP=40Q68BCrC(D!K z6G=NSrdg#KKfnpObiUJ*T4$}}c;FOZF0tiL6uGR|I`p^?2j2stEh)yWIs8wGww=Z) zfO^-hHMMNy%T%h*1}LB3n0)LJVb)u^H6Sy+>N^wCxJl@!yynu&A$QywBpSWR1q$$#`3yVewV#WS7@PujAeau*aBI2L^- zSp2ynKA9-Y;|5MH2+Ijth(a%>Z)(Uf{%s0>e}ngOVALKNLw#QW^lo+z;bjpmN{iLI zwfGm@(qOos5GV5G-**+7-}>0!J{pe!L;lSAVh=4lvXjt8X>DTK(%lD}&h zl(?)@<=RiDalaQeWW7VX8UP^xG^s(d_ZqhLQIwu$0ZRLrzd@9%#C&dQVd~3z(vQQ2 zc_b~!=RIx)Lb`NqM5LG7zp50mtJCUK?~S<3Y;GQgE%p}n4nGABqZx&Q(bW#J`_cT# z$6-LUmwcUqWK@j@l{n z0^Jx;$)xujtcI@q5;6YIc#4!t02eVkbh|ICK(30gP9Zmn89jxp=b^?m#Kg{!K)A`c z-xpBDWtVSoH=ufmxz#+`JeWeH?q*IBiX#sn&x2>8Q(n<~Q;H`neh*{8p=u=sQQ4KdijzXnhoW&(rP%V=V+43eD?^~1!P$QZUhL=3~&K@Ho8o*$qe6k z=nVXC1gp~9^Nn;Q-xFgZKXcNQ>vgwt_HB}mx+X4i7xKS`JH%F82>Jdkd&*St;5ZI+ z9y|ZA$JM0gn@J;1RfMx3&=hoWLdH#;Gr*9IOSWFel0igEYqZ^Ns6JjLx@_}=hr8HA)_>$i zGpiBuSt&ctLeX4)CPLEkH;NbgyWc$DFbrZ@2C~yleK85o+~oOxqrz0?RI1dE3&E7A zu(h&N9F4?yZNv(d@$H{%&5{1$9FDxp1Jbne!T%ofF-E35yCpy+f6QN7TlwvGmheQa z8AF-`~IMuI7pUP_|>7QIfzMg$;d5sZwEgppk`2-6qWrz@`oRd)|vtf>#2_aN^B zMy3SN8aHs!jN8`vy_@T|(k#|ZTENl~3)xhZJja(;q3i6{8N+f01J}M_7UDQ9GrRob zr}!xPxqJClTk1~ul>c&}i^pT5$z_WBl~K)Cw-pR5r2kOt@V0=+|Cwq3I?uhJ%ie5$ zD@q=J_1sd1?AqL~YWE|S5}Kzh-2<_YrXezkM@8Cq##fQ0h?sj|;lpEdEG&hHMmEzM zW_0QXV-4EKpf8s+ON3&J1p^eM;is^akmLN*?^4{S{Is7UrXjyEvdin8K$k7#BgNru zEf@poM@eID0sp(6DdDux#Ea*-JwO+D_LuF4JxCSMPv-v*Lt;5j&Uf$l>M`kNz*&2} z@JBZ9kBH-D;&px@nA(*g^DjkPBd_hmH=ckQG(lX`(pt6zh&M%X3|fjc)$$1o8jpJH-NO25Oa`DfZQZ_qJ!PhOQwkNY#wDPm zBwKufEv3oo9LVYa@y6cGBPpZy#JRZT5^B=Wzf{sMKv3ZUQ{wCIN8)m;B;}m z^=EOPy(0EbK^qLNSCIs|W%fd}dT^ZO(zm3gWR<`$Z+{BQY##p?LQ=C~Ur(xd?pK(b zoD4l%4(6_dhG{NZXgEzyLzv~9jEtWNIh99e*TIQoEVr!9%he*w`QY)Kg@N?B>cP1A zND(w2m#ba+Ct_efcLB+ftNt150F~K8upf@n>FYY@g^*50rGUA_SO?o*BmTXIOZc|% zX)8QS2D zV5)6W^j1NKOvB8$DX)WS+#=59^lBpIOk#H<>4qa0fEY)B^2xvHVfg-AN8Msv2CZi# zAb9!oECho*?~zWl@SCe_-uEpRi4m?+Z$OFtI4tdeC$d}5#E3S&t$HgUsTW4@jIMV9 zTSiZ{&`GbDru&l*5P@4{vdJ#6iLMtgb2(BieGXF$)}C|P9YSCbqWSI>Ud~820>8FP z)6(?!YS%!t^USnV%SuNK;uU{}O(zv?gWkTy-@M5$m=Pty%;)-3r1OCy!l}4SFEe1R z9|Hrh)U{_3H9%?o@*kI0oIQ$C`6)svfGrN$;EjIP+ki>~j$n4h)gFi6-JVl)rd3Ouh{XiLF{*#k}Jl!`xoA|(Zil={1~6fxi5 z90czuC;7)e$`sH8{ITQT#neR7YrQ7_aE@rS&f)QKsu0Dnh9kRwxyhGOR#EM=++9Tn z1Yd4?Ri(GPl^|4{GSIqrZYRlSl`eEF>lU!F$~wB>J3ig(Tmr2-prrG*HxUL1;cCsm z3;0EUBx&3E@aomn8Zb#Mjw|;`zfFwD*VZ70dBTsVzgU@cQk*8lxMwZ2b^A|Da2p28WZ>tP~z|1$|?!E~uNiudSQH4-2_= zM)XOASAuqR(#kF@%>jzvT8}Ib!(2AA`+l9B_fq{LbP!;XWALh*?^RquI5(-1E98-E zl5aWatKQ>n8a}Xsv5CZPA!MLjRqKDW@A9?pZ66-%^Vn|3f@nU#zd-gSZUIXR-RFo> zg(Fz@7Y;}p%@^Pcz((6zMF6>mHeceXjS)dH)fVVCg+4igUQ~QE-Y`Dxz2G5E#nNd# zpu?&dJ90B9w;0XiAePO-`ceOFdQs%$$nOBrj?j1cBHo-I+|!TyB*}3Nz9ZSQH-&ni zpk6R;-mW&=5=BKXclk``qJ))vFMH(WBQi|bPPfxC~Jf{05V$4!W74nz4c|~1WCHlcL^snD`9uMEEDso!O zAs(-Imi9D?_r)OH(f1y%iEim#%puhq8*l?#1Zb6AiBK z5A-Hddw!HpYB&F8-yP9b$5E&k=~V&OqrDDw22;g(oJIMVb}0^J(VnlS6b(+oL=ll3 z`>2%WSLH39FU|j0*dzLf&h1UasNeklD|Z8<7l?WBG0E0Sh1H|Aon|*hy4m`N7b?l9 zGonhIk7LzG1&@U^Rw_L9eZ86^7*p9d0tsW|vwXt(wPMi=kt_`lG}HVn`drmU$2zX# zOVBb7()Lk^ub0pdtJu6GWAaqwy2!`+njEO>@LDCda^Uer>ll%zLc3NA>e@AWwt3^S z-jougB>DZn`dc~mAy0(o@c|EALcf)&xl??CuyV5d>lPbaV?{9t6T>Uy?Sn3ts3BgZs*((>$_Z&b5 z3>|eTWkEI4(`|mHfw{Fe(#%v>f`5XE9S#Eo#sEgly~R8|14jxZb~^|2YlO_s!O&%M z>8;_+S#NJ*sb}aABk`HbaOZ$eNThGeCVPoDLOdXAZLd1aG8t?gI5t5RR%;?{&cKDD zIq*E`%rYJ`?Y{E4!ZnA_z4i{8&MwZ={H&2jpCpSPMI(RwEiNbP&)LR>ZoJEC6`Lfh zg_1N-EeA_x!zApCS^YOQMN_Zxzr;AZok)Fz8S+}MWhoG^M)t<_zXH7=SBQtrJpwA%z#4Y~2a+5u(J52a);XgmpUSdib#Op=Tn_Eyot9Ixx^Ee1@M%QAyzvEA+SYc=pS4Cc|!tw9G#> zOBTf|v^oY)(93We8qV)%*<~{lEm$iLJBoD7V`Sq%x@9;dAm9)7xj63J`MdJwbl{n# z-H?B46CL-zgS7%W^`G*`nZbw#HDaXBEMItZ8Zg0+IFEg5IQJgVSw|(YQ+n0Ke?jdr zvgXyul?K=m%s zOiiIHkST+i0W;C?`i zXO(|WWl$0hmZ#Fx9v8T0u-)Ej8{XZO_ zIal>0rwD%K{uKvviSW8>Mr`-Qk!99%Piw4huiRc?-nw*8{+-Ey70ZgfWjwbsYg^xm z+ad*tjv$6uV((wSn=p96$PM(Zesd z{3^0pve#};FMKfni zqif4lvKj0;WJ%uoy1$2;%ZmK5af3v1(= z4W%t1ysexB5UK>+aZ%IJrjxheaEtKgTFK05R3CQ)^VKk!BZ6HtXB{)b7K*dREpD~C zv``Ynj#reM>q&|WSYU%+$xRrolp zjRjh!rp=P2_*d{YOpEy4miWEegtN&BZNc4gz_dWVBpp*d;Q`mCO#W)4jV507b~4B} z6K~0lUm)xg_A#;Us(k0U|0W**E0n>0>)}+@m3005jBBLT?RS*@eJXx5(yrY9;LB9t z`Xre_evjAVG0@l!qa2c`mjN!BS}^UG%fnOkN!_ajcqWe8=X0W?;^b{oCt(df9MCxgA(X`%fJl$q8d8*4VY%usi#u{G27ky6zl)#h)6)n)1X(J zwTp%VEHO>zpf`kQg{R-z*N|()WrlTx9iw)emkk>lu+E|x5Ak7<-Bt&9)il?^yXuMB zAeRA>G5WQGNDyjHXEpbuu8Ykh`DSwnk+JgDSxMF4uBA~Od2!3`$1jhLCC`0#1Han( zy*E8pmxT|282BMh9E;z53k@o7T=JXu3uHOm@~lD8l6~k650#)(wdKc7bHV!&*{8N8 zc^y5`p%o>VP4x9XgzE~>RTGVHlHYrC*YcLwQ)^)#GKlkH{_)b=`K;uHO(f;`!YTJ3 zDt;ntxsUn5cfW8n#H4u^1GPX7d^iV3eTnN<_0Im0AY>RwV(!(DB;J*2+!YU<|K@cJ zCf{#xE^XkmtT5rQP5Cgj;PAft{R!MjI#GAmdjH5dVrf^0Ut~e)x`LdyeFOSbzEbhL zMw~{-%*e!bsw1f)pV)=nlBNJA-fa%d9j&Ky$WX+O<6(J(i;OHGT(M+22|~1OI8EJU z$KC!uJVor{c9Rb~XgPb)oqxTTN#h%P{?yTy&DMqFC9bARCC|uh9Y@A0@|3S4fAIIZ zt=Jw*l`6OT`Jc`tR3oTzDeFQ2<}w46^L$0=woCwH8K55!7%uY_;tsy1%V*9YI8LH zxXU+&rd_fdYz#~!jr?hecuonsBheQ`vg+#pL+%>ns1qxBZb2gGYoELWsLkF1h%gE< z7a63F`p*F;OMaO7hqHN>!cmf<_%$dDT@ebbZn3SNY4X;&gIwNCiSxnsq)Kyo1as3bhHFV^xp$G7 z#u}bE)+P$uUzbsmDPoqVH(x5L7nv_GNAWD%l|~z_fB1EtkZM;*d%T`LlF-v=m??97 zVlv=!{3?ku9bL(C+g2Cfc*%gPS6HH9?aF1cHhv^F?qi&BXzru$p zkNmB3C(Bn$eutDjT?{>|PZ={t`^eX2Hy?h8sf^9%Tw3%CSa7Wu)z8xwaj@yWmSk>E z9JiaXK;~5e2US8lPCVeav;BI16P98uFqw++r+I)Dcq%H7!@(;z#A##GsLP8NNWSCIJ5!if#pz-}GQ|@+(896g} z-xNw70m7BM5lO~{=MgVJdU;l9nmc|Q@zLw-dE8?;N=B1aWQtZ9Xz~GSddW>Ka2Cl4 zHTb%fSUEd=@&QCty}jgZKhm>-!`tO183_}t2xgf1^^7J*m08{Z+3 zq{zDCOFS=TO^%!v+=B8++sA?F&p`x8c&*n86KXdu)SZr8<9a%||(U2dEBdwCo zH>Jrfd({U`UAxWRz#9fx3V!BpI+cB~;UBpuuG-a)KB&Sl&5L8E&e$X*d0)7BNQP=5 zP)X0P^DLNuDJV_oIoo8C*vrw?hS{Ip1C)7ScnZHI_13>gyL?W6A^nOL{)N#18P>4i zVX+lW3%#1O7Ed!7T`rM>ptF6{_Cbigq>;I&0q#O;E~1J~jccr-m7-496G=#JJtfi{ zWSSrZ!jD}=fkC9esaUfDOW&b~#!H|obFcnf>YG6z72&qPjSk}~1O35|7Lg~YZ zB`3gOK1d*XiIJZRtVH?;p+-G!Hm|r;_o(&lFzZ_Pa&Tboneqat++=0s6~DIdg4;1) z>9`^bHl3Ml8H&#JxF-@>`U@xyA?+gf8^}of^vueI=js~tuRFn{UdnGzOTEG{Zh+KqH}BNjPDQD#84d95%qzw+9WjS&!VpF7 z%ULC@$7YBj5Ga?3ON1q(TTkg-{F|MA1p;6MHyNjI_q0yIf%9(*#t)1$HK8*z0EP6T zjT;C$2~uU{<%bKE<_`&NQbs94t;eO}?AoTEru-KhTs-=C@T#R8wWF>$Eoq@NN(-$M zAPwyCqeehL;ajdRQ;SW+gC}+y9WjaW5Qt^N4gpxIfebj**4bIim^LkXjK?9s+90i& zl4IUqOZbTsVZ`Hdvcp*S-Lbm$jh2pUv!7Vc&V8)9(A!1^*FYh{t?XjYm!e$*`fVMW z@73P2OwEcs9t5Y;M{f&z89|1^lACxIW65}FIF2(4lpi9r*?4uX4aS&r5VBQf$6>h= zv=Prr*`yJ#ncW0g7C$Viy1`MqI2P`(V0)Qz{}%UX4j7i*>Ua`VK3w1V)m+Y`ka42_ zouiByvT}E!Hl_~-gjBbJK+)@(iL+PM6SOShR}Cwcb;JDkaaExDr(jM6ANq=n+Vel#7}E|Eu9Ee+*v+w#zq z4R6UrW5k+>U%fhgrT>xnNx{q2(n|c5>O7mCQ%z+&*R!}1N5nI@GX)qwN|7}Q+#lU1 zsgx02wvU%>t-!SQn^E8=WyD_$mPNs_#e*Sz^@D={Z=}7r_1=G~&Df1u{&Nbd{D1Od zcLSoJa031iBSZnP$on;0e!Dy9T`LIFeIp?M;N})-xDF~S)#|c)@6MaXO(5#p?@o}s z=qps9f6t)CO~u}iBjLRsKB-X5IcP&-3Y8|3oC}tD8|iOO3kx1zR@jqX5j5V-#yy|v z-I|WVTALvJe;G1w6p(Z1%^r)KJP5rs{Ts=)=G-}v*RrfDmvUi_lcQq6vmDb=0G_P7<5QSr}Fbcjni)LTD$pu?!2_BhwT zV{ZrbAXxRwj~@4aM4$6S7DqGD>ODgbruvUIo+O>0> zC>@@CN>9NwNFn+`B$L2f$aldY!?hzq^^8^UIHeVqZGjigu)ynHWblZn#AmcK#^bHj zN*yRf5#|d*WG^C^L?*Ex*L6A!!>d!#NwBu3i6B|jTdg~4BsMh>!{v-XK91TeX;#6V zv4?2I9WP9Oej83rtzviN)r8bc>YM$B>$eeG0X7XnFy!&Z>tPL193)D}lQNnUL~zd+ zPe02av4&VA|K5tv()YV}>TgY?fv4U$9dm^50(uC_a11Ky4k3un+ozhHFNZQ4el;LW z=mvM)`F3WdFj7qzI|&+naQh4vm_N3Ro*0N6b{M!1ZMJMQ2C zv~y=Dcl89!sm&pGjzb&P1SJuu3{A-^w4)Lo_s~F+7=#O2MQZaGZH)<02}BYY+Ruzu zPjs8Y|D03$=O93PBw{;0J4v&}0QAo0iP5jf;EiA;hz6gX!5gwdO>3jF55M=64r!(M zCmlNV&l-}a($XJ1G2?DNEJF?DB@*UmS}&)CF{17@4*=UBqGGzg+Mn6Qs$MsORqp&$ zfxkI2f92z>iT2I0NN&zrN=2BiO9qAD+T41jm*W^|>dME}bYQmM?*Atc&?m>~$k0Gh zQt^K7b1v1cDmts#YGRk7hXm{_N^GRujk)Yvfk@lRo#Wy%xZwDmoA99NG^8VdJjWZ= zFg^a^w|K;f3UiqYB4Le`yB0CtE-(^fG{C!e*j+{G{7by8bN&j~m9Ioig6F4bJc67l zo_0Gm6W9nakF_Uut~-#C&`}8c7k9LThM6%4Ofce^{jl0~8}gZ1r%o7-H(1hU{bxXO zil*Y+!eekt3E>3O$YMQWjm|UOTs{aOwPzl*7 zbV%$3neGx=LkHp@#0gBlP8eIDm1@{K8AjaTzh$rjBkt?*o!1~UV8RuW97*+k;*&!P z9OJi;Gy~b@HEjvvYQ0F10bj5#z=Hi@XNk3^i?`3Z_Am>bAid1CfvqJS{8b-{MTvwN z^jh-lwGQ5(ya(CffV*y3uuN`3CS?G-gh$W=Dqw_hfO9KL=U%lbU{JZ^n++%2JBjSv zf5H8+xzMhKgaqT4Tb+N!a;z{yM^<#?}HTB#ow zYEm=}7Y}%Lirm1mC&fz7-!Lmd7P;S1n=2#gdVJr9gYeFiXyP&Xjav)aFFuMmHDg>l zTKNjso8fWavhmMt=6veEWJISmv92EdQLl3PmX?Q>>5a@tK#`CVaFIF!`FS&W#~cNjFN9wZ_$)+HWp{gH$w=2s58XL_1NyY0 z6OB~~i1=um{Jy%}!k;tb3>S+Mg>rBIR2@Y)d7LUiEmXAIwK>E3d(dE^K-_&+%N03l z`LIJOx90v&C@i~e$cKaV%x?$Y$LtMbWaLR+X?XPQHoz^UniFb2+X9euekqC z8y$l5FbJ-&VrSwX{+#~k#Ld@w1(QuR`Gu}CIidf-r$l%8ZE5s@->?7pd$?YB7x&6l zWlAFTe;Z3EwFz`pbeEO91}QnaSOt;?**D8n5!P%-A1o0Bi!B=da#{aPZ&e8nw-|@C4BoyJ{ z#)<}s)whetj_Iziahb;7ur6=Ee@K4fES2mXK@|-ZRd)bL-I8p@g zLgUNcSNV*Kvy=A>9K3Sg6ZJB6a$@Q%3r;t?mOQ%Rx&>b*-!_>Nlj*L_;`+J}KB!v2 z|L8AIt1d-KmtG9WuDi}xPO41WdL)w+hWVjCkR7LJIgPYxsbYQqcObsl#}7&3T=NvK z6Houb6l8&mi8Z-Xe7zyTEkJgCu)3zvy_XaD?EqOuMceIres|wM5rZm-I>tr_=u7r% zSQ7Wwt_hV~Y1!J55BA!bXzeq*gp6DFXUn%8Ki%>juM>hn=b27o=Y?vpN5@m#!gkPz zS+If$G~+4R7sWV9e%JYx{vj>}d_+47xm@C*R2;J1saEml&5g55^XZ0@VML(XpEKO@ zjv8cJCCL50K@rt`l|&orw_P7>XkYFYtn~3rnWwRL9pc|qJ>ll>=e}isrne1|z5ifA5DDY?Q^&zkyWXSK zRaM{e2s$O3F4kNDGmo+RJeK-6A}lfFs9X3p%h?&oBVV*%7RS5SJ4bquBlIx$M;U+` zNJ%OD{9Llx>hiKyjY4eI#Pfo65!0F%7G__~Cf;dd0Y*r(I{AcO1{}UE@iNZ8JE7Td zSp%gB){i89Jlg{Di}94*x5v%f@9rznZ7&fNETHltAZwv;KtO-l;Z?$B|CP$MmDF)b z=Vil`nRnxgv-vd+BV2E##~Gg|o_V$XBFATBjo@dF6K|uqge3;O_%nR+RMT?*)w?dd zrkpnga@!Tn8lwLZek}L&(iw~?f#YLXO}3;{55gjsU-N52`#=}<9sl03sDgJczvMk?(g5HVLmk%%8lSl3> zrxE>a{@JRQwvh4cqi2_mPyb$;m%Tr8!MEdTK5yeWHD!Vn;h~+uqeD;ex9ZF|b@}7G zP>DAJC7yZM^E~{abJkg6(ey>sEOh~|BRL>;gMk%OP;=n%_`XxG4RRr7&!kY{YD@nQ zq?_RTXNB!LU1`CZ_gu zoZl49R{w6q|3RKlPUK$Xs6{s8@-)M?x%&qBmuNxRVotVVKxB!@V=!B0$XCfd&x8=A zy~|74bxTs8@6&AT8kvh0Z-wQj`rtI$pq!o~ps9f4)HzGbm_%@>%1k9T1)|RTmLRHD7-{Cj#ymd#|+1q}TQCrkX z#Uw}2p}jzPFvVfoEcQr*aIsgu5Tcq;r~I-|&IuW!7C590(>>_rgp?%MEI2?i^5D$L zd`j5KA4$$(kGd5trVd@QNm(AM6dR;gnq)%VZ1%6>cM4FunJJ|z23eOnJn|}ZzVZCG zGedf@50`$WC4d`Ki)KLkj4T@Ye8Go&_CrGr?A-8Ue%GsPC=uu_aM6TCGA~DIxOB+MAlxgCo#9w zh8YU%PUmOWWh7!go7TvaQVQMw+Oq8j8iO6Y*C{;0iLEC(TeD2UZTy^BvdT=HEnl&z9O{ z{LW6s_2ZQnotq50(#npVDIuY2s)%pJ>~c2JLG~^~;jE$Fsp2pi#J8-8k(Y&DpZ{oE zu)UUU>v|m`c?ykzg5^IWIP)}Leao|O5XgQ%Sb&+iZyyVt@Xi-MFkpT}E$~W_T8Cx% zIPOH+6@T$ZE~0{N^}Iq&U!+zog5QJjkQC8}i}aoslEUl9uj&D6i(1J7Z%vohqkzU9WHICot` zftWP%k{_Aq@w(6Kh$lawrP`29pW$&jV%irdoIPaU_D2U@N`EtjQj{6a8){4VxDXFM zVpYR8@#6DcUOHC@Cy#DrR2BALym9%by;X#+mX+yWeg)`~7L0HdDn6I~=WLnazn2xr z-5^bhgzr{-6i(?tiKl9%)##zMRbKLP*7`4p!WIejkazJwUWBwdGR%Qzz$a4DWmMrd z_VsT9t8Vbx(X582c)H%_f~8NyMdab8ncHY+LZR4>IyTNu1lLZ*>*W4-)qbzK`N_(t z3z7I1D31$OIg_(b^dsSiB%O?}N5MF!07r-PZ|{4}e5pe3-*+65+vV7M^;by^|ILXK zmD#;%H-NGp^xM47M3ow~?!|i!XVQptdo#yH9zmiCvYR?S5eo>TJL0f^LASc@mv5c! zicr&x>(&}T_ot}|a@s?G0DHoLSb6iQf?)E!*JpP_=#Ek~$?rZW)x%d!mVB8rjQgME z<5ie5g%CzRv+M39FQy+)NrsqQZH=(Kdw;un7q;he>7X}UDMM=Y$jW4w%~;h(lB4!J zyR!3iS-a8{zg6IvyYX1;dsERI7ad@;K+%LNm?+S&3D8(w-PZG%OkJ;fmVI{?>{Ys` z+Kc*?kN6Q8y}}!j)(*TS=-t+Gr8v^wFJT$++e~l#pYnWdjuu5yo)+b`B9gYglXak% zs<9lrTPH6b~TKLmrcvf;t_R;Hcb83qW=X*gFMgYCwcDMYSCtS<`9ZbTRji zLOd^TU$r8j`nkZ><2mCm+@b^?hRq{boxG4ywbHTU+9^={_h17gfDj@v@RyJ4Nw683nT6x|-bq5Vq zK}u&7ll$G1xS)XVciLM!n=ND2b@(f!X1S*~hCbJY5=>Rw9jbU1423I+%mNEm;9p8V zq5qiM910!RU z<1bfu^~}xggkMpM3$$o$w=5g5wfZ5RkA{!`ZtJVB6C5wXMi@(F7pgY5h8LVlhF*T~ z>CLCVLzMpNVqXvLC7ldcMenpI=(&gU>YsX1 zIXJ{4Q8hhV%Eg4r!0temSnHm{DJ*E9fp#U`%u_df)RQ< z3OU8YevsA;nbT`nx=KX@ayIIFKZ2VoTsC%H8A!;o5(t@?WSUdnIMaI@%e~7j^xOsV zmWq6kPFk=8Zlf7}IM8Bd>0Ar!kayt$@vg*Q`T+Yb7(;e%%w8TX%6ebyS4r+Z&6nyd zQsV%Oeb2ek!0t?OMBw+xic-VNgAH?BwIQfCy@CtPa&PCzvc1Fp+{2D@@iO464p4*5 z!+Fkf$AEXrM(ttYpJfekP&VP1c?U~s@RgF+9F3|l?!g`To4?f~qv!c@-4B|E^GA+u z!;eRt6JDk8DA*b9duYKU_J`Ps*C^eHmy>H{U*%f|ZbI(ScWTH?(5}*bl3Pnc2D9dw zrBe043L+Go?#VeF7yMN$WQkR`$@x~@rTp`kmu+4on1#_lk*$XH4%?qMrm^6^{Wfhs zH|=gmzSn*`uIX_jL3O}GE-v-!h9pDYoVD18uFlU!_g+-7%fZS2ZuQcn^~CpOM|!V3 z4!R1ttDELWcl(wkm6r4%R7!+4qoMBP=+;8E-?X{V_0|?MkH9{-xAtQ5X|~vX;aOS5 zf!sLiM8yw@5e}>c_h97jE#Fg~ebvmN*wqCnPl|z@vj*lppNF1&e53|J?CqcD`FGD2 z#DqhMt7;g|KWjlJRu62H0`DSNAOK0Q#SfpWku?4J@%{;SN5te$M6;N);SJMovlFpMbq# zEfm06O3tOzFdsFpi}~85Hv?_D!Dkj{9k{MXGD>$Rr8UdqIFH3SYOpBkmx7#eb`G8E zR2S|$9lUty8n-V_tpVoxVrTK9+seA74!m5H>|xzIybYPH$np^OC_E4`#?;BCXYW2s zW|5dw-q`wQRBULl9Oxjar1Xdn3^`8nk>7kLBQVS0g(Q0gk(t3>Tqj|M69OC`(AI_-D>d zUYi(qfs?}9Gr40l)5x-?`ifT(shx#oBTSSAV!&rI(-SX%LH1^TxSb5uP@N1b!AN&R zUvNIO?sctSy3{MnnWBT3nyvPoEMU%kHK8ibN%Y?jF<;?a+)xIIVPRJyUZXhVHlDn^ z#3fuF`yu<3V^23Nl0-UO_teYvV!~~K$RhPNBPJrIj$ zSfGx5&d~V;aqpgYp_%mT9Zy>9r8ZhjhF`u!TkY${ovYZur3=I0hv~w^^B4a-5UvAL3p3^qg|-IyVm`4)A*Kq&I03J;9p^>tOy9gp zOlA3AXHkk{B&?=j`3-YkDyb!JF=I7^1S#iJ==kKjI1^KQs_L^EUy?EMg; zCgX%aHPRn?aTq$Z;1WR!Zu~z(D<<9K^G7Qbuv~Em#jlAnN@>AJrKo~^5n?!0 z;YC;a4miJaTfH>0;HV!n)(gAvs1lCdl{cYNLu-h^`Erja4jva8x!J6-#+1?- zI8}khQk?v?V6BwiUY61JU3V%bBe(6}!7I1U_&sRSinOG=kQcc>354y=)I&i0pd*?*Wu_0g z8xGojq=oU`^T%Q`P8MY0iV)*Atj1`4kkjNj`@d?NCZ&?3iZE4DFP?b;{GJ753wS#N ze@K-_)n@7MA=#u@Qe6F~S-|V@tzK?VVr_8`%y-A&hgWWcnyX4PH`80%+}7+B#i(}b zFA~Y+qCVfe7JDTKVVqa^&m^btVV!cX)gGj9X(zMw#BQ3ISbCQmDPN$^C`*^{-x9L^ z+?n3+bo#;m;G*Ae_q!Kc9^CwA?U3ybHSf(}>gg?~8Bxgp|CoB~sHWfle^^C9ln@c6 zC!mCMH&f{jX{4k}x??CvNQ@lKXprvih5@4ykR06|gKfXPKi_kobN{=Y#d%%V^^EKJ z2uGozB;hYO-_oC^4UXJzREi-chU31kV{U{oia*~QNfT~p{a5kpj2_Z${^L$1FYbNX zw8onp8Lq*wXJhF%Qpr6!IXbQ(#cLf-a_RSGg@7`O<;w_HK}JsWO4M7}-JC#cy&tbz zu=Bmqn8{%1DRd@~@nnn`E6~}fXOZXZaUVT*q9?m%LCwUX>sH}O)Sgg1wLRZnIv=^y z#IK9=y8VqmL|ZpZ@14W=5y$x3?tpH9GAfx|0cp?Xuhb_#9Nwa2wXqo``b0MKZ1i3C zkHG9tB4~A)73iTq8^v&#{-lm9`vYiiFVH)?CSR)r;#BWnG?psyH}|!XkfG&tMvHmO z{nVdD+=+(iH3XQjKQ6~$l~0%u_V9J=e3-WB^zY%PUPtT$MQ^{-=Xiw6lyX%#PldRs zr3r*Z8!*7dFpu1xKe(rZ5gG0Oh_F9%-9=D#sf*I6WFHQx^5x0@!aNljUi7%AXtfUt zNR_ULNUbMCiBe9kOl)HmC#`yyBU5x0UKd-qsSilD6s!CuWBALwS52el3jMO!<4# zez58Lex97;9oi+ zC8F&uOAQB>xmIVi5^25K?(bXTe-JXb%@VdyhbTM*i>!4$wGL4GtPSwq;1=>vlQWQ7 zK1JKGbu9p3T=78hqAG!5>kcrEuQ@D{uhPm$1mwPNiwpax5 zK3{5+W5;qe8Antwb}h#|4cSZ$4@0`BG$Hd*!hr zV2(I?AqD>J*kU>YQFXy>{6aR}J5|FWI3Il7H#uP3sV=&on6#NJi!Qmuz>;JJYnjHG z)}3zC(kB%6XnaeTJ3>TS@nfS0z8zoO{~hp|*Z^;~b#xDvbQ)|1MsUWb9*TY##h#uU zcOhH(j0bABq8>^L^4q zV@Kj?l87ygI#S#grufkQN8#8P0XjeOefJgW8o$s%Ftu-qY5d?`ulv$!Dd>J;*4)g( zsK$_f3i)BIC5>Tj@`qj;xv3nWR_^y4v+SZ}v}yr4@zJzaOJO6KNW7zbwy|367C9qv zdTyau0OMG&ghibLAsIq-^}v7l;!}HggwPP{vEJ~FN9$0VTo%$D|3V)@?YA{II4bHwoz8zz*e-V`kjVypvpb5C|fi5Y=wDXIa= z+A`-kk;PFjafmQ-&^a+Ls21k>C0V~m$jA2xdlrBqJNTUx z9;{dKkC<(0FCV|%OuXrKcV+YUdkZ1*!{A6wt6+_6-CV|nhx7Toi_Xd7o8n)P32#oZ zxTv)VOg1_*+&;X!Y(wrb3%P4EFIvDLiMb?QI+L_KVYSsI279HVfh0O@ha8R{3N5Wd{$|uKCsB1lz8F(3igG!I>zq5 zCYun^9Yd&V;M3__w@2;LSmS`@J4{OKKMoHi^nR5XFOYy-Y(wwXZ%c`Np;eF9duQcZ zv94Hau>GI+od21iP-4wKsI$|qD%}b2aU&iN;G_G!X|qCqIUo{UQqlJIPS7l`Xwatc zYNAF9p~jk(lehu`BjrOG0p>!#1Z0tZV+GIu**r2WTJ&q~~`x|-{ zAe9UMe4$HW*jyuVrQdq_T8cSm1Odj#5&?7KUw6E@%Us55+DYC-H=#H?be&rtG9Bqz zU4BW0`gMzIuzs);T)$Q6Id8jK0Pf0?jtxH(TBlHlA+mxN26Oq?v*T+x^GlD1CKg)A(ie8_b$N&xNi35`voCPLNh5eQ@a6nPABK{Ojxk2Tk2S zUfvdTgAV4n_1x0%S+YvLT?Ga6`>J<`N(btSd4!bI54MLW-M?mr``0&F?a$~KvL2dL zWYQuZ-@x(ENkiUYV(3){j-+&A->*lU_b1Y~R=t83^$eF#O48ahfTo>8rg%Uu?FStvnIDzEp)3tKq+HdF1I` z3FH^0`GEJ;smgx7R=wW{EsH%C{>>cKKumvO2FD#OD2KytWE1R79oiPs(EUT`k>Xi= zK+hL)^$2lWD9FfCLR^Zd@#N*7`9JaY%Z=)cORjHn+;8cA%Jo@}<{y&jC_Mc8({aT| zQ6eA)R_&PBbKGh`zSiQ6!leMN;x1j+pYB>I(6IR);3a9&`t|`X>-kJXmt9&mdR+BS z`;@$|>kX==Pl;1?vaGrPxbK)&>m&~IY)*VK5_3Ir`rDZ zYrH~T66{x$(HqpA4kyQ2F2Xwu8glcVxpflP^tXxAl9U^VY8Y_SGCyn4QrUtVXPp81 z!{(aZFL08E=+?D=JiVG~qNH7F^Fya=*QY{4F=dpi=c0C7Ud; zAV;AAVj&`Iu6Ey>Q7_~;1k+~6y4YCAv~uc4h8dQwb|F0vs$}K!hsm+a>9gldlj%UZ z6R{|cO?git95Pbu^iFyhg*CHqQk4UaC#Q9{>B6Q^Lm~ZnG=2v$eYIjDONP}Q^rS?` zsn%@QOo?EJw$9rcgfCIyYCcnOs)Q1j1S_eo9`f8SU7a_4i)LmqCBwh|gxN)d3{X&r zfO`SSn#d$P0;PPh3r{b;u-lmi82F*9&;wVF0!$0gUXElLYra~{U0DaFxbgIMVEY*L ztrYVKrwWCk?Ki&M(;m3r`{XpO9n<~mw}owo@i;JxNaNiJDjach@3p-#Fnv_C;Tv;H z(w#1{6@5dLYZj31{i6Tqur0ht)q}gfm&=i@7-BX0+?Ar&&dr{~XtyW);GuS~&R7`K zLQQCmNgU)D^Nhx8&7JXWwrA3H^(Sa4!k+*XzwP6|3MxW8AI4`CY8-=XQ;)5{yBurQvQoyWbL)6dBL zor7m>iFqQha5pWNl;xr0BP+g_h@&x`9w@m$5{vT6@TB$^=0dn{uIiZmiau}S27XoI z<6i_@!DIg(x9RG|FU^(GA{UG+;`UlQ}4I*H;uA~R;J*E zn$?Z0DSs~dNx2T2ngUAqb1aQ_sL)Bm`CAfcqAwX|!Ceps!Ck-B57N>X^ofo4J13@` zrruMR3Q*D{SvLu#A;*4NNLsx;WIcJ+sOCF6ggE^P-b6rHks%{PC0;sAnQ10A6cBAy zsnrNL?0ypQ>uv?YX-wpH{c_T8lPqm;2G62fVJyoM9$SG|UJ zVDmiFa_r-@uYw{+2ebx=5v}4p*)4?rwD#wC;+K0k|NE)aUcRZM>oj_^{^8_ZDX-h^ z_oMmYy~XQvqhTNvxXI{GuFj&-`1EGw8B^S;YBNv=14KIUP>YAI-jGICLc6jTmk&Y@sKl)DjVia%CsX6OEk9CwqEcg zq6S6{+`=tnHX)@(IMJ)!jTnXHW+eO-YsCGbV>_85Ku}H0pm9VbrcAF|Z5eqEbxByc zJlcj%0h8VwJ5S=drrh|3n@8`9=16sO9Uw z_j{#5ei%R~k@Xowb2T`oh>;cjSjc&2C7~)J-W2IV5=k};VPPmaefXq7;Ufgw8Tq*H z4TkC>|3chVZT|>sG+`fz=YhQ9Efv4bQ!7`4*NMt8@!Ry%!YA5HLwf^gB_ft}y+@+}8%|t@qE)&ayEBx`@FZbqHY6K~t6sC~#-G z<0_0t)Wi?lRver((gUrv(1plsxGH1*pSk$Wl!4g_Fv=9BLtY z|EVBxZQl?`wPGe{8kj)g26HV1*@uaJyZgc~b(d>!E zAN>4v=RFZoL_%MUrd5e_ge`8s2)@lHyyCoSljbK6aYAwWhD}4>-T%!bPs)SpQIs_yt&w!F4{dZ#8Io!4B(<)D!e7 z%$AFBB(gy)o(coSS^&LaxVc$^A%9Ij8E)nS>B@8vX|)Iv{z_NMu;_)1sg>`Xhy6by z&2cyN8h?gsO3DUF6ug+ zWCc4LdDjOC1rTtxjw!4VvLx}VtnQ}&;w76h?k_>mKla{k%UC)=iooN)NW7le2smOuxWfM7^NscNv~9o(eG16?IzzdR7xV+T1UJCl(YCw5q#NL!J>?|&r@tjwt8iRQs9wL$ zwgL%7QqbFSQ>flvGT>#Ze?Qw$eX-<~q~vw&pSQsVOj-`O0b;m9&BsYI@N@ek6VJz5 zUa<%vef5r_}E2Vw4(T>hPg4c2d!t!_9V`U&@98Y%C*zArS&UzSG}T!4<- zJohrg@~$sVF|Fb{EpZ{S0 zTo;A+d-~6d^vE)|tasHOm-S@mRG5J=4J+?`@+}5Cm-*^tzQ{%59L-UYqe1F*no>Y$^sAt9neT%9TJbp_dbi&y$v19DC zChT-}6--)KKiR<4JRM3^2Ms|pSMEorHy(= z5d*P}+ck}bU&Xratx4QosWSpX`Q96gYaV*C4Q0TfuX8_e+L#}#s7wQgv+(A%A5L9o zRYhG5@Th<=HFpY!9I`_qfA8ih?sM(7+aLaaVV)M!DJGUx$l#KZYO zVy3}F+ALYC<94R2N`rTtcW16CXM;T&1uBL%&gfs&dj?Vp=v###9is_aV&LaJH*pz- znU7Gs*_o?Aj0JBYOea@nSWJw!aP17>(({02r4ipQXfI~H+@Myi|Eov%aE4*PyFKVy z7eDwT(A>Pb2%{0k48%&Zj-YJ~7mC%(c&!5Hj?Mm+Z92*%B3Ui;gF-G*Zw~ zvpY%Eezb{g^oWVl53s(7yFEbSf=8BXS1?F?TVsIQ@k}?&iqEv$R|97ZE#P3VCRz3C z?3p(4gd{Yyh}R2)N;8>1tIqcRNaUy0{-E+}{;GlB%_h9Q!Ydi@aD6W z15bnMd6?e$Np!EBzj621szqH9IbmdN&@FE6`5JSms4}9hON80=VClK^G~3i$-&f@e z7VCr;bz>|XuFaInCY}GD9lB^E>#OrS7EkSYCdSV@=AB!Jq%V6f_#_zhQziePaKz_g zm#ESaHGJn-OBteym~4P^`YAPkWeML4nz|N+_!crS1>XWcr7W$$4Ig3yw?B#)&ZlXK zr#E|~H)ithqpdqnP2#aC(W+o2V4$gf| zQdeV1m!s`&n@q+WXzRlqG|q2c#rv4--uchi{nHHZjo1O+P5GWir>{Q@o~Du|4Xwjj zIWL-I{|txnW>9Wcma^#?;)m zL0* zTn*g7ZiE1MbKrz}A1?5lZr2abd09ptC^zKSqHq0JwTi;tOVeye&vdleX%0+o6Pn{g za8R#XoxnS-SKFAQ&UsHZEpQ(4W-!T+l%+Ml_;a~8K$*H`B6^zD^)wB=h zG>p_ZTW0s2Bw_gwuUUy?ZQZjzy%RpTWh{MES%x%j)MQ~%uPZK<6xXeAHyPM@!)l;1 zJYD{NpJbxxHGtgVbFH;eCZ;^0!@4R*1DB-FZv>Xa-Xqi_K>!#2cn0tN4A2`%M^qWM-l~yWk;S`QC+Qg-FPGWxQUqcn)ANbRgw^4BJG)5Suc!V z-AzM6dO&2E`#uZ)m54>LkxX%e<=)w+!gZK$x-@xyzg+eXw)UQEjDiWko%v7C-+}<8 zmVrj3fUPcdMbg@c1Jw{gE6Afo<9dPf4m%JJ&rvYi(-Q;O9l(YROvE7|O4venw0hx2 z&}_I{+8#6h+)cVAa}HafLajkLDEY0G98}cRb;Cc*^d~6?VX0{dvpR{ZcfBmTFR?q% z-m9kp7vogzaaj>^?EaCD4ce1k4^!=|4nzL}x-tuf&*NNmf-OJ}W7?C7M^h)kqZj)R ziD5Ux$-h-;N@>OV$Ka>Fsiqgk2vYI9u|Kgu*7y@rq&jEJ;X!L05pj#Bap)4SIP1y+ z3q#cH$fe&LIKOYD=tt}Sur|d_;(63GQQx_2#9Tyv8Y)xJ1i6^WnDxqO@W(k3ygRXU zdc>zv``Pm5K7D-PRa%@U?ZL8hRS|?pEUunPw9ql*aYnUDsAeE%Cr?J~ciUBGX=dZ< zzo$0guc96&o=OKqDNhRG*k1@rem6Lxdk)pxi6>*N@vafJ)hQ3m^&q0=piIpzEk<`z zD#Up@DZjUV#DbuNj>h**Ra(*I`h*gB<61pB>-9^2(CHGKI~_eeB`Fgq8&L2S_f>xK zm@hpecK_}$?WX?G!_Sn%fb=kAtXiGR1H|;HNIk=14W|3k`{%FOn3JwM9^YjyWEK(w z?;8mkPhV>jrHCBjWZZ9~Yp?&Ee=G%6p``C5?`&ieWL_eOYP|-b)`3`T(ulAQw2wE zpugwU;900~BPQxfaAD;yCM#C@?yiL#G*@Oocr0;L#2)8Od>)YGN)Z{dDH=Y8;Qc+j zEy$%(GnYFq+x6L3_*&4biH)RABuvF*emTy?RARA3eDbFmWTJkky3g(cmVUhBJF}>y3$k z9q}QAZQpYK*SEA|mDW>Nxq1$q&@#SWH|9uh_i96wUEksLOH~ z<-m5OzGR20wH;NMPf*f3<3oCn^P3?5nR$QTU5Tv~Qwr;HqRttKVbh8wT*5uYhozQW z00Z_&YT^C`_M6dfaKz2?J(Cqn{cr?a2t8Z;VgR)K_Mp@uxc|{YILi0{qegrcjE3)h z>-RH25!9!X%^e88JWxGO`Ho)%ufjZUR?C0v&&|Tjedk42kKLL%DDV}CxE|w9qK<_O zJ)=}Ffe>Crp6?SVd>fC4*SU^~x;+|1)Xj@~^6963`zUcIHiB84nsf01U#&)~UJ3fV zc#X05NY~YaV4@_B<#mqh2r8CB*O;G@9&nkEJ$EASxR5ltlXT~q0zb6kJ)chMg1HF~ zSfPo}sgeOb*3F=|6VlAt%-)ACO|8Aq8O&NMsZMIU>F*A89Pf#bZqr-RcD`y9G=U{m zSwDDl6Ua#gH7rd=ipbN2#SCABKJVuz|Kh2Ts-8oVr>-zuXzv`SlF+rvqyI`!;hkZ0 zh(NYuh~N)iQN`ro_MR5?+8S628DMDYG)-dULE##8|5&H21h1bY;089XdJ5y)Gn*;^ ztUfUKy(zO&CvH2n;pA`=7y=LWx|~lgr7(OjhE*{$?Ve|G?JtAvz-PVQ6?r-jxiY;5 z()&xmS1Qmj)9_tcTJINka9Wd;M!?bD6VxPp!W}D>JA_XW5QJT#tI~AJa>!2a@mqHLWSo%)(&i6zpu6^PPnqS32d(%z3~&RA=bg zv@v?sL^!v?b79*i1Wi8H3tkh(heFox8y!2H7g9Eri3_TN3lO*Aqi&zEC1{K+p_Hrx zEm_0%tC}vsTW*{+oQU4!cOiXEvvZAXxL}#^kPysmK0dhjglkfu$&<~p=+#SLC;r>b zPf;CIN|eUizbYT%>Kq8wpP+U<_+C1hM3eQ{zk}i4S;n-oTkh8%} zu+53XAG5C?lqYdNotUfFJl;NKxZw_oDeRuFG(^1&Rv_&9vsIIFOiS~H{MSe zx|G%8e->w5cB36$gCd@WB>?iHc!oZ0#=KD7z;}^BQY=ZMm@bR8%lz}SU^sdG%QN|M zvE9{96W>w<9Gd-Zx(15o@TvDTfuYo|aa&e|ob?_5l>|{J z)dSFV)~W1i+i&^J;lv4WV!|WcEzsdYT{B+8k@091lqhBWhBX=}Tn-mOha-+}&?GAz z2Q!n)oIQ=eXbj>`)ejSK45A?1VgAsL%^oW^=oY*V%xsx~;c&ut*7u59JhEjACtTo2 zJHzT^|CX_IePc)8Nqw%DQ}NbFdH{v92`NS^p{<^OkPI+gnJ;2WC9YfCwtFz62w|9}JpO3zjuo`h`|6DjV z^4Q+uCAHz!x%xOtI5q4|eAZ@h}D*?Rv#MuDaE zKe^_$HUHTj=Y05m!@t#XR71#?Y4AW#7b!HD zwyET9GU}_$TbeZrguciY)2peg_#_sNgY%OGz6CVcF+ywrvgic}aMctPpV}cm@39)44@@w^E8LaMjUO zKRMQa3QZd+t>?P}R$-zLU?KExgz7?HWYk7X+J^~VP5W(lc z@3ytD=4F4Zlje(8I(hbyOT<@v6j@2&Utq`4B3vka7U0m-YsYtsmins1NywHe5qmq_s*_dSt{{fDE&_f(fQm!?OGu2x%?rB#)2VzLx=sOnC7 z2-Y(wCqB9oS}>lGIskoUqPklVLYu%z28XnUkAg0eczPzw z7Af4#>9g4OKhj!x`e0-zr6y^L$S=_fPJ6tyS%;EKJxrxZ~=+gv0;q)>{^>>X-FDy0Ccu5Yc*XWZ?DEJr|YWma~W^FM|%9fDus z@3Qg*JW}m){M4TO?X1OhcH`**4p`Vx4{|Xn@r1pCS<-N9P|oLqz_XdSehHw#I?#9@VNjKjLA(VoNS1CH}0b4w^ zCAH08>LgI#XL3OgdGGDSi<;wbJ6t%7+@Dg5zrvQl2Crt)Q-wMH)Z#wWMvb}an1&dx z5@dxKC3MyH`js1tM;(xm6h$>>BXwAO%rsoexlM)BpA+}iLWXucFf_BLobYAG2!n_q z(#H;%_lXX5peLiRUfr1Z{$&rD=BwQ=g6f$6SSqrJ7l*_Se`xu#0(ABNtFdo~A`-7# z0wT`@OkQc5XmP%tfDbjMHn5xI52XdvQ- z7i-qZ^d%JBg8eb)dzyijU2eub>?d=b?GdP4qa{j>dL_~M5~xC8PwwCS#5gdqyA3ki z5-hR%em9i@ggu)@|DDa;^{a$$-^E@A{7XK4-x>Mrd?ZkpG719t&PCc|S^1rOIr3@E z|EC2|vo82gdpWY10$YmXju2$8RoTIGL`#B~NNoFKYctxrlGU~T@p;INq!3%C#9sQf z$kN^K^7Pwk%CC5@zIs{CJ3;5d)<<>Aq*`u1}qRb0?d zO+IIkNNh@@hT8FR+;_d7Mz1r;6Q8*}A;cY&5~-FTCvPl@pJ(ADLYuEhO&5PAjr?y3 z-#fgo2lD&=ANmpc7t?==ed2wmg+wjxU$IMo3^7H#uOL4~F<8HC2lZXUZ_qT`0BgMU zd&P9nv!zELf}(TlG8`XW19y@B9k55j#G&En<6U~OiW~{F;xvYieW6ov!#HJxZ<&UOW{8e^utAXr9duM z+on{lEq{f3s^c_G{nyl}82hrhErjJ&OcAtvnTp~*|M$sO1|CU37{Ag&cXsy}O2y1; zj;}1jH0qs71~KlnS4Zsj$KLJ^8U%T^LXuXUaO`f6`1phDU0y)^d^9W0kEV!~JSEtP zmk7Lm=}8X-3R-xvgig^NU7)r`_bvFZiVT}vayb0cE#R1`1 z`i=?D0=n}8KQR;QwX5KPdo4FlBhusm?hv1;F=6H@P1;LU_h28IeP~_TUvv(N`);Uy zt^d`w6T&|vzq39sw`ClFkLsST%YdvMJ(iY@Ts0X0qzuF>uPd%wY zuJ#lw!1X&>Kg>xxUHZIE?=`0uHapf{Wvw*n=0GPub|<;LV!GE{)>XV3yV0zlU|Ln?l`e|@B70__1h`bLY*Z?S`YeRr}=#s ze6AtQ>HHwv!nBL3^@Z9nX=rKiWCi(Zw>&ymcid~mpdXw1iF zmBl!!Ry^gg#TRuoQ!q7^8g{|J%3zv>*uVMvP@c-E!GEGOZ}_SFJxrvZy@8DCZkZxN z2$}KMS&&##dAzL_E3DP~xp_~>Wr#$KPE)sgh!MxG-RTlDD36%%AP)^oVr81K)r@zy zn;kk3uKD3Ku)k713mWymg5Vg`cZR-X-HZ}kR-gB9zhgCSZ`BNK#qwMeg=;#V(Fc2= zSm!YQwzDxf#P%#Oy5ls**3r-=gG*K9CQKcuWx>ARb0FL@gPzF?(63KOEKvg(fvEl+ z>Roy2%wfdWZjZ;V0GlhQL!bm^X%5qe1nh(CvDax9%LDc2=r;oZYM$fv>*FHKf0fv` zyG6ruEH?TceW2RrGn21mg9Sljr9#{TRrJ%Yq?LQqxweOdqc5)UfoZBgT$$Z$AJOyU zjecYutMlz7gQxp0BF(V(M8ZMBGQ_gXju(H)s8DXN*gqwYF=RWUpG`KfAy`rn+ikai ze}$g_pVuSb3k1oZFh2Z7i`sYNMf_nC;l8Em_d4B-0WD*G#=WBg7yZbX#2)FR1msm@ z_tC~XK}#v?Wb2EA%#dLMTwDb@b_eTGp^3Mtu@}BQut$TiGk*NjDf#`Ap(I8dvwb&0 zXqzT)lm+PCnRo0fNFv0O zMU4mFM$nBC(EP0))RcM;MTqWN#3Q#v$gS@jV z-i-^`d_i7!V9DURRT@`|6?JhK{@rbJkdaqFW$kz0w+DcWDH7yRKI#jdhx%Q|`fpes zW;1Dcn2a^gW=g>FP0&%j1<3Qgzkhp+I$91e%Do5FL4b8J**^@;K^}Q1e*1qh5xzqg zyS$p0>X?plbPc#87oCd+ja~uvjsI(eJ9b!v)y@$*2Oz9?!XdWH{)-Oayej;jVXIMp z(3KLV&)?*Af6IOR{T%az`5Y$?_IvOEn{gNRGO@JQ zsM2bZiZ$+~7|_`eUpM0|+jjfIc+NF`R)6+a|Nl&%_l-|N%=$TRd}5;~j^!;b0=wIy zDb#o&-{nTFxkpXefpj0uq$C~t;gQU{i=RY#`)byz{q0kpC()C;F<5WL7WXggoG+Y{ zy*9>LK-=Ctwd;?)NQ{o-(J#P_kDr#CgM5Bln#g}YR&$yXt4heTxo)|e06clQ!SNtcD9z+UP<&IW0}hm+7r?~b0`(Cw;iw( zs@RwTLcc#7X3eb~X3e0f1+`S8487l9;K&}j2vuKWlb>S|%3==m{SZ?gfR2@DW-B{w z89+;;Fvq)?0|~2Lq3sT^#A*EL+*l+iAPNm!0Qj4?lwq(05adb*0*;M!|6S{QW5N*? zn6^_L3C-1u`^9oU%)gm);`tQ}md|%3*l^WgWGG@w9NTvFq0o2QHlk0_Zh-~nV|PrP zu2(Oak=NS$6)O6rEMSp}Gow}j12w8nt`HdUEM%*gSRi*OIlq&#-fSyNM#Nt@WGfpMI?BT}$I|{A9Tigo)3Oqv^oQ&i7WwJwe#$ zWeonN>64$@gkhzDz}rPX{@GzE*sc{d;^k7`UW^Deaj#)#=#;e2OvdDSmA*e9)xC@B zjZ9}JJuv>8e8QK`W)~{VcPp)=YfC;m9LcrotI2AbGUgJVo5aVCw{5ba+wX0fkF03zYPS|lxX$N(0j9e#;l_k-a?T4+0V=yxo`*n=XG z&ddMBK~)hqdnUysj`%mB3^@=uT^3z*j&y{=%m*!V^v@@{v)%}-Nz%P#B2d|QUz%RK ze5XMy>sPJygwoc?t^Ts#c^SHq!QHspk4aFdnNIUN`9-yMjh&~^q!LYS;~xh zi!m#gS;#lpMal6c51K-&e zpeIJJ_9Sbu$yWLf-XDnL5qH%EUgAebUnt|KV|FUfxG+CItF3bKVonu1FauX_u+1|F z<9k){y^Rt(-Y!dE)58kubbolTeR{Zr<4);cvf#SFn9B6-Rt&h3UoD~`+~FA7ZdLUT z#x?v3RRg~kjTF_j5lyfxU|UUuOfV_;Y&Y(faEZ!eaENi0$p)oXcz!)CrH1K$e7$|A zH%7EQu+09FsrLM+(q;j_^p@f!#g3ecXk=F{3|y1Q`(#1weHk%g=Jq#sOSW47rwWi$ zCtegu#c##ZvS!+x-xUAl%ZXWkh?S=tV}C?Q)NO5-K=`W6h)HXtu;!A}%goxRupron z$MLq;6p{+$o~t4p29Ht#qkB%dl-HK@iu<83CMFnT8qN$XHQP!8{1`Ar+LW9$Xwmqu z&GzPH21Q3??Gu&p?a6_a3ZqDIp8p04yp3V}++!g?a#u=sf;0DY@IE$LK3sk_m5+u`74iqewH0?{Wsau z?puBbL_kJ20$-21hc7g&_%O-dg5;6qN6;w@h6k1QyUF|cZ34V|30qc_x>Xw4sYr%2$FHz z;?j#ft2MP713F+@G_Z&)BPP_?F1vvmfCzY>tmOY!3#q#JPODMJQge4P=^Z7D zXWDvAMG2C=v)W>w#Xu`C>93SJFumwE8A)IVbm&UQw>$75lrrp!bD_f+ftu1cxQRkw zgwVuOG!tm^I-vVLmes_ACyym(KF8X6_YjKc26a2lf=uO&r;Nkm-YW%OdnVS_@H8-H?S>wIUesCQAfre&Z;(4wj=obw>$42mN<>Ofs0)RIT z|K@ypPk+UfX?a)UJwEMl>f;VQi8Vr~p)ksvV{Gcb`DVj^x1RrO?ZH8X+}viXAuEl6ysWcE25;xsiRAO-f^ZUWWARRr*&f2=f~>0TVRMm?3Bqf+sjsY3 zVKLu?rZ#CRhGg~p7+lY6RP-PXewjZMPH*eh_;4KVDN7;rmFuR3eQqdO|J~14ZZfRF z-6y||Pn;YVXK1lZc`-&N+qy@Mf_|y_b4m&uwfQGfxX$ZD!*Bh8gF)x<@-xrxnZc`5jC6R@x3q^?t}lsznYrdw?;&tlY?O!i3s+t)VB zs8YikZTA>b6i+@(E;dKne5Ux=0!0jD&iIhXs+jm85!+`(?L9TBbyDw488mKmGX0}n zR;*d1rqXU)r@uw#;<=RS9+;aa^vIu;xzpg|2ZoeU(Kky0%;s*~Bo zUr@i@&2wCW@(vmT$p2+o#b&9Zlibmt+2ROa*5o7GNT^ekGxo7p(_WBZF_#jC|JInuvPRy8R} zU};rS`!2tudp0#|K-yOpwY&xTqmEh}Z0|Y;H>oGsw0x zKY6~91d_O@{O1FsDPE~XhZj05YB&3NAi_W zn}&MC^+fM5D^m(;e4Q$QCkQV487zCD94r>=;vkqxEXRJ)!y(USrns7-S$JdBL!(JS zT4+mqC_uS8v#dx`Oaa11mr)5g&t{$~GR3(??mNDCh%6_dy(e(#di-m%OYwe(Wx7Kq zigLIpw&y*l>;7y!2s}6{xNZ585oh0;Enf7kp_azaR_3$M!)CdI>2K%}!_8v1N zu9~1Tq})ygu-`E7(^b{R~4wH2^cPW;aon%*nnxu43p8s;ap0n5p$g5$xTL5YqJJE&vogGh=!cDW!5;$Oll}S9 zP=C>Rwk)P=WgKu>$98rd9AG5v5KC+WT9Qvx&ZMDoPTW;rHlW8gvv^FKyq z&6Cjk(?S>KJ)6+z&>~ch;r&6)?)WavM;oM7i}2PC$K(_DGTXWj8aZD0DWZ-X_Pujw zeQ%5h&p9Ip$x#35F%G*xLyQXpC=cFD^5M63eEMPs5ZmphFJiDY;5nHlE}_p)M!E=; zMWP94ThZtv zoy|JnmJ-;(vY5yrnlvPbi>(pqOMb2T`)k{>Z_7+Ty?0cv9#O7rr#|CuSaYAO)EfAl&dw$AvTeR9QTj6v z5ba{_CvE<*B?9&@k`l0gat-M`>fT}y=O0{Y8v4?Bk-&K#hO{=eD3av!{A*|eDI~lb zbQh#~klB|Sf*HH0W`i^fmBfd2o##NdB2*1;ZwWptjt3wbJyrwvberGvJK0k^<;WsW znlNYujonL*3s*{>OT@-N?a%fLUdMzf_NVlV4H^GCDM-E%-_aeHroHrufvYfodupyR zy3TFk4bLls6!*)l#x=H7eYfRZR-apYrf^XS$(ZxPU@6Uqt&|R_?J-&X@<5*e&L3jQxoKH!{AM;H;yE%mU&1b!noRd}( z?h;Pp?6R8~8pRo|eH3C<$7logbImOPm-i>?_^MnYZjDLhMn?{Wgrx|830dE~mmVHB zS>I0i3!qF*2U$)41K_xg-2%hPvEDcSKNUE%V}MUoD&PkXRW>Ewpq>}!3Bde~uVq2#GWCqhV~qnoO<>l&2`;l6s8r4H3)*ApzB z9<{!HljpUGpc+%%l~zz|+J!ww3qgIX3(0fS?{0?>%NWaZ0FbB`BqQ(zeFLHP!;q+5 zkP3Ke~t7GjpNbk*K|-5FZMJ3Nv2LBE<}_U8eC=Or?^9NvWoq~r?ljM z37exF?%QYPORDVTt&fuNJ%4j7~x5O{T8?h+|BFB|41`fidF@r^v%k9@tH8)~<^ zA<{ID?fe#h;lbz?Jjb)G7omj9cv)&TVmlL__G8K0Z^VSD(U*i9HJAUozk`d`FW-Wm zz_piB_2a2r!$Oxo#CeTy@=L@NO=EeA_eSQx==ib%Qgx;MxNQB`~-p_ zH*`DVNi+~aNH!UwN}$d%&&d}tEQ>zQq&TI)zEESi`7B@`xbd1 z_p8cp9c48|g^FZ9Gpu*_h<+DM0sJ>4{BQ1mkU{nha)kYq3ZZgkY@+^!hjTDCe@x>L zSWNe*^9s~+l`wi%_Eq(pdqYjyR{&>Or+eCnH@_Nto}C?iOwp66KkoAnLpTQNl#|8k z`8w}4S%6J0<$?P7;<@E%`>ewg@6ve?tf!(wgW1V%$+FZoV4|Rw3L?{_x}QHq{Co3;AhbuXAxjNtrdJnFG6>6?Tn8-%Lw&5C)`0L) zsTc&~ZoV}l>|L&khs;_-&lplcYnwk&Qby_^g-%twD zSpE{aHe(;|=xyETX0FdB3f6gwQn_clY=;w$H;_LT|EtIo`eR z^Ir36Ys|KTrXuBU=#75IqO;CVkKiq*vqnp`f-Zi~csy(ce${JhCWhb6rm`%Bw2`p- z7co4=(63&2*$FsPkasfGK6+EIvF`z!clO#^*Qw4=eIq$MFVsbRYct-$K1)=;ME_kT%73+d zx)w*Jdx0stJdHi6_NSK@f@?0Hqaa=_YG8n8&x>NX50ziaZEF2!X{9T&_a-8&eZ(#{ z75O(uJ4;Irr}9guLU?N<{&)zk5-^TW)r6>Jyt8O%q$Wq3g(+L`ZlC&LVU<5M#F}*` zT9|!E6NY!i?uD1$8%>Ul2~u7(`I&r9$Qq-Ko^`H|7P0uv9=&x}@GLLmin@<}ojR}d z^TlugWT50mUrI~S;~NMJu$J@U4_!5UVkeemMk9P6rY`Kf7veCd(^HlM zL-h}{dLL6AG?pbJwHK!F0aJ=lT_en5!Lf&X5^LN@p4zMJngUyv9dNQ}cmMpK;&j<* z7*jTk_P_?*Bam!1YB_CiZZ&qgSyCE@uVNnAsBDwFqg!Wr?@m)BH`v>7tBCW22J#CK zTBkxu=h%r$*sW1PC>EEmJS;AM}%i>EMiWvGw7P;)X zos4gGB&?|Lqeq}t$vep6Pr}A6Z?gcWxxyKZ*M?@~9y0+AWNVJAjZff;_-%4{Fv*M{ zAROaOD&kF4<6VzAi6_I-qVUoW+VhRlpM-pICX*U=EJ4v{d_~|C`8fcsE@SC>YekSVC zavUP6j?185B4kr7sS4uy>`sWokc9+9%aV3e(B|LJAyc@Awc3!iV0gy^4F;x3hLH7o zPG1>4SL$#A>FEfWpK(4Zh}v(wZXe5i6ms+`MbHCB#!W82sBUr^tt|c}ox_5}#t#9@Z#-QZ^Ah2&Z8=!@hoQLCbD$CuC&ilv?xmpb8N3dnbzSA z*@4TVlRTKbvw<5(U_6NJE_4nnCd5!=hpl8z>VnwMJNz=L{_sbn z_hQqvA(Ov4i@NQ4)n)-IL6va^u5vq`tKQ7O3+hkiDB*y&RKw&8i#h@3SfPsFbQp`U z2es9-rE>RF*IUU=rJs-0-;(+937A|+LI^J~RpAAOA46F1JKE!`oP#wVkiTaH?!4~n zE{d4{I4+h9+R#IfZC+A9N++~UK`WtV7P!nK8y!F&e;On%!~2fUtJXtt+*tt?|9x}C zCK7!c2XXP+vOnc6MdS?CxQ^XzVM{8?I#JqHcJyiY+nzViOPTTflaJjR5qljV9N*@& zeipH$3T}V8t*8SyXa-;}dJAacU+sp}$CnQe0`e&=$?dV4q&nTKA$S$wUQ(q&0Iz!8 zY5ml5pr9!O)*4g9RKRC(!w8^t@U3a^&hUaFm1XSd#Q14FSz9Ud-j!@+KO$`5?4?Y7 z_a)k&Yt^J5FmVGa1r-+T@`ZEPH0*2eOV?ho7@UXp8bs;9Mm(e}~ z)$lZU_#`m;Oy>IGR(AKwvGyDdrzJNWy9wKt@GL{eimMvtCnqi|=_(FF_`(iYCV^NTAPe9n=kcW+IhNj_*l?c~{*_@&`6c+$uIyJNRzmi-Yt zS|9VHl=`olM&md(9-L_*_&pqvaXlsobsQZvYh9f7RAWYx1jE1KsP{EypShlOFQ5OQ3M7i+*`E;P zx_V@yIE)I7i=OA%t1T`+)5h^xrb}dA)^Mo&q>u*+oAOt!h_tIAb?Sbv*^543kG?1e z_?V%oq^-wr$g~wM=995esL8eT)+|b}^lT|ArN}(?=oVe;(+~eLQd{U76wM;!oPKE> z=sFi1YVcu-?E5a_&Py+>{Rm!OQuKHV>vErSp^(p0~>k!Aw%P} z%I}Jg8TZF^8}2}oW;JfYTFE}UzRXGZ{ZK`p zQog4+t^iDL4(9Pai(lHj50(`6QItD-KC&8N3<0c+-8V*+!qCAsrk2` ziDh_Tqa}btd`V8kx3?>q|L>jKji=dfWhNqfQ8nuqBNQMec5SPbXFVjw`-I>)SpThp zzzKblZZc+jw0Rr_=WWt%>KK9Z1_Atb#*NzuZWT$izhy-$e=`R)jOyO(W*y}XSbH(v zf#`VP&JB%}+cu|YE6HAqo(y#F6#KMV$**fWLeZ2qr!~hW4W6Ip^~ZMKdvn?!MYk67 zA#<#g1-32k0fjHy6iAd6CW1Z^n#9hnjn6pASrw+sEW?_0oV%txO zx=M$iQcd%KEtpS>=tUS~#9A+Xa{f6GVXAVUF=&R`*^e1|TCF|bvX`L}-KktcM(#L9 zPN40b6S3C4dw=jH{gOWzj$)MXM!YKEC0Z7)<)yvh>hF`ZMbJ>W1Fw|2wUH_TX^ha*#+6C-q5DjLN`9 z`yGJ9&74da6ao~cm|wf~>C3%f#)p$vD%cN~lquH%{V7h}F#w_Z+qxQHai?^^;4O-y zdlu@7z|kd{W7B#CqtCnJ6``$(-40|tJ+Nm?8_pNQhff;<*)d!(hhWkwp#O>sAG`RH zXv|(1HNQgHO}vRi95)6g){|zhB*BQraFF=rHi^! zjG1Dt|C>XRkav;AmtK{dwLG;6v~6l|fP#rE1gbpHWtSurO{v@M`h9s4akbWic+bhKhc#C7PV7Co75GRNuE)7s+KsO0}ZP81tv?#YZPM zk9*7H-yUy@Mc_PzY3S@-#Irc-OMIDuSJ}in!rKveJ|otxk&K2UP{4+j=DTa4*xyQx zZmaAedfiX9Ll`$|0U8<2)X+t}KR=bbd&A6+zFzxKq`sKK%jf>`VxP7~v8Q}~=AhV1 z{5Rz(pVeTwwznuQ9ov&s7Q2@3oIUmb*&C)F&mG@L=@3Vxu-~jTatr>=+LFdE`QE#B zq?k1Bkm^z3HL+fIv#?YbAr>wbrl=Y6yTR6~tnSEms#7`5Js{LBGyvrPS?@>wLJ@sV zq8-Q5N9*=KZ?n3CcsEiWFwjaGZ9L*h5a^E72*?>rQsB1?@GKIRdobDoR84w>FddzZ z>^-YGIf}d9bIJ3I7=55mO?`h|}Y&qtpDN%qKAN>5lUDpN!uRy1xzz%f40_ zF!YXmc1_6h@~QkhZ9fe(@|C#Sue7?WeRk1+c__SE{ zq_hu41C|rm&d-nnhrLy)%i?_~e(&4})b2XGpzH3rqf~R@gDv-Zqsea;UAXGvJi%tjdZk;bKBUE=Mfn>iyKh|X(T(6Mq@#+V-V2mox=h*(*Gryw zv3vP8O`B%AfqTAW9KCzPNcGEb5Q{KP@PMwluDw*R)$n4SM|_{!)eI%cylW9U*l!8k zC$PfGPWo>ThF^SLr2rT!St%;_ZH6P!%BlA{wXNu zd8ck-8Xf0u#QxKM^17mBg)&}EA=83N4=le*?5^A#blk*PUKDVp^ek7ZD!4j@0c2DC(Tjnnl@^yp*7;PR*Ttc!Nx;{c5Yd-?_$=hz#V#oya z^Tm>#mOLggO$ud(z*vQ>C^_H)j=dA;&DR~hmU`V>C+hS4leo)YM!(cuj(u2}oqO+b z#1c)*6y*;1@*I{efw}4Vh1h#NAlQd-W|kSJt1(5rX}U;jKua`m{+Qr%ERwweaQt^4JsD9{5+rQR;|X`a?k_Ei&^G znP^$)ffp=lzv&T$x^~G0I4NiW^KT8FUkJjXyk3%wqr+1;wEK{nE5&VXFJzCS zP-!cay4D(lygo8x;IM89qXmoGY)>{#AVbaSm>mElF~6%UZ8b|fi%JA9QWhC+B)4S) zG_7DUjPMG;)wk<5ToCV{rq+5iZAU*U=?HtR!sCdP3YLHJ&J`r~@rngK(hQNXPs(ku?)SOj;LSyiUouPJ0CHse%6 z)fyz@eC8OUYemc`-;PKLpFeotj9FsAX*!0)J-TQ8fjqYN0KR95jY%GQQQ3D~@08W% zibhWmq`QE_55*rG<{uUvHqOGFprsUDk{H&ml=2Irf`!{;zo2~5S!JBd`DZCfz6>Z@ zu>S!k{g}v{3(>4k&V zm&evZ_0qDF410gou3}O!wNYL^89QkKJ7%mYuq%DK^1$YOoj-Di?B#!GzeYJ<=wXiH z{P8@(awCFhM19@_-t>i)wLM%cP9Uzi=X@Ow_$vanRElaH+i0d#%{9a z$RAy=@T`l3KGao1yMnUSy1hFe7aXn8?d`zZGX`>MAwLjK3$Nn2PmXrXcQ^gFd{7zv z8`U}TPE$R)&F`X3)b3;%-$uKP-+IMxU1eGJZsXq|TGQok&);$K+>lxspalSRj-%|u zxko}HG!eBh(tvg2f^TB{@^=fLE8ic&(5BJRvkkcoc64Ab)qQEP799qD?t0TCXt0bZ zx6@L(p%#Crmi;lLdI=)Wre5Cg5acm3il8- zwC6a&M&WlA)T9$@3qeAiD26R7b_g_SQ7B9TsbFe~BR3lq@&f0n0^e$v3H>(Q8=v*V zO(@wwc90xc2DQ&PQd0cR{~>)j97r?*f5*v3P-QId;ioq%A5=b?FvJR zMNMq35Y7LwwH24E>5pI64oqvfM}GJ%_F`Z|6uDDiC<1@d1cbyl#FKv;+=nqSg97?d zbkNfc_${;nhYE$$)saAPaGslRuAA5=#YCa~ExbpdTj7jHtn@;LB-GEr%)0BX_utM9 zR!m6$go)bAqFdLYTgvF`wDNP0fh)@~Q_|M!odVy6Ro+Fzg9s=(feiQgs@GWD&!BlR zxv;S_kQ0TiHD#ip^4p%a!tyr$s8f2NlE;`tKGKG~@?_nTF9SuPxnX{bGrFCP#4Z#A z2y$%tc4mz-;tT=#Z&$)Qqk9N|9Lzz!{xWJjhX4J`qu&k_eKL75ng`$Ook4M}u$&33 z$=$`jch6)T&i}%}fkrK3D?gFPisbVmI!XaZthr^)wX;cKm2O5IyR4pUnUmO7!Z>9n z)UsVu z6XE)rPX(O5o=gE70Fcr6tcv~dsUH}$M+Enb=QxJmDDq#7T=Y~4hJs)0+IW%r9%9?F zOb?|x4Wdhh^$3-0RF?m$^p-l8bj&(XZ%+Mqe+CYnb42V?)-+eTk8jdMV?t5{ueh&u zGQpk_n|AORgrUm(r4hYL5W(Y>blWY=}+BD@mBWPH|ZEIoJ78dI3h~)Xg+Szx69rK_FpWPJAWCA`Z4HDvs6YjBXOQ& zi{sROt_3PP^xws*GFU%`5k#SVMY1jz&#tzoq5=YOPnEa_n0fJsaz2ZH%sr*#b|)8@ zO#zjTrT~OqWVV@Eu5{hkDz7ocQJw_@BZn0&Q$Wm-XKrj1O1kfQvMxLI13^)2B?dao}Y`_yBN1z!QG8f z7NU%(18sj-X5>mQ`rEkBfLFe0Pe>Ta1fNI6>~Q5dyHyj9esAE2%Ha=TyMArQXdC%m zo9KXy20zk^E#EH7nPea5m)DYi&8*XsQe>Soe90zwhO}^Yd=SKpE^fe9Y)W$6*{> ztC`jeG_{(-w0;3hEe#J>AXpr{P(Ld9jkIe{Ij!gHHk!kN6kd7LLeMM1;0JWW5?Cl= z?mIQv?W$V-4v75~IfStB8FiZSr-v}W||gh@5n_7#Z@%y@e73{E-J zbTx#`dz8#E;d)YLf&K6?QF&*Ll{4q`6WSARM~|F_RdSbQU>J9@bgYjsMGw0$47-_Ftd2Rb|7?2nOjce6V33j_S6SU=V zkanbk)$dybhvtoIgXFfPP?gOOTgAJXz81M6sVJa=4lXxdyDp+_V$W;r$Doq9`#&p| z@bW53sy)FErW6_4& zuo#EH0^RM#p$9j3Did>n@02_`lN;}+J771h4m9pqYf#|e6s8Mv-`aOaiWiY_W2 zA(&B#eF_PeAXW?=CbYE*K^hevex^K^YF$~Xd-bNz^(r8Xv zOD)ey>*n4d0zzZZVFDOU@#?AdNlgS|HGjYSO&pd3^`V~@HpL0x2pPbPt>8j()PU(` zO?$AgPV_9!$TfT*zJ25(jpW7KFp|dY=hp-rEiZEQuHNmij~Z5Wdt_yC-Jgv8u3)Ki zIp9+K_T}vX#cRa!OSp*I;1B`aJK%-iyIgd0cX@h-uL8SjIsJFuJ`~wjQ{+^<@m1>% zRZgV!VI}*4tsKMb1t)d2*#yuiXu3+2yWX%|$&}$`dGX-VhYj|q4+TlqP+>p-Cr}h{_=!NT z?j*FdThVGUH=C8il5FBB`-t*h3Fo`uGqo&>oH(TxeoMK{eotOf_eYF9hEEIQA;*)$ z0yT6jorqcb>elcgd_2Z7Sdn6w#e^mITax`;zss4^EA;&Fq8O=0DwFHR7MXl5FL(2t zoi8uZFh*f4iuYq0??c^i$p?SD&)1n?tfnte?g;wFQ*H=G=(#d@%upyCR6y(~^5Gp( zyaA_20&8_3ZK_TFz4yw)THAmye}kLhv`SlKgmpL%s}Mx2b?xb#hG)`2^?NNcl;add z5sf{iR%4-z^%s0ueM)*{{%HTIJyM(a+2(sxmfz@2JL!m*Or>Kxv~#^#T?PYhi1TnT zL}vSsSlV)^4em({Bwx7gHN!?Xqu~zi6%_e&>g7fsx`LAzyCu+xt!UoQ1w}xtexpeT zOt{KB3rK~-yLZ2%2ilgd!0(uLlj96xEe^4uC?xz5)0J$k>~7wKvzsv9Q}`|fVMrm( zFaOd8`}Q!J*hi?}y7Dgd{9sQVn`y3?d$%tL^S#c_jeM_a{ps%VaL~Ms%JEose2jXw%P(94*0dOC;9?C)A_b_$fj(>qGr|$?W^#srca36R<%fndF zW-p?Cm@jVjQg0iNPgGnH1kK&%D}-j5^f2kRBOe-5i{srnI3-*!oc0|W5csvP?)jW1 z)arb}u&s&ZE53?w7>a}j{@yh|1(3~6e*v+NkPMl_{4kF;OIx{>Yhb@qe*8fh-3bnv zDVsrTkv(-}iBLFe*~~H7CvmKsWb<5T%f=tRH1BrJ$W>CN#R?$d>+u zZwjFM$m10}z!o6Bm-AN~V%6@KVfhX0mP3qnjQd9#S7P3H>k1x-oNa{fzn68I`CzJ| zAU5>1x7IYje65wIel;Bz#?sHor9?`N>6$#UlEnJb^;W75BvMd`(8s`p8?E^X?&spnM&Em;YJJHF_U#u%|1MP(sycDn$@bdtoi$vGMq@nIVucLGE&RHw zJ`T>ze*7)#WDOt+=6x|OZn^vN@@TsMm4^pLEZAthMHbw>hVA5xn!B%>rG3hM7gI7b zZfmojChM&~bVcK1V}jq7-UqQC_`wNbc^yyL=nT!sHnQn;p4xZ)J#*A{Q*3ytydn@} z71)CHaQIsCF$)uuyc$>j2|3x2?gHkvbHeD_n~)Xj-(Y`flM2o!w<#nzii?cgY%4ZE z4w;!nR+sx#Sh^J^|`qx}Op|I0SS-J|}TT;bWb*Nj#|*j2xL_QA(U zoV$UjBiq2sp;arPL>xIk5NVl~@`iy=6TR@=FZ{-J87EHRXPj;cU?u7|hI`R9wRRnU z)0Q#Nf@RvbscM)jS{&&v)*8JiE06hhpJ}sYIZONzaPBPta_+gUNt(OAxyDwnxDWkS z2&AIr7-g2+swE{Arkn7z!1K?4kk!!0D6d7A7Z8=$Wc(V}qaISyx(x*wKq?JqgKy!M zxdZ>^kY(Wimj%F-#VI7YsYGG!P2JChpLc09(mD&79{>rdNP6fg93>a5Ui#;3xKIo4yZXaX_kO@93<%5*)HK=NASH94rlkjm0o5by!OZ38vc|6o)I>`cr^etkXVSEQWMq z0lod}?n;JecGNIfM`npZ?$8aP2Rr5Vbnag^be7ya4##?~DIQ(d9_iDV*fb5GOz)fy zh(SKeoG;NRli?*TP%@nI)F2AodZsihh1*&_3=&C}IMGI|C7eB(Jx%LAWSecniGXmX zM<^NMB&b!mt?13d`TQnXa~=Hc+;uc^tv0NA4-S83D&AsXx`BbTZb-r_Csr7vYI2X$ zCJdbux5PS0y6QZ##8qIMmr?e9OyzH4pHV74u@a(*VJ&F^O0+!J>Z8H(({LXgDlC5$ zpaT(_8^aDZGodeJEU3HZ)C>qkVXqO@rhAGaWdb8WLi|fU(3fEU7gp5iwqilKAftgM zAnVJGBH$&|Iq3^GDcoV#>KYkaTNBeD_)(RlMA(y1ATD>)oyifamVbZ(y@p{B{9OGP za_sVDaK9-z(EoeGGqpd4#Y!zJjh3v>g1zvzvYi2jLqJN#N0?>xk4p)kMS_ zO_2P`JT1gCf);UqE9|d8g7Ff7A0V^5VKh0qEtwGGVm!Fug8LK7c=v5h=oxxI0;tGc z0vaciP`h);%CSaRh|zu`xeJ?5KGNLek0D;EXGBL$oI6jNDGHCs`wcu%r$+~#0l%Ij zq2%ufFD%WsYo>Q8lZ%u;m^|-<7k7_SbYNHHZ8-ACTPZ6+y!W(!Uz;yC`N)=1I25lnvPkJp7vfRxZ#7a0bWugbIN657#zVizN4mxbDd){ZckX(1 z#-NQzlSFy)k9~Ttcw%GigwgJwBUKY)`Dk2#*N12x8(nZV`ne0OL%vE&X7S5=v(h7h zS1M5b*)Jja1;G}>m!EhrP(s#~wO>ImdoHJX5%LQb&5(uZlP7vOU-G@N^-W%-o(-s6 zn4|&7x-Udw3vI>mT76MVK0WD~kLXR8QtGs`xtw+G;x>Jt;K!=;E8mSni})^QUvSyJ zrFkLkk|hQE`b$y=y;3cPuHmY9NMdH;1;8ge@wd3u$NIfU*D!i_bA~26eRP|5_R`5w3{?2> z8@SIA&!lOfC7B(aCw7M9#YU=s30NKU@rX0sG*Y` z3b*MPH1&wJrr@|6$eSVR_vby6*i*4@; zRn89LRuWbR1?#;F?WogUN^g0LmJN}k#CyCuH1xEjH$s6gRi2GWyRHFGAALQeMHrRM|4Hw?NmnVF!W= z(w?|+*fonkR|6x?I93{8pX!2j!bu5ZC=TrBJ6238MZxN~?7<95MyIl?3y1~k&z}8x ze$oT?2ch(pr60|4YTVS#dqhNp^*F44K%eII_uxpL&J45nb_`9$V#!yzNbB2{b~9{Qb)&IL@oKQRJ=?gA5YZ(SV; z5JJIgXYfWT=M9a{s{6YXl;C%t(A509RiSXwTqB(}xr^x^9*UJTWNhAR>90B#9p&Nw zhoY0r;R5F=d+XTXu?jzM92EICC*(DK)6>wXb;gPbE_I>fN2Nm7Kfn-T3M5_M6W( z)I-X&MHo-QI7auRBS6Pt0|_0uPm4^m?D&u^BG9y?sltvVvo7m6d#xba*P%7-3jekL z0qm~o{U2^={H*c4s#Za-cm3lN9F0})(e&rZPnXW?=J~}v0ak47ZhU<$SB0L_W$$`> ztg`bAO8DI8)Jex&8WVwJ5i!tU z+@UtbR$XKkqb`Hr;>Vg#5Yk+?s-8#pg1QvNN_JdQBWzpXHId2 zYlyb0%(Y~(l)74Hp&8c|U#%+^C7!`+sT*5u;88DLb*^T4-V1qlCKr%2DvTH>m)!v$ zhCoF}k))jf1di>Hq;~~#n9_j3X|ET>5}7$Gt#%Oa$<&)~#c~d#;=5?#1cJYg1uZ#c z;hbCkGba8!D4rL5qKwsyYP~-x)p`)NYfC{hXhZrW)CtGn891>N2#6k*`ipDe+nPTf z;;|st7&4#;iw~M=NygQLz;cY;7x})*^GfLIUw3y>nL!VE1ORtBC))wJqZ3vocY*7a zddr}rL+a(xv#f5iJZkd|Br6Nij3SYjTW9|!VR*|~CJmi57Q!8!7pS$D^KW?|g<-5Q zfpR!e$r(NQ*gH#XJ{G!wohofXab#hb4XW;(D4Lgxl1ky^<7ufsPht`(!TT-C(op5~ z))dSgDaTMu+_I0S3VG)kR!Z=fdyJO03z6PdXJzEHAk3m-@RXn73O77otsIV826Y^| zB>Len2=B_TA1Pj9GEjeXvyym=x+y0dr;UROf(1w|Z8W~dCD zKntFIS=Pf_>@5Zw#zf-X*AJ`0fso$@L*{F)nk3)}Z#Y9`p;AxBH}EKV%F@rg>X*LxT$Z%Ame3T_1|u zwLDWR=YwP$%#b_WXY7*c8D%lL9l#$aqseVLrX@fxnZ2y=27lOj*g?=DDFzW_2LqDE zq)y1{CP7G!%SJG9)#O(#lo=^8l9}xv4#cE$co9kEM0XTV;(Bfk&6e zU=b}F#pP#6yFst;6m+O6aNCbpcFGzYAQacQo(J085ANiH_NhNv$;5a~ z%dEes7+^CT?ByEq*iv{DQJHr;-1T(P*tO1>+J7-zkuax2x-tnH>k^f zVy6}_?WC;QcZ>U3M=|EMI-*nZ$E#r@Q3l%UqmgZ6t9#P}Fu(hfrgx~>23%c@_Uz-D zO0s%F1LGQtn0M#1J_W#uB2nPxpmY#oZncZi3dBXSU;#NtHrpKqV}kf z4_av#yyS1vgSdhCs@q7GS)-{r)Q*^tN z%Ieb)f*zTM@i)Pp$P~jf=^TnCES}|9?>E(_D^i&Nk(4xgga7=K%u;uv@@q8s!ijJzq9P znS3TOC;9^<>)}4n;1|p*;~Q*Tg$6W$x)H4^tSX^Oc9!55rmfI_T9>P+Wk;A z4_+iPR#`2ox$&O7a1c0U4czvvckw*xN_N8@Z<_Xi;v0F|G|4D zJWP9Jg9FO zsdXJisMN59Njjzu_CXt)7gVtq3B}R9Bd%qv0q-Nrfcu#O6%%mfI!=7sc({;gatQGq zcnn|i^EL)KuEIs1iS>QPf3C6PKO;Ky@`zlIG7XViC_*MI6>Lvw?G1-B>C|Jp}@Il;Bv9K zZ&aIZbEOhZ5zpi^vG7E;!`2z8Q@-eQ1qs8KDLyM3wIi}*85K~{ub=)(C%0dDTYe7k zllSBiyZ(b=v35?d+0`!k8mCYL-$vAmR%|Z~IrU)qopbWH$t)Mep_{)`GzL9=aEHhC z^u4Nh;mmbeKp=ufcDRXq$lkn6!ZGLaYkqifZT$JGGG${c-v3s)3Q-OGA1^XryUJ2Q z-!|qydXX0<&&Q$T?v6JU<61X+9qf_TA^gxzz)IM$qn|iB!|4|nqTH}PR{wdf^nH2B zc5~a-$IL>xzx132ogdwKlS5?A?RZi0gSg*epq)55Bi56Ae);uPVV#84-co2!5%Kat zcX>>uQjihOTvqQS27XQO8K?Nux~~e~be?A6_Uu(=7K>OQ%$E*^lA_|WYV8Dcx8Bq} zJrA5)4~qR5ua6n4V`u3fx^4=hEcni8qG%M|rk#k@%PcGAEV!vMBxlP#B5;ve_A*M2p)F~(<*udHnwb>~$8eOa zTUPW_KX9;X8sx2c1P9w!4-w<9n@8q=tLu$1&5 z%!2!ZPVW~(3w6laE)3@@*T1!tHDq{? zU2*Z#$c>@hnt17s`E>zpF?ey$r-GFhH`45KAUMx=Fs(KmT~U*l^ema{&YT1?cIsh= z*}ZF}p}ZalmdHE9+R3rf_afd5X-WLJuIHB38|Qg!hOx_pWs}fBXaXHqU0l$wHh5rV z5I{+I0o=G;QaVWoAQeG*rQEW4$+qiy@;kV*#{0YAtbVdS1rmpbwn9UJq3}@nj7Gn& z0CIx-o}jnSNE5FF>GkW1?VLJSH(+;Vp1yrs#mD)HRM`>C<<^`&7NTAcZ%wjoj^F%m z^Z4sjz+-GPy7<|f8x!Pd21$y4cnZ|KdgVDd?{sS#?|+n=xiS-2Q07GL)LshL!ZxlZ z1bA$nD=bm7N)z{Pbj&MR2l^6TDs3!yHNLG^#))2O4Zhw%6aGlZRph2@s@UqG_Q@5S zI5EXe1Mk>!p81QO96#+KLsJI*cVycp3$-~qRJMIznWDF>RdL`Li*4HK;nR1WKREmr zss(UTXYgB=REb6FfB(xaYR-ykK@0@5WaBHi6m(jw9&(%sE~NGRRS zP|_)#1A=t7)X*K$HO#!{cwP5%KkxHp<`3BC-upP#@mp(;f>#46&5Hcwn4~_VWCeYG z#VqF+t(db1!*y7~!9)ue+_|>m868y)CUSW^fJ2GG>0O9Ml0KbOi&jTPCFrtzzRlM; z+|ZjvyHlQ7vT)Vu5>H0bzqMlNCLOTiYSH@jHCR?wPcTN7N@EbbB_JlsD$yX`0UtEI z+~*0?D(k5Fe2PKDmGBQ{iqvGhoPIcc^ zfEXTu02(2Rv@XB_XS2Xi3>dV7r=E>1tT$vs4s54qKJI<9PSHZ_**($sUaT3o`DB*o zgTO&}X+J^WkkBu$SUHP-mveiXu6j@l>KMF zmcbn_5&DZnQ5Y(6Q6L+b3^cb_0(immrjJH(<{PhU6lnb+brGQ|&!$huG4XvNGYrc# zcO*p7fTxkRRr#x~uJwLJL@+<+Ja0Bfidn;NXGc9v%&OEF0;0Bt(@YoA=`&}sC5?<%r)|7-}k*fs@s;J z-(v&cF5OAulnwGqmP8B(C7i_ktA@Jmqh1_N)YmA4ET-d}f-gH?+&EzdMh0WQ-8Q8( z&LB?Ucu3(GjbIgVN+4jxt78U>2DS%{SSO1l#d+h-Z`O;t4%~MfIrkP#HKs7QOEZQP z()sx>4iOSnz}V%7%A|AF+z!leTT1L(soRDP^y#1lj?;sH-d4||eJ2vXO*JWvt2 zarT|VrrylAnLCd{2#@}l@ug3BtrlXLqVgK@SIz0ejT)LzgPGi(4Ppsruflu&NBt#@ zQtR?hx^dSJ_r?!&03$aivNTx({Rfpt&2yzGsw@)36O1 zOPF`+$LZsI(t4$oV+mFVXt8-DxoU6fmq`ZcrE!*VlD*FdX0l%QpT@FSX3ht=iUyZz zvyyt`EzSfedkZ`o-c*_ny9uaS?wQR`Gk%<2cML=ch@Z&HReqrtMoad2gP~WX#&8hicmR%IK~V+(r*aC!Z+gP!M-LsXB&36m@79w zlzE>Dng??y7HpuH?GRTFo#KQO6KFZ;X2QmY>QrX?2Yqs@X1*3vmHIY?ra=+S?9R&^Y0UJcDfQ3cJ6_<%9|+xekc4Fhd2|;(7U%|I%=R=$D^+A@G7lR9kVmva3Y<2FODqL9bS~U8+z3WX@a_w0z+PISylm$Xk8f5@96-b!J-PIsRd)t2-txU7c`ltFmTXz- z8r$RUlsaCol=Uv)4`d$<4 zU&IJm3Mm@ilQ5TW8=aU5i#Mx!U)<-sbUK11kF}pKDrU5OX`*rISZVAP?{kha@P~6| z4&QKX+F|l+fg~}e;-=1;rM1_O1n40TbmMPZ%PyGxt;Bv+-+uO9OSnCc#63?R^t7WH zdUTE)AMcpe)4Yxe!l*`Jje3P0?;X>UwlXI8o`;u&vTN8RT~#sosmbgX$~$7#W0)xg zHs%C+n{G3vfKnL#Ev95J3o|@P$$*dZ#i+@yYckJ9?n_A?D%?)ZmV#4VSggc8oBxGC zGGrjcvK&SlTcz)r4=^*hww2j_b$=`vM^4-k z8GJyXu>b_q9hkmwU+NOlSEJZQAwGR0(^LYX1Wn)M_tKp{N7wuK-_3JMcJ!PvA{~KF zwa2r3wQ;f)W__^H9z&6Q%piZ1m$mTjgCZqOTs#FxkUhVZJD_n^pMD6HQdLESeM)GL zEy~*my~EO$slr;M<1!#ORYoZ3pa{CIxC6TSaVjy78o@a0m)W4PG3LgeAXHfY+;Iux z$imDco@BW8o{L(k?J}dih`75w~JQ#Lh@NE7ga7lUSvo&;2 zP_e3)1#Gns4A+`l*a|b#-*CVsJJfElAuO8e&WvmF8J z+Qh<|tl$XtIY%841J9$aJKDXJ(4;bUA~X?IYo77k#Y*EayTPa|_W)Q;j3!!()lCl* z;lu7?@x?|I>{4nBB# zcpAz}#2NZQg9GbzWo0;HUn)m*c0QPYcQ6 zQ@VTbR~0mMJ=c!C@#Qn6>Jib1w5e130I{aH7408)!Y*%&s+T{9`njpy3VUMJxYwU_ zx}KXEV+)hJkywzeQ1rp|aV=JN8y z%_!dz(4(((fm>?P60#`f`Dpka&H|?`cyQ0!Aj$4r! zDdw9mCQ`PmKg-cY)=^s6If5K1vD9uvE=0%C1JQ=#vUBVQ4KAM;ZZ|T1+za$bIQYq_ zJN_b^OrJykaZREYS(o_p=QKOq`gF#g%cL&T*?i@CB^5FH-j<`AQ`y(~DC7tHSOrXA z7`4h08?~y)(J})!ez=DClunI0gPRkj=%?1={v4U51Vu7Uv3^&Uv)mEZfx$N5SOhC3 zl!DsGHbf>@Mtl&TNgB$A)NgnqT6ImI{5uZkPI}Q?yqS$_Dl_fBJ^S7ne5~SkKY>Ega2_F_Fug zgo>DyBlqd*zR8C$*@$GTrjQN3tcqm<$u^oif7LMG(nOYZkvCP)31jj@*zk=s{=0Y^Wp9Y39+sq4V6TQ4#pF+0}0%yBALN%h# zT=D2e(GR8`h>~UBO-hqAYCKycGVHgdRVOa=qtWd9|E-?jQ>MT~ltdJ?mKO>x_DmL7 zA9km{DVgGOH;0Kp%J%}FRbz3hJZkgh)cMuTUF3(m-JHcKxnp~PMevt>%N63hafg}1 zJVmdfhq>uSMb62?{+B1PwIW&TmDkh4PU=xz#!9IGhVPP#Lu#~&F)ncp0HQx#nC~$| zkoa2UtJeVv-o?afrz%Wdl1YW;D1pzpQNcqH2}HRQ*w2q@TNCOqhl*OES}**$=3in&bU?_v1j_v`yS#Ji=HbXJ-Dx}9dweE@O*Mbkb!1_<~8m8fvzM4l> zxNc0l2mt)r>A`jcwo|w7>YrBxo97fu>M@TK>a^d+}~nB@b+t?ZtYhwNF|V27e1&?YM@W zj9!-uxsJs+KJKgR1Kze#(iW==s=S1%M`xyu1w$1C=%RvU4{YyoT40-~#60ixwxOrQ z!;x7On!z|knJIA%m#P#?t#oeZERXxkc4=Lc0A$YwJ8VGPeu^GU@r0%y_XVmXs>M4yUd%moIm!839`UX;U#!4B z$d@#XQS>IaRB1e8ob*Y`Y0AbW8}fb3*aELDTLeb*d5->IW2TYZCdzzIQKi!tZQz5- zhT*P^7x?XDIgjRP+l?&Uu1?F2hF&)3eS{WAk=B=B!ThosdZ}k6*bCB*0?rg&rrC`I zGkq3X-x7l2Nbqt=l`t~0HD05mOU$P}OI~C*w)5H_ELT6X|29#`tw7$t<41io#>I$AfV0??>vFV>7vnXsv(Ak`&0M zvr9phObsE%#hektA5V6iw7c`W31`dmH z0DU^xFqg;kJ$5D=;W?nHZ@cy>6plVe9o{>KV2#zfN>EAop7=Sv_q&&~H((6$A$}ij zdU;@AX`4b|XdJh=;Z0Tq%?nAm{MMM*su5kb$17g!?nHg-0uLrnk;tkwQhwI`$;HY+ zVoT8YnpvHFs=hg~CbGX#=2mB8?H;{a8U74~^V9PywqV z2Y;OF^$*vdQse`~J|Y-+@3Gb4^@@bOsN?84H<#bFbGNH>hKEd2THFoeB(5`>Fx%W( z^w@9FjL>l7LNZ6tT7*}Ctb6q&v6BRXoy4v`Eq|nzj?8rkS}Zt-LfHkNelq37?RV*} zp-Iq(4y~H+437rNMT51;nO?(i<8NM2*Sj`~zapX_;T{_$EKjFkmD!8E1nW6hAU-cY zxvf4L``Y^Ky+d}Nmto!WkjQvrpi9s`fi_L++^FAZ-sm5x)k9_w^W_Lnfc~ERiY-#S z8|FO`R|?m@l(o1>C7b?dR@{t zt!)Z@v^SdaV3#s+x*bvV-2JEB4TI7LjaT=I!(mOwB7rfj#kH3Mmv02o!NQ3c4SkQc zikE2*j!?XbMO)rrTYRB3eDvlkdUR(CrgRUJ$)ixs1@vBB_;!{FX1mmA4yM(}mRYuH zBBgKB&~R7jNqHk-p!JWt2DyDSc3^x9o~u|MEa0N zEeEXZ&iDkhX1oSkLuBP5G>_=cgQneu{qM@)#+M+_mj}ca%VDu$iyOrBbUjO~_x)D> zozP82y^sVx<`0P+5i1cs?_X(eT0%6wZHbykto3qjhiX+7v3y3Gd$p(HB*M%DZH#iJ z^Owr(KPD(ZbcrSveoa*(Xx`mJ3?pKWcKS1UZ(^&2Qe`|-esA&B3}F)tDLiYCF{YP; zCBC{<^%ineM(4Y&FjOi8V5Q+HVCk}o);#L$Gzrs;)Gn2a3Z))PqWT@?sL+$t5mHG$ z2BYU?)BgF=t6g})jru`EE#Yav7sua@j{~ry3)Hk%(pP-U(>L^jkRasQ#>dh|oJLnkzqUuL*ozW94JAa?opA-Rh=)bl|7o}Hp#R-a zWr!nMjZ27Q1YDpYa}=^NaSycvcx62xYWX5cZ_IxPbK!fc^=PI@->W^Z%>|FMC$oG0 z7Vix5!0T;7Cz1I{em5j8TXs%3Et&d_uKZhN4iWrYol|Ecn%Eod@Ff5bU%_%OiDf<6B_5c1B?6xEvZMJW}s5iIgUQ}N8vlGUKv_LF6g!Kzy z{6-I_o$GpRp5=g|lFmFnj8U~Iz-HC^hax@4uJgj92eYo(Pavg=?K|pjuc*|xKIQNu zT5cKxTCXBM$F5c5^#Z^3Hb^^&xjTnR8qIU?PuG&7$GmFehmS%FRUz-i{eC%2rUSzQ z2)xwvGQBobtE}#ls|^)K@*|>Js+Uo2?)#Q>9|jtfRbTMWouC~~mSU5ORTQa!H3-MW zjGxhxYExfzO2nJ7U~{o;{)_rmBaK`6-Q3E7*TlgC)q%{q!J1kdOVGsxt(#v~1R?~2 z`kJxh8WP7j?5^>SprU@;PFIW9|Q7bI|;i2kIEvfk0n7;|F z1L!QqqCq%_;++tLP)8*&orTySN*}7=WA;-B-J11I(?3RnHrIIa6-}WDv)%ZnQJLw( z3D@|R1wHLF6?xc2g|AO!Ji^U(Th|L1vON!vmoSvY!L~=q z9a0P9aJ4VcDH87+Ykwfvo9YZ3&#Fmdiv4kVgwx}4={Ok0|Jv=SArOr_zIV<;u4p*+ zIYyE7ZfWKVt=BkqDM;qeaC?!9yC{L!{;4{yPX}P-&!2GC%;6J64aXd46ENm}ZNEMD z0wo^g96YRhyOa@g>uwpkk>$D3d%4~PKle{6^Zu=Yb#{vL%@-o4+e`P|wFDgi^a1$9O%W)c$>rJ~`))s6z=sp_zUsb#O zXb^vC=GNB@P2kPk>%rds;5x&D7~F=@^1zcDQDzb}A_S z{BG|n-r=w=#%frX3tL5#&A26+`+GOy;89-CV3e}^ z>;FCJ3hYoYb1yCBopvRqTdbcJ`+?~n>oBcS)}eq4Xi&?rQT$N!f@6cQZ}IzsQp_n6 zGZ?j;HM6llY36J!m@IA{XbT7$SY9^5Vu|xuhb)|gCPK7oSAerh8{=~ZXx~n(?+k-p zlU+PH8dj*3K=(fVJcYD=&JeU!ZE-0Cmt$*?3WX1pI*YZ(cyWb)h@iQVJ6dn}B`wXU zHXp{aEE2O$C9)}>peWS4Ye%jJw~qxczAVdOAgFl>W-3qzDvQ3>X=C2y8Nl;3wGj6U zI?Jkczag$t58=&NoJ2I&UP`En@BQh{lLdT7)+fE{8#{0Qqcb7|VADDUcTi+$p&f;= zh3EHz`QWrz>3j(FbB;w`MC&J^=!G!6){_o3zkL2z@mg7hs=C{&VgcqBeGDB0LqG05 z;aql4X7Y@Ev&yW?Mt~i3hZC8_8r=q6*kIr7lU?E9rh<(~|dx#Sm{9GqGu(*ZPUFFdA+MS(;QIqN8=&?yj6Y3d8)#!|I={gmJ-K7A*+#XeZ&E@IfiGIGM&0gjCqlxg~3X;Ng z6DKAJ3AO6vM=zyhR@#+QeESeGZ`pVYdmpJ3;XHk(>1(S5PP?4>aBNzA4rrQPa6Cu1 zXKgP}?}|C16m$tc{Uk^Nf6Vj*q(!l$4lLfsjs@fNcMIeDpr!YS6Yo3I6=@+GHL3MT${`cq71p+YIRHCo>2(Bu-gBYhrpw8FoKQf|HzSGRP086xKYPCy}dtd+%!h) z___R%s??aMxNEu)))9rx3iC@G3)gIL%~CmI(yf0O`A*Q=&8|PC9p9}*REvU1AEdWa zwJ#Wy>gx+dVskAc7^Jywd8mCNER*n(7r@3wks5IC3v|*Qi z?YM&RMfhfee+H{+&t-EtLw-%uWT0|osNvY>BRv!;9C52I~ zsE%qkshdWRW&cI}OR6>QTLWT8adrLVjaAmL60?m|SndvGyRflikmy#NUpUU4TQcU2 z?>+hs8QsIim?++bppNA&5uL)qMW|yk0IkYwmE~gO^8@;Ws)W-f#-=Y5z%IY4p#k>|0ZaLZgr~E*6-jL`N z*Dad`WW&STrPv|)-C_6`>vd>y6Ygt{^%67i zEBITJ-xul+F*U7PK)eWBe(A;C`v*0K%I*@%F(rruO4T}xc3s7Tld$5yNjrJKvGg?XW0k&I(N$Gh8+ zSqfdiE&4yWXy4$YRC3&>R*%d`m&Z^HJtJQ|*a->KNe<9kq8zw!YGqREpgd>DGVh3H z3`>Thq+BOQP`{{aMLD;Q^w#S*&*%}3i+I=~j%AYooC=0#KvlpiNwqumF)vVXP%2;6 z57uqO_3b;)0_y7cAkax@3}p3mzwjGO;~Xq8nf&Om$+Pe4yVBAg$A$-LvG#1i5z zC$mP|*gvY}ea3}%glzX1-RbI@C9M-;ErZNR(C>E0I4b+u$m^^K!KjA{<)?HH5dqct zdK)a#cb2N|eJ{wv6%>hf5k%A00|Cd$ci@+Fj7fkxe_HuBg(KEh_CG*C9WPr?2p|}I zxTmrzNe=!Nw-36(7$Ey`XFNhXgJ=`GhYk@~${uNS(<)uZkk;>we`XyQ7Ck=SUD49s z*{<7cA7zX8PUQ*+uicK*f&h0!io~rnS$py7No!jlzDM1!A-BgW14P8w?W2+scoWaU z0=8w3b^oG<8$3Non%f4TIb6rZFD%lNw#u9nbJo-&bP}C)u(T=(TMd4z;kwcM%E3pA z4#-he>xf4+HH|24DrOq`*l|Da>zYB{tW1)x7eq~qVtdWYPQpyNDsTf|mqHLh1H|}n&sedA4 zq2-s^vyl*&KjMO)bdNp>We?|SNJ;zx-t+)Q!bU_aHrh4^W(%pW1x&zmL=>CC3Xfie zzdh#1^K4%<3^VqdJSA#8-gfT>UT-AFp9~pn9Aa-((5~1ec}NssaS0}EYx=N0Dsn_^ zH@D(OJl!QT*u(dfIfKXf=}DGsmDALSt-G2`#4jRq`6~7`nHL5ge`GK6^johi%%KJW zn|LlmOWt!?-OmJ|ZmyhJED}0SPF;EBgq7{qN6)s#*bt*4Cr=kNj0PpN#Z|YhZ#@g! z;ytJI2Fv0#zJ7x>Z$bHX$rR{L`<{kdT`j%89fJS7?%4*eECdjja(r(LC>cDzjTeNa z*CZq`^M03HrN~`_Z0=i4PJfvmMcK|=f1uMMNPzc^iufMXsQIl=brWzHEQOy@ z;KnDwlcvJAfh6sgM|$~cc|!^p`xh(n4BZOQn|Ka#*-uW)fVsWgUqh^E?_seNWJ*A@ z|Df64@BC>^?LQ|H=4(poG6a{1JkTE~`f5C=wGcg#cz|DjcRnzqu21JNw|pC=_-ml} zy7AifOusguWJ)4d{HwaL|JHHS40SD>OJ13bQuvx+vZj>xmQX-69hIl_8y0w=bERq3 zPp+~v6RJ2VXH%$Be>N|U9P->BdbaNHzkWgQkyH1HrU&<3&r>W(p^?>Mk!4khQoK&p zpwb-yr(XjoTi8X+^oz}VZl8r5x0P-UBR0jh;-c64V>(bvQCcN+%4^X#F(h-Dq++SI zBwI@QzvJ)CZ;8*z=`m5#+{B!&%LHS3$*-_>EAZ@6)gyap79itE3)zD*i0!N-i z98qP9$%ui67^IVz_O>{zj8!9jH>tw7F+lLT4JWh;^gzY)0Qm)?DESM>Ty6}uFw>sL z`r{eVU2;(nJ&BfH<8+bY)18~>>6-+uS0H3@4qlJ1i*$S-l>II8)-MB83dgc2JGG3G zD8V{Lm# zunzQHY)#`7IonMsNtEB6*dXGi z_=8L86pzY*wzB=|44{czL$$~Z^91(@WtA59sco7?cNd=kG-86U;Yo>O>O}u|s!0S@ zCB#&xF~EP9($1v!_fp$yjE$o>I#H8~-kJdd|21l7!bI3l(1-9pElM-RfOu)Vrq*YP z7IM<1$?5j}TEFLSkKP7otxCV$1_*P+o`K)hr%!o4Sv=Hv00VD6S+&+ITaj)wPY|>p zw;arjz4erxx#tk+CnWDrqLR@<@Z2qgAR+-k>^wpPX+f#P7Ivxm-C)*dgGkTATP#E9 zKOiU((>H3XNe}I8pL8w}OS4dq2gnu+K7jY6ZWmv&e;?)|PTkq!$SS|+vo_NCM)^=B zXU_d2juu}TGPL)Cufh6~HBEL{)Tex&rYer?+xBZ|iGV&8vS5s`Z~1e#2G*>g$>bhO zY%#Tyj!%OoaHx452R#jhL3}W1l%mbYOSlj0r_A%IaWF7**fuR=sByT&&$y@!XhOEl zfXijH&qhQiTleqop!+zAIyJPbFqo7%aIq^I8~N_0s66r=5RWBXxc2$pLA-PvhOyZ{GLlBJ{e}2hH|E&+_SlgX8SO z$!wkD#j(g)49#BAKO@1g+KW}4Se>RWI7Z{-0ITZ1r%@&V(}vfAb5A~{xvdGxbzB6} zz1jn84Mi)w?1?|lqu@IFQkgY-bAQ{1WD3dqWSbKvEiXD_INf&(9ga`D7cGnXI@HX# z7HXI0N?19Kk*9D+@?y~07Rp3ttio39ln(YAb=w?V!$-V(_?T>yxL^DynRCk@RRRgmHQ+=z<$f^wbH7PJeVz;(5Xwt_j`clz`5Nw?b zLUGxcv6Eta`}bqtUgG5yVIof|GtG(=*-!qOy8U~-CB?m%_t|of}#I=s&=S*=7!nI2T^V( z$Mj_FYjq2QY?U3YDi5y(GE};Q!n&IddzWaEQ$?^;Z$8=6SX(eg0EQnK{w&WR8LzH| z+fTnU;dXNh@2ximGx617<}b8>?ZTRG%{|&?={jwwYtn&i7yZ~8(Y6jcH)g;420nKx z5Bi|pI8j{ks7WQGgvRb^DlzPArPHd&{0ouj9f#^F*FklCKo1iz)LrF0`XKI|VI=3X zTx5i4npu|imZH5;O!Z@Mb5^PPJie~nyJ(r@|Ke;MmvFyPL!?l|Wo5L?hrs*!MqK0GxOXM;{*u{^U{Q-_iY) zy_6_LNQtmSJ|>?5);S0m3Lz&*kXQCEv%)>7{J)9DupdF zu5x-l6OR>?OqsJ<>cF4D93gHXauOV;YskJM!$OglB$HG%X!*a*tp%6}H(~s#9L; z^o&MzOKBBgQh_*H?_M-AAaPUehqZey0FseF;%- zHFUx*f5g>I>$_yGQ)h+k_=CFC4}j0RM`bs(hxu%yGuc9EB3*jI(D>v+aMASt<(1{zQIGbnP1wO&)q7#7 zVxD*Gp#2PbI^iD(279Tc51|gvo62{2l7dyvX#FSmmJZ|705&N#3|JQtg8ZXY-KT=W zCOMX#(v+eo4AiOq7>9P&Pwfh8rnKrY>(P}uN$7tP3j~dFqk3)n8hh_Bj-C`;UN zLbcPhQT^TF+VckSQIp}Z)>RzHUpoO2Akecmtq`|F;ciLc~i_jJgloOL!yhk45M;Tjg&{Y zD(EU6X;>cP9*un`#lj!D5`M>GbDfayQRGy;Enp~y7;6pQ>eL>Kx=+^^A$QHD@xfYT zKi~P-ZTddQy~i~gmTmhs6gnmQ&Jr%+x%xFF7;2h0a4kd<;h7jT>$VWFB zUupKsj&jRPD*1uHP+TvT={Ah!`Dny!JjY#{$LyGN+xch|!5MPQI)s!%+0U2ZX;aK; z>6>CXrs_4W)7R=0j{&>Zan@*3mz+GR?jz0ZgXs4=YGLMI63pY~AP!y4drc*NL1~|? zpK?pQFG9hVIGaR4*~MqB6)`ZwF?$)>*1(5$cGz}VrOV2=wXvFXQH{g$8DsV?McCqh z6Jm6Am4LVJe3wa)${Io0M?QJB!?;|+kw_pS#<~2gtW%1(0q4_R8Hi}{LP_<{D!Tn& z+hG}8tS#==*Y5^6?&Xud2fx9*WZuWZIz}RZWTets`KHmrGsqpL!BYCbrP@oy(39CP zGXs~SV_Zns2Nh?3K(O4AIH>-jo4FS1>7bI+sjG2wwR?ps-UB#kn$WU`o8d`k$5 zRcz(^_{-Z8gpM!ecUjyuJ01vzp?Y-pViIL30&EcVg)DlmClIPb4ter8oZ##3ykknP9HOCr7{6q{>7| zPS(#!jMkk}lVUm-#wWzu70&X08;QT2CM;L}*KRO>s+9r%VU^;J95x(wFw!V!;coXx zl&pls5{^2VY)LPdtv#(u(_N^NwyOlE^$~K~_Bq%X3Ik?8gGw^^R#CnwmTRjAT(2(n zsB>u*^~EDD&L6)!lYEAiqG=@cH1=;Lej<-U z%G|tOFlvSm*K=4wA2h5&&}80{18A%f)lL)ZPU@I)*hTYk+|&&vII8chEq7SXEx8B} zuOm?(K@+uIH}*c)%kWzd^nt9%_90ELnLYcIcWh0*czs@3jZl4l)kI7iRLmv6*0eg9 zJ0K4o^-Z=I?DOHVq{Fw^!aml(Jbx?~9W~^JE|Q&pDTTR}3+rOJP@(&hZNcKWxmqZ# zyUPC)pqd>SWmb&rCe!AFO3`#5fvr)d&@*8nk*N0X0OM;9?jX|mI;14*7o~(*RH8Y( z8fpj6*FR>2f^y?Ua}?oeF}`Rymjd?HUltX>T$ut6234X{j`JQxWw*^W1EK>wb&)ge ziG2;}l}|!x^}NcBLA5{<7MDT&T{%2zL7gb;*Yot%gyWt8ap$Oq;84L31zR%4YD;(y zXY-`AW1d}PuiWXKfcX7t)@{ace9XikeEK(X&O-`E!NL!LEECSaBO9FVm&+8cWb+n2 z0Fr(29bGAHT@kW?v%G}p2kUJR1OY9V4Qz2CloBxqlOKV+RV&$s*uZ~mg9BR5A^+oS zJgK%iRpnw*RkKIcCv9vd5V6?nUer(;k_Eht4R9Lk(>{jm!kw1p=vy>!8l#%L!&MaU z3@C4ZO1VZyull>X4dQ``Z;|&+ntEr|4ypnyJD2q|-QzkPG{w4=>~sO}at4^9n$PDV zQ0FZPv3U?v-BLn??J~OmQiHEC6J&F1UN{+J+Y#9hLp?-3s7eN*1l}yHibOHd5T5=) zvC3H&mPn5Zp1RH&HF=is{*m-hbufSGo=Ha_Sy!OtUzIS{`}zBY(!yYY%aAbl^!>*I zn`^L<@huU|fV8mGHV^U5&c>u%AwA8H8-zc3qK}9YU!Iw##f|X=y|P)lyV5yvPcv9q%Hx_vK<5@R*0}KE6vH>X~ z^8YgBx+?|dHvNL4jL#})-RFyAV3u6XJ@A)Lgy5^oRjADL1OF!B^NNulopUZOE6|9hHo;OcGOq8p0cWpW=lbTl+*}^( z;b2?xbfEA`T0S~|hM!5si&ayVTR-;eIuD=nTv-BBxKTW8lp@}-FiyZe6`4&mJO`8z zSyfvev3?%!_&JHkUldbvmT!_+J>^6#8OAB@>9IxALwgxL0uyHop7xKM1ej{R&>)g!XE)&1gk5kFmnw2mc*CVj% z$Q!3U@pV*JfRT>4a7h%)f57o_YApA#YJqDuqgdU{u;Q-Iw?O>_e58IuOs;>URF1Q)r5YBV_t^ zP|4VJGJho=H#+-V-BgNj6fIJy-E#B4SZ#Z$yw%MJxD+`N$F-YE1o5sm?2q*^I0?2r zN5*a!Y;>QGH0&*#^O}w@*cY+%utQFcz`OVd7ETe4k-0U;^9ctd4;9 zzSrqAvn<522j~WzF(lY0VFP3DOKtozZLmxH=V+&z0X-t@%>7{j){M}M(KZbVN~8l(Lwgd-{GbnAie~UpV=mA^`BG7yUzwRp zVvwK}6@+6+U>2dLqSK9{Xa&B`!H(}0>gtD)l$bcVte{KZECyxxnOM_%u%o3mioCLT zGC5Gzhm|t^d@Bt{ezVB6sjm=lA)-=XPKp5k zvc>WL`Veho?dPX6gNx(j{D$)V8P(siz6gO_b;8PHl~v#SXDvN9s;g}?NUk#<051&p z_8r#pv-}rv#QMtytGJS9LqGCusF;C&MC9KYBiG~FZI@_{Q7+mnEjj}jX_ehUzYxJ~ zU|mgKaDGP(Y2Rd)DYUJt>RBWY+dY_^s6mqjkB- zNJR|k(NTo!Rz+5AWE!6pKUgtupA%yA$WP-I21PYk$B7wTM(} z9bzs$0^2;oDN#_v*g`_fh{w6KzF?d5yqiQBxbj~>&l;TyOzBM70XpQH5Xgxpe-l>d zONr5BN0XSO<_U$>M7(#YogvC>;6TGN2UO?v+(EX81n|}ZK7;M&BxhU_6I?a4>LG~H z)u{&okB_w2;LfD?Y*i!R+O`q0;b{4QJ@`W+&Z9cIZK->LJ6HkohTpJP{?iM0ao(@I zpWk{GTGu9zZ|0c+O%c*XL(qm@M`RO-vt;?z!AlW2;rBz!rI~@4D-P-nL@kewpF!%Y5?s{|Zr5ZLmUC+m zGUtdjMC#d-cL(Wbi#B=(Q#8GamJZdh<{Ee7XY>3>X?F3jUgkZTAa*)-Uf{DPBJx)i zsB!2|t#G+9o2}s}W5d&D8oTJ!=L)fPQ!eRHHxzDb%+X;U?G6aDZKrb1^3v(|3)=Yq z`U#aK`QOnAqi?>88lD?Uxk$5c!VjzQ%E+!`z8O?m`Z(t>U+vIzwLk|ThW|z+m}~Q* zI{K%zZ)WB91XCBGUpbs#Kh_;1_L2Kw#=SqWn~RrLA;orU4w|F4iIT2TT51*-Qtc}R zxk8J45ElE&YXn|VitFS$Llsb#e_q0n<{9`~Qov8RV4VMmK9}ClYP`!3SrAmfAy8~1 zoE0prbvMHYjLCRdeu0nKF5s{T!S*rhDUK8#w`0!Ht`kM{UXqLck{>}MC6;kQO; zr|Sbd*#CvMy>}d=j!V+k;Mp%M<&LDohFio+@<|U3R6`n6&drUTi=zMY^{L2pMwf+Y_Qsi(7eE`UAIbOhj4Q#*< zU#<8~lpm`8AJ^fh%TnmK%#^uSBEWXI;Z6b3KVXY}5Sw>1D0Jm+B;;SZI2njn)lWPx zYd3uA8nQ_&-8V{mT5vA0=t5oN(YY?;)H20iibxqXKaXU@!Z_0nSi*oRga>=CDi3r12dtXQH%8B&D{ud&~8nCXGq(DQz4y2Q`oSYu8g6%e@O!FTc*Ro~jR6T+RfEm!`*|Y@N*5Nk@G#Sd z(E4uoIipI)=>Th;=KZHXG}q~|Xb@&3?DY%x7BR!E_P%$XGu<59 z%g`iRiBP{@Rc5f?-k3OQy6pDt)K*qEv9Td#@W^&ABW-mv*^~T`<3QE ziin%^i7$-cud;X+D3$l-yJo-A%9WN|R3Hja{)OZ5tJUXOCc4-jJ!=L>XYYG?M{hHY zse47ozfL7Lt%6aM@dx)qFn*~4Ul!z^ z;oAS}uy)$Dp3Nj73qnS{1BdRH!ncT01d*d+730L{pt$q)xb%`4ui-RI zz7cJ^4A6H0g(FUZXx`a!4+PYzKz=vnl}-zy+G^sdl$q=3AZ7FJH$ep05M8#VEJ_kR zy*ej`oG9##rzHER0hU)+AGG3fsntq9b8B8G{cJ#BFovIlc4Gd@+~n{a zuA$1b^JD$jOQz4|Es)Dkd|!jNg#zPGf(lZz)vUSg^R%J;Oe`)zcvc&w;tHBz1A9uW zC+@}BFLUglHtG|M1wN;j6mXj69Tl(L7GfRTJ>1x@|zlS ziM?iRLL!Atk_fMn^FPnSUL;f{mr#f+_J7S{anr=RchkSVT`Gh|5Hw)|ms>44O!VMm zw`I>@zVJr)(B*$El8YeoXP{V?+wf<5sxK3<*r0Q&4{=s!!*0o8gxfK2^JwLHzVKGb z<5${b;{fl3KycvRsk`x~82^BOCb-yu$)Vn>1wXpZvq?t;rb&k(mPc{Q%x zrJjcitzm?pVav&>G^LRZ)170pCr_0c55i5V7me`Z3{ZD9O3>zhMt33n{OYg|eOYl# zE^CVVs#ATTnLK(2q5S#(w~In>Eh$Tla4obHH7AU*2X%*WhfR8g4kh%9bV#`G=lvT! zW+cXc(`vu?k-4eMvBK)n)f`?pmNHa`YlyeobnV{Vryt(4X^hF3?NGXLA)DsZhgWz{ zk1pTOzYsJ5UQLMDA)EYu!(cNQXE?IlAf-2Vgy=2)nt4T!8Pct8WR)~di)KN4@L9mJ zgSTS~?Vq(hn$*6_pn|Bp;jSycij*zKqfY!c*g&3*&cOhd@eX>`KOQ`t`#z3$!J3FU zKzY@96U3ZhuUTHn3aEx4AL1lpbXsrv^$7j}j+;N-`Q;paX_Nz@)!qV{B+K4ua-oP- zao~szWNbM?U-GC5q}0$Ox-|Os6lLe`vjTpZb-n-b_jDv+%L%MWWb)tq8lod~nn-}o z4e#KusZ2#X1)rR+L%k!gX}R&Kmu4v%Oic>3`oHsoSr)%7gG+>7C2cR!@K&5dfO@Eo zGVA-II_3Y2hk|m6w_iqS)jJamjd2s5+*3Wm$@Ba;3m)Q($B+HRj<#-$TCAI)m1S#h zA^8Oa6hn`y23y}CT)iN|SJM@q3%mA53PGcr`Cfb5cO>1-HjE^+$aXj5O^@A(wIZkA z5gD{?@pGGJ2r8vA8I^nyZVzgTVsi;!C7P5Jsu)a8NsMKp&mI+|zStw+XNd0~z^jkq zJi-ASKvDZ_amQk(*`9~gX&zCXlK)dEuMvX@i*AyJ0qUV zlixPHbhp~)!kwO2oc;s<*SLtlJCSCEHd2dxo@k2U^=VGJg%7QJBROgr|0&idmLcrC z=RncrG%qzIYQ&9Mdi(l=v%a)oEC!_`r+&jAaU&@jr+J_H_hNd-1ar%ixX<+LGceDy zoX*aT>#Fm>&@RSiiS9oI9_Iy}0(NJUe{$T{Zkx-jEuqONpU9m2$+-=g+_8Z#Va(8v zB}(_Wk{62i9FiBpn>^oB9uV7SnI9QeG@J<~*3Pb)-=Tv>V52v5Cq><^Xua9)T<>>kx-pK6Wq1*}kdymQ31NOWb$hZFAi zQO$jnDw(sJ>unr$4@qbiki2Eht+Ay7)Z0((dQU-8KNad)oehY1yQvO%mp-3KcVSf>Flx@rqV@(crz>XgM<^0RxElp6etCdgW$X z#^6x&gF-QB<;bxvYUd>uNhHxYG2>04l|2#idkg$`={R93%c5mp8Cr7 z+wDrMgWqp;uz|~cm9CdbY_|X{)GD~zok9~h^+}0J@y^#)#~(IBqyo*s`vogsc)0!GKkgOn!7Ps>z|f*HXZE4wv3w>~QYF-n3(_8Qx&|NLidzu9k6VmC%nv6}eAx)#Q{KN93om|2eKBDhW{3}@Jm7jVs3KV;{w zcvDpBEV1NpIfeY&Ut1kCf85jw8FI_gaX+xthvAr?NGQ!h$fkOq);cz#bCybc1`{q@ zZ`?-;lV6SUA242}uHGnqyI+~o_6HC)R|frN)xt?Dw)Wu$;VNcRmw3wax8;v-(R3FILD4#Yur_MlaIhu z@9dhuvyX^pL&5LAG~*5)C;#p>#~mr@SVrmfX6awXd3hs8v~}M{T{|F znjT#*{HvNm^;Akm_=m4M4)#;SqQ_9SdRqv8lHjTE%zJB}^YiJ~w&$~@DpDse{HHI+ zKS~BS=`X0z7g$>xPR{J+@EdV&6Fn}*LAlUvY(jk32Bq`KCQJ0s;}&1%grs7;)P*2go>|7GL8+$VylS9IV66zRs>`Uy5+wOm&EIp$D=JH!j-G9pq#vsLEti z$lxY|<){>{eZinX%}(GT4&?e(#N(b1=xgcz*`2h=I7iyPh<++G&HW>_hUAvSWA?npX z87f={1DYTF32fA_1}3=d(gP$`3{Z%U;}j!|M(4SAmig0p7L_-C!?7FZPH&H z)QF9pYK)JR=ez-J+wt-N@Zt3#s3gx%pn;Lnxmja@-_Ii5nMWW6Jf^_uIplIqG%UU* z=B<>;+aZF|<}a9bz6G2o>`Fx;R8-<4=Q)>3RnTI)KARM-leWFn@#{PaJb3Mr-=CkW zsFf1-vQ}i_>}8$bo`5kgz)aa-^6$GhmLZo`daSSkgBH~-tJAYk?+pw{GlzH16<^40 zv+8~b!2_X(UCqA5GHW^2uoUdP8Cc+IJ7tqGeLb>3^1^fsxMdd=xGs@^!U5Qx{UWGo z@`6#p#rv&Z_!SWu6(O2E8V?F)SgiDBXxL%}nJ$_kvMS6bZX=#sfUd45{01!n@pX`c zb?J%BYSmHo_|r~`neJV>}66CsL=4hJ0MGg|;77C;@BM)Wu8FSR4G<~*Fi zoWTuHlso_HJwpXqQN^iSJ>!S$0%U&u{Lx{f%Uoes^=#4WYu=}7cZ<Xrr~T2_yc}{!@nbHN)G76lYFC7&!E_J-#>qMO& zy8VOA0S^m8J=f9T?^n9Z=M*p!`5lI6Z6|rd-k(o}avx9fdi@MpFhY z_$0>i;)4PrnvAGx=Nlx@Flg{S@Z<15#pzK*cIYg~Xogl=Vz*$a7A_Q|O@`iJw`?(( zYn#Fb+l0mAUxQ75ZzgHO9|nF2?4O5bU+yz+WrA73_mm>35gDMC5xGM@xo$%oWPCj; z&g6s6@yz93&M;*Dv4M#h1K9n%>W;?f8FV*c#nm>L$X1oMUed8DXmFdh#c^>U5Em0U zo@CXz!;*KV&nm>&=o5;R&RD1U&G1Gc)mYg3tu5;CGh%ot0(H*4)_xqjWZfia6x^&Y zX2`?zCdwMqc+xlmPPAHmS9~s7OYY2%0?QkRPYgeSyF9sqPT%`ZX{jI>m)cN_?st);toOlMQKkc*JZxhb+%31zD=Fr^uV! z_EtnhKvjht1uYbC9&UqiJ&dwT0hRik?^3XOXq;WZl{LJ|J>a(jO+>SXMTlsE|3o;1 zoB)>pb_^J#u_<1CsY_uZyFHvK9uyCe10CLP*e&kec)~h3$EW&s)22Q{m^eISC9Ylp zO-XmP&u;PrHL3p#rxxA5tDR6fHxJ%T1NX8X*-PvseAST2SsZ#V&^SV5x%ag!T27GL%KhsR`A?iHf>DtUFX#s5WLytu3UUY1-D)USywc))3n87f#r z$CdN#{-w8iVbqZ>UfQo7lL3!6Uff=2c)W2pA~8)@TVj_Q4|>$f|G(5{U7oe9G6Li8 zSgR4D1lD~!EpP9AT`e5HSW23Fb-m%KJVwCd(d)sgZ{MHF}95KXbc_g zzMYxrk>Y%U9&uwxp=eI@r0$CJo>v)3X&-e>OF^O?UYpmT3Uoy0CSBU4x;VOt@ODve-^ar91tawp67=kDyVKLH??xKF!JNkl{Zwd}Cn0owa zd=oOSe5H(aW%wSvA9lu^Ml)vTiHCO%H`SvpGS>^rQZne&F~411%aQ*jmoWX&FT)8B(4Vhx6S{iL8Qg)YanK8j*nitR7~TYdf}6pC}93kM`ph zov&NagL+9nov>b2sLC0tf(A%u($Wvw!*7Surm`g}2K4-wOFUrOuc=FUmOn`O;s<8m z^VaTbK|IAu^R6q#LtfdC!X+kWOFd_#JD%~l$6MX)nU|_)82ExwjaZXYXyt2sM~5o$ zsk3jSv8~tmj@gu6S-3N}M~$+5^XuEi`Xs9OrA}HWXj`%u50)OwW*KAu`dZv1BiZIM zah#1MY?U=N|v0w#6TD&T1Bb--7F745$@UHKhjKV9q|5>|Yr z1Sy!KVg?>(@WZ?uNxBEKz74;?jO$UKC5XCOzxf;XI*~T*x1~}_!P>d5t!ngUK0R41wVZRmh_-_ z4nWkLzbWg0<<~Qhz7#<7z!>Vtw~2x!ZL?Acx-nH3Vw4^n-(#+K+ zPfKN=oMG0}fB&^KtQD)pQGbSA4FrSZr zi(sGbrl>|%p7Z=7sl(ofnUDYP+u*Wd(V$p{C4_sN4Wr>9%ZT89zo~vH>PB5k6%o{7 zv8z{HAa&kS*J+;0%L7AskC<4>^YRnH5;wur|06EV5BL{z`}RU^YF1lbz)5SzxXuzn zex~xauNbe}i`@=$4B%RKsN@x7U^A0}!Afu|tH9Yk6&u9)wp~SP=5aInyiws)Fi%Sy zU4<4mf4+l0XT-vW*+SgSV!)aa9!HH$-0zj|KIU{TO*Zaar!(eo$(MZjwa$v7{LTsY zJ>t+!ENOxuJ2^q}p6I3UuJw;!1yx*!8^;`u+||U#+8-uSoR`v%Xy=dz2pMW(FU1hE zu0$yDVH8u?Kw?-ELiB1-|4Wy7k^TU9OM?Jy9U9X3%P<-6;7M7tp=2Ie~(~s zHt1pXVQ)AsyyJ(5J`$<|cpE&1Y6mw(7vwtQ4x*jcLJEXZ4SrCGpy%RS#`*pwo{~t=SfvE#V2HETG`JCs9h@m+ z`vs|E?|p0kV3+}RVeX4DH%xz}9<$$5y)x0%6k}HYIiI1pUVD=TiIR@sX`1gk0AlfN zg+n*q;DuOCZuBo%hq0G<%~(FK_`-0)uwZP7zVexipHs+y%xNb40tE7d$Nhjqz&yZ- z1Zq)jo~DR^ej2@IEm3oDGNDpfR!{bG5*)ziUk3fwPpOqoQM_wgXG2sd=ZYKHz-tTO z;nT~EUmuF^WcnMBJ|h5p6uU9cjB)^68mSp08XqEJ2eD|-_v9us~9E7hP$f_Lf)azGlCt$oU(kaSKq(iB$mH1~?i`|at zxOH`+RKY0hAGF>H!Y=V*YArsq#p^x!b^$0K|6IUy$6@>NFKxl^I6G0V>{Ca6aUh_x zt7|bEoH17S2U#s6XEQ4!+-7ua%l{*@Lwt}YOe?`lnW8ciBekT}(6L%Hhsv1h6%{X= z#o^nq!Oev!H1RN1Q~IzLRC)&y7fj~z+v9vNt9^NG&lCigk^1C4sER4_K9J&ym~~GD zKb{}xX)prnY9XjY`T~i&YH!xNAyY`=j;_-p^c?+`|9aw8WJ^bQR^y2(>wT9$ARrBqW{&+`Mu#50a`TJ+Q{goy^mggtm8IN z_0=qI)OLl3xuf%VK`DjNz{zq={k2V)=-H^#0}7}1t1p^;^*Ghe3*Xq4cW5yu2Ee?T zPOHR@`Rju|0yI)Dvu@cy22SH_v6s;<#00h6hE&_W1{uth;z?qEB?&H}e89`}zE(f# zFdjV4Av;Lvn9i)s>TzA8lhh_9RQ=E8Q2T%k{!ZlGSd#TfaJtrlta zFdmGw1|f95hT=yQ%Db0Fa=fFfLp#CqEV_dlM=gnC$6M7S$#0!ErL>~kL4Z4ziCsI+ zHV_m1u;$Ty3vSF?6xgK-^}eXxq_c=40CyIgOIWV{G_6eMFBgB+sG6$hp(WK&+I0D{ zj}Os{$5?R7OnsRmwCXKXm?>vnHM)bJB=ZJzWLCqb zYo`4uo2G=QWTZ>vk116A&m7pSnH$Fh!DUmQNUBjOqA_^weaIdE6C!j)^{G>zYWE1u z_7G8X{QenVnAyJ;>iV^D1It(kBk;R3W>fLWB8B3AA0esG)DSEHVKNB5BKBa)B4bk#^pR zmov2ZiTsJP!28$eP5Y1Kr6*MyV8>hn1Uy^2^_z$&(;gp8=ucG7mpOrYz%gY%(AYM) zdvUZ?%;k7EbXXro7n@>arP)PRlQvUAtsibez0@fx%b$ZPH?CS~8I25O(7C8TCEr|z zch>L%L!tdmDAt@GSBm?zWq#V05Kq7oy}l^Vt_NL)Z1&;ReSQ>> zNVcTkX1i&;XyP-SDx&Q>x+2XgQ&7@Dy>CZYI;o{6?}sHzzpM&%r_SpFTnOQC3Em*+ z@FYZLI8&-n>a~C)LbQ;}@FSk}`Y;_y!o*BZJti#*`2g)!L}GJuqQ-JC2q_c97~XD@ zi;4wm1uMaIef8B&6mJO}6;G$6dj%~>=n>g)V-9Y8TD%li3KRa{`n1l1&}RRuP5~n~ zFo$!(2J+JwE7ZfMJfF00m>=KWlGz#tfBD9_{_;)CrNqp=0tKAt+lLxyL`>fKHi1b8 zVGA_hPi3D1IHJY8v-nwRslMJ|zsh7wddh*|9(Bn^gOd*pC>GbcZC9_UTunGSH&yD?=Y+PKq( zD^*(GaY%J|l9O3KX!^Z*!(BzHbohhFBx`M|tYgMxM%w$oaQkieVk`|6aeYVJlC2U+ zkW{ohta!ZMDO(ueA?|Lm!GIcAyIoeOCVL{}~541wzQMs#e zYa2JWvRQJ0Agfo6+D@yF3Fh3fC(trX9tO7GZ^p)%1-gm1oDFF3cXEH`9gkl%y}Xii zN*wH3(-KEbT48gWn@OXn(B1jL-+PZNivum`8!H!R@ArDe%X}Af#P`a6aUJqzxM>@q zEIlzjb!rX#u*hJT2e>LU8Vp25q_uhH^gC8mJuyLJNd}J9dd&ngDih}5(xg@JkAQfe z)DwcaXlo$T*eJaFJ(_QSlL{jp3_7ahg}(L$BcB6F~s4WFwKBT*rFq6Z)U` zHjIcBo6m?7yflTvf+uyEHVDQ;C{SNccve6Yxt539B<%`Zc5~c$-n4r)a?Oo4$*6<# zkSPjnXVo6vTfxgk+v#@|BAyzn&Ydzln*f?z8>v!|+O*B| zFn`g>`YzoZF3CQ3g^>ID%ODeh#Kc`vTeLt4xtC_BSj0$y5Hv;w_skk=LZDbthC)lc z4f~Zs(=e!s^qS0$BkGCQLM#>ITW#1*Wo_$`qq2O+trkuSz7W1XiZDuY&(NO+}7BgyzgnQvXobKy=!P-c$U6HJu`c)GAf7P#nK<)X>X6~bZmMsMuH-UfCjN6Wf_!avauVnfB7qgf~%Kek@ zU;pZDCv>Are8x1vF!o~gg0fQFN!{A}=MnmnX(=~fj6yNHfn2j2+7^#4E$*Ec(``IN=ZWLDMQjLy%$+6& z;~gVYXgUJXyAGJ$1$A3VdizFU@@5y#(wj82wh9jh^6m$es3#)=_ zF|k#tLCB$_d|`bz3iB%W5r??1apmjl+%_uLsiEcgF~kCWD5ic!TCuW>hQyoWewZLt|yt~^WEP+jomHUkO@H}cTKqV5@pU9)bddu zX5SN#C$Eo#io!tG6+sdbz%R+xW7MsgyibfTI8hMV)hWH^Rw|uj}tAtR)g)l-i}^#sS^HVdN4XBNX}PCU*K@R8&$cuX_1bV6mH^` zDAU#M8%Y7ctU%8@?-It>nfEMD&9?d(inqxxhBDsNmfm3oWAPHh-jA#O4`*Y345vo; zC0}ppR1g#)vU}#FN>#Fk^M}%%@J%S{(SL$f_(uc?)x@5D7XZH)Ei(M_3}q1N3FCW5 z)nwAcr`Z#XV}aDC37lUmGM+dlF%ELxWvY+O%Rjv4e6YqI6AX9SfCj;{OYM&Y{VG=5 z-n`91l%B2ZIMFq#l*6S;I@~P5=wgg*`IRZOQ>hN|0**OJ7V3Et1+I*rMUvq0;OGv( z=Xb2&!8^I+pt6b?zcTL-^>}DpH}W4H?w#@%@lwjrHF(O{36vF#f9bX|o_EcWcrAFC zFR1xnR2nDF_uQaJ;xIR`qsME9#nZi)e$&t)`yo`$Z6u5b{?IR@(xWU^22EE$Vs1#C zP48jJl_MOtt@;e+5y(g7wPBY0{B!my*d06fM0JPPW|T_M+az^p80!P1n!MR#M-1T0 ze!cD$CUG*o^f4fyd{YuW44lkA??r6QB`TjHd-<=DsRY`<-;77&Y+%yHM~(ijYlgoj zg~oR-%VuB9%||ZSuSszUh3xgY`v}8jbY1*I#QHt-Lt7bxlnS%bLq(n6-!{!e?Wg!7 z#ZwLMa4yzO4QJ-YVn*oO9mOXNWRc=8bMW$KWP=_^zijsGfB6Q$S-UIB|M4_4{l^*7 zZ}ks&CZbf&LFHLDu!424i#dBDAYA~~^y&JoY+uxApGUS<=ZCeDOp`iMT^U9EkKNTC z2?g5^xzzED%6+)a%RBnJ)U)l|-?M3m{N53Pdl-GatO)mE_absE; zKvgQDZ%wDLvSx?wV^g>R^&^81v)R#yHnzO#A*ic)!Ve^hX;S#ROk7u1hKIe73*&@q zr(HW5)2bSOn%|bHh$8q}{@EqtU8#QKkBuj)sKoj?5&u_uPq=hMIvS_Z)?%1J=(~&9 zjxUqc&B|tI%v068pDXh#OY>&wm`3Sxxl1DH+ZDqt#O8?df=V5((lf(vuDX85IyuA( zUR`B-;(M@aaD!~;_Nb8#uRzzOU1c^SV={JinNl!`B?R}D(lkw{rJ_@;8aKciWnfRu zsA?|d1JTGJ|ILXWIf>pHXis3JPvl1V9}yoR;Y-WWeUXXWjM!!@X4%vz{}usW_@pW4 zRtjTj1})kCuLPM>oBQmuPzu?~%ROtrW7U4L z^UiWUaE3P?g^h^^#Vw}we#}=U7eSvy%GhRPuC3=sf@G*r2vFRF-*@(0_9FL}p01ilirxOLv_i98v3bz$f*tZ;?uf6*h5TMwZ~-KdxJ=XIm`*xgrcs!Xe0l(UvTRhepDdB6um!rA zdPqA0QKYYAnyfNWC^-Uiv?I)Zyj4`Xw|Y|OHJgi_gHL0{@TUHc`-$M@3j*&~rJjwM zXxE^_Cyt-+uda&c8-f(G_n1SUFA(0Rq4%&E_bK~NV8vy$y=-w<=_Mw;?fUyBz5tAj zOPEX2N|cdh@(PJ;!4DM%j{FM7UuAK%X7r*-*VokYcKgOh{oW34tpFHV?xDeDuE!hg zroAL%pm2koqeIH5?Hs+RCtbq!VQ$$NA*K6h{tqeBDYBV=eqXdrO~&}f1*xX8l4b4o zMj*{KD+|-Cxjd!WNtc`oa&Sx=^fFb~)UunxS2=@__{?{+t~1iNZ=c!vqDkVYlJxdw zkAfSq{_bYNRDP=Bc_<_AjaoA#5@$O*_pl)8&W}kVK3ZH)(&VzR=iu+L3Woi)Yt%MD z^vwR17!NX+4lfr$`DTJXzypS3!Oue~3pIocS7=5Zw0!KaeDh+Msd=~f<)S`Ag8yYQ z6yYoVTSh4ViMTrJke=R)l5i9ooEAL3UJXS>Q8#)n@s#Mfj0tT2fWm>*mpM>8c?=Uu zz9>2e#A}`3;@oa3%wr>0!OHIJQZ{cH|A*lrv@VSPWHCGnl7wltW>Ghg31zl^>a$_Z zv23cn~apv9(v2TaW z8-vmv+UDOpSd5%0RTo{BoMn0>ybu%zxFN_6PoKwvR}QUs|LyNT(ewS_Az>VXmQ=z( zonP~PqN9q>8~0kw-a#oEn=fsF>T53-NX^NeXiQNrNRi_z`sFfWUanPXP-IVL&zQ!9 zLk)K9MV6|Dwe7v zk(iy*st|IhvCwR3#l;EZWHD~1yS>L%@L0xi<)SHO97NCfLhQhZ9 zuOM=Qm<#c2uL5v&;w(x-XHK~RFW>*%xb-{&78g7}C&S9?=XXPZmh1I-yz~FewQ;{5 zjV3Unqvr(i`stQzwW=as~$XNz{S0GE8o5g{q8g` z*ODNVRB^>xcpH)?&a+E3zf{fCdZYhq)_&NZgTl~sX~@a4M}N+Dvihn7@Jep06`e%^zPhyz7hFjCU}L;;8Qul6W|%G)n}} z=P>ERa)-gc;}UyworLh4Z6|PaD!Lv^_BBdu!(S{AoQkzz=ehh)$`BmUj0L*9L8e? z4p}O`zOx_m>>K`)9MN$d%H(WqfLK1eVy0FDoa?WT1dxn@7Yv=ExHN&bs&ICR+neSn z*WJIgFQAflOC&0=23NN^V?t)NT&nUSu4SU)cILmX16S4VoT5)W*f5usPecpOUGjd% zwQYSyt}scduVxi+qnU^E8Jo6-*~x-l)INm>t&&3d}IT%hD->OIPCop_m+*bS7hZJY!3d!vj}JU1N+toc3E90zRX4MV()`(pq|?77x-ZH z(UOtNOTtRmbCy`b;JZOP`GNS>2NT~YJ+(DbI zYUJCQ`iK{-AK?HkxXRU2r`YYrgPv1NPdw8!j2I}`TM87s{QyS@oU*KaFbg<|xM1a{ zkpwuj?b=s?D@)20N5JvAG5COHYLtcfa)m0J>^RFLT7)~<**8ctL63rxAi6otC+5~5 z|F5+}4nF4WvR{{pVY77T<(4NiR|zG=2;|hV<8`b2Wy<;O*DqjZ-;U-Cy9~s6#4P^9 zTnNX8SBBY{8I`_bNUee0MHdA3zKk5fw;kx!tnz2yC?WG%k<`B!%9-3w?;h^E z#%jpn$CO<^TrcRu*{q)mm>8ogOb|FM2`Y86Xw64;2weUUlEJVi_lEV2-J(3bd9sB2 zvP}uomj1(i;E5Kl0+;Qadd_F^@8vpHk+h66pk6DQ8p<#?pQyjR;QJos8^^}m+xM1+c7Pbc2j6XDsidK*yRzLLp z!I#Uwd)r`HBF{{UTHYr!({d=ELkRANFLJ|Y#<(dl;HN(t#+$|>@-R1E%bOQ5171fU z)+j~IY5?Aj7YMLWdDz$UK0cmnwGLFk2ee=oeP?(sE6x_E7OS6{b(BoLMKURWYKM(B zTu&B!%)01$BL5?9Z7%}ppS>t08VJal&oQfq20!EzKHMC>P*_c9xEyq$8~J?kK*^I+ za+j)t5jn;UcKoscKRN&lU_d@~?AALo7rU&U_D0i&ps_7`jJg8nH^Ho{a3CdIDp&(6 z_>n4Evd1n$O%vGlY2RD4{@lPA0|~d6!l{PH)Nj)uFmoNVp?J-0dt$RjU`j7}R+o;&*p5_wkmYq-|Klvn&`&XGGf*bwd%2Qx?> z^M?^g3ZnV!*;)(-_w|ji6bznR-upv~sUKEKu`QTdv+B#E6NMbP^530#+;^@+Pu6~3 z60yI|cxoG@sE#HzeGjClkmD&biRJS6)ODEYwwHs-4`J$?%Gy|0O9{3(1*sRbhCliI zyxny%a;21l9&A^BHj4%y|Cz!qfs5HrnUVOc*hE*p(=WbQnSD>rZ{2 z0Dpx!IzCNVTbEdF;`ms-&iWV%?|RrjCs2Z`Ou{}+C_`r-+t%d-MBZ%Oi#ztxIx=j! zl01OQv$a;S1fH8x$!V7yk_{KwJo#r}qk|nMgJnT5`(~rbY$^m<^P>^0`yadPlC;GZSgVM2)M(CkZ4{rC%lhZ))_vyqelpI?>jU$L z{&|!G){JoSUy5URJCCzs2fS*ki7#a|d-nJ9!KUmalT<%^*T)?@7$j%B8$4l0j0fr7 zQu62k)ionG2_(nlOeB;+m@xwueD<~W|e{_S#xAJj2-Wu;13=v5;EBZsii zV%G03HC9hX6-VM+$WK_VCQ!WKcdKwLgvlaEZWiG0Wxr5UWg>8mNgMP^Xt~ro1G4YY z+-2D!GPZ$aHVcOAsp!JOvhZ=T@VjPi_8-nyyxZJv-)70A7+P$(5O3ieyN)M;38@CLK}BOF=6Ot%G28g^2#zIjv{|$VMRiiPvZR{vvM!%Iw^}`5@H! z*F)qTX$6d90UWn`KHJtN>R189R#;{Bnv1%4IG&1@cat~fzld`?EOVRNBSCL;W|i2) z1e#7&8^W)HhSkLw<#HMG&@0yiACD83Tf#A|iU<_)gjOSxrMAZJ<)+}DaVPOH;jmEN zhYr5Y&?kau>6DuH+{!&jg|8*yAa)>)>Gl2W$Ob8Vw=!~@T}rl|6#M~x#AC*@=C%Dc zTgzy1Zl(MMMqlwZ-~Jk+2a&z@mo$5|TaOt3!~n`ChoD^5 z7mV<{m+@C|JF6H2UAW5Jo7KVJ9zsCCUk00h!wImg1`}R9p896rQfAx&7-(oH3|(3c z+W&Q1+*weqCO>#Dgk&C69K#QOm-LDq3x-WxI@r$!IH~;PJ>_YmY^uAmgJd}YIl+h~ z_|dO`0fnMDIq@KAMSs^WnxvIx%%X-*ZJac)j6+a$@fymb3-U>oklS1cnu5#6TeD9P zj%^TtM`}Nk1H63w6JG$b0feK@Nv>Rv^%iar(iTfO(+Yh}r87MTzWoCeHUO5x76qT0 zzwb>6EH;lgxchaZKUII_3!Mty1OX9j26O~MIB_tl{g*Jp%-9#$z_C+c?pq_&mkeuK zop>KusULE@6Phgq>{#sv=~XYiVp2=4mOf^h;VVw*@s|jd`_hb`FG?5%Co$G0_3@46 z{4_kv9($bz4C8Ul#*V&XD8x5YsW52zI;E@##-RSk2mZZUy^UMdku4Rsah?QR0nEb`q@lHSNUc#91tRjq5cPri$0 zpC>V_2)zkP|Mknrf@Ubl4b|>(rpY;h<8%EMxs>aAKCkDVUADiNlxpxlS?2K{*n>v? zjB$U+&3xz|IHqlo&^aecZWv$2T6^^0Fj`B@7t{FlNLdJT-gd12Q0r?Nlswupn@wYNc&I!bU*E$`I?p~O8Gfsmix=`!pZ${hqZuq$2bVK| z1>7F}8oAQfx7p3;^Ym&x0ai*nNe&rWRFxg~DoOsv@L2CBE)G2Rbi2oy%KV5m5U;># z-(|FRTW<+@yp!b1PayvyU~4bW1<@#kew`mt!L*b=Epw|`l@TTFhUx8qBo9DraQp)C zQ7v2|=c04j@!=R8&bFr~D!7cEG4YS{`M0Y1_l^fMHm+7O4=O*PZ*zdOa|PYm87@hN zVhM6jyHoz)9jX9Y<8pG z5cX{WPQ>u{z9(VjO}3U(k|B=i0PH-g5T42j{CERiajf1fsS>j2z2EO+0foEH}c}JqM^A~ zd~{W{tTnt^qliy1Tt+H2CbHEm?p$3kJWxbU8E_-d@C$7vVAji#tdrGjrvgF4F z_!G+#JfMy-p&nK}F@SvgA97BDFh1qQ79N=yJOM6wzXKiVHaE6< z;kMaY915q(LM01FloTA)CHd+7N*Z0Q-OKsO-_ktZ=iY{Sg=Bip6q5ChD{w|M%!v)1AD<-<2Jcu^(5K)JM%n=G;P?u?2DF=mW^(k(nO^#^J;ZSIE4u2j` zcvh;JgWRtt+AGQi=$Uibl(Y?7IVpHpGIMOy)nV6n`sb{L;SBqg9_;^Zz74;^(nm|c zSH@2b(QxM|_hc!H(win)-lhk04#J$Zl5c^7ez1vL zVcaRH$Lx#>-}7#Z`-^D(&{Qjndxf{;KaUmwd0K%Ut|G%7UbVLGyI~Kw7Kn@!JTj0K zJ;nnLh+PDnx%!O#1+SF2{;}=6AhP|^Ou-pL&skLFKrf7W5;pMCJxrzc|A zt1;JXnjV(dtZEeK)oxyzOr>KoUqYO*A=BZDBBBC8%l;ZVi1DeVWx;4Mwc2 z-_0_`HtFpBEnSdN1$4r6#?jh9pvUK^bPH;6W>PpEaX;La`vp|W0xDf23Z}rCj(`a( zw0;SeY5jztt@Z4P)^e@g*RpVy)$mQD;&-K0)8Jl}yj~&9lA5}Q# zrSMc{UuQ{`V~5FGH>h-ajBK56{RP;bq!nXReHUI65y?*^0I}16)d$VyBN)z zt34r)DI8z>w-^7`e=~$U>WM=0wzpU83WL{KnRf0&U=eCYwNol!n?#tl?iU9VCQb84YRKHJr|V4M?}Jn@n!7~YbaiHT69 z*`@}em;6G8kHoNyqEYMq1T(W%e`hXm(+5x*^{D!x`1k5ChGA<8s$ zJiIt<+laIS1#;&H-=S}s!GknvtjL9jLKh(WAcrp2M?k~Ll>_jA)->2VwTz<;`hr3b z%e7ZaCGkZUo(ip*hfTS7W(lR;oN1uwXg87yZChB0Pn1dXq&v?>ffoLx<<`mkKfpb2 z*W+1d%3%So*8%D)0?b=nbXo8i!$d1}8#Z;@2D5X^CdMWR9>623J{_%^6nnBRj=>+;yNMXxWkqzJ{x<)gs>|)P0)quOHYFFdq4lJ_oa}- zhef2Z1((i03l@RU4fB#0z2Nmn;ml2H%CoL(QaTb^>u0ERo| zZQOo*_9j)XtUqx?ENNSD8u1h;?AR!ye^zf}~u*bCYL}jqQ1y$zRs_klRUtQ-} z%-te=*VSnC=6Yasl-~3@2M6HT@bS*&oz)4Kxa;~_!>%rMuVZx`O3*-Imi~|YTTZ~} zEC7;7e*Ipb1)mcX8D^txl>Sh!4+no<69_AtEm!NSIbGehsxE|4M}ISfan!Yo-1Oj` zWtEf^-$Ob2Xpg#eDo&>tghNdo4UB@Ws_c4oG^99wDp1w1!|C@fe|)=z7Zb_$?k!z^ zQK1E`?Gsq6y0qeSo_2fMBX^kQ-C#&b{2;hJcpIbj06m^JLkxbjdY`nLEV-53_5wD7 zc@lmpqxEx`x%64rqrjR>8$23d--i;~8m&MCo((7i?nAVwb+`@vu%e4eah+baiu_lt zDDo1w;|Fd7Mb(X%4+Odu_p-sw$wa2L#39*|m;!wj(XMtAP2J(ac#xAM65a(fprmo5 zgaj8>{m;7qvRkx93^wEQ%W>Eb|K{=~jw>6E4WHFdk$2xcm+ZG+^m6zu$evNtmwjHU~&qzDg#^(uVEhO1jKh%JxOS`G=n-DZTq@)Jz@T2@ea5 zeyeNt=SG0Y+eUmY{xnp!R%nAWC~}_K6a;;Jk`k{5cZPdkFx_!?o?-=>V>V+REgEqL zg@%}q&iVFb-y2gA|0S95a zHLIUG#e<>@W_N(S*h47idz&Rq$9-FM@cDV5=x+VT3f(2|tO8X~wN*yuZsw!Q{Y7|k z;}PCzHL$2&{*S_+|HIT-zcu-W{a-}|BqksN3QR>r=};P`B21-3rP~RJbT25|NIl8+>GX`w1x}SZXDpF%4in$;|SawvJ<2l9V8=vIqI{}egMWU9(2 z0p-{29ezW@Z>x$>%=84%3-E3T7G<@Fs9J&1_wUnXJbB$hzsQ4vqCEIbkQ9tHlLW zuMaFk{CK9BeR3^R3E??4B|>cbzCEJcQw>zq)C6Pt ztFFKmolxdGmg8~;E)B=tzSs6|QpI1!!}WKO1L=y9sZNOLnj<$ewuqGKwWNxL>9C^@ zSVdx77eBl;1Ln1Z)B@eP3lDChaCj*0mo!dgB&-$6EhJI!t0O(enbhjm`XMz?_tpKf zu6gTQj=yhF^;a#6DEr3rdCc=rWMTJF6EHvNmf6hL zj?uzK0@a$b4v|0o2eIAXUy{8IT&b9>I(+hb$ZTDAQ%+<~Z(VMLw7#C|LA0h?} zKRB)S)?|?z)`xq&xo7S|VmNzSd=-;v@mskCtuO&=#}q|cTB8e>l=dCuFmIZY_ah}? z=6;0oZPO2HtD0lR*EADzquo9}zD8|t+xyPQr5DF111(fHc`W|tc$GsJI(<`_jFn_w zukaA|HrTpgz51`K^%4E?Yoptwz0q##3*xzEw_Klj*Dv9E(v|l4=ZT~l<5Mu4+)|>x zy#42-@I-yXPJTVLr4Tbt`%!N#t5v_9 zA-$!K0&!|VA1?`G4X;UJ<)ty9zp_4WKhFRLGkqefoT?d+fjIj~+tl<$GF4W@fS^); zqsYrB*Z$j}wWcClSpOI5iGaAC_B2x~1r*D?(xojq&1_1$TbB^#N=j%=*!Y`05BHu^ zH(}x9HtEH}Q^J7#Vy43I9`B(S* zp!yft`kvbl>e^AC9*MZh^*B3{rOn3Bj8C@x3^3sO>*_JYV_Z&lC4tpr0^UeGUgWOf z2>Z4TJOx&9#BG;1FKY68V#>rSkA^b=BygEkiEPC=d`ZMl^b9)t;K%llI{9s~?VetY zbd?jI-P;=~5RIC>;;`12Cnq6b+9) z1^)bRMgABi*~Y-iw)N?vDxc=?_aijUr!DG&OY=SSIAF0RgJ}Wo1~0k??Pv#`WYT}1H!3z%SEAxc`>iD;{t%0yz4#=B&Yw*x_m|n~b9d~JhZxs? zne-vN#9O-U3I9B{#e5Voy>U1rVrG7#6?jrPw z!GIB92Pdda()Tu?V!v-%Q1uOrFZ3QQa9xwTW5MWQbTtXD$2>q#Zn&~wbl;lk>(3Y8 zo!uPhVN5ThK6{Wi)pkR6Xjf9(}{wE*pPfC>f zH`6!Ee>TWjzy)>~8s5xXKb^=COFEWS{z5%W{o>Ch;SZn3P(i!Oe9=vU}t_+Ezof@~Q%06~y zwTAOpp3#+E3LX~^Ee_8{}S7P$rfnte>Fi+1>@by)8u@yr0|yISsT zxYrSyz4ML!A9DLQ0e}8hGlh(HB0$*zKlYe3oTv7*AY&wWF0;z%y6ls3>ERw%sRCxow5uvIv}=r7e@ z9?MaD-rziTh2B{}<0ncZ)h56(0;Cyv4(0&cA6Kc*R1M2rK@(1XI_@`uWbMStrVpJ! zr2c%iHh#Y&Mu+`|Dglj`Pyr2QI*PV5aV|6}LD$LQ(PGqlGpVJ1Ickw)`Z%TA=d8#-y1S0%$P(qx}8XZaaP-G-*AxKq5beOZu}@NQmvm7y$Arq1)- zgg*KJTTv6+>UVmZ>CoS#_r;fIgiSenE9?Kj6sG(Z!L)^z7jG_qJa54&`Gkx9o<(o; zW{4oBP|59?+T!oEi^_#`KfY@`S#Nzbefp>_>t=?!;yDjMF@i6$NDyrAYw_U@;`H#~ zvBQ}y<%3VJ7y&c-b6U8hzT3|ibG{k4{p!wU=vz+{G~bH5f#3<;5&J~r2%D^o{n+Gu z#BE3Gvb}{Z3Y_kD-97BWZAUOyJQd%5@rIY)?f~8T{iiD!rp15z=UuJLP%ev=&lYv9 zETHF4J%CAM;ekKSnf`9vyI?pUPslqt8}02JA$Ke(-92E>ie$0C7H+0bd++ zpVw28xAFp&mH=x@D$>6c!|t%|e)DqxL$-!W#G}7q4_W>k$PsJ1oI=DjX6%Qzze(js z(#>mq+s+nVbD1o8G@C6Ot|?JZo3j^x%+jnAH!nFlc#zDqd-b}DwTz^~4P4&{;)mM$ zAsWKeR`M3x1rCaBnanY=;0!zH6%7kDXW?Jzp3KnW)xtF2_`}+wRg6ZZT*Yq=%^h{v zP2?N8$WQY}Nk2c8$8e&d2(Q=Z!IJeaglJm?SH^W#Wnaj*Zxu*CTV`AKU>Ke5cF_zi z>>bAw&&{1%RFmtP&1qnjC>?wyMCR=^IcMG<1?5SJ+kbMA9rWj**Whp37h5LYtUEzR z0D518Y$&3GxmrP1EsP|ro52j-9SHb@62z;azPrE+{^Ot{wY< z0aIElN}`|pXu~nZ4}!GwRt8d$t$OfnCm)mf zFez-8%8fq&m4ar0*B^{)0UDG1oe~qM4s!t7+_F$+qp4!b$s@xq#2x2cUddaESoGud zYd^?=Z!Nbnp&9Atl#i193g{g}LEbuuqh16n?iMv%nzT;ryQHh18UFj&C2tq- z|C@+BfwLwVV-D`wp3Fstdf;9LnRXPR6+O-*RX6;0q|nMSqMg4|Z0Vl|IahS0GY+bh zhM0O^0I77eeT`N_NR7F6-b(*;-Q^R)VK8s6-bLP45+1EmAL^1)i_SJI=GakV2pDh_ zQqIeG42LNS&wc|0xj+mg*n-dUjeQh#Yr905$Xl;Qy+ySkOrRppV$7@tex!y9%__w! z%d5frHV&4e6d>mZ*c}?yuPw3kZOqzt6?Fn%)L7fg$gUqhQ2EWh8GGBhHKCX#SMhHy z9T;6G-qz^awJck5*JH@xBJa@rsqe2cHL2wfUUic%ij$+xmY2>_lVvEA$zLEK)tRoP5`e{kd8wd}$LJGM#1VTc zXP*1am$(Vtfn}p1$jG`Qs}lwt_Hz2gG)vnlo5hN3m4}Kqc=C1iv39NDcC9~r=aX>) zw1HFmOMoj2JU6oHx4t>F6cWZ-&eIE0k-yyl?1Qi^X3(Rym}+WrKJe*yKe-2`Gg8_1 zs-!r{@u!&wPcA{#8ZNX94a7@nmS=wYYw;q(3h*j|ftXx0VU))( zlACLt10+?SbiWW1!Ggh~Eya1yknAm29+5Cpc3oC$$nPg5#pXsnjq8HPNT)W}_{w^A zYS9F(o*Fp{mf)wGpt~1%;FrtX%VVQfV6`6TT?FaEq|bFcGjC$7pmRYLQ8;O@k4o37 zU1IkSHB0p&=}guwU!8Or)HJ1?#(yISA#?DtL^>%+MiPt8G>4A-g?w~ug}e9wHJO;3 z4WxO{aPJ6`=Yo4L-{nH@6O|oU(fKyKhXHWd`gudw7$}ZXL37&d3<{KJ!l|RAhYb^0 zN~FKY1eNfky$_#eZ0{F>l{lt#I3TD|>hT7Xa>M!^>N6k`9Z{#(oZ7Qf{2Ca1I%QD^ zX%RDhydPNfB4h~wG=PbUscXKVd1115t%lKotFdxG*587d z>B{YMCV{OS16A#k`Sd2tj#ob;&@x>`j!_%2mFrJ#yipvKF|$(*_f^feYTy#9R(Zm) z@><@Vs-t$F2XiV<9gup6M$0QJ#7tD;r2E#`K=b*I4L(5R@_lPfYLroM9N*W+qM#Mu z1ROor*U$7LxSx*8=z23D=2zE#!yNykI{uGYG*f-(dY+x0?bF5$Xh>C??#1DAZ0EQ` zBTg^Ovt|$#J7p9Z6tyFin%Bw=8I68*Wv3YYv~6KPr{}VMd5(5H=x@7sJydr|{l~JJ zU$ zlA~DanKYr!4$_iU8+kU5hl2>nZ~a5I-(kYs-E6X8{dz`{)4%?pU!s~5ylp;E28$=`}NEW=;%2tuFHQ#2kgW42%>r2vOUkR~8qG3UPbc--QCK z{qz-+j4f+;G4W75D=*fTvOhxzcg1xJP4Z`_I(`Us!>0eQOzjr^HdI1B2pr^?&@bwb zpMn-r2Nk9ZrtVnJrztF*aKtgfl?xGxhkAX=3J2}4BsWez&w+S-gC~7ZjcsrHUL5jR z(1=U^i)-Nahi-g*?PNvI4(Ya6ISswbZ;390R(^d&)NAZ&NSbaATL`bbHdyr_`I2Ll zzh@{5uD@kC8VdHfWy^+;4lV#3i%$=&&Hzt&mpG>_Ir_Gyud_O9c<;}Pkr#jmtd_9N zM+3j!xKoQiBe^UB8A;zhce2O#(oQCD+51MBXVW$w3bo+%_64%hN=Bf5(+cCx|@K-gzO% zE?BG7tZ}V1#$X`{goHhW=knE``38}xbbE1n00lFAHn5Ni{G7<}dcijFH{iYv5eXeb z_Ai};G&tJj9;s1Ua64v2?kCv#(pzdGqMxZQq7JoTl^9qE+U^X}Sj@ST`T2lsZia!0 z+XYcZ#d!-{=jZF7Kn{!V=I!T`=uieg-Ppl;f|NYrf_XvJ8Q#4)(v_L#A@}K78*c2>?_0Qz zHbwK0QsSQ*T%h{QD@+;){>;WRczAw@7aaWl1`)^|ceAf%^^ug0!UbXrZr}z-o0xN!MmnooT9U+HK22AMa& z$LOvlF4SANTO#B1E08Mog*?7Sl?FF!r0%M*mk(7}yc<&73AI5=)GxPU&#PuAtrDQ( z`2T)=8uw)>443OWX}E;v+y)*@Sj|M9<$BdWbtqAVazDrgjNzB)c}uD*QF_^f{OJ12 zyKLZ;rIr`DegU&%NvW#46_8{bz$l;v8sizsJ^{G&cP`}@+hw65Ifmpnj?N_==h9l; z$T*i^qsLUTHQa}bs1&^K3(yh57bwn$*!h5c8()1XUcC`k27AU-j^Zh(kX{NX6sen@3j+B{)pIb0ik_FFg1B3Sf z_{_%zKw!o^5bvi>g%HS4gf)En_G}2JFwIYfy)975Q6O4k)`%rDmDpLi3}tLG(^Kq_ znea#Fs_hIqyWlcS)SjyJhwEj#VA3EfIO!*M<^$D=m4Z=C@!B(Bi_y;E2@kA=``0CI z4y>Qp0M)0~AJwt5hk0Q!?K09DcfuVtV8WkYSaoS`irKz{yI)|R zKCExe$h~+fwFaGa;KG&JBK&#r%1Ldx7QL0g@xw>=lTb#$-HBFZz_Jx0CCJ4ajT%G! zg6A{*y-Z#!G<-SgG7cZ->_Q>ikgtKCg<6KA*DI4(iq(HS{{3o8WQ>N+6$n^&SXcg3 zd`Xfqf59?tRwf&v^yu71Yc9wl8cPc< zds|l+(%~+J-2K>mlkPU%<8z>uK|bhh_DM!9-h^2No|~~emo~@lG5+HHxjI-8j#nGJ ztsUIhYQrA0-S92x;gC(Q%^H{3b4}@U@;yH=Y?kYCzLoO0TSzcCL4Qfu<-Xd(!Toer zbgh}YG^W|?$NX^UpLA_RrQ~I7VSgTFYx}^uN6EKz{U+P4)&Ln7Uk7awoi18QWG_#v z)hWM=v*L#YoJZQkN3E$F;r|F0Cq_yf6XvfIG@e{W@N=65SXUv8 z_hJOC^Bx+-`4(g?oTTd9{{6W)y|}!5@Ui|xl!p|9Klz~XO|amkV>y0lfjiHHcg-ba zO54RM^3GU$P*07Im7bh=-QK65g`yDU$?U6f(>$*7*cc*41LEA>MA{43u&YsUo~NBC zjB9sqZBcSkiz;ngpV9ag0t+}W1j8I@*0dX^=8MSlM7 zq=Jxd=bcfqezCpJT|)hXSzzt8VeOEPE`X&g?tW^iyO)RqX0#{1lSlO?ib$|C8)~ax ze$WPIE??m0*RL#73zVISsXe_uO+|BGsA}SZP^tIUkeSpkO$xTWLG06xrJo}#edajV z^HM&ma92;+LO19)1;SK=5TGC(Rkpb4K*aQfCH$;R+4UdPTExLI_v#@LuoE?$-QLLf z^5)UTU=i$uKmxz%{&#adB_qzbmQQl!-TH**H6wOWFG_L=x@k_2p2mnVOYlSa{q81J zs_;F#8ouIBU?hO9XSTl%;kz<`FtMiJ5s;N$j^O}q*OCHMwm#o_8GP|o%Mr9T; ze(@4X{phdhOH$ei{hpCesN_nFxtys+rDk$t_L-iQHO$XFI?y~!OPtvI+xjvdE2av} zHzFcA7<8_@UBR_TG?Jf>&Pf~+q(%3L#XOa+qggu>W>KL;4}}+?-;bgwBtYuF>XG?>;W)x? zgiB2*U9ZvK_)qr@S{MGWG{>MVTbGmHbormWS_6Bob-3xSPCQOl@lTVx+Q}4#7rLVJnbAenq|qD+ThOQ-n-Sr>hffV=X*( zwOxLocW{ktAQncxF>!K%JM z*dS|finOj5(Q+Z?+N}r}ViOkka(LQjfgjHnM|7B0sB{#J$6(#AIJEjKjPP?`%m_PJ znyViUxIj77Gg-EL2iIx?W%%=Xg&*s7@dvP{1)SXI|I2%HPC5$gtu;yZDRe9zLs|H6 zWUN_U4WLLE0&B~Zh8^;B)R?7x$O~g;mq;PEg&ZE?P%#?FIP3X$CJ!9+qs6bYz8IKZx2r zP*xJ$JH&z7h5T4!lFT{k z%JDqf*thQ@71sGi<3(Kc-!NrYLUQ{12QLEbN!%ZV=Z zIj&7Z(iNSejO)yZHCJtiEV$zKgRbN?KZ~h@GW!$%4As!v7_jrklml~bVhoIOPWWB( zImPQ-t!mCu?Ad^V2KXXWlBu9UqVecc_Y<-g1N9dV zk4H(#h;6^OMnaHY`Xu-SN`=V|_2pQC=Gdgkg{x5o#%$}is0Oz1-+1WSNv3Mct}dvu ze5DAfBE2O$BDGxTkXhO-KvSHdu8mTE$eGF%43^NT_E<>K1Z1#T-d7Vw)k&AfPh?w9 zL2efP#=kv;96Z-=Ww5?>X6!sFILdnVP0;6~baC9I?8C8BX=PmzyLVDWA79M^Nw}f! zy;WP}z%)yOIQ`pd+3xZ{rdUJO1Bo1;x-`dCX&cVTijYx*J4ioGDl5nej|@`1eH6`QtO z6-GC(;fiNXQdM2VrXX`othefm+w^AcGOcJetJLq=k#*afsm89dwl){iy?2!&Q847R zs3Thv>Sog@e5F6x$X9;%qB>MeUj4M*8dZ{C)HHgjn)cxL>Ggg9b!Pk`f1S(t%~*9t z=c8d8ZD3+eikj||;gr+*aTHh;ekbhdG^_9+|Fy^i%m7Gxe2SrWXo>DD6ZF#Xm|Dj( z^yFcOl|ar~*W*bm%5fVko4=WPLUHe*9L?|;{18Ik&wHpr2DWa|;1a+d|?VY{uUZ8FJx`0U%A#nYm@aRsUPb6*pudmtc< zenssU7HJBwEGc~1nyN{cwPc-9aB54aaV4$u%Dbj~2X(-X?|b*Imp}vHZvL%i$kmBc z+RJk#B8jEpCstO;*kS^eb3S-`tfWs`)4`jS{+Nep>E4iyEALJi&-=8c%8`M|L$**l zi7=VBVELRcS%RwUDUrWZ;5tCMqD$`YLn9q(=*83h7@kg8m-ZK{pE&{(kW+zL)^#a! zsmq!C#=ca;H;iuw{-&R7IT+o#QvM-j>hOSlg0wq9=XG*!1q~9uqviXEZTUl0dy8_A z?+_sY5)rW1q${P8e!f${+lK zmA3C;xM%mQ*5K3*yON#bE$%_SXbj?!*4+=p+=d|C7Umm$|ETOb#o7hb*OtI9JJz%u z?VXj7a=o(f& zv1*5+%`B3M1YGuA!4oxV2hKyckFG>$okLgEshlqv3O`&=l}MEj*sF!u7BupT)2^XE zDgCqsKUe3eUHL|D-hX%PubhZFq;Ix|k&UuLwNFaIodSn{$(39?rz-lV8Q7~|%3EVr zQdA7!zuw#W_~a}l_E+#^lSO&sy?)hCo;pg$Z{-n)N0>UbCYLDM;i~kY$RIC3 zZBRw(cEV=}`HL;QFK>-M0|i;l8$8o{5p{ZXT40)#5wI7Pc+TPymlY2s45au_=Dn_p zK!O8M(oi5aZsG6A!ePyI6;klmC|Kbo3_jrn7P&t2015n|4Dt^xxLw^`7t=%f83j~u zWI$$^W|Sa(%`Y*ppRXcBvRgnhH5IrgN4axWb{>^%IRZ?TK8rV}HG2(qSTs1S7HxG?7|^+rDlsCs)JgC5os% zsDg&dov=y96(mi|nHqFAX)~7+)N^k~cfXeiR_Yf?AQ}T?X!y-DaB+!0HZ&y!ej7dm$6$kT`P-l{MPyHIPApMRXBG%pZ+$S z7k*1G?IlGf=p`b8DpU!7T^tT)1cpSZrU$wIZ+8V_eynKNI_P#YzzlL-i!*xHvOEV~ zTuKsZv$E~tR(LmhN31BYTQE{UJ?FQ0jLh3aOJ0%Tb2n2z_i8;3R*XMZo&|3F_}X7G zdvXgr@Ts?J+e3;6s@TWH*Z0wr%1lsOJBl{>`ps>aF7|;)>M(}PiS|@CX~^aO-qpLL zEGA4-D!qR7U&Yk!7^`qpzkH7-3HQv+36olxeIz`{@$a%Dc|P>tzK1`n_j$SIg3w#V zjN|8PmRl;ww`?q-aFzX!i z+Y1FBw11hNaU1qjP003z`0Npkf<3SChO9Vk!gzv2>pkt`gzu4D7$(WQGny5mwfLqpRu{&y+eRO4$r_45tf%nh!l zW}&G#qdQ+M7YzfcUfbg=Kzl}OU&!_Qv>q7^xDFgS>X6p) ziz@d#P2{UdB`4T6iOu}O$vRF-Hhfz9_6MNlB`(SgR)9+;0GR=KPE9ml=5M@w7~L8? zJ#IyVr9_#JcRSglaF}QJ@_+)D%qI}!b|7Nv@^M|BtjK?wCdPXFO&Mvs;LBFUt5cbc@* z=#$$t##PpK< z{2&K8`#0!gtvx-{v+&+AAZ)U_W|pX{_xCS+Jbw95BA4tria*miv@~i1>SKVZN23?E zfh83X3nn8-@z(nYbDwSJUXkUCQAeom9I+P*d(fQ^Si7B9y+QF};#DYhbKqXKSkSCH zN8lG%$kubnc|BM6HR)QRsBfDm%^6dLShkDDPXkxVG)3DI?!6MY|4{nhI|Vm|>y*Kw zce);>v!Wmgcn1b-d^6&?Hyb|hcQ$_9)ENX^&O%*G^p#@7NiS_)xD(ld}DgEKcQ^z-0p*46#8rq&{7`bxsG ztI9BFo^8)r<`#E?P{u#OU0N&*caNge{_?OZ6_%%;FUFIdwfLHoJjLt}_r1N^g$j0c zABr~`1u7@Z&Nj?(f@fSW(ES6|sZ(YDYtuj-5mPJwR90LVGr3HAD#z~7d}7I@Kxr2E z!vgRsgz*GBg+Zp$G<}rfUG>j47?&DrN!x*yFlPSFF!mL8uP_@=N;z`%Wi{>c`1aj= z!}ktj_13WyH;Ffik+8NS9+{p_A%7p?9s+D>*Q2GC&3Zp>1> zak-GOe&@efEDx4VVB1BswO0QbxGN>#IDkn3{YbU zT>9A07mdT(sRj0R(s~cI#{<}0NJcc}iwDUij72s|O!d|7fmH>xFHdFV$fKtWzTWp8 zb{uB2%71L88ob3LJ&BPYW%?$+H$B}Y=zFt*}Z>ZVUmbaTl{Ursp)B)qtv z?lb=(s9MSD*{skCGx6X2-Tb&XUa3BOULzOf9-%{Q3rGkSItxOm1)Sy2f|&ayCR)kF z%8_fyxco8X-yTy6gpRT~)WypM11gpyM$K(UMe&_K45DfE*E-9s#lk2pcLYoEPMW-JDR1DXST;Sj}NW-rt zC1(UrC9U;J9ihPWciQ`#utp&q=G`We)jCq(^C(H(~T zRX6xppQk?;GCLc_2^xG-EkoN7GWZs7)W1mRsQcw><6i&enw9_dNa!;yfrSsY zKR?A$Z0&dA_IG&TXw1crhftN@{Yl+n*mrHlDdzRFPwk?T^ag@1F&94s#VTkfpW_b7 zk>uAhH1O3=%+n5=t>mR@kU(bQ$y zvuW2)WDnDUmEOieU*8y-jp<3qNfu3W{Bkj~L9(tc_EglQREp7Kqa^N0auJ8rOFLV1 z$vI#^$$b;XY7l}PwYRK7_%HKZCQ1R;Z3@}mBHa;J1ZX-8R>i#B6b|I0 zy?E|*to(#Yl#Y_wm1BgoQ>8wAf}3TZ>ojA4{Le!TWqKc%ngiRv3?ydN%O;KuY_@yU zIlSvH>A!!0zpB9AT>WJ8jpJ?=qo_BRXEM0FcAycMg|p=%QOu2V8Ju=VcdMu}!vZ)$ zh5B&vZT9EZ)#@yA2ksl=b_AwvEgQkwbz{CWMFD>Y|8#eGR$Xr1?{s3p%3PiTmJON> zo-tnn!8ecxmJYiB6O9jhN3t3?IY$?k))ESnwrzeuhT{k57R$2~Nj^TCjUQjLO{%jo z-Myu+ce^uhXoCy(rfr_7ot6ECz@+9*7DFCG)ouI-^P9q1jI!Z^!%FoP3_Ic^71Uv0 zErFUGu|p~}eCmsV!T$OdPiou;c)6b8V5T64Z{@Yn_d#~5eYx*44 z?MKbqvVzTyXwIwOS?Bn$TqFneU3yNNq*#t9Z(3v6x0?9g;qH3>bSKG1QSKn-mx(h~ zJtgFeo!_wwnF_3_{5Tm4pzgW^=Q_Ox|Msjdfd6yf>H4=K>U2Q7#iQMnLs~zgf=@q2 z*+1AIWhp`^&6www3ojQx9U$D#{y89__W4rsMj)v;Jt8CM&4WEgSU?5(@ zP3;xYZ`*YKZrdP79n2<=W&@h=yRcBKiy-=dm@B23`2^K=U%lm4d}IoS?_L+`%_GHM zUdoeeRH^zpfJ5~L`RD}@r+x-$r0M1Jo$>u({B1v6w=~P!#VM%o)9dtuX@)=*Y$?9cyst&{t7TTBZ+va1ysgH-EcdDdNg)tqvjzhXQ|IrTey)Bqyj!*% zv>a&65?1+KPvk>omiH8nOXNH_kFzqZ_7CR=81)|9aZc1cP-9 zAnkIl=8jPP)x{#G5j`(fIfJ_4SyZuX`0`FUfxq-IkqtraJrPdx@oe9o=hm=13Nei* zLK|3Q&2&Xnb@y%mnARt#X&z^Q4-65zRg>;9dnpL})B|7C@=s#*$ed3M&NCnx__Ku! z4A&$NwtZSh>byBBuHZZn@VvV3xEV4LR1>ExPi*VjXz2g5gtk<51WsI+VSf?D`a!b~ zMc%^&D7Vlm-ZWVol@Pt%m%vN5+>k`gl5faJ!9l%qJ-2;J6sBrlAd={6aRp zQuvd=QtLK5YO=6? zKyf;=HFDbKplg}s1cT#wDIo_y$ngVtb8&paae69B!aW3efPO=u28I|pEfogP!SkB4 z$f5ckGUTPravQNE4hLThMbmlb%mO@M^A^8#DBr2S_S2%A`P8aCczj&bi5y?h5cYw) z^fJPkT1|!bQrr(ES}*Zq310scgF%ycDlb=fkP>i zg>;&LL@{^=yo{VkHB~6WVgBl9JDebo>$fbIbeCN2`@bhr$ulUw!>VysZ|?VUENWuS z&1R{oL5b)4XQZRX70+=@-0z#td&U*|+FP{ZO@=a;ncD?e(pHRCarjt+LhzB;aOKfD z^vkJC4sY8PYE39=mlNxAx#kX)!V5wBr}jkcvRYi0<%VUh%hQ=loD(oFqG~tY0-|drJ%X~lmz?LCpW?vn$NqQ_?=<)di`U8 z`yGqqnXE_BNbThFmmDHr+g&4uyzZQMryRl(jID&@9;krc9|-LB%SntUQZS7@S8LsL zp8GGW`P85rhUU&;VcV#Wj~Z$YB0RI?=85ua&yABrjd@vE+#gD;2_YNfXrh-VqCeaP1xde83^#2gSG9eCfpTcjvl|F9u>I9~n5 zP(t_@n^TAuhpABd(E$VcqiQz3-v73>$7fnXVJ5eZ9^#8S+HJ!9F80#(?~&n5BwYCR z+eD8fg4COlZ~9Z17c@PBEGT@pFgtAW1GL3lH^J-f`>UV4U!l>M4EO*97$3H?&H#bWY`K^lsDAqqbgFjWhYcMt)r#b}+f?eKSI0Eng-V{GX z?T{>8D93f+jlS7_*%_^iJxDLaSZztR9LMtK;{}WAJKmGTlk=rU(=T$hEO2kv5;$I|EWP32y97D3BubgQTblmKZx5$SdxgbIF}zl21oCo~XtZ;pITz3N5Z z^YEDVt;L%O?u9?^$Rr=RMuYT(j*xXqTmJ;^hmwEoT}TF{jB{&%qWG>+qYl6ODDp4~D2S3-7bc6%@C9gdrfmnmt=DhvG&9LWD%1fxMes zVxjS_R-?+}+L18`d1%+$q#qv-a=0+aR&<;Dii}dGmCHb@4Un3c@A32=k4f}^ca`G- z8A+6c#lpKGMT6{!nO2k=b%B@!-=jXN@tiG{9eu;yQ;6{SYW>k1H1D~(T_*(2D@54j zQ6{@o=hFjm$xq<+g!Fyt)5*hFUmu_89i6#}CgQ1czF0Lo@Ouu9h8X&KJzNzFHaXp{ zR;BGSCDwHOQ^rz_+59Ydw1o@`M068k^DHHTtbHPwr|S3qa#o&*un>*dC<`n6KFOIF z&4aBbl1exF^vFHcxh~p(LJ6o|yPDc{sDL4>4xnPA3~nsKmviIvoA8@WnVcTECX7c{A*T`~>gi-m$!wh5 z0$^5HpknN25mfj9rfFVPrvbbY10YJfQFH62&t0Ae^p8z=(;hlXJ?$QDTK|w-V+zx* zy0yLBw?^t7>JIbiiVK?9#LGN5#u?g#s%( zToq*jnDl+NlXC3e{A0IXN`J^g0hodNr90njVIu&}Q<-~oaWNa>pEl4-vBT(|v!!mL zFGq#!2a*D|(Cs`_rlH>m)qwj=d!y-{U<1T4^2rMYC6a*!dJ2v#s|kiMgb97G7p^Db7H zcy7>1m{sdyezy%vU{hKp>qJhkC*=a1yMWzvA3*VpD~hx*Y1}__3+uSQ0RQE5f&K01 zc8ouAAB>^A)|82hb&=8u~XN48Ib^Mm3;_knfR?PlRSrfWt0&mal3{cHS2m ztnO6t{k?=OY=c>C`~7~tJ_g?mj# zDthG5#e*zcpy6}FRg|UazU#04vRR`GpBunYEM%xJx3XC7iuB$JH(NhFfgIKFXu`AL z`r8})!5h{LXq>w82>5OKDmZ#8_r9byOG2jik58%3y3c^quv#IlUd+!g)}Bu}FANc4 zV0{<{|M0qVm&Nq+*`u>2htG(A*xrUh3`d@a38P^@!qVt~^G}M{3@s^Et`Afw!eQNz zlk*~nW!Gw|!z4lw1@gl`f_oelNaPDQzDfLMr0(W_?}XHB@KX!&8uy4Il@Bm~RI_Di z+aj;OqetU;!|t(t9L&j>EmD7cy7qvF@hV3JCmrcFJ@8KWU(_viWlE0D)2sHYm_h_1 z>he5p|Bd=?w~5~MtXna6;?xX=NE6-~Vh2wTETy*^@g;Je$>#3HK11qU4jo-yb5j^{ z*-V1W*|2F*p4UyY=7o$;4Sr{F3@?jM7*a{Q1nk~dP4V3|zm<6CJCPB)>V!Cg#Qy0+ zpPDMSbZ080co$BXe5JvwXQQNS!2Sh5`SoSj5gGyW;kn_xU%K!nQWreX>jbs3>#`+z z6&%oaFo&r$ac^n8Q2N1rAqYQMYuoh{Twb>yj3NE_6&#uHlkp1A6G*mxH*r0`e)(_y z8`D)}dd@S}A)CZenYTaZZMU83P(yy7f{d@`as~lWsJ$1CsbS7XdL+^%Zqc z|3oDdy@mo*?w1}KJ0-_+`Cqn zP+_NBTi+`?^Y0-!e6c#&;7YpZu-hDOBGBvAv|V1Qy@U=XdOV5N*XLfXp0jl*^j$Ms z)-gq8T+^_vkv1meTT-fEz0;&Q7cRHttG|Q{TxUu1AcoptzfRpTx7iv}O_fAoepQ{h zp#~lWZ(XTRZaAsc)0L>*!O5fIrT;stynjr}o%@krJR~+;^&80ZkX9&8*gabBpSwBF zd5SuSRG(w@*nj5j#oF~=ksf<}u4=}agN!=vckyxwAO*Z-P}US_k&BbL;WO)ILFkm* zB0uFEr@iVXv(*rwFPV5+kaAop*o08m28t$AmOyeFqK&zoRSAQ+fyM7A0;+L@gO}-r z-8`w6eGg6Nry31Sz0|fJO%t(Agt^K9LjBu{q^}6z1X_{x_?zFQ08IVDMB}UcxFy2N zbd~O^96i+so88X|Kp|DcxJDFYMyuX{df~OV>V-l@mJeD08--F)HPeER3FmZxj{hO* zJHz1&x2}nV6e5UTMk0E2iEea45Yc-O(OdL7M6@7?L}zrOCwd*dMsJDE=z`HreZI*# z?{}T+`D1>VA9FwZ-fOMB_TC9CQcm~YuCOgi0P4Ija*55YW!I@Y$ezC5({|qk^xi%c zbxoB0ecjx2C&B6R&ZG>fr*^itoDZz7Ol%V8IyJPdrxhd|MP^O&^Efs><1TE4ry z1~`lST3O4B{ZwUaAk~(pxW)pBLm!)|H*TbL6=ZwTlyDF{?$AGr0_P3HV$2 zPK;PQlmx2cnzTcPYYo%^UK3o;gXY)<*?#;QqjCkiA6v!43eN0hlI{_LH+pV5{!x{> zhY+H)bF<`b3oz&rtMN0W7lrb-EtvRSh|@1rX#A|4lKb;Tq5lvnvsHqj!pt?c3pJF= z;EY`A14=CkQG&N###Sa&yP1MUSaC7hA!UI*2dfWFTdRNc?{}9ghZ)|xI3lOD zI270Riy*%6EU0l_xqo$E)&>Wa)QQxptdY{UW9&HZ6Cjaob*gG^Xgyjufah$^RHL~q z@tLQ~<-leo=WW0iFFB=F4K)w%XWLSj&q3AExOsC!Ki;1C{qBiGV5@pgmGWMFPp?x% z<6;!)+W2Fa3mEpklxoNX6(M3^A};SzFS`;um0DBYRdLkfRJB*70}De%F|9B#D^{*l zlh(sAHl@K1i!Bmk=MSs*>R>wKwofEcJ-9W_l|Xp)k=Ee1W8m;uS{=0WcP0358oUm5 z6gz3~qqd*u>Q6bk_s)RQQAbI_yBsBm+-F~LY7F>=CL%a_b0jQ|ySX ze=K!%S;Ajd`9M2!N>_};`bQgYmBSTDS9r9d=u=qexsSj+fsB=)qFW2MykvUMZ4MGE}11(@+NnIs5xqAe~sCe10Jdk8EU z;G*6cH|wU$0|Ow4S0flCHl(AnQkg*U%;c*)_SRUnFyIm|kfRKt_IRZU$|qt%^-6pE3!_D};8e$%#luwlztu>3vhJcOGlKuad>$c@3)IzYBZ`(CxW zH6FEO_R`naVKE>^+r7pnpnI^NKdx}8?CGx@J{wm$?(d=)?qE}$5ow9NX(UU~P?N%< zk?{ydX3Rq*o(zh(l5X$$rs9R(!4bV5 zd|qr-;Qlfx0y6wp{4+GvDFCtQL|;9Z{R_&7ABFq%3uKo~DGAgG7pQnLj%~S;bdYH(=oG+n@nt%L_Vv>G$>$o1<*3_7#^OOHGmdW zJ^)WLUoOm-n6MuB_IgVkL&n?Rmd^Ix$AjQ{{e^V9RUW|3G2$b17;)iDc|~@H5hYQ4wyv<$FaUEqDYiih<5M+=y;` zVf2uD?=V0!(Q4wI6YQ37m31jQCQbxbuxLa)%|-a@oQvJTbq=d(;(`*dTiv?^K{Et%T)7QRQP$V*WO=OymByAhH-i}83aoVt|FbVoZ9@0GI7ZM%=8u) zgPuQw{ifmLA0NB@WI7nJv$Y;>m{RDC(bp^~{W#!}iOTehE#+FuB0iurG z%-N?d=8*O{SK+&{0@ot?*i{20(6Ly{>K9+XeZTd;%6nYA)-m zahb&S2ayY0ZU~YCLE^s^r^M!`Xj_*@9Y+C-h~Ed`m2egzh8jxXX*Q7IDv7e3JUym% z6yCHdoxS_hoez*r*5RFbTN+>K0q65EiNAcfK5O-fXXtAb7_&|;ByOq*@>`?0#t_sy zQ9$|@R~zk>52<&yV2? z^eR|?$0C4nfBC3U+jp-hRb!PV_6q%-DgmF>*~l*Bj!ZcrB~l27@xxUhb@7u)15JWR zE;Z)?q@o6`>JkyKXS-aL4`#+lV4$Muz*0#o)5n{041Va~%AZ@#zBLcq+Vz6mhoF@S zSAmF*ly9_o7|6lm>f!yMeb1Ll+_3W^?eccFW7?iME}+`4uM02M8NL)_ep!#j=E=_d z(eevCkNP~>(5KpG3JT#^1<)5l^ENDJ(JYWEV?WKtxdo>(m%_^00&u7C_+IgAoFxzm zd5sKm-2GeA<280R@R=&z*ktdD9A%_-*!~dl!v@T<^Zf(3(H9B*jN?w={R9SK)>DlUoVu!~CAneU-EKl&KBRvF(BA;oJ=ezSqQ7n0t31ZRIM?4P8 z%Mt|!O_$qZ2fyqqKVl0TWJA7<85aXGv$%vWyGv__UUS0N&G!?QFCY&>$||aA$66-s zmXJB!+7S~5wcXj3F_vZIq)q;tSbkSqEXMkQN>sv@s9(~mP>o$_fS zaWq|W=KV*Jb9$2x7x&w?Kapwy#4xC{$G-V6s6_r?vKuBM#_Qs0%gH!>{@;JBSOWy(J9Un_f zcS-AocgQInFeHI$-d-rz2ji-wOr<7zTOClVigq(0{Ef2sCZ>I-;a7`@1iz6v*!Oc_ z^4VQrC;_(WQh%}Cb%i+_JHA{v$m6}hg_o*v;#3Wu9JpM72eu$tKrV#?AMfK;16;`h z@c9NUSP{#MYvVm=JqNcVNoaLV(hYjbF@{)J{E6?n<+@v4X5C@I<jC_%@*4|M|gs#!Z<44@{y5gn#oUt1Pq{fX)i$#AW0Pwa< zFY{))jGIl`4^E%S&&b_$!)QkR-nIq5c}=W~?sxmZcG9d`73RvIPr~pbs+R&BU$h}% zdPVmt+rrD<_Iy=z`O)CFx}gC~(mZmwoRMVu!~OWwJu=DKwu(A)1#6eaCN-kt5m5^F zPvfO7qWJNO%`Cf(K?;T{ku@SpSr5|e<#oHs=eMKkLLh!m2b6E3O=*|VZS?}d$g|)Z z`7#Q2{y8W(NFWv9tjjn~N|<`GDE!&W5;bKg`Uvan5{%JcbWEj+y250x=KN`YZKsSy zM3r0$onqSnqT_v>d^x9T*`Aj8df`!o!1?ekFUf3-h|qPFFRb3wQ`1}NHEqUCYyD%Y zddls27|w;4N<*rn6LO-FL(3~GwCO2J!z-K^Gpk*Jz}9g1Dc*n2n$C*EXAIsk)kS&Y z#4G~NYg#Zcp7szk69Zk>nfy+>)JHBhdYp0$)Iz1?li6E+4K04;E*hFzS&M$|{Z7K^ zlk!q@_rw#5UNW^)53#6oJGxv!=Z!wdZi^Ng0+1#{m|jlVj?C7c`@zV9uK;EToQi=? zI&uv`gS>-R&c0c?pe20KhYS!Bzziv~o(xUV=|b9GP?yu@lznsR(iuh-jS1qXjj`F- zZaG<^c`DyGsi{nmM6raN!jHX8S8dC=AUY$35Snr*e*rG@b3nO)4c04BvDwHj8-Gi~ z;F`+?7oRDP-(j=(i4eS&-bPs-C_>G;aG}7z$iyQBdShK+(WNmvu2LY?_44oYC40s1 zvnUv@1<;|#RvMUrA9>Zyue3VV58wGgE!3aPTh+#MO$9I?2YFukCP17w0Zy=tW^%B$ zUdC3_Q_s8VxRHHOK+i{*H+6}@cP zZ@MKmsL_ls!3u0FEuD!DJzqCS1pi!K*@DjgrsGVQ=IK==mwDVh%G+;~v1%2S|e0Ox)6gr3ZqYe`_Z-|GUOZdUbqbrW!d=oUV2j&~_Q zUu=q(C9plT>{pD*;M|7rU05cXB{`cwZ4-+18%g z2ZFEu=pD7#Q^pbLhnUAEH zBBmK-p?({7=3*CPXIML&|IYdXdOX1Inj*?)+b>?Y;N`MK zch9|Ru8#}L*ATtqeF4xB-%?UkLVE{ltJ)y~hz-C(y{1m`@S|-R_frY;4=i#kt;qdH zdCxn>4le2UI1g4o?LwI8FIV&Qlj^=BEXzEXwW*G3;{PtQgI&alqdOPx2`K#V@m1oygvSWD)uo1!2;_EH zP`TX0O?C|7IXo8A#(ikeTs1E5$IB>Nm5v}Kwh@Th>^}Gd3xbyX$O5xLTZbcHim_^x z1MSwFViYCAJtZ&5d9p0ygrMghDbgUl7~r|7%PjVqb2Sxsojn@-(O@H+HTws8;LsFT zQV!tD8H(h7?pKtDEFR!&k93&hT;=^#GLZd~&Y#e3C}h z5mW2an=6Y`mvVij;NyC6QqyBGD|6*Pt_M1@LHWVC(t6QQM?m#Pc{@!A3wFh|ywa=p zgVOB5mfIXgI)9eVC@7V?K8~qbTIi^W4>vMfIV(p8Url z@W~Dv2pj4{-euXVNG&!Zj?t_P2zqq)9%?ej(OYZ_o~ZcwHVi{Zj?Ddg<)~fTQC&Q{ zrn+mBRKk4yP<#*iIWt!#csXg|)>d_W_8HiV*1{`E_GwU}!UuV zzaVebmt4Inb+59u3PVjGb#iWW|7aZwTt(lX{bAncF$j#$>;xu_CCMC1%jSPo?Anm} zb}2UII6F`p`%(7_26T8-d{Bliw;yD?O+|fAAe#asha4owHbKS9fUyNG+!T3xR4d(?Eb?Oj`*t-Gs4g!k(`v z`(kjFbsHc_a+&AmUvWev`Isej40 zR;~hi2UwTSv-_ncQIJ@McT&Rpi3A=~YrS8G=3n+0ci%Nrs^gf^iIfDb&Ha zL~`_Rrvx)S9`V3_ud>KRc7#n|os4K}xP^|`okfr{E$D_Ke-DU~Br4KGNkKN*$%Q#d zaocdjBU!UAm_*3PK@$bhhJ2LDJ>WX3!@59F764SglL-D0RJEeVDiPdtvip z`OeHCiIH-Rsfg04ZZNZOp>(_3(k|!QxL3EIOBPe?xpCsofY!=V7ljau#psZYWKJJi zOTQS7!m&fw3C9IfI4ot1Klr-m{)8hF{Y_B`Z_T_>AQiAb19!tI=n46=7Vo~D^@I1q7!M`NCE*`O!@c@?Fs=nx=We6mo7YDpDofZw_+Dq(PH7u}R zXKuIDy(Vw_@*YDNU5M~s;yce1SKi_|F4fqou428Tm%4>mz2x`36TVAraw{e*(dF>* zhVYhK?5Nm0&0uE#^WQt!kPbDIon4NDKSsbobz?~5dOxF2`KU3U!LCZP@qOSa;JfT& z>Mbs|%in?T8;LWWJOyjmJvi<7&G5}d$z@Zip}6!xvRFF?!wKk>C+|6=W2#GWI`?=( z#QyjtyS9_f&C-{^rZ4mFrHp`x&Mp^SI1R+2PCk5l1R=$V6k!V9+XXo^MvTGQk{g`c zOhCL@s~oPWh5*h8X_<5d#<#1O;9U~6543%e$#SrO$v&ryxiOnUFs8uBiOPl-dz2#6oAd- z-h!UJ#y3UtR%#VP>I0lLLU2ghvg(p$3D+VZP<3rw4-H2C)&wOriVdcMC}xdp9*JjML6K9lmziVv=DU;$SL+nE$nU8PZbznPm9tM+=pR{OAOq^-`)o@w>ruM=q4I{3Rz$@&}<9{K@S;AK0A*zSb8| z)#HPl30s7^+;a%gxt~6-^p`4K1-l{P(BWEgDeVCI)N@i+IArtQi+<#M@@bCUH01}K zX5UTAov<(D(~qipvJuEh!k4DuVaq+(IcSjn`Zm`-xw!eQ>sn;C*uiIs?eOJ0P*mO658S-#L92D4OLs_hg`od<2Q4S1`T%2+Ge zNSDkem0u1xrgg!q9UQ59mSw$WGt!SO%F{{5xdiPE=@|HTI_r1Zt_GbMdOH#kqe#_~y z=H$K$=ZjP?8F9K%ve!LNgcD-*gs%7cF4!VDmG&3T=&lpUTJq%zS%*R{)W&qp!eNc_ z{o(zDij~>Za*)J3uN~T4*W*Ku1tdl7cOOr^V^Q&<5$MptuN~MEaonkmf5cz3VQ|IO zC^4c=dcfNqLqjO~P`d8i-*8x0|)Imj&P&M{XgW?t>Vp~XaPN;`Gp_*o57WSnfDjIrjUd zU2y~0QQcnioFsP;OFstD$G==xC3*nfp%0J0Ji?DW)xy%()4lqhX{Dy8A8*bEcVtwc z^N=xJ7jH?}yQ{xvQ0v|ER0?N-5H(fN*&g$62ovVG;|=8|mXaU)F2z#F6vgX_p7`k` z+)&acxFb{O5NSr*B2*%PbFN+521HmK3XURwg+DExwdeZfZ;y0DdNAp2OOs(@#EQ2t zrdk8c4o~~4ogChnFmNdz*3CTkq-1Y;!u90MM2vmB-|sQdvVMwo*P!QthY@EFTMtjawqb7<%JkfigZw z5k6GQdSM<&8!0P;nWL)OkFCaapqTLh)lYuKV+tXsy3oqXb^)Qtgp-hFx*Q|0=LudC z8frNB>;U-$nFZ2c1LYW!UxYsI^?~DP+?C7vDo3XC0`u7q@?GZ{^nUOr*9Twt<>pJ5 zMaGIa=4Gnwy&B{yl)Z7=M&FQkZrb-Nc3+jjI<8C}j31<$N z4+a`nVE0140cAi0BmyX}!e&ajIng^_IYcfzM&|Jzl2* zs8z%xjkik|Wti2#P8UyOsMGz=MK4h-rgAqaA5FEO9l&k^FEg#go}Wu*FH)T`?FoNo ze~Ft=X9@3`X$Td?a0E}=|5cb9Y6c2z(uH9Ys>C@SOXNtJ zCY6`VgkdcrgHjiCPm;=A44Kkj(XoCHJQMRXnM2$!n`n;6YdHD&gPMh#1oI*`YmZhI z<$zgCl^pV%%xAPMZGUNp#Hxxxa1lx2GmP9x3DWWj_Y%k!7d6kqEo12^*xbGpY*D~& zlT##VCV9v>L>$PnQ122etv3=u3}O%8Lj%3>^&Z!(y?_O6NU{Fgd&h#f-S_(2uYk}f6?I5S{1nME+Py)w| ziva#TBJ{vLz&>p&KmRh`D;|a;-3FCovrW*9rXaVciia(k0m_xzU!x9V%{9{o2}O(? z4w_x)>Ggf5-be;sI+|n^x`f&kmD`mW*E1wfp**CghXZXMoSizuWM+7I&}!BiC@SarsUeX z-x3u`=;(rqia(=0bp1tSlC>(SpuQ}Xt($IF)xy5=KsKEu-2Vpacft`lt2-(F-JsMH z=d_4-D&A%TKTfEs4j2qLe4RBEM@+(4=Sp5!XtahLz;A)4KAE@#$7LwB z?J!F+>^+|O{g~Tvg5!lKB~qFrmo6ZV_@+q`OF)ZGhPxnsH;WoApcggLN?o}6N?-T2 zw25yKMBV5ccwTisX;^utqzn=P=DCYf{lkU1^&f z=v;vFyLSh?2M+l(@p5onS*4o^mi(^r8>b6!Dc>wmiZi?bmjjyUy_9^^>XD)zu;^*z zDqt>+I#Rp<7aSJOeY~e%FPkEb6F3J4s~lP^qYhl=MvYxA1g92Q%PtG)Rc+Q3AR3=L z#NiL4>Lnv-P7Jy}Av#$H>br!$sHDN)c`@AGL6 ze-wCs;v7KdW^A9bGrr-r<133$EjHU@plt9n`(jYltx+)W_MvWB$N9{%pb zBhlYSoprfF4mI^b*PLo597LW|3ZGssZr){LKK)8Y)IUp#S1}sf!x-qNACxDmO#6R) z{nxTu^igdGrFA_&f7nvFFCP^9Ev28Gw7G@SPzAp7sulkt)!LTYKAB9pEId*JrK_0S z?1&g?Lo&=bp^UNre-;26%Z-M?^fA6j88{2`q~9>_mxGe)s2mO8&-Z-iCTD%5(}lx^ z_3|qVE^&RJFsd8MbuR)|nXiYoQC7-a{7P{(i!%TUP?od6LusWedGIVyg=@@+W`N9G zvvGPjVYYtg$Ae8F0r>Bjxtn_`ICI&NATg}#W8Ybp8i*O&WH)DrU8`Q4#jjKlT<-a6g_3SZk&P>4L_2ZIAy{a)>48h6K z`Et#7#{v1mUt}c>QmhRN(-Qg3BZ5&(c?td;Zi$KtlbFyyG4A43rK|I7ecRFdVI^N# ztaonU-s0Qz?oPQ(|LIpau*MDzh5?@K(m0O3*qv|eTV_j+7E)~88W8U zw@_dYnyOC><6+XJ1b+Ko7r@6q-zW0^0t)b0(c&(&H0N}~da_YHIn_XIyRS#i1K_AND%rS_gK ziTf5)i-p-F71PU1Pwe?2;0bkfN{3CyjYglJclWLGMl`;P$TYrJ{u9&51DOi{nh#W>NF@~&^?|#P{Kq<$ zn|C3cf^YLf^w4a}f{DDCqC`EkNO!Cwgh;j=uzGfF81Z;m`2t)9C|inTB*e(}E1}i% z^4j812_Wd1|F`*^}DBKH#oEx3G)qEB{F73G)(YF^`R?%)k7i!F=xJ?(Y*ms-Lz zRTRVqP-KSG8)4syzmrxI@vUS_XZCE4W3@H{HJ&6rmqdrdL+U2Yp%1-fyP-~nS4Olf zM^V3Y#4n@5@Wy=dBg|IN^Q%j{F&U&SBr@oYZw+&IL~2c(*smDv$gc2P#&EB$(w+LJ zKpmt8MPpK&x;GH?bn#7%W{Wo;Sw+P^w)2z0tZ$F-$4z~up&dfKvfNEr{MwpjeR-E_2|NHqQNF5FA9#jy;9rHyjE|OJJA=)~J1Wd73V9bX7&SoA7C;2SHcJ1+S(Goj2jqO`}o;Z7Z^C z=j%SGpD4%kv{UDtC1l8B%|xNn(*x?-?PSbU=`YV+1qb^H`(MJc9)8g$8Ngb2C2zGgwHCl?RnRs9;H)h1k%1kC()`B&20ulaCO z7e>$`fD2Z&Sed1VEJqpQ#pd$oy_GNO!G9`R$jJOAwCiDWO8?@hD1$=Ks@Fa0A?z~C zJht;IMUEa&jyV_ai~=b<~#xw7Jn# zjlDJlPjbz?g^5z+U7+P{;=ZdB5h-TN>=pQMUF7YWS^k)^1;bK=U0bAl4zu~ z;qHA=H8S_~cf)iYr!3Q*<6~4|k3gb|EaA|-w3Wm;*5Uo%{VH#B@q^;E38%C~26w3I ziPv((lo+%(vww{wlE*c#psr8($4X_;H=6Q|P9Com{%TLK&-^4o*_yC0bt`cB>Nr7E zDHhc0WF@0>i`d-%Aut8`hWAIxl+ry3D7~E}c!@B@AK4=9H%CamO6jLTef-5nZl(Az z;@{;~i&}k#bGOXvw|s_+Yxr@jH-Fu_4N9BW2`fdWWwxVoC@Z*Wk-nwVx zjaQhF`)7FP{+~nK3^K3MhEg{r%O1q_aC-U+1lhH(BgR6J&L{n~}F>ctF zMcXw;WodhUt7BI}q==)U(%ZYgQ^NFrstTXLS+Gi3{Sw_xoMGMr?bA|PN(sat&fix) z6QrM<1)tLKON#`Pf4=V3VmR*)C ztnNep#SpYEpSaH%59Q6_AS;{mAC4G(_&5V(?z*-g>azA=)ON|P#~7}CprroW#h zny@gd?9H}a$^A%|4ic5;QxNQ>a#*~aH9Pm}HNEyD3SLL^B}4%{V}1rxlTVYv9ba_< zh01xR>L0Ovu5JMTPRw*Dcqt~CyvQZxW>FOTGRIi0z;$e1%mMA5>=`r6p_iHS*nCi7G7;-TB$|^wyWjkxLK82ro?kN672mI;h>G z3wA>=quE3{;k@evPB+w9GDa_9AC>EJzrEowq9nclhLo#VWI5>h8hy|->pgcg%LF{< zJiKl2U3$MTWwJOOWLjbr(Rc4$n9SpJWiOhRanHeJ@!40l`~u-%4=f8&@jv$6+b?pwV7%SMR}^#_G<5Cj|6{Ql|{i!B+1> zY+KctJ?iN~w*K?!*4uXy-|_4VRtD%}1x#X0Md?nZ8CcretR; z@VEUL>}=b0*#+P7H9tK!;8fA!qX#`9_uLRt)fSoppNj{6j!XN|Idrc+O>w;0bIST{ z_VOZWr1;7G$NXL&-Yi=GZhA&%k!KCwJsqgsId6~Vr8S}uc~TIUtn!h>Kj>Jz$8D;s z#PUIZFe2=uziFiL7=(&$G1P^oH_r#@nBg!Ww{5WFrJ3p_5?427+Fy##Q>cGYb?z<3 z_IiQqPTCEYo{;^JhG=>kxnDTMIun@CfwYcToix*5*5!k##$D%O-o48=445;F5z(@E zjz8&IPQPLJ5`lAii4dejGglKQy|@Xub=qQo62E+bSHsr3bz5q;7hh=@F<9^&-=63r>T&J~iKUDu{2~@cdF`*alq+Ae zBxg)6!>szU!$1CdW9JIaD^PJA^*9i_)yji4L>7#dcK5O$*w2Draq0`tq;!M!p5!(n zXaz@oIIF*=IRa(>0TuuyNf}^_J!XKsg>}v6sp@0hP^5SocB1-~$hX`H7cPwP6TxqNP=l#Yz@EtwpZa+CuH=bo5^XW@FN46~-fu1m5C5&;IhB_JEJQzWqTS5wOfO!l_=WUCY1RZ$7KO!Bz{|Zj-n@a4wYqep}4{|8AJ%G>R2MMGtl33Se z=y{&5dyOvz{5@4j#Qn*2BE1Wx;oR;KvOm=hk(R1@A#eCS*_kwUlcG%;w7O~7W|TgX zWjbNa&k{1WRr8bj_4bxTkU-8|%b|5?`Dw2hc%XG*0p!~`C-!v6Ux(hQ-vCVI=-*Te zdVcdLdmt{s^3tXm?|8emam*#HhrD#D5;h^8d2aadHJvD_)*Zn+vSx(2oqa6PFMB+K zj{nldO|Lo-vNO6T-+w|@r)5iU<}+|D?o2Qpw`j>uk{4RxFrXNy1$RgJM^yN4q$0(l z`*oAYM_a9XeeO?;wMhW@F73zBr0~iF2fvgCm(=i-7^ed`qnAo0X}yU~;N>3^omjzk z-6udJM57>>?Ln`E{<-mC#3S9}sHmddm_AKVNy%2*Q?x}^8D4ud=gl{}ur0>B^Wxu4nEnYkhpqHF9%+umz#Jtf$@BVyGH3NH9}Km5u)ACebQ#2N zI@7-WWD-82Zn@cb-Ft-eJP?hgU3}H*9!6TfW0p%GGzIx`@rK#KU*+~$oEpk`=41+d zgUvoyQBh4X@=8wBd+r8<<=dyYf321JKxd{LV;*r+rzd{vt@>*`*pt%XFT;8$C$XS> z>i!2I(g;%~OAUai~k{Fmt)Yk z>73k$7y_-RReTvdN6NR{^`AEO&T{qV%4DkTGiNu_SsAQkl!$cF}WXzqC65E{CR*bX>99WJQg?+cjhmG#!9BF)J|5TgF zufL>?oMCD=?hq`7TZATbMV=GpgxYv2GN6(41m_Jz1lFe)-~28$YDPqfD&H~Dz(RZ9 zVV>al$f~(xsu8R#7*AeX%VfJ`T@M8o>w91kW??#Mk&wuUCxpKhS8g+gS8qC%JEcA~ zo-q$Rv|T`5&$!|wXo-`B>Qoi2bQBP48m?G~5-s`7Cnonu)7kC(`rIaVCOsH9SH4^K z9ehIH_O7Ggll}y;FEczrSZDzMumm+O^h*TH)$3=w9Q!QpmGDexf1hpP!s-NGj{S!e z#`hu9N_h3JNwN%Q zx0{E8&H{SDrAY0r?)NB5&-(ni$OWmsPbNK4jZE)!C}VT1(N;yaW2Q_|U{+!2nLj>t+BIi`$Qwo`o_Z=&;{jz9}1ZIWB zM^Q=iQju|^52I^r-4BA^uH=SQTrax5k%~Nv8f8U_A;Z5HI=>aROt;+qeI!(@_}D%k zNs@=J#=g|}m!MJ>-f2B1iVYKzcOXc<$=#(wF!5kKa^#n4zlQsbG|aa&5{42#(;;<_4ZR%&=?@1zvcb`>&KD*lvkFN9-ucTb=-oG)N*FdU?TmlO7S3DT?W73CqYW8 z@l;&dz%QGLM<#=6GtL_?V{?DtozvPg7O3h|+FSCoJ=7KdW`oo{;-QFu&5)UVc7&jO z<^{uEmtkG7@%s=Z_B^>JGd+O!O?b#V%jXIrxbL`<;X4y1Snc_A24Es%x4IwlPt*0i zfTep6tOMHEGzVPt!$LL^sk`@$0s*O)JSmG8}zkkLd^)C4{rU? zox0O;o6_wSOs63x*}n_-hUjUeQIyo*ci#X}{+`v@{P)KG_m{H<)^hr=2ac_PxI0flMWLIgWS9;7T4~$-Qi8=81J=}dV8<1CVI&`Hg)N@ zx$ohYWWgo4rFI8e?e5FO8um2&C^FEVRdLtYkRdzH?q|UL^~HqlBu+oiL-SWjFzG}? zOBHH7%}UAUfhe{!9OVCZ&PzRh8+}V<1#VzMOAm-WdV2w`C1?N2gj)VXUXAmemWv0Q z$^IX^n#U-P!e%hKqhQ-r2k9N*j%sA8ln>7KXsNO_{`pd^DI{EK@fD-z;7N-0ig?4* zVmC&73j@!R-PD3yEQBd4+J&`6(xj5X@Y_Y2ug|biA45UZZ3DCJRP#JWZmT@&H#sZ9 z=@J2@i*AAsNCtAlWkSWVX8sW9Pb%7hTJu5Lps&JjyTC|si(yT*6y2$<``JUamNm1} zVZ{r1_VKYwoXn!Pjb76Y0+?a6iFyqnO*6cTP(rO21X407J5_8tD4|YAp>UY;E)-2_2hVy89)eCMfurouk`^}I(YQFJ5 zRQG{%Pf){70_5W-Tlj7B?n9=#=4Wql#3t8@nX$BxKLY5%2FCLslZ;1v(obz{9-are zp*BS#*aYSZ67_K5L43*r$0w=_X zmu&o^q!uf#tZ8#MZ?bFr?EI$&iN(!7wT8NxU+?7@2}#ktOJ}^oTz?T%YdLi6H_~5EOttjB z!Aw&mIi(~ihNEzm>P&W|1`iodl!{r ziko6>Y7gXp-IT~gBWe)DdpA|&e(z1M?)6)y6G%%_3CIuDk-9qw_K~-|6a73A+_E$l zYF9FTO|bVy$tPpe0T9wWBdl3JR(Z3Qv_~wb9YE|>M6>u6>P6LW%#i;(!#|gb*RjuT zXv0jWT*T2vneViRB%njvyx_CN_JsUC^Ii;ZiN+E)7lQ)T<3~5ogai7)aGqeeF-C_r zLurr8;Ik<=$NsIm-QlazQ;+v3eNTC@QQa9I3cvlsjAo>FApz1Vk7B4p@9ZXtAELWK zuMGIt3K5M9(7CEttXwqG@7Q&|<;{_Lt7}tq%^Mv4D~IKqDS<7v27;drlNFU9=KFeD z2FsMQ%W!W0u2m&vcebAY{KcVmS6F^@ACmjQK)Vchw(rIu@cwZw3RK3&gRh@_Qc?Qk z4t3(VfLR~l9Yg!ijes${H07n@(pGbQhz|d?cP1u|dJ!__6d4a~PQcwv{4-X{&N6c- z(Eicp;^1fhoDM|qB#OE@9K65;Rldi4M*emC`;JW-16tJ?`#Ztw570+4G-Z&8Tx(x< z25Mw__lPrZAm6vmrIM;^kyIBZ1q>zP+jXr(w*YC;Xq7cPdRVdmB<0Jex&tbBT?2i0{CgS!GI8s zM-rtFRue`dGB%-K2nth1P8%KM_8vo%@6T^`&HnuJKzetihUKJJv?{E>wk6XQ1vSzM zym(gPV+Zw4x>Xb1bz>~ZpS<#wRW&?>{1DN|+VK8}Q_T8Px3KvmB*$!CFl{PF-jVEWk; zuRK%pa=;i4WdQ2$PBse60>j01D9f*8>xC#fd_jvJ^)m@u)%H&AAB&r1t=|SHr3jJ? zApI@hkucYlC6|_Xv4vJs-*!#3h~u=N16yI^gG)>UX*EXIG+U79FR9AhyI=a^#50-C z#OzGp=E*5X)ot@6KXP-)>^S)9Xx;1l+2L_;GxIyBBt{V zM{2y`$l@&vMb5zaFX?bx0M5<J|;(klJ_iCZnzx2>LLb5G@V(8IUnT&U5I2ia$OvhfR6FR6$X8 z77&`zA(~4QO#d=zSsRvHh@CwVdoErN8J!FGrL})v;m@`oBp))p<; zf1h7=H3gx#>`h+&Y|6zAB9QLCH+7yawSKR7ahXDgAQFgblra8I`cZh|>l0k9KV4v) z@gJxGI#z^D8tCkI(LqsKYv|5CDTXZ%4A6~3Bvd4R?}4DJ^3+Y@wM3Cnv5M{w0wj&x zVyx2B{0`l* zhabkJ4g|l3iToD)$SH`Yo}`A+XDBG?ILXgvuCoi#x=b}?AwHbSHwTVCmO3Ad%WWW6 ztwn}0M3ek6EAeKCEDzs&D)`6EGl>dTyt!;d+zVGxV|M`dcDG_uxPa=(rc#jQt=Ot> zqZbxNB80qxffU-EcZiboKfN-lv@E2G2V_J4b4mR=r%4cGa%`$OV^XTGZ#mQA$e3i! zWP-C09$#e>@tjoU5H=+%PB6BqGNa?*t-Ew`|DDKuZwS#VPH@X}j08krnIQJsXG~;n zC5wC+^&kRFdB!7f>wMwpowC?s7p^NWu?O54hGcKmDyIB0$lj0;K42y?GHexdsv=PR-qlUkGAGi)B8+PObG>&)13VWxE*BZaZpK-W< z8c)~6a^c!NiLhwSPa%HKDaPD}{ zW`1xJ8X+vHi?BpGLejff7nF+N8(-wZlK7H`?WsYaOJ)ds{k$3wEOxXvK0h}wfpC$K zBjI)I)2;b z_;wlnGuBMzxpwe8C*NeRNIO|-y^haF-*)hXT&BkP%SMSkU4Dtawt2yIgD_K-*=E1R znRr0ek1=!2nh;eiXBNy&+uv%v;^kialtV8CJS<)WXY)B8I~1UC%s2o-bOwzJqs~NL z`3ZT_=*R?L7B2^&Y+*~I(!)98{ev|}67~Zi@xq=WzI~OhR#g{rNAwV-CG-hOQMtti7?t;56C05v#JfhWy^V3tWed^1RA(VBsd7QTs2?ai zpt4KLXttk_E?M=6s1puBkO*noVkQTKVp3n~8K%jAqpQXc<|^v`P-_OkxF$6!j|;W3 z{9T#I|JgIP@!P!zZf1J$T^3S|?>IS^GgsSm!=2wp)jt!&&R!sn9CUll-&pH?J-TF6 z8Pj*$7hy8OL~@?QkX2(J=pOfGo!kD<2~YQP6eE6^wswaf5*Hr0Tv_ZKFdjT~wLVYX zA@l!#4XJ(@tP&1biKxT@QDF( z`adLMVH3M+y)`Gqa5$g$c56WnhA4UdLFh@D2aKt~DzJ`)VMJpe2AYKo)?za+D7Sfg zWM>ea+4C#M%-M3~pEFu#S^Ke+n5fzjBBBn&9!mlRX!hG{i}7R*zP&C&+`hq57N;v= z&oLovkyB{Ts3sC7Tg1Tq_c0F_K^^;t9}H=vL4(p>M3KJ-x^kSVOX0N;A6bZ;M-0Qt z%>ui=Wv<=)7%;4=B00c#LDZIyQF^rFQUC>A7;IXDR94g_lNefMF6O- zjYOkv9tnQ`@eQP~LT9}9+)(JwXcY(oj@X%o3;f$@#Uk*r*D}h>HvCYG%HdrDMzSk# zRb3Odza>BV!YstHn0HOfZWbasUVkHo6%mHgo9^ixp63)zaOVU%q-FxuVYKrIp2C*h zbNp5w_yRdd9Apk48G@gGR4ixu=LRed&3?fAqzSC5!;!<0tm{#o77(VYdVp`{Yvb2t z2&xWG;oQQ+IlN4>3fjaM?K3au?`r9Z+#c5}^OMKsKcbNt zh4K9?ShMXXMCyXOp!fxG&hUT=A>8Ai{&gO(+O=V~KL9xY@cna4$Nt!|tS;I4Vr2&? z3j&w}&lCwnMeZgaLR`v#H#Xap)tUPxEE(K|UVTj5`B_xv)U&OvPXp1*{mM}oK2)IG zG}f)SXi*-xt$@Z6z5&g2-&}F0j!)w->srto1u)dsFPPm3i z!2eQEqi_H)Vef=xknh+Al=_D~>~Z*Eww@rG6DkMh0TV>Me~&jK>~og^g!AHDnM1cq zYCakJ@gwMM!I8W-1b>*ujt|<7k9kClzpKy6_D)M~Run|dnIJOz)hddO4{Q`|-&^|I z5{#mHN!YMus?!yhxN08kc)B_`p`#~)vTNh zF>inVw*YaJS29Yjk;NuwOSD>g(&s;ymFa=1It#7dZO7A@#Vznn=f{{Z?u-BcXCKP@ zb9g}L#HEip>EN=*j&!iu$a|k4-n~7JfmKg?UnVY4HY5c%<4~{F1W^yZvdkNC=^?IbXk}Cc*as*qKQ#mB;x6{|OS)^03Ft&r7wgo~)b~k-CywXUW_B;G9vd#O zd?kFHm^O>D<5v-Mbd<8!6jc(_eo@TGHk@(D1vW6Xj~P{-sFztG^~KhHyc0qWy#(EX zyb042orB7-e#{aSFU_XAtd`3L8B8|gE$`1ID$`2L0dTFB!AVe_yYZ~|SNW65p{T;4 zq|;mhw^WiWH~~@7*3vUuj!{XVf|p#>6rU=b7R|A;7X|zon)1RULnizWOc0K#V-_?q z#f#7P^w0Krmi76~d@&1-Mo)ZJ^G}3WWdi>}?fMqAZMLVWH-8yll+3ZZ+#d*cp%(b* z<26R5UTM$`S0+r<8lS@r738=g7t@xBfg`JNxD60%e|3{~Md^pY;{Dm8froL`WMTcZ z_4yS(-`_HvS!q@sTV(>yhdGbmgxY?@<>BNPuLmr1T_f?b0(6+ZQHjFzzQPC#KUl60FA<$^16~`r11W9nd@5@alPh3V5YU9ef@w{q3 zd#4YzX@msH%-umUbAHLLSy+Oeb1a|odLXGeL}@f%gia(x=0{aiEQd_s%hz%X9)9G3 z(iNe}Kb}Kd6CYeLsQ!0yZX3IXCTllv?E~LxE|*Pp7$mxDdu;lN;8BwpRDv!U_FkM= zvJdVGxDrbb1LM>cD?8&scSozO8k2|_T>=WgZ*g#bGY$Tg#6eDqbHV{QAniaLPZg#= zNvl4C^PO-&IH0>(n1#|iy35)(^{W&&N--~7;%nJg<#O;Wd;U{Sr80MGZVYMFoAOmi z{^`xr+dT{b-kL@R$w5$g*(Lr%tm)Tuh}K`<{`uHd6P$4c{iPW)OMiddj`4(eN(gM` zkG>V6QWf0r&6F=zwrl^iCX*)$s3%4yLv2b&EP34`b4|Z=4Xb7!&BM-ihi(?g-oGbO zu(xF{ux(W~a}v0J5xRpzZD=*~F!Q=E7XinRac=)N-}aTbWMC~8!Dx@W_PsgrL3+ow z0Q$|qqicI+36k|=eQP#T8aF4R|NlmSinW>IJmj?e1S?QjLbUh;|3Yp^NJW>pK-kF# zltc=jDSysOgbm_AlDxgRRxXkopPY}>ryQk_h#NPu2@cL;wJ1X`&%<{jGZ?r5W9jI@ zAvtH%lTp6NRt0!#<#p$PFw|D69xjdz$WmXA%P0sFub87Q1g6AB_nkc0Lro; zeCqB-0$7`KS#hU=(WxA4JM8Ik-GXE2|GaeL!d8MtlhtRw-V-R=S4hJx!)~#f?WT!6 zeTe4k?aKM>W3`CpoGz!AIp=xe*~PVY)7L=~BfsM>b`@bTnE7&@esu-ebu*~7Qm2L@ zphgI|m~|cS9IBt_7O0}WFohVdH9x*lP73fCVc?Sf_v zXn>-JRhv?YrEyrpc=^!9WRK=Mv`+p*cqqkI(Ug=B(IA@7PQY&XrC4|mgDoe}R-AhE zOE&jidiFJ3lJ_1dPCvcS&p_vu8V7FG&?;)se?w`W5c1;Z>dV)$lpHgp*{CZ569F+@ zhu`MgL~#L*XOhP_7k1RWezL*-q}dYv-B%VmJ(#4JF^fI&n+Il!;FAFn!7W?*{XY)_ zD2WbAVD(R*MD-NQAlDg};9Ie2K5Lv-3*i_Akof#K0@gcdm%?TKH+fQ-Zq%&ildB2w zVQ~Hk+-~I_)qKjH z+np8Qlz%n<%}YgKBCg=yZO3d=P&<^d8A_D?aLh_onO%CP}jtLn3#m4XInbkvn#NqsWgk%}>=uOMj+qQ7c? z&Wa7x%Ny+%+WC>IeeL|riYoUT&A)syushjdUYM=tS6GG`P}I6AeIWQw^@ni0eoEYi zs(2}C%_^g{Qyn#B?(@^ufZpr$U*T)TTYW^HcF@ z_xM;$>X(?f^Tk|b^u z$bK1eF(gbdg1Bhs3a=)^Znnp(-(P2pm!40oPLkq55h|=8EBrTLa?WzWt9+Y#*z0@P zK|1d%Kbq^rz*N=xlSfxfeZHnHnXV7)`NSl7VUuX%9<_0=6v3L-Adc(rItQs^DHotm zNP9eMPJv9}VE6%AoT(b-RhYZp58EYH_&%{&eTaxHHws1874$}9vBFpK9|WKfv;4=! zI14iiVWc4XCoOi#mfEYT4%(k1;QmAY+tBtgE3C1*tqcI1^0Ii1wXu0oz5Z9ZFgQ=; zmn97oGkGXg{W*ET0AS-~30gxXENQ|j4%X9VJ;O|XQPz0rYPl}3ZL~$8ypmK_he-PK zK)Q2cYMkFrRCEu0Fn@!VL<;xAqSzA4q&&o}c)`)a7!3+b^YwHSuJ&r^nr=io_`(}J z)NI2l;x?&Zda{A{y9&bq|V^-ZQjvsHxieyJM?8!6+( zmXHKloIhs=zyEq+*WA@+4!Lz2>WBi<CgAW^`2|i(@K$G&Y27Zd^({n}t1MMv za%b%(m4LHMoWO53H!oO`9L0_)MOwYq;C+XWHhD5$fd)`QkUEtlv>8v%<3%ix5F+BC z)LqxL`yK4?J4GXtpsImgX)b`$bgKl2Nw>}9VAm(_az-H;t@EN?_pnsT6CEcD9X@X& zQ}FRc35 zczD|fz_Ho!RmeL(jw6H(6{Y%rzv@cQ3iHY1ER)(s6N~b)H@1Xf&NobU)C6drOKDXO zeby=QCkHzjn3wZU6tALm#iy*BBbChbOKSFeHP~Ib>nxK6SWT#;Pt<0PtV%IW_vwMG zWSl}0R<7V-q{N4vb<`Hi-8^~iO%m_~kjD4*x`g)RQtO&uxVN1SQkc*xBHywtoJ$#) z*0Y6(?C4NwMhSlKoy`eW7nj#iVK-!#*WsVq!{UBu7?zl|z)g%eJY~dKFOPFz4RWpc zA)fnpcoOcgWJrFG-SJiE-5aP+Ln8MPO>hjXxX$rZ792GyAGwHWP9p^{5cwXGAy{y# zzI<_066RwT%}72=$i8)ignA(|RWM}FvK1p|ci&s4Ec8X!u3dn1b!w5GufQCY@-XHg zE;B4S1A%{#5osT153?d&eJHQ^_+eOz>ywZHHS2$US^#BS5J6sW)Z6L(3)LS18=_5a z#U>%Ti|v~TI>!vhc@tIm9Loc;Gj(B*i>`5x>R@1do5$Hk#(z@pEQDKErUQSzS@X3I zA5)arAPf9BG=Jn+eNWB;LL6F3km&W{oZ*|ECQvSy`K59R@_$ihiS92fnlxih2e(?Gn^gHf}&d4UBYq#$EFhW&0>SqfOB*E}~iF0qI)QTwN-Y3)yLwFBu}?-841G zuH!=+->pNQyV}Y0FmOLkO1tS|8_BH~|ng<;|}}h)cPLTZ+vCN=8>xc%!-?d>0%)_m|Q~ ze1-sjcO%HJ1T^XcmE&T1E{8>(KL-p^rKip1K8;`R*{|ByZyG@CnRJ9U^GJc#Rg||c z9sLe*pTt@?aL+vJF?seEe>hqqq=_~GqUTF^Szmt3dKrssOHE$8MR(VT{gUA*x6U)i zcO$1J7mdFNC7vMI%0T~$F=(10JGGha`T-VsFV1+vTq5}t9~NkmK41G%gOB=>U{FkU zU1OJUhkuX^DZ2j~D4V8FGuf%@`kR{$wZo4^jYy*W%}2ZiNyN`8Gf%}XEX`S#!f_ks^(R^MJQVqWzFaesq@*r+>Nm(@`n>BV zD33?BBs-K4m-2TF zJ!CAYU1RWoCF%0^I&47Idt#;wzv8buQhw#nacM8Eh7AxmeO%r<3(IpqcL>x|XUe`* z{rcE@-R7I2KIabgpLAI&S-7WZO_+c?W|ESwAK^0plBBC~)k?W;mamJ9eX;7&g>rkb zL=NfFA3i#;~9y51V1X{VP$OH#s^da0G6 zUy&LRBIeVZd-bP{9YR0f0R_Q@T`plKW$RN82NEXYhEkvv%=>wNO<$k*Tyvujxq-jB zhOA?0I$Uce6P=(?oLu$9n+#tS6DAu88%JQt%#=3jHt`)0mbm{XT!v;6tgJR|Sdq#T zOV`28cum}*1^{pX>LOK%vmaFr@cw_|Wu9cC8I>`cWG%b0tOpFt(X}>Y$4~;Lq{c^Ku=1-FV2mWL52;UsPWr#OTw0n=cE7|v08}@-`2|!M4tA#vg3dibns*l~g%x^_i1I>F{sbxp z>L_4tR3V3}ULYr%lqmb2*YWn>KahtcPEZ0ctXRRV*Am-LV9{nh>L#f$^4Bx;bgwJMr!uhHHS|;R!(qa_+j?MOk zg#9<=_PG-KjO@IWn0@y5#m9Y;J^NYvS_%mBIX9YJr$azb6}|U!G0ug(Kl~E`ZSasY z3Dh58vK9gR;e80jRJlc7-1SbQK#-aQ;x>)O!*3xAfFUL^AdUBcGJz6XM#R7@Z6rkqN-kyMtM5b4WBrq6b-gFA{%FpT|xYt16_dmM; z{{JFr9|8)472iLBPxKKx@%kpSV@zbakndpJP1D7JlXT_XcqAa@%mvQQuW9 z{2}PGifkj&s8GPc`Vi@d_MYh$nCl1(Wb9P*Pt(^wM4fc$ z2-48faGZWgFru@+x9G@ms*$CsL~9KZ8T|G6jde@%ykWE}s0@Abu!KuhFX$#N(}6JJ zhipqBHwZpK7sAHf{Nn`{H}R^wuDD{sGU*!%@6uO^q5>_5w61=3ctjELA#mBO*M5@~ z);U!_X8dTW1H-uzr^v8S;GX?^5}%1gLoisr>jjsFc)|8iiCslyF}Hx@=n&vq**#m| ziw%uGPqX`{Z3?6fss-_E%5PzOUld0)k@Bkzl-a6oGM}8Nx3Q#bcKeffs>-0!C%y>E zCp8Dl6;V8sErJI@a(7}^uho|Z8L#6fKnpO@YM?iG@V?p`Y}cx}_po0$Ko(+hXxf%S zl?^*1Y_p9Y`Blz7W%ifcDe+u;kEi2Vt=j^zgCsLDz=nec6nrJ}eZ zb)NTOF4w@IX`|f%o~zkfYh-Qzy;v8}t~jujawfzvSd_2Pmy%T~?S zEQHV@q2j^waG6enjG32cC1z-`Feh8(3Gcpy%ZSTAZNMVZcnZpg6x6{`Ttzth+~}9rWx0;s2G2j`05Dr`TXsu&*Gq+pOlUx*t<<10$M^@`HIt*$ z565@(M`~M+uol?B#r8x=DN`J8^W}t7j2fC{L%d*bu!h9oy;uO8G37H^y%Zz{h-UZ= zY|xFqxcJLD?#I|5(A5EP57H6jO4{Peo=pEddti`TNOxsUZ{_yH2%7 zU4b}}EHCn>siw`JEv?e&W^@%L(f6?W^}WB2KJ0oFAtRf5U5ZEOT}dE1EB}hGO&nhe zsCwRlx#4&n{G zG+G}&Ea+B0>$vh)Q+QW5!J+p?A4{Ctk#`u4P}+{JlJL?6$wR!?ltg(@eq)9_{u%+; zb!j&iGV##})DqZ7ketAJfU6VWv~j%tjQh^wGavL>2~NOGlU^Pb&*N6zHPzxXqj4u{fXpJuJf z5}ElxIlf~2c~aai+i{Ls5eyj{5vuZw!prCHDW@?_Yh?_JAY>-ReVVtb90pn5b+knd z-eUk|u*I)dS=YrBO}qH!y}`q8m1!n((E`;wa)0g(mer=0>HZr$i~xK6`ke6s60xIC z5xvu#mSbB?LHhnH@}jL=F6I$Zt!3>u&Y^eH91B?~YuBZZ?}TB*Hu-m(n}w7)AWyy& z!J1HqZchszSw?-;8dDOG6G$fWA-cQ;kxfl`GLaH%VTc7Q^6yTIbzOeTqF7JSq{UFx z^!1MLBAZwoxy;egEo1e3`^)LM z=~{>{?3!4J@!_^?$lqrH#JJU=K|%jPrx};S?dVi>-KbM8K*1hC!aeLfv2N)86h{b> z6r%NETy%N{o-few7_+<$4MYCE~AT4Tt<* zzzE+7^*4-8(MJHww~_aKpN#J;N8Ft5>lBF_#y)(;zAHcHrLgw{~FD?(6r3i_OlDb7b|^yOH6a(OY}A!1<}_ zLP8cZ?nm4yZuH-0;yXzqN`ZjWyZ4TD+BCm`_NIrXa8{2dqu#eT%)g2z1j%SEJ3@cF zBI`w{xHQJ=30@h59=xLcQTQfcWooXxKkwAf$-*g9nPs?3j;s30869f(v1rqW9~dah zkPeiZA59HH7ulu%Pe!LIk5Mo+fapl1$!tHb^YN_R{*~m$~a@cl(QS!)=(;VP?+nd(uyARiT zm3rlkVrhsMc;hC(kYgSySA#WXY%T(sWj|cj8ZL?b&6%&Q0G5*c5c|SZm+a8wPH#ZI{f#NxtHKXe-HX32 zp)s@S;mG^G>Sce*zb%hveL;(>vX-^a!yr^9n->;p$4yRLhslApymQ&Yef0RE&uY$z z$#Z$5NF`GK!)l6aqE=9;5l+_2GK4I8mkGQH-T*bnfj1;>WIg-LPbSxzLn*d ztS6EURfq1l=@<>O#6~YMG%a$c1o&a+66R7kQ8X*)!=QpaVrj+8(Rp{U{R%(9)yY%I zw$NF9uEWmQO^EhW4$bdmo%+;DZD=^A7Lu7$2rk^_;hq$D_~<)QHY;F;Cqkkpz%B`* zD1cc}90>cWcoFI2`4f9P5!jLE8@A8k`|^cIkqcA5% zkiVg{g^?$G$+w(i2b?t=f&kQxS}@_M>0Jj3>CUrUJ8<{8q(h>YAl%^LHaqKly3t-=s! z`toh0G^xN{1%h6&$o-<#RTQ@h=?uOSYx}}7P75fBngBpaG0r{F6Y)yG`0Wv*<(ET2X@H z+Xq&=%iUe@-05gwQAD;JIvz~fUq7Yo2s{gn(YT76*@@5q6~ix?_`A+D_SsCU0iYu? z-Jun6Q{m*_84(yx{>A)R0hi?`=*ONJkBh`pLihgCNe^|x#7_=M+PNoI(*@pvRNb#B zA6x85Z3x3FD+xm&sgG(4Mef_nk)YWiEp8TZ#*C7RiQ^u?tB3SqJvJsI*OK6r!~G=G zX{OzrN=~F$#O8R*iN$vWg}~o&-m@jCZG8xZmjMmw{w$xFx4CfphX}sfWjuUs_@l#}hOSV5!)Hqfq zi_d+5JV1z{#zMiYJ?mQ=S^Z4F*j8wG;heYjEzBwV5#KY9N)!D{j>y@g#tPg5Yv$j? z>WT;q&miwU8UAy5rEJ&YWDY0zXP@6U2{*J+-mntYb(u9+bRNMD7aD>)0ps{`E6*Q5 zh4Afu5D4=OAIWD=jr&C{1z8v-kwDImO8lL0VO@yfksm&ktkWjyXHsbHNR8zwRPUWi zDRL!3R>Y<=8`reTU3|dRe#oYb<{;z=5DM%gMY1sy`_YnNHf!oXE^C^P?>oN>C%KVG zgaY+|IZ7m4L`#S%;elFdJW4L4`NjsA`@I(1{Xo0(C|~UFGor?Up)ZK2sit(!`i#p8 zzI?1c%0dBR=KOTOn6;FDz}9a`y0^}9<&L5513TQeB(+_y$mxvmF0(K(`ryYCbMD5k z1_a}8*)Bs*-(%KB=RlgJrrC4g9@p~v3Gi1(@@w@8u(s)R)fNa#-*#LUa|%s42!dQ_ zJI`7_DZIYQ^liqScRYe}w#gnrY3J)+$0PTu3l!@e<)phiF=D6#qz&F;yI=4u`&A&} z+V7D0LTNwAK3RJ|xgdGruP7si-gA5(G2A6Pp6poT?ue#<72(-3MgHntVrJ!$!sU!! z)yF4hO)Ci%;Rj`=66Qr4?j_UCK_9rWjF%l$mbA;X8e)ir?)O9Qf_LQ42n-(NRi$hI zK#lff%hNWwntO`-rg*H-8~{mSWl@xH7?;Pzgo_P2%eU{qJ3i_$W+|k|>Ezl&z>EFz z3GZkjvfodpPZ-lYmZ3*V@lH#~gD}*v9y_^NIMo|Nb(v+eEhjKc#mJp7WC((lei7E0 z-CZhBM8?SYzvg-fR6GUCxGB~%5MoMJa;KHQ?AE!gAfHIcKFZ+l21Dsn`{Ab;-1RJS zR5v@_ZH;>fru@FS{C?gBFLzqNYsQ`|%KB(8$VD>OYWbzfK|hZI0CRy&SId%xGtuy% zHJB^c8u688!AT8q1um-Oj;Lh2Qm!d^{00f-*^~QY;Y&R*S*%*G0Y>q4p{qYZU_Tjlv8&MqG3}cmVPzHxsrLI=f@1+TVFrUKef-{9RhBfb4mDvGgYrvS zRlK2q+7O+GQceq)$}BwO@l!~eM3&Wv1ucvQvH(dVfqJc-{o!3xS2F}Ce`+ZO29dc4Spu}yefsQ6S53$J`1w9 zmXqn;B)W4w%x3G4A_^sJ*eoRpkWFxR!i<*!xOW?4V%&?^D7BXVE%NtB#2#Am1i=45 z0mk7wV=@Ga_2L8ccs_na9U_RovJNqMaLFH?0x^C!(EReLmE8RC@6$eg z@&oo~7+mU0ty7amvCa`YpfOzg#FN6PthE-bK5sYtNvJT;XdItE_sjpt8*htq4?_>Db3+C3TE?#c8Zig=S zW&VuYejRCV8Rfn{;ng1?Bo;PNZqfgPE}DG0ya=#qv|CaE4hP z=Ak0V&Anim`cw@(8v%`|Hy_UW1^%b2K*Y2#^@%AlaWVfLdfILoLUyS19ELl^~E5;AGEGfiJmGb%D*8^S7?_vLssM9 z7@ZNHy!#kR0H&VIIlz?T0Lcgr4f5036#*|g?m zqK1I#Pq|(OJ(qH)BfKjbI@c89VoQ$$#?e&S!+?&nG}(<0B8;zT;TtQlN^RcOd*LzT zrNNn(+a|Isccr(44I^y3u{l*eJKTsQ4Z@6nFLb`uj1*$W(w?Y?xfwph^Grz;kXK)R zf&p>HW=tj2su+IpT1sTIEqqlcF560c8!fgipp>>$(dMy%8B5r_)Sol*nLrj0Wa@Y) zRtrvg2KC)2SQVo-39rn zH!!qpvBB1XUptn;q=Kjkfftc&7@PXa;4Ut?FNDCmqL@DwCUs++O%3OMA~qrthi-nc z&44jwJVFwH<$l8p3{CTF+mxq5j~@Layf9jkUp3Rd!tO()vj;}Es$2DLl5Qv$-)$u! zA)60DPeHtt^O^y7H!fKgaxsc$E!N>KQ<(RJgD?T9OJda(gS3!z`>5wlqWm$lVrJDf z9}7DVGX$0XH14a83xx_pM&c&&+YwjZFxKOzhduGI*jLTP8B@4?zXW&jL!}d^btuld zEHIa0t&6GMgyMsrNs_2*QeA4jFr4p9gCe$9h(lySg~elbCULB$mjZZeOgg_ALo`20 z?}%=7hrH@UMt4vJ=jhQXuyG-kgAB5gK>b|QA<)oQADLZOQ8MD$g_hK>UjMgTrJN!x zt(EsXIYQKn8~K6ehdwkRJyF;$&+kwsX(8i9y;=-7J^fz!#20Sq?|Z%uS1)5Bbg@KM zYP^K_tY#PfEKzu#|C^kF;eH*T202y3Eez{Rr+D*9s^*W?g`!?Z2;8mnQmeCgp<#wMJx^(AAn4430kQW5b8?#%QUCQY`^Ik2Sv5(Tzoljqqce^*~d z_rtJBD!NT>pc0LS7^_*)HK`!1>VDn$ixh&?pU%Xb;teFAttY4^haNK@i}e5*qA`7 zYs0(Uq>3<0?2zLS&Z$NJ95nbTF2+uNt0Ad**3tebGFZ9OWnPos0$z_nTb-fNDAvp1 zANvW~2TPS19wy^D`yWU=JP^YgdwFKB#D`PDQKPB0JkEC{aNv+{%xX=jK!9<%_p z5HMuOs82UHoM~gi)tG>ZlrMC}_$ohKcm#AnRF@6hJQnQ|WG|S`jP3#)EO5%nr!BJ}x zLFMz?Xzs|luEh!+oz!vt zVq&8~F2B-njA&>zILgU)iTwOj`_^ilq!SSrmt$<5ahIg+8LFo#JM>*?j=1wFQ_HE;;^@xHSqe{m2(12bkKa8Ak$tU zbg7ft$UPg-GKuBtm217@>x;jsf&eIfn++aY_qN363*&$xV7mk`K6)9dN(3a}wIi5- z3;ove=(Tq+^^2^a`G&)C20~n7exI?i11M}{vPk8K8jNsUJ6ZLAX(dhqpd=Cq(()LL z#%Yi!mxx^!7c`{%m$`zDT?;RTzK!9{V)k=Wq?{+HXdJ;%0`99SD3#=dZdhSg<&_W} zcQuSWk_@gGFdpR$08h=RQy;>!VSX}Y2R#$?s^%f@H(XUWKejr*05=rJj_o@H7$4?P)KF&PZk=@l!{JWk_$^QB^MwN5LMoQiFoIqG9Xrb1 zUbM%Z?M4~m6j5LB>o>dJK{@-u_sl-ZYo92kH@ofCy8jr_4o!W^-c@O z>f*Vhc9X$+hp6P;yMk!&sM7K$IPA9pt*K+L_NeC4!>Z5a^cVAg<5JiYG1&OEK`V^E zg0*xt3HflC`=AJZ@C=?N-?E9z$%MMQ{FQe4pOb~bTQUdtY;rss+NiD)*s#n{je)YfOIxK~wEKK-hx4XFev$XtAA#h?rVbqG%BtZBjM1qwSH&E(^%> zM=_9T#8S{^-${-It2tqA8Mio4BVl`Iry#jl@NbFunyXDfKvukqQ$Fs%kZCvWc<;fF zFD&9*#vBf3V@8f`iDiW;!tzX4n>ywn8}5BI(-qraa1+npckW|km2vp)=G<)F=VIi! z^nYx%^1yA6ciQVeS??zRF4PUt4g)9T@gG$si#F>7v8IHs*LCbaSTff`mAw`3Sr>)}48g%d^0)e;*gygM!b z@HS?q+*ZRN21pA8k-t%Liy#l8(U1hhWp%L{hl^zB=HWa1IX{vIv1c)L&eq5ax@W^O z+6vZ1aHQAAUp&Z=YqXS4(1?PK4$^s_Gft~*0_P)7fF2pcywaLOZ>+jHRxKFK+uI{KWzrhHn)1iZthSM#eDmnSP@tsC)$7QX5o<)U1xB35bRx@G10O4UQ@JtQzDx#+5wlO0_^v_*Rqn_LIlK67xFM zH66=@ETr`|MulV~$76bXyhoWmK;nk!#9>Q^VpQYoqw@>dg#IYO#9j{fJ`<@PMhqHz z_xQcxB|h7_?Htu)p?KGZp+6lohig^)Cube+TdC0Uht2tErS=kI&T%nMjj*dBrs3I- zNKVaLMmo?A2PZ#7M&1#}rm;CBk1aOKq)_H$_B{S2Y&dTNH%1X(Hs6&NT@tE3C$-L; z|8YNFQj5Br;`viXZgK32uJuVet9)K&j(H31ICh>zuXO5r*0lLtM{iCizML~; zKiD6chd`?39D1@hk_fW*dl@pOw&7z~4T3r@F0p-T{yVumg1SVho#V5HyutanSFhN3 zgZGZfLBzlZupmfWj^(>(#V7~u*dGtMEw`96*O@8@u5sZ%=juv2plTuWT`OsUi?jx1 z89L_v6;J;=uFRhtbJZRKUTL)b7lfqT&UaV4T(*mb`|8}Z*Dk z&d?63;~t}>yLAN>UZ5eVE8}<6<;3l*lb#@(f!8izb+m0Nv&wc%5p%^`pI>e$D=jKdn#^sm$XCiw8Qv*!P%ylCW z65Um0+}WGVb?*=9z|Yqx1fKfV>0W-wB61$k*rki$#|Ajgw1+>G8k}gas2em(Wg5() zS7O{H@NIwNy`xPda?1C;xkD;nEeMAdG){@?90?^66bI_lWBV?BA6ando?CoY@V6Ag znRgjH=!+L>_xOHZ<-UYgi?fN*fG1=)&BWUz=T9m0rDU@q?t(WSVcDd?n*M{IPU$Da zHYmK{cib{`Y7Al85by)jB6xs+bVwW(=@)hrukMd&9;|ns+AQ9O2pryZn<%@S!y2TH zx!CAoFTt>6m|(XUR%E-N+QOem$xLoKSX3rSf)w&#;4bT{cZdi<6hbBlEcs(&|fUx z*a3t8kFD7cK}4lDk=}bJAPOo?kSblIDZTg5TYxAa zp$MTGdI=B`QubY*``nrP;hp`$@MUMRyXSw-uO03-uAPU1XIOwJ3c@3>LP8-*xVa5W zf?oaSQ7V#`8MXe~(muiB;QLEGlN+yDzU?+8yhIM-=o^))IWq4psJ_}aMzMU+Flk7)$9z*aL~<&p^}Iw1G$iS9_*x|Y`K7lSwzvO` zaOsH+c0|SYvbyh!wo8#3BbpCIIWf$k-)o7Smy6CjeZL9ioiy~)m2UiW|eV*H`nDg~RB0Xuq8CF9c;oQ^-*K+b2%_~?)9 z@kgR4#9FjNK~Z)kTVDP4mlGF?k{H}W3p_3JNdpg$w38*d^6(xNPhzo2HiP!>;96~1E%B50>=T~%N`x65NdjMlQ?5daZJ(_?@Bvvz#Py}M8*oc+ z^Vjp3(@5#fETrs$JxTQDtplNhG~a?LyUW@&B>f5S(3@qQ&i}pRU{;d#2An?lW&kVi z3l~SphTf)0B+29p4dpI2XEd_=H;uEIB(1-=P4r>x2wDElbGd_5ng8HDF_Dc~7IJMB zC7CZ>B7+S2Uvp@^Apr{jXB0>Mf~i9?6p@OqxM*a0(g!XZW6dm_FjFg#h(QW>{PyKtiNNRe62}A1(#ZOKtH}Pq_GBE)LVv=0= zvTLg^P4b?e;j)<{a^g2d7?YK+pLe0kpwLrfr!}Iv>AE~>OGP8H``Jh1^3(8VV)A82 z!<7Ld*;Bs7GTq6YF~p%XXd6@DlTqjA=PV1~an)5L%MAp|H|KPAttSUx&)3hd-x$9iN%(<8pOcX+Cavj$#SEvp8^{#ZPH@MOoD zv=bdj%i19h8AZsFGTkib4RjhZ!zQ%&KC#v%BPPNnG8 z>z@_ZkKKtR#Q4xR@ftw8iJoGV>@Upe#_}p<8(OLe!hLi1`#~93L0EFkSMwTxGBYo( zP&=Ti`B-p(&-$X#8Z-}Bl6KNjyLDaf3nz5d?5M#;WF$@U~qBWJWdT%%bn#{yT97a`RDi=)yr@bPu=feG0TJ*A@TaG#xkh-&O$ zWIsx=`Z4+9Z_S`h(T?SzIu(c5#jd(P8a0Dl_}`V6m==c{?=6fco<8na*I1!4%e{t7 zvkc$3#*Qa`2ObK8@X&tWe`XmwSf#2jj{=R$3*oQ-F7%3YS{v29pwh7_q>j(3^z9r+ zijE~}g!N{~)0A9L*s>Bb8A{rI#Euaaf6%B@g5+sgdT~>)!jO-fxQ(IhjHU2tDR_ms z`GrVZcJr#rBM!d{WXg`%uOH4mWu&sn;B9jX>5n5^1D|BMs#A2EM89lnQbS(TfMhbRq}z(6JFt5O-Dh z=eXvZT=l?v>OJ?r1%3?@KTV2tz2(66jXK41S9HJ5LxPQ$8z}m6_tYIDl-v<^{-*OD zU?9R%i9<5!>c`Db=+ADO`3C)ZZir2^d1CJK=4NQ%ziG9=joV78tqQb!3-WLDixM`} z!)AE(5Bk`e4x~Jg&EpT-9#}>>kDw0MkQnH*hmErMq zJS&T%SYevHloFH|DAQk*;=e9-LEdU*dD30IZti!wVkrB zL-Qgd#%^H{3PtCSRa5<}dM+6PRVgu}j+AC(-=eS|V7X{>SYh4CMMC8Ui zeCk2iUdNV2@Opl9aWfjCh(|9%V%$xKfsn&7XLu;V6uVpU8@pbR5Ox!9>3aOqb;{Vj z8l4lmKtBAMs%-ys1<5jDLL$`cK+0G2{sCKk;3k?`OI3EPOUEf$D-|XNH6~BX4}q2A z3y$y-2Ap+ddS`gY8PS>`SpZ16tb6b&tJ5*lY5uw;MgH495aKae@rt{CLir|7hDyla z3xA}u%G7vAJe15sWprL}FMwb5+*&8ij}+(OwP}e7kL`?PZY^f}$_inGp!TApqMrt@ zN*(uIEecb6Rd2dlR`&e@1xz<h8iD zA%c+c6vrP&xgL{j#zZfzcllbhHOb{fn%wKKkkSH`#%WL;)T2*`0!P_*j2swCM1;>J z$pf_Pao_j=D4LqYN=KT%{M4m?n=8_3yAE!PVAT6{C-cDa3|SJfX|>*5V9LkqG!`!ft)s^J$7 zqfy@s?q;?Vc5f@V$VZ8Y81^~UTwOO(d!$$2F+$XfCsI;N)Y+z*5AQauNGM~|Eg$iT zpx@&rav^_U=!H4ghMAV>lEi{?PGwvT|=e8Vg0x5R+@^{%Dhw0)`_PO(} zd!eUR8wdWbJM{-`FAsF|30@c=I(V;2!dz(%k2ZhJZtkO)yhdp(q1$|Z=*uAy_K18_ z89a_^iMAwarVv^jI^ZRpI9>kP>s15(4^GzGh{I=UVSysjNo9~hQJ8Yh;+qa=zyun6 z*K7&VZ$FbNOBg>we_X(U9~4J0MhN6tfVI65y;v|F$9t+K8Ds5b7g;t~G% zs(to#3w*?-ncs&z$w~&2;%R1zK7!2oLI{;)_rewTo}8D@EDC97-<*jphFm6IU8jr+ zucl%UNL^N7xtiAxrMOA;;a(h)ibKFXT=c#)rX=Q3&oe)@-gb#d$7ZNAqp)YW&tukm zvq2wi6AHr~HY#1Z8&B7j6#lsHy51-2&pydEsdpn^)P46><^If2`IsfrpNHI zDEDv|#Qq#r+FrnjgW?Y18nCIP{F zJa4jFN1WKRprz(M2eySt-T&^8fEp4rFeA`#{OUGBk358(1Nh&tbL7yFL%s}K{>x40 z3_paKlQZC;MF;`Og{A^!fLjD`fQ1}L9zfd>3%lUc5i{=KFk=LFKIK3)bmyVNaih@ybgC z#9a$I*B8h*CG8G}PmI|{ULxqbWgpgmHQx~{{>&HXQf@QouAB0IrFN-BR5=ud9=*@? zBVH7GLvaJyJ%N1kEOEZm5sn`OGpu` zmGacxM6^I>itf{q{f8y@l21%#g}FPuek48c%X`AR+S_iQk#0?V{GrxYm1$(!!vX7N zE3F6D9OP+MP);}iWluM_>m!#+dD-Iwjr&|G ziIT6EyfX7ldhekQSHPTaLnrZ&gQvdOMssH}6;;2Lg>Byp8z3JQ!=}01J7`;F;D$DY zwOI(5L~@`t7sXW`ebdXbO09Kg1!40XLwB*MGu7D6aioNl%@fH{uR^@cUVLh=3N)j4 zolv9&FKjUc=vxR`as9r6w0olecmkOYO_`BIl7shZqj%c<`M6}Al8-m*&t5;sU&vsK z&#nu5mVdQ*z;6oUSw^N-fO!tUvBWpT$r%mggpwbED_c8qKS5C6G01xj?wyB1B~Nq- zUl2fMB+QuHzAS$Xt0CIsB@36Gcc5Xcq{=eD7%+uFZ-J_(o8(aG1sDr(c4ZD&!iKR4 zEHW~;EYA_oj^a>#u}~E*a8ih!<&bGuw~4)GIWUu^+J8;awA>?TGoyRvQ$YLQMWp?& zZ~ZIWKV^b+qNOw;U+y~GiL$_7m}V>z`$ntyW6VKJCY9%(Q}!os6aR0IgC6STtkO#0 zCIUJtv{!8K9=jNB6&3O6M-tv}E@HD}I5GbVVk*U*--n*pE&AMEP|hZ%tLWD=H`O?u zqHDvWg5vwMXR<*_ht5ifBJ7lZ{e{&PtDag4!7MMTG79Agmc_#GJiG6hm}^Z6JyJ7^ z;`eOAQgXb`$1a!GmUXT9o&S7Uk7xCJ+3LWyVbL>g1eMAAxRd^OkmaXZS0@JAS7TD~ z%p6_Ox^@bomw8(>f(lE05j^@$# z2rCnMUq0Qsv?pn-=9?$B!NA3)rPyi; zOEIX*1s%SV?e~Sb@B>>lu&(ut4|q)G_;;kL6_urzl3xxMU;J~e@`D@KfY6zXT?MmmS|mrqObHQy{rB1i+aFevuxCo%6luNzd!J% zMc7i!TEee@u=*EL8@Cgn0(@x-k5ERhXO6$@U0;60H^bt-Da4E6@{lyyV6nk^R;-KS zeNi+M`o;T@XId7><4M)G*G#f%x-8M!1WS#dKKM*Fho7KYW9}9FsrLr`8%i@Ou^)qX zvT4842q@k8$x+2Sk2}BbNVE7&?dPk!TUA#A4s@<4dQz|7FkpHRrTzW_u1BEkD4#Fz z)u|jDZ76^Gx(_dqR2#81_Ga@XdTTNEP8ubxnGn4di-6Kw&yQM0y%YDh?meabw6hsf zSUZC|u$k8L=NjD4o z;vtmrvy6+=LA>$h<~`L9RZBi@BYsjEnmNE{BM_RzA%)EV*yA)lE zGL&Y1<*V=fF$5yL2%q3?u24tqs4~9ylJ7$`@r2!zj!0(Osqo#HKs*`w+0b?Wv%oZS zV3jJZsg9$kg>OBp>+v5$YFB3FFfi^scy(!D=eJhwJ+)+(N6tyGO()U06BuBQA_Ned z4jQ^Y!RP*ZBOC=aW9t^C3mS3&-P#eCpA~K2${S8ajL5e7$r;FQ z=_uD_JKeKkZdbW^bS!#;m|{qF4LzCfd1XWn#!eUL&E8C7s*>uwD562!nsj6{rS%Q1 z|MRM*kIi&MYIR5`w;_UhZy$$%!_cBG?=q*bCjpJ+7`?Y8(A+3kg_(9b#+v>$yf_&m zZ!l{q_g1QgSeipiPH~$2A7JDojON0FD327`C@s@jXr<*x*hg6IZ=muq2izPacF(T= z(Dtvy)v=Hw3&0sPN-X5s;4uf(upYg1t~Ax4k?4=KKdp#1x(ZIk-gM3**Z<%k6L$rw zzpC~${R3y%pPtxLug>oYN7a*6{?Y<}djhdX*POjb@2HdKnO00OLLTSJPQOe1Va-36 znEQ>fTk#(+<~nTkAuKZCkX7m5eX-QoShE`pY6iRZkuMy*T_?@YLOR)MTog-FI}v}4 z`*xqc4mLTWNBnVXONX6#tFO9)@|MiRMUT(e8V(Xg(26S0KX$8O8$!2p=_9xIzQ-x52^xy4-N-TGc=1SS=Oi1Jzz5dv@je#Q?H;OaI z`qc+Q3EkC%Bg;!RyOYY)1UM#d#rtIbr0+SxW~YO&d&Kdc-STcHPn2_cbJUyGFuOh2 zNyPC?yX5wPq@JlQ^xJ&U+%Y%_x+5(@RqaS#ny!vl?+ef8v6B6}7aG_tL*m670{qcS zR5EvWP9#YywsW2Xswx1xc|b$x9s%XHn(NoP7eQB!63_~Jpk{04+4rzvdt7HWPZ{dI zGuv2uj5O6s^_xo%#Vye_1m}{rZ52|BCdsO7=93L5H|Naon;uAF*QOjg%e(0dVGK+p z2pdd?JJ{=~9wg6G7b_e>6;sv7Q+IV{@=)`U@lRvQVPSh1pJO6~jI-IAJK-N030=sA z>~ybXJKpy2304K!9lu8~L88f8k;2lYr-{+rM4P#T=(!KPf9qWumet4svE?npvrn-? zbHc(=HP?awQ-CBlnQ-=ApcWb0mc^+%3+87cCp6xxNH)#{g> zNqM1|w<%;XLTl%jI+NCX<$kX=aVESw?sNn1u7l5YEXvqP(izhXj57Gj`9QAk*^NUW z0ZODs*y{;@`VdCiZ}XdGlX=Kt_bnNavca_lMW+6^&I_QwIx}&3ti7M|-EAH+UwRTL zni>~IS1Zw(lQZyx3^gGMx??sLY%b5awTgQp$HJ=qImw~9Yl8#H^Vuh#HN5x%@EkoC zHow>66RzHZ%7-+#HdrfZJZ4;D6_B3~;L6#nboq zmvkCSAgUlmGYeOv0X z_QFMW*@`<1zKq-YF*kiYiQD!Av$;7@1*utC=i(=s)$S+-za1^gbafyl;4`#*I-mLf zZx%p8cuzW0K|If_P2jT58Iaml20L*n=J9U?n1bimfTfPPd418f8^A^}`JHk6yi1sZ zb+aDYCPB@Xj@XoYc%%}Zp1K-qGHwPhOwdz?`yLUWsVW?;zxI%$BIJPI-PwN}oTu|nytMJ%tek+IvxT?3Wp>^c@aAfW+K6OefI2mphPmbQcq)=3<4A))#ieWeLpln_07hT$Rad(FuH;|Z^tanlH{hO&~ z+`6an4W#%`PAoGoqr{g)fN!Ufog3fUM7%7xP)*nk9kd@GV;rz{A7RR|UkG$vOPTT# zb%Bwl{MPlL%UI~jXyZ~->z_aKPCrK%9kSqoS@APd$h=rwZ6vWEe%;>GrM+}+nP(qL ztS){Qk7{InWwgL%{N_G5|6Zv5rdZHGTl>B^`U_xYdPVws25{g1?~ZQUQ#lJ}olYOh zxEX86mix)VVffZW3o+D!TwF(N)CyEvF%+`F?hohW=J!PPR1b0F+k`f_H@bO)*lx{E zl{%j!z_8f-*Jpxtinn$Lr5XC&;D~Xg$lT$wO6ASes*R#O2W1yjvC1;rNJDm)L^Doo z)&D#K$h!|aCpLjw zaa?Y}fqEo%cbSv>90BZJNo#`Ce*`vXOvtN??pvp5mCn)!l>6CF2*n{P6SIeU1ZWrm z^dake>kv#mx)P(2XKv*1GBJ9EqVJ?LFY5uO`|V1cbeKsy^d|WhIkh`+hxyZ6!!O%_ z9RML%y2#c5Lq*akXz^pfTcJORxOk79dA8oq<4H(0@1YI118XLSw3BkGs+0EUfxp}{ zuM$ks$}u-#@%DG7;sc#=&o(o!03IC<Yg_?%r5J{b4eQ(u{XNqIb7);xb8RG_mpN+r@ zET?!MZty%(w{tLf92p@zE)p9)I8)1-jk-+(Tjo%@du^K&BbpH_;J{8AoH)LW`^a3m zVN{VdFhUKZ5P5weK?D-geCv^D9Ol0ESAEetXjP7V%fas*<-Xn`?^^x=s8{mCN4OscJ#H_lazHZc4iDy}htOwO%o;B7Py>3Koe_ z;X<#&NvDv^^NEagRqu;uny}&H$b*9Vs{SMjaU%d5o+LMDN%Ypr8o1 zCUR<&%0Ij$G;oR+N)&$g^e7`2Zna^TrRNw#?!r7DKoO{LO2fGfn4%=T$JC)a%{?_9!PRcm z&=BxVm91f`qL~~1qfUOzWhXKNSxMY_iN1u*^<`5aY9%ye*nd5*yP5gym0h*}0*AG7 z=Y67_+Ox&3werel>=gwA`&xfgD06&WdDX~qw5I)%=K$Zs_uCmTHFt>W(W77nrYC9{ z?I$zT(AF+}WzP87xV!_6xxh4@?M~_w^(m9>C@#0^FM5hSa7%VEB#F>U7esfMfD6dq zQ}el{8+caYPG)TE=b*6mc`~!weicus4E&I8q=qMw`G(w_k4>_DNI-akK*{>)R*&K* z^usxGsYMgz!;wQ3%aQ%>n}BYsi#r|p4YYByi}pU6_t%=!gAmb$pr=dH!B^#TrTu#fQtk{4Z%8p% z_NsrRyrRuS95urYvaUA4bii27-eIPVR2d!Y@ez)RW)q$Rwt*XG1{)F(0+hmX0=P0r z3ER*oWSmxe?n4C*O|5eO-u=jG3n<_!OKx*W2z14cf!w-88UJ(_Pck>d!9hr@wc(gi z)weInp|2r^;eVR6E=}MwS^GO}ro;k!6%?a5PcXnI%2ClU6#f(9_BHOOh_*92D(cn3j+NZjC>x*+K zZf3kK{>+@ozo<5HLuLDp((W|Cj{#9rPK4ieZ1j7iW<^GJ}`?P z$jRZdj@pqnstGumKMlI88ncQ2vXw$T)>v4|e7mAktP^#Q4=Q)(!cOyq?%YhKd)s-f znN&tqV~*S4@HrM<;P-HZB5W|tJ#IfrwaYu=JzG^oquB}uLc|HK@U~@*;x=J`_|La` zk-QE8SrvT~*0# zA?_eeav-#SLulr!vj9v1J8c8yl1t9^SA}_xsm-%(bX4uRxBiYYWfgOffa+UhEF8o? z5jr61DRjX0>`8w?7~L&E?%3xEd}R(rPBo88U@#g(C=#xlS^hpE`bSQjhLf-dRrA#< zr_zXyU%lws)mkEtw$=`t*W_;1e1)2HmX3aH^8Clbk%V37TOQvgaNDxip*#2{{n1rk z(b#JK$5~;?mrS>NELwQ$wc?I+8R0s^%(GOwY4qW$-Y|JgA#9(x>E~!p7J3O}t_u|q zn@e7KJqT$xyCb$HzoIwG_rY)rT1N|jv5&81k=~8xp(gL`NuYak)KU0M`wotru3OL= zAdOT>b)$SXtq{zp9{7|H;_e-0v*-h^u1_UVi8P#+C^J_YE*@`*5@qd4b zuit(t?G#v8$E}AHGmm-{?XlS(plSoIVeJ!zue0-)S0u`7MrvZ#T;f7rVzl+pHT?hw z-_a@$COIB&V=?%p1(S34d*k}nNefe0mrni}xZipP?)%L>H4r|3L4`)7jSV-|!@)8Z6DFQvA}oq=KLwZpG;uD^^< z114=i*$q;q%$iAL@=l&m)oHAW*Nwfv#Wr)UF%yZz$7B1RxbZ?*JBhbZiW>e-;5$F< zuIGhJMfPg1c-3mXmC|D1ZP`vZ^(k2DV7KD{&MbKP+9%1(2OV^RBx3qT5KHP{cD!_m zCot=*?g|(8Ke`#Qg_+lv-74z{+3FzhmY7||x9*&(iv?aRzOmal<77`j!YuN?RWR)M zaoJBwgmcszqUh-^q^Z3M%R0ZS^jdN}ny-Zc-l`kjZdzGgd&egJh5%qRa?eMrT)6@J z>rgQ5I-sK9WN79Xh)O&B9Jy9f4i}oC7%4IL+bG;_W+z9j1rbgyN(7*=(32X~C9&1m zQD5YI*;8yZJra#uSuZh1<^-P+n8=R7D6z2sUTbLXQtS3}EYVw%Gy4lmmAtc5#!f;; zU$B+-QsaW~>91=~VpwtkMYPp9DV~YH1#%cT?lp7H;I=$WZ6vc z7)g!hP7(r2)*FGJs&bU<-&ZVO9sTUzRFwoZ}084(DB9d z%PxPgJedz}_5F9HV^SG26iZN*?n`)eYxJ#%-NVOEL$E#0nBQ2^P+bd}Z}ov>EHwQS3Bo%={^>eQ z))RiXKwllQ?%jxh*na&xQ z#;%cMcgMo3Ok3P`y%nJ;2Ni>R?B#0t%Hu@sll9`o0DB7*zPm+@n3+y<4&%%U? z?C)5XkZY6am-@H9iMkf5KOWY~cRoG0d9tQ`b-p{{es;{LXS^Uz^ZyeUr^_@hFhjqyi1&pfN>_CLS6r>$1q>k)4H=IarwCFTN0PEOFJ(rovKLL973 z(T6Yj4Jl36U#3;oEw10=!US3>#@4&Lrbvnqu3s3eqEvFUXC_WcR1*^$n6s?)Y%&aowI(*}$}`?q9FEE-%=;X^ zoR(*gH>nEZgOBaLGY$jD@`r2paec9WgX!{@a{ov)Ek0K;m+;S7y^oLP4a##(P!$;n zQJI>;bp^?}Z5tV?t)i6nIZds)@bmh?ryCyAi}d*9sv{6cXEiim?T&{mT~+XNcOM3{ zg-G0EofaK0#C)Bzp<^X$&pVk__CFv>;(7&gm6)2YNc*K(^zU|BxKSQU-eRZJc`;d#dXZ#k0UCN)K+E{xzOybS)tDi_TH_%RmR=L9VL5 zFB+}n@pg(?4e%Z-O;uC77L1X5{E40EFWVaaGR4X2Ut1)Pi}eWqQKIV!1t&Ki+Lu$U zWi7d^U&W*_xvHm&SH@4Sl>1lK*A?%6Qf==Du%)j2%!jp~Ssx(j=)3vP*y>r@wYmX? z`@~8y1W-3I*4vSP(sf_?SMKkJ?B;gpZ0Pys(=IXc>HuMGtkunZ@Abw?PP<&MS{o0@ z3zG9HX%o3D-_9KNC=CTM64hI(`QqM-WBa4oY%+6z)m7-@Vc<%P|A5#=%-;%_!tM(( zN77us;OkquN*hMWwF}@kF1$C-g|$a}6~s-|&il>%207&WNU2TvldRonv@GY?2Gfr6 ztc~7Z=bahH{=<+pOW>U0>bDJi<2Cz#yDd7FtL(uBNKxsMEi6z*^u}*6%A28h>OmAd zL8Goamj{IH5oxtQ@gXM-?E8sSYkh~7P8)p(A(B`$loKoPZ)A5UMQ=V{?exwZw+Cc>qk@$T9%&pTQKuBALb zin*L@jj9bsnqzCEY??2qzXWa-6Azp3Fdu}dIRYYp?t~`6;Lqt&LQ@Kfi@9+FUrf9W zb%Z8=17m?67DzljPuAefsU>&Oe}u#nJ_2V-!o6(aw+|?_EPk{PVNVWGFh}`DD=ega zI`1ei?)}pj@BYeNj1io(G`c=#St)zw`y)Jcf!Z9)bWBPC`pnDOQ9Eu4yoc5avoAw8 zR+x5*y>XLIjGuY_9VF3)2v1&)H;8KOxw-=Em?-g&n+oyq3EUjeUVftZm`>G09DTdz zD}Iy1Qz43_VXy!c9ADN1Xa-QeQ6ZKl8ArO$!FAI6V=koRO<;8o2G$v0! z^gnw?SMsaW7$P!D@%2+~=jW40<`mIZSEXyO-m)*kU2Ss>XPeOOpb+EEo8@G`BFhdY%BmFSrt zgcOAfNyIs~_NjjZv9r#V?Vyi(SRZ~dU)zUs?E0$9gJB3^o8gRQ_fXwmAq;zAg_+0h zxhOQK&_Jv__wdR;=9?ercG@}pjpJ8C|knP*^c zI%vy1e*YgDifta;8&1~`26{k8?6;VkwpTZ=2!xP*UP{2aPh7UjrxqW>0;@ ztV3l}tIlbEAr1{ebJdh*C?Vsq)=FrL-Y2#Q^+dBY*gwvnvm79s0LO3WB{T%@h2{;B zolh*_x{7N7P%<5lPZJ4LD%5YeKjUb^|BLV&|5(hrAf8UCmS7H&7}FRtYl()^9&rY@y*{MK)cXD2+$&Qz@b@R*x0zB+#Q52TrJ23E$f_R$05r z?z4we*?fA}^mQq3XKYu4;I{gFNn)5;{ZJ~Zg)AGu8kTDabbKIDLxsN#gM*haZ=S-3xm8epDOfJ@|*(8szx@$~Y}*O25sh{m=cOP-5Q5CnE$d*2PR!Sxt){)(M6fde~WiL6<6RE7ILIQ44C`!nMKT^>! zpp&7x##3H+`S!iuDvE*6qIoHl$(nE;X${XLuC^Z@$fC}lt6CrQg_G$E)4i0 z-ON4BxqCj>^d`+$`|SAN*L9`ctpxm==1)2cOrlt8syYWhbH81)oXs0fJFt@~1?u%g{+x4^y3M;~(C*thI*Tq?j3h*okXzy%l~&c^f^D z{r58zMT#tgmu2sSjJUP!FT=SojengClre+qU2fO2wEjk7%f1c|_jN`f!Q+}%g?uzo z-z)wxozc#{y02yK7-`}5S99-RAh(8(RFaE^Hq6-dSTv;>A)C<{B7pvbtfJXu${hsj z$lCY-^NV;LM6GvzTs8AHD+mB;i08p`er@Vn-;9_twK?{6H8b{Ws3%o+@)p6z^<&y?5)`o->pcK2;wg5gHEpM!Jyi{4 zHQ^Ts5&HpTdvCo3*5*lR`%8RdHxzI`kLpShIRkw(3wIilVei>326?h4Y)ZFaYKLXq zTV#F_{OWPwntQXmxJ{b5UrtQua&>Xlk?b%9Br2Tq;hRW?w02&F&%vB}bpu%qxh#E$ zkgc)_m-?5lFlZS5pYkI02Yu`%yC+Eqm_;Bf)4%Mjz1RtaLz;P54k)-_mV|=I7M_yg zp(7lvAfv^&2|{mI+9f-1CsD*8a&}_ok07!IR6ulF@9WfAu|c&f4<8<)o#)&VK&q4ngh&7 zYex**Ndn0aCnAM34ib)dI&sT|wbLXP&O7xS z7MGPk%MbPZDlTH=>vt@J(}nqVl91!C)+GNYA9ho788PV!@@v0~SObQzl4sUhArd+J z%!^aTb=IcL1rd8P5wkcx_+WAyXwzX}=(L*wF7-2Usd4v3uNYn{6tR~SBvW7P1|EX3 zwSFTdJClwQWeUZrP8_42_Zkb?A217_D0rUxnUE5r31@dE=4zH_ z&d#GweA@oa>bPQO?7guAuVKIDpvr@5s2J6I%KkZj+}a%T%<1iSo=79!WV+QP9?#ea z0k1d3M>OXhi&eq>-l%i!J{M%&!2yq<+t?qS4I9`-GNk+Zzv-Zk=61LH>Z#cZL@58x zUtbK~;0@l^?zpjc-$PUU!oYRruK^eBa1||1?tjDYiv#G_Q5(bQ)~7P5hpH{WdAHo( z>9!|o$%ScEVTfBrE2Q4gN9Af+K#_mLEvcId_Nfi%#0f6H)?Nfj-b`Vf%%V+)!fQy7jq>W z#NyuEw-~Y4_T+zN8jV&_8$%vPL&pBU`wXZ1*v)sBf_Ix4FfEzLNKgbc9!6XVdt-k> zB+F%n#w(g780Zlg?E;yjqyzW}Q#J5_Yf#O&&hY_fn_M$)xFn#eyw_%_9N#Xz%p*1s znvA6U=L}l4`dxmByDS8@%z(fC9x(+rSeS{EK7`y{gBE4j@2k2hzfPF-wCP`rjJ9kc z5qK~xrU6T|DyYf8k#x`7i1xO>+`(cw$i}qVtqLT$%Pgryb+hMFx^b{v4m%u@okvGp zfA)rl&>;bsw=SxT=nkCR0Xeg71p_=t4-O#MNs;e%8s@JMto(Zx;3JZU#=hY{F(f=5 zZ87v$Is=2aKi|GR{F7f}@g?q4JK5&;oMssN;L6 zWiNRIx^;>`=VGkW>L8D)oTXzv%;t(gOQei}wkI-H%M6RqN`MO@qaEG}C$Qhs{gn|;|nD>-()yQe21b1D)23M6|Xf3>_#GTaz<%4;2 z%D9xuOZG2y>npdz_%MaxYwzd?B3X=c9#P9*FJ7(mbUg2g(Nt1=I;6#t@YQZINZD}6 z>hyClW=P?nfH-}a%2GKv(4*3EDKR~xJO94{%E{CZp37znO47T0N6Rw*-vs5guN?393V6gaY$q6b07f@TETRl|NPD9D&nHuFobtP+<$L;9K(4C7i z{15VsA{ZyMj81ure^a{@cBiavuy(F1CwK zd_Jxn@pJQBya_mg!J1n~9l6RHQ@6gS;n}!UR#}6$e;1pl&fdH=sl!$Ndt5vbJHI``jt;JgMSz?4h~t-H3M~s0aH6>^t|MA}bG*T1`r2#2t5t*Rt1Tft zE|14bvQfTHhQkZdd|_73WgR)n;g_uG_(CYS+vnIqGYo7AJR@GAn2*KPdjDER5?#X! z!%^=HnsNZ|#X*zv@dZ^}v|uFcQUo3Os?VhDH)YK<3p-)Ld|qpeblTE~2!17}lfT~b z!RYKp*KFUaNe`~=y^Qx+@7c^QHMIBI^^UjI0pQ(Mz3kpe2OT*mum!vQKdRn4p6dAj z13kw~W+{7>P?;gJ&LKr5E0xTntdPCuF^bAKL`KFjLxjxCLo%{uZ?YZ7Jcn~Q<9>X< zzu&#T`#6vONq_V>Z?D(ux!$k$Mgz>fgVqDMOSep(luOZ8EeDw3+)+5hwGBwq2brl+ zJb!3oKDrSb`kp{kQP3QAMDjAEXmY|=O&RP>5y(398qv2O(O1muwcl`Q#MRg@KYUmFw`PWi7tn2-ErZ`n8XBcZYwhe)+>8M=@5tnEV%!XAF;V}oj zC%5GP&tD!9S-^$OfrLYquHB!VQMB`URYP2OG+u8i%SRfly)&2v! zKMwr$xS2~G42X0{v!=SwmM`eLeUCU=YU$^fNzWh%DiDDJ7oN12&4McZygbKnjaOD; zFXiCZ0Ml{cAhdkO1-KtW0oL&$JUTC?tg@~G@1#^D+g{l({EmVBlRj_YAXr7xywP*C zFq3?8YK%ou+rPhamf}prNITxEMYV=+!)+*e&daP*loJ~uPhPRaBC&<|5#U~}EeyIt zc=rD;|1PomKHK^5VFvb+&c)uTBE76Kf)sNIU+cc-?ZD43A!OKA^@Q^={oCa_9$xU3 zFCaDF^>!6~X+n%qfRaN5r^9kQ%ioCozJgzVx=K}S}O}(A{StVDXInEPgEb%qa#>PAub3HsidH50_CSfUB>FUvz0-On6Dp_F26V@ zU-Xn#6zp=Iz3A!U6I-DTno%mzVB5Q2&cCH;1?z2v%C>YO8C35IedLY&sh1E(Y=8L8 zuZLB6Us(6feY3*o({6h?XwRp_G1^mBo?8>epLpe!0XD`Ppeaan?JnO$%fZ1b0L42e z)?udLF={=XS9_7;qMFX==OEyOITm(jYFu4`OCoc27}@9%60e*ClDrI?liWC%yW}{n z3hR(^u`y4Kl30B^5Mi8e!5}BGX@xV<(s=&>wZi>W3`um7_!CeyXfQ)1H~Q1JBL}K> zQExKJLSHO=-43DVQ%gFUnNeDRQzFJ$tJrrNkA3=nVrH))8&oOVhpGF%38c+IcpLxa zw`!V@yRYX;eneqDMN3DDzt&J`m&((M3zt;z=-`5k#K>7OEVh3?o^H-y{gdT?q@=R{ z*62HZvKC}N-+IqLbh^Df{EqYc3nU#^0`gi zO0QYJn|nhXZhn;9;K4dOkZD*JO*~#W1$i$cYXb$htr<^8SPuK4$layJ*}9Z>Lhq&g zLyqb>F-5{5F6GVS0L>8kKC&74V=P8txyKX*!9>Vjpd9S^=ySzu_Merl??$2eq^g6RT(_*7_{74Ta zMy~I5hDf8{ZkEl5mgRea94u=9sp?2MIs5(@WNZI?otZ>yF0^VhmQ3yhS*G5KdHAD; zT|d5P{WfS2eIiPTnX_HzuaMaLTFYj)^+{n{-~OmI%y-hc+jSC&8~DLyFOZl{u{DU) zQ^V10*Qohwl7G5eV>GsJ2Xa+tM0Or#x(ck6qk^64ZOtzyOG11@nA}Dax?b)sMYT$ky)q7cONv35MhmvZdD18z28+vgfh6fv$?rhb7EJv=D1eb=qmAtqVe{5x$TFmINI*~ zHy>!arv~S_KYOcByR>BApPYWjSy(A6EPQp@1{2eF$K*C4g8+5D!j=w_2%Fq{2<(SR zU#!H*NAHDob?Z;9cosZ4yjIi@)M_J5M*s2}jSx+TMncvZdj5uxUDJ|0ADh1_%bY@( zE;2|Asbko=b~lT7D%4Xz_ds6iw--5u=1xRg-RM-+8LXC|DETF>?3}*+7}|UGkcZR; z|887GXY05tW2YL_n_nlrTHI5S{9|!Y{72d*zUxBpWXG2QCnlHN~9LyxytU$x!gm;>MG zmnTPq3v0D|ZIZIVvwwm#v?-_Kb*KUm#aH?mey9%qRVRI1BX@fElad8rBJ}D=H)Bz= z6x87fIv2iw&KeHug7R=bMmAlX;704y!Z-dfwvS0>RKTe$O@#Tx?jnIRTPTn0czvOn2g%lSKRaQt|KMl6({iy z_|x)X%Ii~HESVh-BN9?@@EOW9C4k~hByRi#!^l$38U8>}#7lM~XiA+?S zAFp`Q{1@UBYl`3zWlf;*^khPkT1=E*`{@&}v<+7^X+o;^MkxvBU_GAsNw+cGNziPs zo&;uh1-J;S9^X(bac;+glY3>?kH*{MEfmAInjOtwrGUbj-Db(;h|Y2h6RTFIuF-$p zD%}u3<<1)qiv7b2;*F!yMs=vID(gJ8Z57K3;4Z(vbcnbU=#e;*kzEg zLXg)(`g==vyurG02uQ$Bkk>T*!o&369-p*BS}#uxr%8kcVv;RXi~Z^B=<;SpH)I7Wc`OkG-&}5xpG(b@y z`w%hzIk{a918Kw}k)Tal3d=B(kDYs9Zd+^P4ukiRbUVhZS<0G@5n9C2*ol zxO8zXFmjA$0eU~BYLXtl~;k~~F@5 zG%x5?2T`(N`XRBhs_kr{ks-U5%!^t>X$sl3qp8}=Xjxp8fKcpgCc;G+9$rBmI?78} zhyBjS2tzB|qiX5$bGQk`ftNE1ET}v;q7c5L-@YTTA)PdixH!|@B7U{S6l`k7ew4Z- zy{S>pl@}9*fHM83PR+2d1N|jvwZ0Oo{FBdS?HqUvkAD%9v+`Q@KBIA>wH(3w&3DQ?6(SX|t|3NB0Dko6~@(yy0UgI4y{DwCIPUet+pmZz% ztx!>T06)SHCwmfh8@v6ilpzuNt5B^3kG|jf;`HnXHGR5Hn8vcs^?3qgxMsMe{bH12DSQKXM z$~(V#WZvo>|4+!S=LKS_ZQxIy>(wZAM_j6C_ zegFAxV(hcVKFffe9JkN%1ETPL{BISX$5+q?UzNRlMc}WsD*W;-8uN=y7avLjs3FmG zkFiY9N|PZk5iA}`#YUx?1is2!{rLMYU>Coh)VVzTJyr{K?|~#Ed%@7Jj*M(k6F8~4 z(77^bgXjw;No|l+XkD0mK%9#_waLVRHv8*5}=AYX!igmx^%LE$F^{jP;L6hHj`)EY8?gxiMi#Z8x*I6Xen z6YRA6tCTmx>x=UAUtQgW0W;jG3vk_9zX;g~T*<&W(@GEuabq2KV=525#yc}}JgABU z_XW%t^I6*TlI_?lnpvLaUZQsz%UN|C+0ivwSyhkVYvSZ2`Hi}d@3mWx6CAu&R{1Q( z=*H5BqtQe;(%#&DRB4JPyJlQg)uBQ_+k`^Z$8M1X9~VOR3_%p5E$ODoC~pv`*{&uz zMs?TTnW`%EUicS#(8Kvqwi-Ga#R?5Mkkn6KD-S&DTSSbig8!ikwGEy|g4!*8Y>k&d z^N6}MhoOi^-4K?BETg}#axNyh{<+BXt~PHr`++unq)Y*;ZEjTb!~G5l1k?HAOytCVs(_6*Zp^IiO-8L~h+D{MK5k7BdB@Nfxo#?F+_txz zQQ2$>?=ZgFd=x?h*G^esb)Ht@t;rR$Wlwp(!{v?FHT&B+InaR?hJpIO@(&-I&wEMk zO`VmMechCiiE#EMHl@PB9z6rk*3?RdcseYVY>$P|bv%u;*R}_2OPD}yV`fK%)ch=0 zO}x66Kw!S}#An{W(IN2*tYPK6#S(ixNCi&)zR~$qttl^%E^Gyn)gGN5RjzawQtf4295e0Xc;TtL66o#G3LyS_Gq@*tJKN$f{TrqoR1jQ^F z>-`N?MhvHCAl!!2c9}9Wxs}9q)sMOB3J#noSj2yh3HfjL)*6VBAFfR92}@;=ftZmH zComlJT`Ue&z9udph2J1Xm}JDA9mzJa5zR^$QHJvCzgfF+Vl)8+4!TVb*6YY811h`k z(^*&>eip8U^uccY8}8aJ5-~U}oi|Lcv3)jtYT|Bc*JRhS4l12WD=D{^S_F$&|O^p7O692c5aVmYgFgizMUkJ?4xmDPzrtQ_b zv&`LLP&e`7H5{D~wP`w}mFB%A^+>3JfV*loUu)m;d+OIluK18AEdqv2>e7rX=hhPF zCPFy{*4#k)T=ZaixB@ry6?DTOh{2H_`b zZvx~8MIpIL9}5!qJa)4Lf|*>CxC|dn(uq@UV~XC{T{bH!rPJ=Myn?m3I`PJ;P<%wZ zUB!!|8BIv}X;-ybq~e{g5|b6SD(T_^8nJBat?<>%HvMf6J+qB5AcjY~Pq97_XzU1`8E`BQ}US;~PXq_C5K! z|2fA)S7}~qhLc_Y-`0nNzVl-$jIsQY7Ox=Pm*?eZ?8cdM2@%2h(gM_yI3KmS2XAEBSepZTRBx$Bsh zaQ?d%#&7}i)`F^neMUXx;|t>yqIE3NNyhrsg()_UW?R}4Hl7t$lnDhnhw9>i2AE7Z zM~_B-_f_6cAazk|6 z$I?b?%0Vx4D_8G*o!X;kiw#%qYKtL)#)rU9mlV}g8U%x}2C9DKAfG8ZzP!VYz-~p> zR%unPx5Nx0&c%%C8zff`8+L@D%8xuOF!b~ryC1MyfD>sVhsmVg&dJS5emvTpy z?{2OB8%j0X+LiUIzw)Sbw<}2V$J6T4YDJv5pzs(O18=5$gi?iryZ-GmLAlY`;tRFQ zgG{q8qL#+R-i++m0gzr=r5312x;vlopXp_}gz>3Y=!iuWHJ@*kXB4!T=P2c358cCP=|}h+e?M&hh)lDvuE&u zL)q1N_ZVgBx4sDu-L>??XmdF|NC`(`3vQo(%bAET&tjVBlXskDun zp!NN!noAQA<_A%B1D&+HrE_R>I!gc*vU^au87G(ACn~d2mF6UAZf{o>FlE>~&0jfy ziPB!_z4)z`x+S@k_03<$o3H+N7rZD)}KMb?0f2le!dwAqzH{ziMP}p_Khc z_~Lk8B(nhl$KU}fv%-KTSg=#-1Sm#;8{~q&;<-EC>;enD zjp6J{a1DI%*)|=#A_Aw4$y@JAiDHHRY%2F1JsIwDZRQu}DK3Z@VEDAfq!Zk9wB?j* z5(ex27+jPqruB2K_W{%G+=AGrbDQQm_NiY}OZoQHyNpyMUc4P|3%UuVmL@eG6|&a= z7*QO6hHCXMte5=zlnS|Dt75%~n|L#daL7c^_cqyy_(Pus_|Zi{Iv_+GW(|B+r{lX&3^BE^v}18?MI;-a_dUF?fF%R zrC9_UW|iG^krZ8{I>cPvN~;jAD4p4)^jOR#p>omb6-~Zp%#LPYa2lAlj?gPgGr|pJAJxXF6e|ImttdM)V&tIiEFZw<*R5~aD&__L46;L}cmHtxS zRYD{x0n6SS+Rm8_HAu0u7ak}rzBm7?$-AzGP>&2ch(h>lK--?|BQq6*qqS3Po!)%)RodTDnUF)6w~mO8DV29ds~z6pPdumcx5uwD=1AzDPnl1e z&BL_N0$O15Es!TpS68T*pCi@NRCDYcpt&<64duCNU1O>(IJ6qrP;#zg@)lDoX320xts;nKOS zl9SRq*BGFU>2Q9BUa2BW^cR`AIdq01Wy{KJh;2On&+ zS@%JYG$Ztc#hgF(JuKuq+0$`ckv7w}8w4cnGcA`n=E&mrj1XVHBHqo6grM*SJxTfr3TrX?Eb1%QMC&xuyE;LqZ%_?j3 zYLRj%A0a`mRSCPtcf?TL$+A{^{$5+b#<`nDdMvn~b|7_5qdSO8sKq7z#@+t7X(TaY zTmJpwIUIYI7~q`fj#7_2>QX> zG63f{yghw*x`1o`-Mo6Ly?!QcY_fJNyyN0|S@Ez7sb&|E&ktV?7^QUoys0A7IgM7i zxG9E1ZNY~{MtQd=6O<+a9d0u;-0o5_#ex#J6LqrS^t*^MM~LctKY)_gve6yO8bxjr z(LlY~)+k1kBG2)?=VO%H4MFhN0Ou97#5-@O0`4y@;kCkewhBM6eMj=orWY>= zv2-(C=k=nGe8;yfn<*sr-A(=P`-|~BY+t&V3qz(=i1j_5bMy_MU(K2dp**3GT}RrX zNLR;S_VeD1#&|ci!B*B*mhZh_9WvMBpo|%P2;$~|-0qDlML~Sklwr;N39Cz@QAD>7 zkjW_Z(#Ve@Vr5~bHl)R4AQ(KP;t0n8Uj=|bQim{|uPzwsr_lo<#`k3j;q(957BfmLi?{PdDhwTtkFOmJ8V+3&r=f9Ie zpAH!w3y(G4zw3k(FkV;!$I^dU=8^jJHY1;?qq=cZPEfI>JniXSKsD|Cng9g4i|Pe^8U_>3+}!uANHZGdhcDzG&D6|g+(+Cys9M@g4$mE3 zoeqj{d?amgFS^Y95W2aY%+E8>6wP6&q(yGXnC*z_)#T7HEZ@{22dKU3(S{^nfTC3o z)-x7wYCYh6-uOH)S6tL=dF%>hHn})m;fiEeGDU`us2D?+E=0 zMTeDl=}I4m(51zTbKgx;zCKN&v1q=EF8M4#7>x~b*r^OwlNBYm{=K}(K>Wo@UP=&m zH(Wdkz`*epH<=I#ocvnG`0b-az2@$i*g*$B-2a97^SAxpbSM~{3y4q=%QoeX<_mos z?;T;J{t+yS5a&|ot>7gm2&(fc@%}D?whiQHAZgzUT%z)_S03dds7CtHG2pkt?;g%I zw9ZV8dX+#f6j@YWeDlr@J1Nw7Xa#2WNg(2MGOGz`y-|W>!?0T4AARZ1R~yOMEnKBIp@))|WsDTDC|H8udB0@ATz_7S1nR{MJk{xHy9m!5vLYQ$&! z(4;p#bQ7=xsz;t7z&@?)(HbS{`LT*#(TNeIxo-6AM|>JHNry^7zIq3hE&5iU1KLyM z0`|H7sjPL$ppaOl)nfZOncvEN_86h8rX?i0TKn!R?Oy&Kz;V0tODS8$nM+N{Gk>nQ zYyIV5=Gaq7H{ml)Qn*UZ;xiQ&xRaSfqcmw#aUpbw$`*7jo5SF-6O}30IJ{(}^V(OI z`a962kYup*JbmEZM+HXGHFOUI;lC?&m_Lm~lAO4E?i{?f-shOBz9C|Bzl+9h3H(|V z-cuR{_TM+HwPO3%ofju|J-thF@{h{CLS{L%g%1H~p=biAI}c%aW$S*ebG37VwqTdX z-y!9@gU7U&7ZBVMGY$6}1AI^)J?^ZS2))kN^lB=!Vxhm>uh$ej9@Sguvx=y9qWq8C zRZf4N`3m<;{XuIr-DQOE8Fg!bpS!imwsQ?YC;-BgEQ;4xA=?6jYhjW4MH^|Dpl!G0 z3GbHAq)hb}Q97)?1YSd;pNO$6KOmJ;Yiz;KcsKVOkir%`;)@cQk2px1FJ?GeX z3WnTQ{oa&!)ZZH|9klFmI#9*(S5)Yx^gVDl!<`1IF-~MstlDaOy0mwDp{)pCkLWZ2r2gzTj?)*kR7KO$&t^H@HrGNYA>DY9uT(*4Ji&3Tr z&hI#5K@y0()VVTEUUj}b?!9#Mo{pQGI_KgH>W;>|cdL(j^5UePeZ@J__opBA(COp4grqdEgoXZBMra{4$4PUEZ22$i_MvM+wcr?=s8AJ?7AK;M}@?~X%1 z`|tj$(_z!}=SN!#)G-oTsmDx?Y+du^!RXr}57BJQ?Jvr_-Tg9pjthFQgYuf?4I!7r z#~!x74TvVE*<*`DBqRA|t*$lH4_FxyQrYuH|D%|M>vkaDMXN`Es{j+NaM=~uOkzb~ zJS(;Uw;?V=3c%&kOeEnsfR+qZq3oQrm)7}R9mb_-JWR75=WQVW1(*R!ZS!PVWtaRH z-DOg~nDzJZJHhr%*YU005Mw|9d*?e^nRnD{G86g~J=^C*oU~TU6|}hMWxjEr&3M(W zv(R_Q5mH)pwDQemt2G|}m5;|SB5+yU?D^W?r4-qOQj2e@-`NE=;=L)wjhlZaE+1e4 z8Renoat(1LZt;e8&4#v9{Sds1Dn3f!^hZ}7wKu!EUgjR8Zc}1GvX0n=ej)oRekPB@ z?=Db#r*G+q|4N)5jb znfBfZYki3(S2K60!_mJ6zqOv+d%pi(?dOOIp1vR4D5RnRP9izzGJ_5Hg zghK=fL;YNX88Qfg$eT{f`M-J@>PEcB1IQsyZ+UeuQ@V|x&||xVlfT2p%LJMXKwWf9^0OM#A@kozidDEvEL(8=PiPmsUl~qbUb-7S9A9 zy=8QeGI3o%Zx5}%4=siwcxq3+TvkR_p&8Msg70Aib9hclzd&?6Q4*P1GYY`}V|cLt-lBF&;PLZpj-$0Gn%^7j5nI?T zr}7(`sBsNx&hHwJH&y>me)guV@8J+Mj!awqv`G16ttH<3s;DkQz4AWK{=d%q|8s&d z%pHOVi^}`^DL--m@faX&XkaY;s$XGK;1bvie7J`q7oKX9cD?A2SwEef;uvAw%4U7x ztjHLBHP6Z{GI0nuIOs$==Jy%36LE@6zx@ue5LW{bZgpU@uylW%Df0tzVNDQmA|F>D zUipFA#+g{_GaeB98{K(v>9)_Uv0Fbv&t-v%bg*rv{yueI$&wuxFE+gmk2q=PO%qlu zh~fS%colviDsX{pvVaJ}51W!bh2TAj0{%BxNlFUp!OPVz+`dX2h?3Pa=OTv&iPvQ# z6}=TP-cv(ZbH#e>RL zX(fhjLpDEU-)N<`qGi%1|Im4Muzsr@{8N&C?yDpN@vG$Cm(UwZ32Cx_jlB(emD_YF z&DIL)kOR@8z8dEoWu{k5cABir6T~Z&c2>&L0r?bFKMUWRK=ar92(DJopYA*UQR$Dp zb>M7vQMpfl6~H&r@$pg4nP|t5b!JR`!6!sPl~U1FRZ{e`gMM65xtU@IsY@d0KYAYl^gM7IWOoj3Q+G z+p$>N`uwxD*o9|qF_ItTQvCOD95x>;2B^l)W{h1Xqo&AGD10||*W5CM(BFGFZFssJ zpe?EFXJ6dIZqP9(_OpB1(`WeCFZngvIi&~n)aCX87yJwSy-$p?x-achhpV^ZM&EHB)Jkfx ztb0!78zGhR|BhRTHC^8{WK{h?%TpA55v?ZT4US}fVtBLl!E}2&*zVUA>S3Bkn*8eE zAP*Yi_`A))R(bD4dZD%8vhG>cB4)RD>l+*9wn+c@6iv;E4SIbv`(C<_+r0N7`m#^g zz@qjmuhl-Ny0Uj|$dnia=R5V&IwG86oP-h5n40ukbdB5V2RV(t$PD?_zUNeg#(G&t!DX-u+G;2)y7O&R@ z4xh5PGSr!JEZrpuK###{@&QYjDXZGa3-m0a9EkbEy24scE(4r8w)gvtFJHDiGa8F_ zZ?UG(SiF14GVao|OKHegQbIg11)FiC2IHYu{P z>R+?*-DP5#a&B5Rf;I_2i0Uei@L&RlB)H={YI@&G;Z3>v%_l%!%{ACa@6@Bu?Gab# zy$6?B;PAqeKdU22^qJ?%xA?sftM*0duJ_EZRRQwjams(;yf~jES+cY2k*9#+*rc zVb(io{*jdrw+z14=EPTjB)<9e#mAXYeY^a&JnnptOT(nxM74BdFyP+ns@0M4WnVLs zoC$@yk>P*^%6w*lGBY1nKMPcCz44PxNLO9K>f=D@g8?8(7fEyHup|+Iz1|usfNj?X zKk_@!f45|9V@^CMxd>A)4gfDObRRHgDYe0`m04A9Gj^sfXKdCrs%8%abS7lrh0<+g*G(d5|K*!f=UJ(GTGwhn4*r4 zI-tJinKp*ZH#YQMk*thu68Og_U%Q)>vM8*hmvS16;wpMzTEDogx%x^dHK_g}vf}Z; zmf%@gwcg)Xv^F|Z_66=w7z8lot)tt9P6VUUUo!1K+rwTj0%VX9pc%R@i5UzLU`)dV zX<@pN(HPD%S;UT1LN2uEuR;}{+W1H(szp2;-|Oxk#+BR3_r28IG^ZTGK2r$MFyd8M z=Gu$2Xmqq{OYfaeuCu|UgUf0scv|33y* zv{TMu9yQneJ8uuTqO1xUz#=SP)!Y^t`<*_);M?oG& z*}+)^fuQQke358sHBYzkEb=m`z8a2cxXs+jr0b{0N1d6{@113h*W>o?f@qF-O1c>V zr59+_t0saIwNkdCx)Yy*zOG~&`UfN`blV&J8Su8RFCBJU$q7}bGd17gsu%!IboZZH zQ+wGrbf2?&;u~JRgbH)UD);Kofu|D&y;t&Px-(TVQ3Vcvysfc428miR>%MdOO zP;Z~p`}b)jRu7|CDSm`zpzSQSA*7)7De988H16#x)DN-aai-0A$8J(8xGtt*=*4oVyfusMlH!S5)}8m8Da<~~J`XIm8IUwT zJqKQBg#eKM|I5-r7ejf#-@C$IGUFK^l#R_*Q_H6d+K$eJz0gQ3v$uC@z0uaUcWb_Q zd@nr25A=;4bU$kNwz@V;wLitF)p>#+vb4|kia$YV_e*TXyFMxHW6)mrUGmpFrfg%& zd-Z*7)>Azu-=LU6fw!v9)7lXbGGJUE?^1B9^UZY*@gJ#Ah94vK@&$H_bbH?PMKCe5 zKC-XK$xzK#>E@&3em&Gt^W>4T$EOPXQ`pmtU#Hg7Ra=b%PcJ3*AYyHDC+m)k%N@>K z>{-Q+__gbRJu3G#l;uniiQ^4RH>6lMN$wx3Vo;#Os zns}Te?}YwnUgoc+qRUXEbv67&qP|rU&V$y@SU^>i_xWC?ufF)Ee~zq#IC}pzeYZBm z@}-~122WZy(g}Z6g<^l0Sf2jnw z@5O|Io^Qp@g4`Vo^aOk#>-F4)C*Sg>nlx~cS-CmE&ZozMWXH}qt81yt_kYZzhQ*;_ zgLk?x&@F?MHud}K+JcEG$K$VV?4S1pnha}z_IIip0D_I1O&bQ%4&_9Q5*{_3OqV>e zx60AwxVBo%ahmW#*5EG9r&4&dkjeRxn!OD0KZ_#n_9;tWJ0F4DCPBF9PBpW_nN71&??qB>ExN>##c`>sRs)^#^Zk z@Mi*2GUoQpIibE=jes#){_e8{yp@e;OWZi=g*KB<2O4+JLoRYqDw3i(;C zj?ssIr5gJyn9EvGyJHSO%ZcBT4N>KP?z>;#2q<%{H_DQGH_S^Q<}zroee(FQ`kQX! zQ&U9W@6Y-RORdU3f*^m=Ta=a7Jpn+uuF`W1-$ngH1Vn&y0rW3sEx8=jwQ##~oYGoQ zk#_+aJ_uy*P#g3(DCeVY*1@?j-7R7lW{vLs5|3=P2;CG(1X6aA*TmD7m7%qFv5GP1AWh?m{p)cuSop#G%CMl#R9L4 zPUA$?Rd8iKqf#e(Zr?R6TLkf`nd?1=17-@AZSi$NTu*|C_uXHkz`*B`|c5$8Xt{DkP_2 zM4LW5^@HitFtobewL=gfLceeQg*X%|JXRhJx+-lvQs&^gvr6N{PD!<>-c#;fnEmpN z7E%J#8mW{cuxEo>!fDa$b!D54`Xd=z(6kqO{$tNbDRq9Up7O`nS+9e&CUD@~BqTm@ zDLixow33Vr{g=$jf6y+mNS9a@w6YUG9XF!)S`qqNtowWlA9zu2Zip`^0lpy_j8)Vy zp-ap`+ONRzOVH~Er|8~@1=4jO-fw7@o4yiuHwZ==cbZyhcyp(Fu(2fm9j_}v`9l5Y zdm{K4i@VY{N2{6G1#ZY)iGDIh@nesSUI|FlS?%qsOxSKUJhf&FU>1CM76%t6Z&+R@ zpXaQg{tA*-A#cCDeN^Fq2SNY*vOH5pw&N}Wv4dxn5zUWU<0nWb)#2hpK?E-jb=%K} zd_gex5RORW$~%LeOD%)wJj34=qdIqSI!7NMs18kT4^8_{Z8Ui) z9GSJ2uTN5E6Ly1oM!t;ZxKLGu1cc9|_=H>&d>P)mw5bpAy0`Y5wwCzJF-s*b!5sTB zWMZOP_!fQ7QraPntpogxpHx&AR1}Us{yzfA=rFy6fjH;_h~I$ru}?q};xzE=T43uE zROPAC15blBrO^f-yGPGug`$K0dn>R$8TI;UVpzobl4nei;{hZ0iu*l5pC2KW{3DjH zud1ko`>Oe|wtnrG@d->CJUsRv{qd>C3}GHQF@2j+FmCAgz*_D~yEeS3i85b~jhjZ* zH+k>6c7$@Ehv*yL%!rV95RlHeNdt-q?K3Z*k6)DUmB97fbNK?iM3K-!-OB5OI9;n2 zf`xuhr2T*NtXbjzrQJ-$>-$y9yZG}S_W$)+OwN@3Gt!M+0VGGD+-SQQWqv;Ji#JyK zn7?G~OR}A@3+g#DNQ=?>$ib5lAmAg3ZZEa{A$K$a7^L$6{y#7#9~}JCS$Ley0ZVp| z(R6@Ta#eU_iK$q!AG188_Z-}fDfsA9((rBPb+2y!3eqtCfPv0P`t`ZnH*MxZ{%9X3 z=+`eKl<-&TO#Ei4RDe2dEorJ~9gm5^@~+6*a@NISlab1!!pNg*YEDO^>0(}S8P@IN zZT5$CU&i6nx0@K`?J*0#P5^Br>`WV>T2^Cz24!X%@PAmP;zjj?R~>knNQ)1wP*#pu z@`i{N@$B)Ei!WQQF@`e~U0;7MvBDHeoo_Y|LIa@s2{iPJ@(@=m*yK=qXUJCU4Jd@( zh5h|y?t>I_FBP=@7j5ZNnZ^RtR1|cTCdD7Sf4WOC4VxCU+-WWVVA_#oW^tkYeBv>% zTkw%4^S$mEnzE#?=J5GovY#`|yPl>jjd{#m(q5+4C(OkgI?8T+9l9B`}8R*7)t?ep!{&8hrOdH>|{N zyesPmo(Hk_@K3VZFJg?e?8fVi;@-TkB8dCD{R`b0`6sx+F`s9>VI;OW)W@UR)7Gou zVi6Bj{p#}SeBR;8kvZe+>{$|W)<^$-Kg~Y{AuvxOCumBD)@pUQ`TwEoEaRg7+I7#6 z(kN0AgCYz{OXq;7h?I&-haz1{_YeXqB_W{1fG8o|&43_X(%s!P3;9X5P$Vt#z;KzP{JZ{y6gsw=gYLXRr9oaZe(MOT&P1z!u|fE@@7QCDm;OD}j#D z?o`T2ZYLq&WZ9!y+(uS-k(w#pnYPa=gN!>D8l?6*oZf&4H6@g<;pLJVG}&U{WiC%V zRsHxiag&8k*^uzR0c^LvTt*NXN(}lo%TBr9KE7+_70y?&(fD*sjaDVqz&DB7miLu_ z;kQ;6fQzXYuhAH^&4#>8nxWr?NzqkpVyzuq5E&tx@xiZ?3*(N9ujNF2bO71BF;9s{FnwKhcgI!xL`6QsM?|Z7=HY)k zmOH@-HOm%^?Ha2Vv-TK17r)rQAl#C12y|zf{C4wU?&yehgb#2}iVQzV;Dj!Z70O>T zv}%p--#+XZERjk_9;(qjZ1*&1(SKQjWg0F-Znv!Fg}dDN-^d`Gt^8L{*9+d?F58b4&# z&d`W=tL8vap|nJE&Qzfvgvbp`h9kjy(AVa7j=~>4&#iR)nGc`>{T}?d@A3}5<}A3G z4+$A48f}Q8NzctY<{eOnN{8WpIful#Z|M`UHFuxmsUd_{L@u6JnHBNq?9GI#&0BM_ zn#+hAzt!n0fM$XNL3b&B8_FJR6xLI#?$+~We8=~Z9w$uOi_z7O8FTm_sM}NxPGL`N z>;#R7DJZ|lujy99WotAd6_2P?19d27W(Q(dd4dL(aqyWIl0Ungwd{}uj{r%Y(Hl?~ z!4J5X-gy*##;&G{-N*+@l_q7c$cCeTG)=`W2)W;q@3?BCx51qFh4GH;`^z^!pF(B< zL)UQ$;C+RMGa;0@K-^a^iE;(L<|b|CC%G4V10?^1-HrGWW2!>PbT&mQF;LD}c(leX z5v4AEF>7hQ@JVtC&Zx(203?pGy|Ac3pfr)}U&^h_9$i#K@75<`^$qVrLg3tVY}AS= zade_)!$vHW$Vm^swIjfdx6k<(bTgYf@0xzXy=6oihhBy3mj24_^ep*+4j?~?XD@qh zeNF!UGic8nlT}WrBroUJ?qb0IwW$-&Pu9+vi@RskBv>W#V*Ihz}-q{d_cSZLnR506se;D%O-0r zGER9r?~ylNF%1Um1IUfH(a&#IDa+0uc0z~g=Q&}@)wcd6H+=ZCuP7~vmJ)40OnLY{ zZ5Zw{_n)jAxk8l^=vp(+ajJOWO%d~iYb42mV?=@q6s*N)xC%|+BV~_c4bkIX$Yx;r z;m|7x1Jwpuu3CT%@fP{x5xupXZIwTyMr!2aKkr>&Z9-^A-iOiS7ryYwv7fQsYm2#Y z5{4Sw^I3E8KHDH6vxB+T!tmiq)q7Y6Y{r$$+h%eRA6DOPwvHc+G2PzKOHO%qYn!kB zt^!$6GL2iQY5v6h)()4&QmWzi-ASAdIw_y_vre7yy4J}TVc#!EQPKM)bFe18#Fq~* z1{( zn~)rS7lXh-a=p$Hmeph!!LOLc@F#b52)&?a-_-#JoI5It)XvOnaXU%gvuUN0ni)>- z%P$$E9~e?yFz6hoAcI;3t5 zi}IL=4+=Ix7DCrMRYH#c19&^zN>k-urIPjLke|L>bY7X2_o^w9LhVN-|7EJ}HC+bvdjf!Atvlq?= zA8@*u7S`YMGa>}(tDWBXG1YgU$UOW@-Af{DIt1;jvS-oPVwT746XBtrOL#bVzCSEG zo+rC{TCEaJlaEALCjD)WV|%ul(qQg5$zu^N|K4ar;>v+7&dN>pYtknHFGO8wdF6VB z^+A1k@?ycq$Y<9O?=JJZThDsWIi_&tdX;yw%B@^mwtBQ5khCfUxAaimc z7$hC)aGRm<6#0gp<@Wr{(r^$T^h z&pk1s#$@_`(QmW8i$ra)a5d4DBpDufgTlNLBB86|0g|O=xSw|I2{&l^nCJ6oG}1mZ zmL5F)!Vu6#=JB}dqzn20uUb!lA`6oajA3(EwrAID5>MNHO79_Y{LE?k?z-QV?E}D( zG64;~lWfwJ=g0mN*iZF!A{$I~noR8E34bq&ml(#+AYJ1V{5pOzHHqOKo8QuvR zGldaxcOXx)q7hZkJLX4qvdzqyez=AoP98#Jve>N_HL&w1(G$O`pD2Aqgp1KN2;sW< zIAPH^QJLw(anvIM5uAqa?zm>WP()ZsS6Mw69S#LdGYs%X3y|6&)|7>+iBzTpeJR0A zBd^mqpm(J^MrFmwL=!Ujgyke;Cv1KjUO3b&MbhIB)sAm!|7PZ(F%1zLeSz&S1boi#o=WH+R8b zH{#B^IxDVDy;g+qiA(*c03cvjLSMjjT2WFG()r;oh>D0rv{zF3M*^h_VP=JgzIHK5+Sxma_FxMcnw3iwTJc?sgGcSdf8T8H z-i1W8kA@aETLL!`JrA$4tXjwXIk=rtj?{Dn`2Fy9v)chLY*!?6Z}UJcdsu5_rjrw1it2C*4YdQ*{A4;Hblv~Ba93^ z2hQ=FDgbp436$GDXM87_E|5%>`$Q_dXBYKhQ7$9xJg>T4b?^M}%l#B2jJPpwAL-_$ zqbw6}kIO&ODbKgJmCnE@$#pUjcBCdK?h_`ZgVMx+*v1`I@13EGPF89Jjtr2^999HCu^ z?l0O=U}XIZv*lnll6b-Wj2KI`-3tW1Z?y#rUgxZ|=f078J3ox`WP8e5?2T<3S4@6v zhM)JK!0r?c(PK!Rc|a%Xv5Ne?tGC2OSL{}5i7_|c9{vR0a=vq%Sy*R9;XGj1L8R{k zOQq9c=6eN*avr#8-&Q%~PH3RA@od2c903KSSN)4?pI?MThw+6V(I&7^z?%740IxT6 zjI9Ig^uG>9Hwm&E%l3kOXhfRHkb9yZ$0*WpzFT{qt#e~KB|%gQyU^-#_- z%Itna=p?CaISv-^TFivCk8R$ys(LxCQhq@lo8W3C6@*WA_Zce6@;e7@l13Ir+3E_T zcfOjG_2XC+ewlG4{oD;K{t0ad%i;EO>;s-E$vt4%a&3FTSe}7P7~WB4^Lwb8QXvjJ zw`T?k&$z)iI=YpAfi}keTkIv1feOkbeMA%4v?b&#N68E5P^~FN_p#3;UokhV6zwL6 zKAXXBPEaPR$TwG#Gj!p8=4dob z_Ni20!%A^rsYJ%m>S8P490$B3KxCwmb3FTFW_S!){{S$&PC;Ua{xye$Ybfda@WBs}?KaS~XLS*FtZMdAEkho#V?(LjMkiR2{BAc7~u)6!YJQ^<8SrN8V3_{$OLpFL$DWak`6r)|zA(YD3)D5-#xnBl_S)_6e~2|k>j_8hPc(R2@cL*# znyv^rP1hvXAIYH$1L~Px!m{)_>1Y)a^^=Em1X0|NXF2$=^cPwqE16vQ%q>s>P-~0_ zWHdSbqz{T$Rk!N`It20(=wU_bS>tOdYTPM4tMuUG;DF#COHg@BUAXd(*IObABqyX^ z#pwH}10%VQdgS4q;q)PTXD{P3d-kThIqm@6w0cy4H^GJFtyY-)fJI}awIdVkvd~k^ z-{;~_!L@tuBgc?ycGb|QbcAkMF&*R0oFlYw>HTx|yeV)>!9~GeZ)471x7=m>-ah3& ze_>rEFc8o%*_ZWMb~?=|ycQ@EYZ(XzDA5_2iP&0ie` zN^)u5DzF6j#!Dt8%66+hE?lRUGRsk)2Jg>%;!=*R+OU<6ZrzYXF&F+&sM-_)ea~u& zqOS~ci?oR62!&kv-?E`|#-%qz%z-25Ugc7fENk=0zDYl#+`wK^t8l99ZX=N^5Kjs- zp7^>h`Zw@m9?#DamoBlVsj@r{Stplu6YIFIVYGICErFL`1A8!a(v>Cbl8ptO#|mtj z2uF3Ipc~kXmu_Md$K1a~yu7M+eao{>AyDZUl44yIS{f*oxXhcdN#gxQdtw*8rlLPV z_R~QwbS&Gga&=e37}k@wJ|lLXTQ8V+%4KgXu4j~Forx0>X!w6PY2d40 zXr4rjJ;&~UNpt&$ocQ~lQ}-$Z-}xw*VEj!Av>1ouPPTPC5gpM}(m=4-0quTnTA)?% z2Vw#Ip_l+vuDogBYu(Y><*qO(6W`UyjNF5$KpVO-v}eZE>_x=KaY>X4aiLY=uXxOT zIiEg75-j?_xa~YN$=g^c06unl@c6LLk2IW%o>jNP*3Z(e7?*lt@!ZMdXU z&uvc*)^88EgExpTK^WwYNG8@z3OiYw@+jfn<3h%Ztw;qDD3N@HFohu6LiF&h6BK=% zYeg$_8v@W|cl%?w6e}D#(nTFt!U2Px66q`C^jF@F5gOSs`T(%s0R>=j83&qvi9lch z|McFsMUi>XhuETb!nzMny}6&9ezWKh+GJDi%${nA`6_JYE=X-8^0hnWgFn6b)yXc3 z2RyM2fVa(guXK|u)fd01B-V6hb-1hg^GqD20o*4s4=&GNtrKI_KKa!hji3guk^-gD zgKs#B)}PUYw24g$B0iXSdR&ghEIL31fH}IkkUmJS-1J z01MBq>}E%jbhH|nF&BGuc<&Jf+x_y6QSWgF^3Mc_tOfVQsf4p;R89uRj$bGb&Pg$~ zG*r#;TOxi)Z8C;hRG*EJNS?isS?Qr2>1qIjq$_7gMPIjfH_|=}gSg9Puyc)Qaiia& z+t~StA`3=Br2T$LAE~ljV|wCKaV$8`o1gYa8kk`4X_DsO?-h;8z+Xg5fvU~43td63 zuzsGjvOpegiI#D3^UJxKjk3V>Oc59HMJ19Yx^KViUqgjq+)vk4+v%>sN$O~*Zj?Pt z*8>;Xs;tbrG$#?0Qv`R)R_y^G*%Kw>K^_1kWAYc|3Y5lR>CxZy0?!s(p}^Y$(Is!U z-{>DlVa7Sgj&ZfMEg6K;QzfXb5tCC1ck2Gy9K0K^@_N+0a&W>)`)QEHsOQto?&{}f zCF+)Of6dwOy|AU2(#$gf@d9Ow4!C51Pf4f#VyQ(`7MDD?frVR#nI8>Kl(nM_9-pAq z)HTy6_cysJ|Ki)SGXu%{jk94i{G#O=G-2ipXn zFj&`=KbAswS#}lz9qQwO-}n{I%HjqLwuf5859_5S1bXJDL!sio&u>+-cYUmivki%@ zu&Jqk7Eo92XZChL_Dx=#5!J`1N%qH*lCNFyyD}i}g%=xAwCIA}R)LOe12&}}PG?+Y zmo|J%OpnI5FJGTK8uxcjQ^Tcx`10M|w$*OjPG{xAD~$VgwBJS;#d-y}cCo{IN~iAM zN^K@d3S;uC{ef@O$Ro*});UB&oWOw*GhfIa-eNbW5mk}rW@2OiR5mQNAbqsU(J~6i zY6tI`LA9BgoSD-x9AQ#wHtOsXOq!!O1McD9Bl6qgEprDNDcq^{dc+Qku9hLh7EX4Yv{V9n{MhDv`XUb89rc04rt69;?xf zbHt+6(Xr|&n?H?MtWW+;w9U2~UnrHFRt9Cte+q;#xO(r6JT(jlfSwbJ(6yHc&ZqC{F@KLwLs!;S}74iO7sBd?FKkxpGZ@T7`JmC5}3J7ZvymEkQC7KGbS=SINs1>WNU6JM#S`3KT7$`VW%Pu z=|`STnLJnLu9gyi!fL+nM*FnXel#NN{E~^6mYhZ%J?g{nSf6w+$9XDyPKo*e zegBee@ac>JaGm{k0KxNHftSr^%*EobHwz8~OLMU0UP>jlgOe5p3S`JSY6kmly;(4X zxc>#kQWO|(r}^YbDt`?Wb*snJ(SnXa%624)PVcW$3)RYo2?rT?(b?K$mT{4<{MIP5 zg@%0U!R9VgcCQ^Wq~8@()o((Z$Ha(qWX0^`AIsYzH!R9VzpGX`x|N0Y)x7U*VH*S8 z?x}l~!NKH36qMAZYAc@`9s2f#{B5v2fhKa54}3Bsvb}+Ys9uH9T&cQum?R$}CYsf~ z#ZD1O2#M&Ky#f14h+%29`~)Pb90`ogWB|znhi3;ME3elt6aFmX%HR8KMiSVTSq(Y7 zKZcx;%##0?eg=xZ83(L1P~;sSEfLH#O~(Zx6_oEk!ihgIzNx_9hWD0|(5l`tQW7@h z*h}*>NfLqgZm%4SFw1;7M=01Hq%i4V8VZLw9K*|t@QpR6->R0vtSN^?>PFXbg& z=J}#Mu#h9DH?Foi-Cv29d43XgQh17Rhnl3lVn3(m%t66-9%J5`@#BivftXU7KZkk~ zC331*`pIuNJ&fQi7nc&CEetPP6X0`$dn*N6N7uDCR8}II7|5%&b+0Zq3_1(4dzPzJkZAJCCb2@D|HCVk>OlJ4vwYm%!Vw5z75iWVV>KFg{jp-6hv& zgjnYlpfAANe01)c1Rz0Yj-nuAAXto*h@qMBfUSgD`L^EV_i~=kW^EYZe%&NiDI?n?9;ND*j@RnugV{%c5>z$nc19dI~7w9)F`&vT)*XAPtYp+?^*79(4pe)1CD#j2Y^ZJtIdNjF?6?*QNel%6i$tF5f#y+hg8JIVb=9$s1VZHoH))+`Pu zUnDPNozI2v94RHghHRJUEh5U(6Z$}i4cA1}=3&yHc3(P>h-pAb#GKr{RY3NM_6?cx zC+^NbHEXnn}GthM-bVUFX&B%f52TRMoT?Mh0!{ zANq77GrL}~lLJvGQwjSShi10J2Av{vfQl&Uw;$##36}rG&T>xOpfvY7X+5=y}qpgiZ2Zb(8l*qc?}u!y_ehG zX`^;|qsmZVDg86OyGz@Ub0RF|H#*e>YQNLjDdTUn+6J!jvwQnG>YAmMLiwwH>puUL zJ}-E)!>em-12-%-q9yldnl<#M0<{YcAtfJoWOKzanaj#3d;i(NES!P%)?VQ5!7c!U z{SW-0^Vnr1c{@-~*`0`A0`x29T>)BvUL?VwJxX#C8^+X7vw)YxF`etN zzjhw_8#iqUBwc^GrE7hXBJR#cMAXUghs~sbKCrG^&{@#~FB-Atb)2-zGC*GiMD*_cIyZ(A2z67qILnK%o05Sbo1@> z=I_9{*d7^;V1vx?NW21)ss4N{eu3{%%63jTho4YkS%R%(kd}mfwQ#@vxxWWato{9S zIs7L@VphUNqkwD?k_V8`dFnKn(Ej!GmH1x7-v6LrQSvy?UR1f1lFDRf_tcr=ZUOSF zqW!1B6zf3PqW#zfy8TM3dr%`6a=Efz5(y+ZX=4|odSltSYBUS*YPc0G1!C_`cqR5g zl^(^FHn6H5t`x92sDq7lmevxK(Pj2#ggs38<2?=zh+QQ1f9%;)FU@aBl z@ASLpfm|QS3W{2m3>U>O(Jp8!Umd(gG~2K?4k0lFy*P8Y)_lvHO_W-n*M`aqq<=8S z?X?rYRMKw|CQYPc^sFjSBxt^Z%oOPFL+~DzW6RMg71F+1kVTwRw~_z75EY=_S`!jKve*J z6)%TZT)wvsZtoyipSnf8uZc)Td*Etk!ut_#N;WRPm7diave<&*mT~K-xwHP&)uj0b zg<{Uifg;b5yIKra>UlFB-PuNcpm=X?lNub2JnFoz7;{Hycp1-yD|+aeAwI7=#(B)S zhnie_` z)Xi0J=i#x84T%KUFV&D}fc@HFOfe~}zB>dI?*xleW6+=Us@p`Wf#ic9JlMI3bxEu| z0*C~mOVTkyM4XuvelHww!;OVd}v)#qLTjZSux9Vq2EEO^`=S_h7nDDDJ>A=5EU;{~YxDe7*iT?qxDE zElu#1{O?o0f0Wm?fKLA`qkC$H;bNT>$%J^E;luH!M+Aboy}h-M5V@D)9VG{>P8zJx zd&ec+Z40v<*xe7El^>Fp1JHBTaX@wwwP66Ppd_bfeq&}pXc&<1jHTMo#kQ}G?aI?V zo>Gg4w=>@2EHPQr8Dy$$Bh|lHxM==iG(Pk5bpM&2{X)6D6lgN@2Nzy9hW9F9iji9* zHOma@7?Ct{yYhC-WZ`AZ(}Z&h9T@(ono`Hc>_J}zbCRs8{J~F6_4mtRDNvMagA1xs_ER*57nP~u3@!mQ31#nI*l1XtD@r#Q5-Xn?)x45 zM%N9a=x`a&o8)n83pO!Ofd8TN1h2bHZYpgG9CH0o!rN(>r}b-rCy>P#BPr#E&Dl0f zw;;F#;jnY08HJr0E(nmnDtmV22fEx5zp0X?ipsL2j_XNZ9lq4xkI~cUa%b?2avnJa zgH5%145e+?$Zq%6Vd++)ofpJfBs!A{RGao_ndIJYHT;8msX?g01MF|(l3a%Drel-1 z1?`c;MMChZwaT!y3=gy6-*64ZJX@~LSc${+RG&*d`iNo^w}bjIMN2Huza^A?&aWzS zO6W40FK683JWyQMr8`(@0NFM>1-KvmQA_xu`48rm-YnBB>&ECH={Zh)*3U!Y)vGe} z#GSYSWHeqTSX3RoGRzl@aP2i09Y08sThWq3F1Xu;cnxP)*h|JGrX6`H1eX~*Peu9- zaZD_DogD55xOs0wpswjkE*XO_mG$(=T(4aB*&r1Gck1034f`|b8ohJ94EH+!?vT}k z=!XJ`Q+U7++`)&v?~#O}A}n$fLdZEMU|li{a8}VbxA{9a4`ki^zti&Z<^4sv#v}7* zcxr`CbM6qD>vvvjLkVVF!fQ$7!3P~0*6w`#>Y;1Uy>Wzo#E*P8Z1FbSAPH)2QHXDP zi$eD30fBogz|VR**0agKA56-F5*|LuGOA{38`&GCd{!2weXg&o_X(L;T%MgSTyvgb zt3E8kB0WEb*ov&PW!Js4$|&yMbn07uNy986W&qTiN24v$dsj%X>!R$ zzr7v;eFbSM+ielw24x;lJ|^xz4wwQ}+e(})nK#Q(7=ygHj0(zeq5IkF86gpyFAgLZ zYX9N4Ox{WiM*9`mm>`3Gx88ko&HKL1x87#JMgiX1^fmtB zDizUfh83Sz-7TJbd%})na8KLJ{~P^9L&Ce>{OFK^<~Ns|RN3}YO$!V|+xdHsL{qMC?A~#Obbsr|Vz$0wCQO^wZ+@e-{JiBfsFqwe=mfZA+Bl5tDTv&c0Ja6#Eub&ZCocS;Qd+_*}G4;i4MQdu#H@I(=7WJ zJPvikE!OS?hRp8tBZ}79W2Q+qJ|*3s&jT*2X(tp-f#&2kkV>2Di0DsAH{!1t-G4}} z=esX8szWm^EfoX&VH!;x3dgU6xR#zx$Q!+6GB9WzSi80UD5iokeUVyg=y7k$nH;A0 zc zxjDI?42g34Z<6=FcqG)rb(_78bft+T7i3&WDtN%nJ%lK!`{3&S6w`a?e7~loRx5zb0{7bhWRDJ^*+EX; zjv78A2zzP`&AVE$a_60k8an~537pTD{8S9_#lTUgGp|y|_79HySDYo-hDHfMGCuBj zU>{)R^eVGXLs^>M)|SsbiGZweXI<9^D=~BFw$qJGs{aJwtK>>Q8%ELl*31JCeRU-m zM{in&rFMdO{*m^$>gU_Obdu;fb&Uf?V$RNqmd69R%m~tFy3Vi%17C_Si)yD8());5 zdRFpC)@g^hXeqop=|cPThts6oYe+LbzQ2OXB}*r`o|S585s&HE+laN{*)$8+XB3E> zY>1`M$V>9-$2Fiphm8RR60hzj?t}d6z-#&J{@tQ*mgmOQ_xVS?o9RSP`i<$YkXnW# zYLy)fkGxaGxQjS+`*3Hlk=uxSb~#>dlXw6$kW9-Sx#*QakXB zUdCw-R9EF1t9<>3vDmEx)MAyYbk!HXN7q;G$-3OhNH$9rWVX*xZ~3Oykr%EI|3b+l zA23u#v)@e%O36ooKY47iEReCKlB<1$z8w;ahzgCRGmZvznBIo&gqdjlG+cr27DSvv zzho=}52s`Q7VNL6UwLOCoLj&koXxY=yIds;Dpx_tQ)tQ(%4H*38a&5j%Ggf15d zZ^1fA2|#P=J~dB-bCf@r@QJ_s5%|nV$ky2^{u(9*kSYAVS1*kOZ0hfSLE23Ha+=^_ z{VB2gNEW2`wIP-AX-{b~(e6n7)RX#+@Wk`@wbZvA+0P8i#^jwRy~yAbsGBTbo(;vG z=c$^mIQ#GJ=;MxDPa5xgOo<}Dgs; z%=+p7g0RxfH&e4#G#`w8R(>5w8pu8<7eb4q_>`SluiY#>9{3_)lb9i9CN)!I?k|J& z;?2arAS@knQ?>ZiSPK)2CeNb^NB0ouRnFAXtxcZg@)l$Y%LAa-snd%-Mb}%&UF|)n9c*hP=`|DJhpJAL~ z23}BjGPX@dB=CEfJ(&Lc9n&~6!;M@#oBYHB^YERgz=VP7a~16VLTjCXHmd7UT@7$l z4n&GX0)dI!FmlcfM!Xbu09c9?<=t@rg5Di9Z{dlVOlZr744qcGjhU1_eCV3A5YXqn zPscm3jc4<}&+A~~$9Ld8V>Y-278qSyKm2$et7EVQc_`nY*`V}I_2hl@h)!ce)8iOb zk56AR@`C#kWD`q~I*p?D^tK>QZyGI7Z;cABS*iO>N$!RYxMM7K?iDNwLQ~HHQ$!oV z6wzj<^CXRk+8m@$-Yb<%Q$uD>d^=O4+4b5TH;`^i4{@1-i%bUTB`4Vtc&+#=wIu`iJ|w!V{P49Q#WHtm`tn3^1Smjmbjw zn}M)Ef?f!5B_Kwe&Bh!>8*0pf7a>w&bd(aqFt5V>KmqAwpWDzBVi(TgcC=F#&v)^* z-F-#LBLlP_JejjzE=UrI0Gxc=SZl#`Cw?5O5B9PbYqIDkW|-K=g5^UE%5&Ki*T>(Do$?LT9 z`6|_Q@FqQQSYnUiDX=+g5%9+A286%{pjWfI-ry_g8fTEiLV>?rLxbt}wLiYJ(mTnnOZqS5%Y6H08?PL*H4i2=H;wF&dLI5J!xxzVFqE zWV==2H+C2+CQ-!17hzYz{1w~Q*J|yKC9Td8Y89yy@GOk&MYhy@FkA>D)PZ4PzCJ&r zJmrbRqG!qDK@)}LNq>rnoQY`OEGF@BkVqs1DZ2Wv#k(mp2i|$O8TV2muo9$H5kZdg z*#Ql-uCt;?R?;e{w*|#P!yV|I({FmOt<^*^9`bi=Y7~M6si_Yz*cdN-;Z!1O;aiPY zp-K5C*LQp#RjUbpXB#m|z;MIQ!1G0#;At*oZF~Fae9Y1zbVfa&=t)!iD;l|a8cDaP zW_0r4-|0{GWej^k6X>2Losvh*Yqjxc9z%<+W&-{^(?FFsyZ?i@$U z4xI2X(mSyZ=n$-V`NsqOcnbM`*FD!d;7Q2c*!$bQljAEC)5b+UZ5&J7Ph%t~(C;<1 zdaQSSR&@K9W3bP9HtI;KVr`|?RMD9#W&Vx)g99!_t2uPY&X~FH)~Vl2j^Fif_|Az+ z?PfTg4RdYC+;H}S;D`yc!TycXCvttUoSGz2uX?NzM>$1qLw=LOtENdQY#g1MVW(_= zmNQ0_ct-S?_))iPZfhxsBV+oA{H))5P{;pA?yelqylN{kHbFO}$|@tsX$!)Tf0sOp zH|Y+JJ~3|XPmfZ;=@8t?fG(nb2_RDc84m`8aQ^#vuz?0BX|sOPhNDIvor9Xv@BA+j z?axxk(+a4qg~t~Cm}tsnRgKW&D#uJej=9?sUzyqqRA+R;TA zXNqEr0(>zFbz@OLoE-$qQYO^JcH%q44o?(Y#QXm!URuP*c8O{-~_c?73sRnW#3| z8a@S}4^zH~$C*3khkrm{ElSBemS9A3mQ)qphFv*Jn?9fQ!Izu63o32LI>dL(Nn{>n&d6l zSow*+Mo)_3qL_blBdjd@68b6jdmqI8PP)4qdVGp~v4tP0bn^_s#MqO|Z6K2I{&Tig zGU6s+o@~kbx4?{R!0@Z2n?!kUsgg}-_G9w%r%GF3bzh7U6}fIvl;nQTFKO1vn1B!)aK-FODl# zfGvhCn2i+(O4v@xq(XDvvZM(|!8U6Um#``PhMAh%GDWWI{Zn6ao(ps_b}@}H@##2h ze3ruHiuAyQj4Egp+u-%T;p>uX!!kPXaUTrJFA;YfVr&_HDQeBKul4>RrJI&l&H&y6 z<1B^U4mNwyu0Q6ZbJ=BQcAzDT>{#b`O=w3ZM}norqSq|xSyLTSFM_#m_Et);@wL0_ zl4`oJE!4^6AYNGH=!Bt^YGWYk)jF(m*4Tea|L99oLxJM0D}rVaq`1oYdQ>({qiLUUYoB|9OE9-e_x?j^}QD)vSc)R-_?g(W&03 zoT7eGJr2Cs^V^^P=OcIk*yl&50p96kL{+WR~RUl2a%fJgUI-0yS%U{GG6(?5v}n1 zK{I4mv*uzy3_*Lf#*j*a)vh=(SQ_omqAc+%R8^b%OS3BXATK%uj=JUM{8wq^pZYhj$@N(Mc44i{_!I}h<`Q(-PF%_95~_CAjZ4Z({+#7CK!8npjz$< z5(h~ZMjrcVW!p6kjZYE~u){FBF zm>@h1f0n|mvY=&lj9)FWLw+ss9)>MB&(?-v^r&#d*;W{a; zcq(o}-KXN0;6;4Xr~A;W%pyaqp3Df#bG*+IebEPeJjS`%EO?1;0E(LP)$v-1eaTnK zER1>hps`!j_jLGtmcPK{!f~SHrA303sQs2Io(s^ee;0;e#TDPztiF+$)Z#t#S1KaL z!!YytQylg}IX)uO*%%l7#`BbtuC)liSy@&+5JKq)+M)%Q{)+F2<`nXtgBD!i!b@=B zV2x|A;cP`-?@`{JnOXtA^Ud`e*{I3BuP|o`%*T%|g&kb96ct=X6$h>C!T88cUDffT zwAQ0lvrxzBDmC)4a1$8q`MfV)ad9ym%v_DJ-PY%5vKmNzIg9F(o)3#+hc)pnBdA~j zH*gJbl`1QoYTI2{9pizcRa|^Q1aXyk}c3bv`iRyV0p=RcoVAS*fTKx z7Uq*SZg%;?h#3Ft(Au${3X|U}g8#7%f4lr39EYt`GDeu<@m|A7dVJ5tfb9^y+wPdq zP8rf;NaTkBxzmGB5VpPf-LUzF&7*b0NW{mZxlD`j*i847{#tRn_?JUbpVIG6AgAx> zx7Ui&x;~7Jv5~z0?GG8r7JR5&mrKqkO`)6pp7(h1J)@IB)5HsOS&{32l5TOE=Pk8+ zLV010d!!n*H+w^x6C~3~cux8&S_E5F ze=0x^_CjBrmMrR!kZq|4k*hi?QhMe$B)(H?QWUnje5Gkl()Kc0^1Q~~_nvXhz0^|O zH$lRoCReph5#zi2JZ|x^qhzdi%S*UeKH?P2o;S_iyfo}<+8+9o^6}T=l+o%CH7?HN z^b6-kQruCbdnOfTgnaZj%GjczkMC@9<;x!_kw{&GE!6(wC6^knyr*GPt&1Cfid)AV z>;0TCcn#T>YlG0Rz4@>Hz-1#LT&8u88eV@qjFSn3j)+*mx0-0v%sE0FnhDk)ba3C)@uSEk2d~fy_}!(2hopdr^$s08C8X8 z$*w-y;ZS>2V{&mgj%YArl~KlIY{W-Fu{+BX$;8*z7Gv0%U!;^MfFL3Mv%hZ*K{R6FZ+_4Uwb=XoV!jCgyz>v4nyL(<2qs(AJI^h=G-`<$nC zG=k`jc#Q9}OgX0$Oo}~$_eLEX4%_YNkUAt)XMbh}9 z_UJW~uEJil;>TSu^Y3veoUjwl+8;lW{KVyzqF{(jnBkMipfB}Bg_!!$1H|Pc>w`}% zFE<8TZV0t~cCApl@`bkP{n2doc54jO4)&Gn-g(T6`I5CJK`yIC{3?K+smJl0rxswf z8BY&IO3ij664?ss~?ox7noL#amG_E=x#p2ch7$B!OD+N#SOSyiNFz^WZ{7bxHDwupDX!_8J6`j2va+D4qdq3 zJ_9_)xvmyrX-??`Zq&ax2MZ^P(*JH=8GCAcs z4rfQWS$1=Qmd?Q^*duZKKd~wd=@4J#Ipq|QK6!;4Iu0L7(xZwl(=b#XRhC^Hjn%u2 z`C&#SvVk=-erouY*`JARa>kxoX>(O4w)=S*tvsC{`7Ecq#J3h3e^s4fN2of)$?R6Q zA9_%ltFRX-_$_!h&gAE(I)qp(8GleA<^H5Gq zIK9ik@wTL!5A_36{igQf1Lt*iPprRM9W>lxXs6_JKN7~*lp#b+6(8%bKpC&)GsBO7Qz*jRv|2wWZ3YBwW4kZBx}fe<44fzlwGuig1})!yPxtNb{*3d52jc2MN-W_ zJj9h>Wf>2_KWaf}+IIV#)@Xg)#-`g9)8XJsqdal%FX2yyMFdyjjd6?krweAZIMr|^ zbM4F1)q9uv>6LI)z#${gSCWS{O{oG;)NIy0!I(|p4|ZUT7~g%}m8DktNp9o%7yS@+ zspN)+=PLs+d8|e(Of^hBfUeezPD}pRqg$(=()Gk~RIB?8x|wGoHcWo!b6>7SSF@ay_>udmmq_K*fwp<=6mXA z(a^9Oo~JTDr(@3REsS)gZ_ebBSubvBq;V&1X@R3RsuI;*rGqv|gY z&+_{av%EUln*Ku^DrUaBTGPcC?EXiN1O>GI(d(G2vE#2W(t3tlT#5-_jiO0qlDM-z zL5xou-(&v|O7IggOG%FIkZwjO-7N^C zQyh#MW83rF=X=iY|7Yhs&pEsA`?_CO4K=5Nq!@9Z?_!(5^tr3Te;iTC^RG{`b`rh4 z1aD#HxwsQKpZjZeRQ4y+mEPH>(_tQbkGJ5#*TK@k=%!#0&rPrHv+xTTVm+{VUB8s% z47=jq;~6R3tviQvLGExX3d^wWh$+sC0`;Jyg-+wzAa)EBFC=pGcfgOmq7zBBny$lb z1ilCb-~ViIFxy+HB55aHI8rM z66}Z77XT93u1yZ$+6+xQKOGW+dUhjnHLM`;4>+J|V1K!e)y%!@@~!JF^xYBwX}-yr zA5xxwSMFLW?rbT=;WJazQ^#|5N>_vk@3p>A(ol(Zt6t<*E=xaT%yNmNgUFxUR zP}TeZ`70^o!4Q>wo=E8W8>amK;NBwv$;N-N^N~JNd!E*|A`_GnaXR(1UthL4eQ zG9D3d`G=wc)kQj|M>D2K;gzAh57?z5IL0f6h)T;ieZCl(Akt2S)zNst8p$*E175t4 zD0J7gk|b=shUe7zYG)Z)EJbJGM^&}`@OF?#n5$%o*r@DgDey4pNHoYh zaek;wn=N_f+{INa75%-#buT*KV9_z@pQkw-A0_nfkLbmrXQwNd)7ZbY+kQ4VUyW#Q z6K(G^ZplojQC)CBj7i<2(-y-oG;kMqf#r8`RbILhYkvgRfAi-VP1lFh3g#|mtq-k7 ztsUg7AdZ)}C)mEFcbiOHMXEhGrUx*^7&^TZmT!?50uJe}v&(+S@DFyI?+lC~q+{td zryZh;Od3evQ#MSb6ae5pv>Km-MOSY)Bv zZ=sN=hysbp?Y1wt?OmHy81%)5v}bcKJ^+z}V0OTA0#&7jqmGw1)phQ@`I{n~s^?WU zHbRE28va#94=nWg-u3rHP3&M`)McJo+JR5g|JcKakP=tt0#J-i^vkmFz*WLb`^yjC~2Vo?6OHqIzfntLE zW8G{$wmFYYeP>{Qa7vI5h@c0o58#iD1ZW_OKX4pr!7yZxjeNxw#6;LxA`V~%mAltK zT{b{(1m#{Qc+Thq3JyUuF`#Xy5`}-&QGzNB?gKi3u}Cl@+d>U&waJwxFW611?a4MS z8wgq*gp*EzXv~^F`FmhcpV$(;r{Up+6Qhs^H=NX&u%zv?(X;GFZ9dzSIOg+Z9+osk z<&$^HUbv3Cr+1Ak0dr0q>85Xz{#lNUc=$SWv-^54l7?GrJ_h2RODF4uR6b6hQZQxo z`8OL-_xQ#o;k6m3+1J1C?WwjZ?J?S718#{wBBE9%MxT75xrLNpWh>otk#Dq2$X@|- z-E8puLET*A7rVo_&e3*lZqxho`3v9;2Ew@q<2!%Hf`M)e_RRmlsoTe_0an5&sQ|1g zeucA0N&3#uba)?EO^#{3h?xg{Y|1O&7>Vm^G+0<=?z7 zeoirOp(eo}fW&;(CItUsAkTN3w$Sx3qov6bp&LX?}F2 zXlU7U+Cu2|15(OwG{iO6$Vb z>x?`;m2ADtWC9+~64~+>OB&f~Rvv9XV!9ysdr9LN4?0gzFb%VH2?dteX z$!Khvu?p}3kkTdDSoON6>fq{?E$QTZ_&JeThEXfVXtBHh`6UZfTVv!EIJhyOhO9Xo znQK9aJrwTBHE(sRI9LEpoPIppD*1Tz*Ob>#3w`UXbDMCYgdd~r5<&X&p1Z6lJ3RHJ zl<)8*-Ji^*j7(sz=i!j9((G&r>8buyUGFB%%PQ@SG^oKWb*aRj#>__c?*akGu2ro` zxRVuGcdMl9^JLDU8l(WO*L}S~)yftOgIj=J_V|qM*XHirR8A$}5+uld7STKcrO1{2 z`q*ADm1x5;FM=9atT7Mwab1lN|BY*w6&~yC@^7S`4ffDQ5P?=yNz*i@gXuU4=3wY!B-&&^&#>a3iZ8Ir8m(a*R z9WZZpexzf{J#L+DZKMh;ledeeo&ePt z-f*B1NyjjwKdNf?n3^l_`Xnt#F1vS6fre6vZuVz$+7>HA;6Drdwql9z`@$Af!fc|G zuWo)THod4szi_5(|A%aCK3Hf8Uj2A=ArlXdPxSh=j~C=ydF(tPdV=(+n+<>}c$S)B z#zsd|jgEX6*v!MlRNk>u=I@>r9VwlKEf{fsqe2EYC92RV19WH(xPIuX&TgjRXNqLJ;nG9ZK|CW%PsAm zAZgKbv(@#nyIf{7=j^jZUU((BEmw3cNV>N3sJPVV&$w0%B za7sU+%F#(7$r5qD`BwqkN1`@Jim^ll#Z5W<=iBwaVWAptzt;lGXW?cCxrY2fMQ`K}wUtkF7@S+(;K{yZwS*y}=fcQHEamOoPcy z1=Di0M7;d`4z5^#3)fo${oORLOmyuo>n^Oh4)CE%^rDf!HZ==beAx86_ANkn1o`eO z?C5U5Yo&Huq=;*j6~iKy{TB{}gN^YpC5;oT;t#f;Mn;)=rFOe51sJ+i6Rsc-Gpvd2 z_pC-Osd1Mk!1Psu6C^%l5A%Dv>63o;vB!D1*xyfozNARZ8piX#29j36j@9gPS&o=1 zYKTwMS)eo~52b&Szo!i7U4wrev6;9uOc7=E&9&;Q!|?mC8i2pqL<0=wYhG5eL(cgS z=?`M(pGQjjZ|Y3Yt+s-tEsgI-Mx<8AP7auZ3yGC_EZcN=^U}%2Php!?a8uMSHn0*< z-Q{pL%&nImT5ZF@Dk?t)`-tT~>kbj?Hw%99z);h{wYe=hJ@B;?O!fCg4~%YAiPu4d zUoDe4Xs%4ZHLkmZqf#bJn0#-InWdU`*D(eB+rc08S}ZU_??F$-1e0eT}7 z)Zl&DQ7igolrEpTSEkCtQN4HenFY^b?eIExxQLdnPdXf2l|B}4K$nu=N3D5@o1MxC zheK{HHD^4JkPDjCtBXX=8F}|}aEBh~ee{cd2TsiRUxvy?T|bCW@(W}a9l@fk)lO$_ zauwS&M>7~+v+lfsN4C!lE{yq%8S*Hci(dY;ZY;I09Cd1NhfcPdA)}k8vff(@MJ98y zCeL`~(`L)kubVOVhmXeE{K^26EP-l2Yx}1L_ysWtE|ijrX?z@nv+;qWApZV<$UBsh zo`z~&{e2=5)}(h-zhdVeHf`Q?oVk}8$n%7M0k6Z{+lmk@dV6eS+0sRi*L9v6c%n{q zjg?i=1=Cza6dH0HL#&cvTAX~=hiQn~ zny9>B!)FS~9WS9`ePRK~`VX0)^NAJb8%oxH#S_kN7@)7?7~M``sp5E=Q?U?q@8fLg z<`;#FzJeB+!0X(0Ju^eb2M=*U2_XjiSrm-;w$JuW>pxF^el`6IN)hg=fM2;Or^eGJ z-1}$;I#U9l4cuk$m8`@XQJ~BJCUZu*Zfia&9{pQ(PAOA#)!U~uNT;PQZ}1ySd=;4p zLXV%0^b4l}H4_zB=XlR&g85SzDd=3OR&sy0IZ9(c@Kdde4_<7>C_vc604)+HKrA26L$Tq5;X0X=7;y_Id#40;h*f@yA#}Q+uZ%A|s z&3U0t((rE(R951*lOvtlqy>o=roB~eyJHM+qrAr8R{k?Dl)(_Jro3paUS=gK1$Pk5 zJ-F+aDO+94Cmnz(PfX)LgX=8sLIX550WOGYf}aWUMC*J(9m!U-=y5sbE*Els6|EK# zyJA|^zeB|9r4fh4_@)fb7-&8H_s-iV?m1E z@TdM&6m!8d+R7dIS5Mp_@H178noand!RrS!tm50NV`=<*-BSqVAjCs_fKnkIS$rl2h8o%#^+d-hRNzpkOVMgd4;w9G+^v_@jc=8jpu%t;}wt`~*V z?)!-x8;t=t7ZhgF@n=QM7ELRI^lBEDJ=C7;Q2y;8_-GBce5q=J{_SBt_GlJ*-ka>Z zx7-*l?(8xMtOp__ZDktbNfS1Np{vi=ohZF{3~`O?8{_cHYN=wKEnm+*HKYTqMoOXi zV%8MB#0AWvimF6#7e{LYW+NC1;O`u!=Tq2uA}jr4)lB$A6ct&B>oHquBU^CsRsP%g z=kLddbwsT{pT!xG-E#>$0(V}?RlT@`kw*-JidFNZZ7j6b8HJufLoaW;c-$9)C3Kh4 zFvfH^dPg=UakB&_*9%G8^&teb^7Q-QDY55%m05r`g}a_wJl$IKMzOKs%0VJcWR1gD zPj%o9W(PhNv+uPqF?I+?D>Q$@3 zAEUCWaLD8hB(V_ws}l|1)6*uvotZxaSjse`9y=l_lZ4FJbjr2Ou+wB0@a< zGz&069zsISU2B2H+eCCNKzgQqst-8auvxgJP-k5VM%WBIMS?KC1jO_w4tfCm8ID;h zB(A2_f0Af_>!K;>H}Z!u#`He)e4NdHhn-hp?4p_vNU5=(AvnW_;GeP;+^p=Wo~S+q z*tLzFLokB>R7Lzi*o%v4#e}Eh4y2C-L~q9Fop}jo$wu6AOnm+(1(m|ZFyJUy{4rV3 z^I4(O?84!xJo&({hAxYvI)O&pesN@s{nMkwZ`M9+kAdqi67g`$c3$W^P(8&FbShj7 z!oqukZ$$zp$%=qK*XvT-l6CaL=Ov67aL6tZ17p^IdY{X1bq^G%8(Lk!$Yy4JDHlBM z`n=b4FW~Vspg!R%-;`(4&6nq7P9AgsMZ<(p`MrjJ(Q|qyS4Tv5KO_dLg5d7BYV7+h z%8$}~#QJZ@1(|aM8N=W0gZDs%-%O=y^ma~vdpa~dqqjZwLJ{9UQLvs{_&hv8-mbO> zD1bqAS2ZUC`JX#jk=gDnuPD3dtf+Hi>pe3TxyRnpiJOQeV%MJ5_^*fD%9n5s9%k}` z0D0%z&bwk%^{SR`+Ad*W9*8tC!|$Yxxj1OE75072PJvK}!!2BY?TF{= zRs%1mME|7?R-g+O+V%RRh0wbK$4$7+a>u20xz4c$hoZ-_5GLQdf+0N&ac|au^bVX& z$YEXcasZ29Ux0hgK{R39IV4G(|8`e<;*4Jo=k^Fonedz0Tlq@h!j`59a4)u3CUUPqz!(}0YQ%t#a8IJJV*gDi?Z*|9Rz;^E=_?j zL&}r7LkG`ZiO{>dQy-1K@Pm0)*A-;i?e<~s4ng$T1*KWAdTsaZ)$RKqmy%WBE|>mt zRn@PZ#juqE`Stxb8NXITr@m`q%NDs%k9O&u*%nsR`j};l7WwonO^d2)nEnR0%?o?& zZH%_L2n>YGW|l=*|MbSf?7Y9e`2QqJy*CoBH1X%YyuWY?ZN6xB1Rm*UOKaUq5@Y4%Yy~?boZBck&5CnRm9JWqDbSGw&*}UBxo5PWCL*<`CUxe{BE$7h(B25w%vS_X@1O zYFl)-X@en68O2h(^Zk7MEx*#JN>|q*TN<*X<^!7H_7`8hab@^af4fD*N;lH&?=vD1 z%-IkEV)7sP^_Rq%6K+=_8l1pO)_GIqB(J$W&Br#L`?-WWy9O3VAMaA269IIgC zfaI`n7pnTyy|5`2WJ>E&n=x-786?~#J=7JBZ#ATeJ(b{cm7bpf=zB}GvlaC#FCbku zP5Hra2u!OY0V0MjyI&n#$ZplgGmk^rmYoIr`$GaRZ@rIcb4!qyJ3!VT#0HoH>z8SX zA^d6M%v*+&=!WFHt;<;|%ZEI-vMnjdv*Oe^SooaSOKO!-)8#l_ zyGOQtl@BQ>Uwo{~jgQ|y-2*W1n7+#)7e#VbOec=nJv~M6hUggz$5kq&y)6o_g z=Xe1moWOpcd$_KgF+*X!?2$UnVXW^^WS1i5_;}2I)@**ln(B#i2v5z9?gxTGrH?04-;TZe_jgUS`uFAr{uB?CVC=M!W zqk)|VGoH5;u@pZWvxZ+BnIJcZB!RWk8=I_^l+L$}4|nTEEA9^B{q(3;wy*btNnl>9 z>lI-*<#H|C7s!X+$AuKxo#Ng#DYHK(V;^==#PHw{I>wi9|7DKefye4K<_?UVl`{mX84Q4-5@I0QM((mZAf z{jmOhq&JBLGTo)<@mG`=(w4wK>T;d8_F8sjG$>j8ZInjIC`5d|GGy<`>66MFo`;3^ zHA6_AX?!Oa6Jk&`g)MdAMkfKDxbJY%CGd}@84KKu{c<^?lZNBy{Z)4uDG1Xva{#u| zwaI+ymvIhS9TDmHRK%QOXD2!+{vC3R1=ldNMGwF+TfFxM}4 zBV6hzBrdxmr$FGRDJXwlK>!gXmV9wIw@TZ9aOzg$-r{-ApO8^xHihBKB=EmS#+ct& zC$_CJ^$;uL%W8XPGK!wg7qQ~1<+GM%A10A8>?xMRg?Y0HIWQT9G;f00aKiRjLc#Z9 zFh^Ha1KRWL5q<6jFpCo1CEf8egs{7R@D9j}V8|;i6k>^ttY5Xns$9}jt?+Y%UoK0@ z63)AsHJ+cwZUX&ygjx0n%D>A-W*_WmD`irADpBL!m+jaBhpaLr@MN`kA4`6-X?0;) z66lh;CTu42U$?q|KC_w&Fc-UB67*1@nIP_m#xQd=QXr>y+CSCS*>Y=US(CgJYyWFh z%34?(#ls~|RnhJWqjGXPzYGhrCu?WMHU3@_4{OS^=|Tlzdltp_nykhBO%N z=a5e?UjK_*Sq83Hn@VioI{LHFJ4b(?RGD9V3Fr-ic`vy8C$6(2(xn8O^cXfe)q_w$_?di96}ILyeVsC)(e)?AOT$ifMHdg0^ArFK^XgCyu&FA?sjv#rtAX_vpEg(oU7R`C zB#QOV4?@DR&_PNh)z-F%{jL7QlFLV~1mhN9DAT64PKB$GvQO>u)*ZHc!TuwsMtdhm z1@e5hr|(LC1(IWp9mmuT>*hR;ns=D`8S+zTGmj&o)!hN>6S_pqt)=+{#?$&f zK0$0HijzRV5{;``b+zo**Ve4ZX&>JebFq#>UcU4^QD2uLp4PjDmDED??(toXSr+f- z3(tkLL*|7)DO}>kjeUN12{d*veRb~a~^oWuWGR; zznJ1GAyvqhAG?^;H^D6b1`e4i#cMGLi4D|XGrz8&@~LT6-OQ983CV-PHl9Py@gS~Eac=EXt(>0wvdVx?P(!*s-EvH5Q`vsQLg z-pYC-qhEagu(*Q6m;31%;RGR13HeW|(6ysX0+Ez&>!#pEtV^)5a4pQwU$PzQ67)lQ zSABsP%DPgYThF5%%e{&D7S#I>ode}0a^OYy*mly9HtLMwY^e;k{~xV%SoVf~?WS{n z?}A=_pH5&iZPy5byC6L)`BA`qDk0c@|Ik>w&L{S*(6|Qw&0WQW2KDGAe57$yRiC(rGnKxa`er|?0SPKsx5jQUfatjXO~mQ z7Y{P`EgmEc_+}M%V1rMQ9se2D=-*cN1Tl4WE3Z^)^>JOEMW+xK|7Wu6Fi(=OWKVTt zYwXO%8(|e}N^R{IXSP-t&5PlzF)U+rUJrHexp5c#$4pUEf_-jf)C+yT={wC~f0dKD zSb7bIx{s0!yb&ReiHrd1KrD z7IU8JP91{&q=dTa^fm&GKAdF7m#Gi`d8DBfi~M?zdf^LkC4*RTo5;$`8;&z>qNz18 zDne+ys}#dZ0Wbv& zLysJLX`?RYrpQAoFqCAr(|5$=zy>wUJj>lM#;YBjsWXzJ_@wN9yjYAR zzx4FAMQf)L^K@36Zzn2bc&OTTpNbLOXfkt( zd^ZGJsFgIm)SAEl<4BbklXyOCz*|t^Hj#xWwoWEc1v$cFWrv!={r;*l+`wY9nadWUZ zMV6eWS@i3^pD9cn4`lexb5lCvr!rb=Dd!umtzb#wRTRFU7`fmjLmy~14Egi+qE-9M zJ{`~~0bQ01KQ#L~8zXbKeLSd3&2!R5g@X$RWmh4osNNLbD@=UeLcuKSNb=)wuJp)M zHM>dy^^$@9;o3I$q;~hy{ir|v1^FGMH@z4wCXsj5>3V}pCh;!@zR)TRt1c3Tqv$w+ zA>Ppy%2}Zb+n)Z$PzZPUGmq~sv&u3yPF+b`Aq9(!#SeEH&NyTe+4IiA1vV6|pemdNgse(d74#L*}9gPP-DdN;87OUiT7QLp#W+A3kWa?e|{ z%ZJBe=YgPfK43H2s0pZ^2Jp)r|vQyxkpdU-goSolI&w88WCTawHC<-*tpaEx?3MRg_s*0>+V5M)j=WC@RgO4`O7q31u7v z9g8ipR2lPn!}gxJWUr*@zIsdH#}FMz{X8Z)|S+B z&yoAo!tQfv7-Gx^VE;bz1J`33nV=8TtoLkPyy=iswsd-owtWuY#19C|v+pl>)L4F8 zelnZjW8IZqdZSoFy=FT0H?+O$Xuj`I-}h4&SG<^tP!7!6Huq9N%wE<-&ff6JuXEyL zg_3_T#<2|v{Y(?JG7a=z__qS(Lx_tjgPgVI#Sr~m z5W9oSD)dm5>Lx#n?HgWH zxv{vdPRc0bt0O)kyw=O@^$rudKKHJ0?*5PQrXf}Baz+yPHhzCy*cFUsI2;BFHR31h=v-Oq(Djx9J(tG#mFJA=7-{+wd zyRSqSXO*Slt$k1DKMv!o_K{tlKS;%x082;NKPYp2AIZ&|)F|Js$-lQ1Rzs8)v#<7= zQm)#cT<-sw6RZ*rzLupftmw8%*Q*GoPxGH-S>KkTxkK>h_zj|gXaB=$3U8s$8wqQ! z%)i3rrdDk3G}K?D(h;*NN?3DKW1g!dzVW-|9EpHYW}0jLp@-%xG{$Q8Eq<`QbnFMLc$* zKC>ffO3F4Ft9iO@&}@Y3a)_=vqWk*~lloiQ8Z4jXrY>opg5xLzMdW!=$G+t+Q#QJiFJO3{JKNNpx5PS+xRl(6(TUp zToy+!Ej{3NESakwLtVv)PGP)WFb0R3k5e@S-%=E5ZsE%i{5EC*_nxyB+V6T1>1z0# zU;VrsE?Qx8+O@tgV)BTkqScC`d4*0f%ysel@l&FgleReoM5k;l&u0q{MeMrj)c(tx z3#r^?PGr~X0)&3`&6bQ^4BsTuX8INC{~MqLHC#+jN1l`GrhoKdi)c|quMXmM>3W)l z(*$ao7}cgzQZYNxSuo@Tx_oYK5tXxM{W`l6!l?#e$LX&BTz1g46 zi~t%HMHUj5U7c4Kd?-Uz$bNF4Pr}yfilcRo)~P5TMR_^ie=|mvE-4lY@<(o`ze{5T zSzzkVNToN3-qK1RmUvcRIIu3E2y9UXCrfAAbsGW!gpR#I$KEyy{UuyzM1SkN@1HG5m2BX1*E@ z{`Hw; z=1D|)N~}?U*|w^<&_3nXVipeXJ6ZIIyMKSsP*07f&&~L2qAr2Gs4bOk1%L3Xj^sEo z!U3L%B_0#2KrHmnER4BSZ)IzF&V10Aw_~Dy$m$$K4d@oJitZvsRjh-k(nKF9BohqS z{kXG-|D)CR!su^6A%9HXgsXyrv6n}uP;l?mA!KRI*HlBVuu8#d3zO**@)I-$EX+Uy z4k5Fca}Y);;vS4C(8T*`<<3s~dW93VQFZ3Y8wtvlGzLhqeV1nvbBf;2Lc$sFKIpTx zwFZ(T41Eo+k^1ExiXi`lIUayW%WGze>54GD;q8=W{sSo|!5>d49he1UtA>5$ja9$; z2x$xsdmCA=aY77qpRK^&wqJbC3D%L!&1lFNzf(Q5Aum)&F&M}CR7vpot`yfo27osq zmmned)V=o;S^v$}OC}eR5MKDgYtJ2FjHo(;8%X!A_7)^yc=o8CHN|F&sbk8mLPV?1UkwFUR)NGe3}kI>YYZdRXUhDw9bFN06eO!8cG* zGaI`mA9Xu)IC`RXc{u|RbStg6~RJFS|f>(kj&o{ma9%rRDl!Xo;J1SM5{ZRnQ-IA=|6- zDL(#hJ3^)=A;ZegzP-*KzgIO6&(^z_G>$Ph2Ij5=fE)CVmej=$&~8J*G;|ok?5ZzB z%!QA(RJd6fJ8YM^m&ojPE_LXJ4_S4ZI~CJ~X=a)3++M?LjqP$AZ27-ZVxf7W6CAFa zeZuKNl(3PT5yk?z^g>*!C%IE17=XAl{K3Nl`Lx}z#>@hM!!8=FVEG#-)#OigChP-@ zEx$d7h#s?n5triVkY;CZ)Gi3NHwb0eQqkrpQHP9|ccoo`k|J+P!Tw-Z(Iy3q8Cq1u z;u!|fu6k@J6NAu~?4Sf;zHVJw0o*tm?*;CoROvrm5QF-S)e;9@af%BLzt3@`Ud4zy z1_W`Ce5td>0%*KXXpHPUj#rD)In|YoS;ih{*nzGsGzcBnWc4rRqO7D3% zoK2_ZC2_H)0L=^m)sU00|ZJIbg0 zOYjU%^I^0UAr#3R!p8<5P22S46F$svs>|4^TS{bk5(^0sZqDYr?ASQhs!TzU8{@sF zs{iwzVh?;syVK}cg+wfexi$|6Rp=hy7b<*P6_D#^=kkz8{k~}joU4hmr6MHcUA4rQ zVnh_4Aq)AMMruGe{kz;qqcp(sKv!G#INi)23g;#6S;`n)@%;J}7=Jk?XNqZu>OHq5 zTX0{1cJ_j^U1_eY)G2zFwobk%(7)4llwnSttz&TB*?p{?J7A!Lbjf zOcy0Qe&NC*7-E*s2kWc*iCaIm;>uU7obP)t!q=e1RSp@T?X8*UPG&v~nReObU z^**Uk#b2$1IJ1@ActQgojycz(EkdPIT#33+s7TP?w~u*WwzzZ4ACW**y$K+ABc&W+ zs;BhhH@fP9>T|zBlh6rFLHT@zCa~yl0&{@Rvn-Vh>!v<)i=AsM8wg7b`t}W z_CdrrM@lawbHZ_w@@XK>ii#XC0YpTEnF{P*Lj^2F5h|5AU$WoMfK+^X;|oX zhKcY!QFLf|nWmV5Q6w-I^ZuZir^*mqKnwro^4M-*Zi*HG8!Ngz-+c`^aCBhM=xcF0 ze~&j*BVkZ=0W}RKV>Lk6@5TCV#7eWvZoLI5j@}u%M37GLv%Gf;z8s1Vjwb^=)Azft z*Ibho5u+wip$Sbs+Po*i2<$N!`E!w@Ll$FbUV}kkcVmJjpRcxzesss^$Yam9!@U~E zs!riAWmsPDDXrf19}-UgGV5r{0WeLFoKDT+{bYB(%UU{oKYA-Q8H4qXoi!P(Ct6oZ z{YGcIE~&@%MiiR&N?S5>@Pgw?H@EY;ipAJaGxcm1W=G|krE z6yzMZ2UV!K`#mf%O9!$YaW>n8!uzP-A+f0jR+|4Cz@KF3azC&vTx%^qDOP_WOlbeF zG8`bIZFovBkpSqS*zB#fH=U81$muClpI*TxbxyN`s2wH;WrE}Ap`qWuYeBe|kG~+Q zdbuZPCi&^_tCgwEsX1wobfis(7j(}kphVQps1o`w*@ zkS)>Uu;s}QfG2ddc?KG(6hS7cbkb7ek&_>?Hg@)=I-{vd{QX-ZXTN>;x2dwCAjyqy zQ_pPo=m9}mdG(o5Lo!S?rh)=OT#yy#D3JiUECRVVM0|I0U~Q?F)lVlJV0c0eIelt> zI#rA?Ki7POqJNn8UHa96B}E+!moB5i(DMn${m9OJ#GAue%Jth;2O~~3S?%XP<1Aq{ z!u0UOnSXr+N`%ytZ%XVWipBpoK#^~@hJAnS<^KrBR_uu1n-Us4d*}qw%P0^jXlZ>J z2tRGaIAC}qiFR(pm>(SQF&$qmbi|{P$gcFuMCO#o!dI8tKA89buQry=msw661$f&x z=$#xJ!^7%(eTk3hwo4M%xxe1o&#Cv=Y94bvm<@>i zXa`Y;FhWkrXU>NSbKJCYHMW0k(#YRpJg4ZjH}4Pm`3Ln&gA=jk)px|q-k)8k_S@a* zrP_=5j2>nSC^o^o*#*$mkO=F3k-*8+iu1(IJvf|)8IxMekwcgY-sA~ z2DAjWkjelF$3*HqQVoT^`{~<#18T$x6DdSBOnwG7wHrvj1ZtuNpyEHFRQqrsWNMOr z3Qrgdb)5$7Ox>LB7o4J$C(45V=^Uvy7%Agu$%Mvwi*7DHkJ^-%obbNO*e}+eOqwcm z%6>z^HWwuCTRX|VIPf2=S|u}1K)>XPtILV_O_x`uZ!x*aDe?wk$cqQHt#5|KaP-#( zQA%4t%7=SyM-bl+$0Y*9J?kw;Tj&f){q)qS3Jm@PwA znYo?G94WyTTp*zP8%LbT1ssV3D-6w9OX{i`=~aK8BJ+n^E?W+LsvGmOWXvfmY=P`u z;2oL`okCt!wMf}>b=^{o=q8f5eK4QLeuRpSMwxCHDI2VisMbx~zf*BD%I^cVcwPh$D zy^#vX3M=0t0rch3ui#h}Bs@DXp9s5hlZf@ipIBC76pn*=~6d%E^ zR?J6@=6kGe>+ocfDT>p69yZ22wWUk(-#0BBF9u4iH5-!1C)jWbP^5A zzI;G;@9&vFg>|e6GVkIisx^UrsIX0ile!V-u%N1W#?Q2u+M2H*-n^LO6W^z|FFe&A zD_}ByK@pGI=ZEN>&4(*A(H};9#KkJRaKAnY<_bJQ<>mxG`Ay}RL1IVNI=-^L)b$?i zg=XcfwL}ZC$To=lCMsVYYY&0G>l!l)-zJ-GK7Z9|2_(pWK|c|*pS$fn3+UEb-z~JL z4D;Q^46Zq5sGTOKjNBm;fFyQQ3>|x;tR}~FXk2?)b?(FSl%?0Lgi{=C>i#FY?lsi? zAFE`z(|IH8K%{D<6EKEU6cGN{M(02u?74XWbqksx5ukfJp9X;wabH{f*d;PHS}xh| zMf%PKJ_zY~RPnD`XM)iylhz>GP+cS0AS^g*<3eKig|){WN*IRa$T!TT%jNaDL2UE% z(Y2USw5Fp1`<>kDZt{w}Sh}e<{@%+|db zEWX{1bTZ*YgM~RhzjxQ818LCIVqPDAZ{Sl)sL}dn+58Y@YkW3Er z&6)05A&&yB#QWimiZ22zK!I$LbGeF+8zsLqOnjCn7AE*sH|Ut-h^8o?X2C5p;}0Bn z_3a<8=DNdJ|Kvfi2?>@h$kEYnqvuv&0YMz&H_`9QGaWlQN7S%bflF!Bkam!y({%~1 zc}Kg%)|Cnl-c>RGDUdw0Z>4h2{w6WiO)1T6dGfXLS?%>_L^e5Duii(;b1+R1VM+lg zCV)1KX@>v`Fuz zJ{4BRXEpEum=E!THh!=zBXKZSWWqU2<}ISIw0i|dBD@Y%dOzz`{`q6OQg=b4j3fsh z`dY+U!A2n}*HcX^qxn2)ML4ptKEPpWUcJc;f zWnJ@DUT~_UdCY%RnvHanv5c5^V{9Cg02N+@cRf&um{hgT+58*8+)i?s$Suta=(lsV)>153>4_|4JFxgEH3cHn)h3%(HzQF{`@Nk z;g>|uRC_7vV9VDcR`UQPaAxHlzU}B=!^KJUkeYv&_n1*LwIVu=%%(lcOw_jf2BwA= zzyRo4h$G20qGn_mq<%XNq5&qH;hI= z8YBm!$5?##{ycuafA-j4dz^FjI_KQ4>%Ok%ZMgB`+F!f;NeaInWw0*#@Arc3826@6 zq-%z*jVu%KnBQ8`80Z=IoMie~-h?FNxGfDEYK;bfz0ufc-OoiU9HmJ*I{csN5#VY& z0l*8TasQ#>XTUNYj6KORmow;JOU87Oyx6U~R+}1uZpB7*vw*`sO>HF3&Lhi%mo;T= zwy|~3!~lOy_gy51TF;Z?H7ZkMm}l~R^0m{GcHJDxf9eQTgI@$z{zUA+JM)eio>x7S zf@;>Yqg?Ojmeu3X34O-7ngQEyzqd~hunTDSWN^d*lL6$FYG`Jr05PWe=fQ=*Bg|;5 z05hsqw1IB}|7xM96>+QtyfFwX+IdbxU(pW+VcRhMDddo`)Hf1j=*9V$2WAuKC9yHY zGv#Bf90aH=!gz`bc~Bk_Ot!DKIAQWaA)<2=nK>v)J;XCEM3I*Y^sHEK^If?svze&! zAZ=L_gt4D0Dc)2BfVF8Qpa#?BY!SWW7sU87 z)!4cs_?_jCwGAuZqH|8}#QN35e^I1E!OK!V)?-L#^g=EjsT+O(L6e6}9bv`y4 z@m{}Hg_yX6=QF;jyRDDhzTXTT30lUxGP9zQ^UK&k6PK{bOBz#uC{Og6^%1uI%@ zTFM1}frRs~C0xV!@l@PO>Xztwsn&Sp?=K%SIBVxOi}tExtJZoCT1Hb+2G>^Qr(Ak{ zI5`(>8hU*1jo3I;G9xQPA1!_RFVF7uaWGq7;RTn{JL@O%3ujMXQYqf4hvz=alpx?L zPWe#yUEAk{YARN$fpy~w-*muKU?z$z7W>zqSB!RGpJ~k7HBwzmN9FH#(pDS0p5vzH zhaEpkx@~|e4Vl&^+L`JhT++S)uBr1#;~gh6ynGMwQ}Btvp5sBM# zF|0!txc;y`xKL7{@45WIM~bL$F?izB@;oisUu|{s8c!tVK|w}wJ&|W3!`8Q7v(#|4onr$lUyDxRnMMJAHggZWat8vo+n`4uz|izky&x19fbRDbIbB+;g>{nhh+- z%NcRQx8R%KuN=v!O^de)(TB+XMzMaUq}lhg+`frl(@E?Q`mdhBS`Cjjf&B_Ln|O@m zt>fi=jN{KX#kVtLl+%=&gf%w|ka&vtAqA8&I1Z(4*w~S=$&IZJk_;)0Q1^3e@UsiP z+hZ5rm3z5uF|s`HE=wsWzDUvQB5FU(^ULLflKX9A<;~}G5f^j_b>BeeHW_6n#xF`> zqo;r+Ti>^{`R|y-RVIXzW38uwf};$T+?O>=BoAZz8TuIye~2X3)DwEVQ|v-T<;2R} z03F3)*cZb2&TwQf>a@;&iF=RdM^V(rB?w`lP%to~Fp~>mh`N3j=`}=VllsMTR+e!$ z$u+9~TST0v*_cIK*#gZ#ax>U65~S@S-X+;PzL-jdFy z-Vz2sxR0S<(oP{m?`i?==&1kx=h=)`q;a?_+b8!&&t3gkA_Fl2ub>ObTctjn6xoE$ zEZON?dNvPmaj!d&hsEtazjq(B&T2j|K(wYvqiO!B%tY{qME}~pklM;#Z*r`3>O8gC zReyiLKnj}qJlNo+N)2c+y%P3U&U8w{|H71e-T4I-S@&hl|7A|dpS#(316ppy5O`^mM_UTRnl-ktwa(2J)64US=s;MhF>F}0nhV1Ylfx(hu&h}rx>%c`H~ zPA=yKtBu6YuN-JhimKRt{s?*322Y6=X&`X_RFH^o_|Cdl7_?d-6HtAeC)5GS71txp z{2HhXxh^s36tb9VY=lxCyEFEsY_+(dZ~)6RC6WPu{$w#QInr?Wl&N7i#*F){lS}2n zX|*di*vMm5yZxU!JnirWLN$;xfu2_8l5teVPD0i$$yxI3t#?9^4)uy>YNVOYmcncF z$DnT{sM=vfDLGs;t6UPxVVVw>L6ts}lOhN@J6<_gN99+JJGQ+5#z`z9MhKg~;#S9D zR10d*!@LewLWPtoG=!+@srgdSThp3{Ac{IFl~RnxIq@g2_K_~f%_SeST4b1x*dwfn z30S+do~4J|<;`?_x@5Ampr7%Z{7%l(Q)vrtztK?Dqkw1CChZk}YQD=FV?@qlc7~4Q z4Ml5e&A^|WxS?mW9zk!?#13ajM%;5R-&gJcXcf+qdnv5A1Dt(dm5$@!d3_hW%6uc! zGFFxPW`cI+Gs@qVG^`M!E9zFG->!9*4#FHQ=^-A|go+eyavqYod6%o8r-!g~D0vc8 zXw6_1kSDNF_}=vR&-Ix9kFyl&f~uk_3F$i~@u`2hvzQM+c!3$z{fsIDwlzxL80y?$i{$es@W}%f6b!CUw1!8MiJbBwNW_8<>okAPTeXV z*1yJU2x-HckIIk)e(~W5lQ@)~2_lLe#y}AWRhv9lodGQ*fWxuP7NBQqqceyRCtT~= z3B>37!;GTYWp#?SbJOceRd(#MiyXmv$Dhn(BP;$ro@r#4=8#B9M#2@%I4W%8|KhB; z<&|%+b|adz_JCOiT4rD7@ZV*08WCmWT8Xt8m^8d=*%F-Q<(U?JT(=Oik-qu?Ou@yPfgPQ-Y|A@;z z@}^y*eBGYaP8&>5?^0cHFD!c%ncXE8_?p8d*zxv-GuM*VSlDTm@C&V{5SA2?SJSx(pU zJ(Tr{s*Q2aL%j`W#t+nXFY);bgmufg9`~^|RCUC3IkH(SY9mUy8zZ9tMaVQji&H}|@t?bWsnzZdxz+Y*w zQK>aud=#53^fhK`o#zSfRjkNMld{pQ1Dk99&&@Eb0X;R;wLG!J_xHtZaoOwZx&@2L zhB3mLb)oktVv0k|OKe1YKPl$e+Sl+ljIg;PPKg$dbN-r+PEs)qkvOKLDPUY4`$<{p zTSGY7&77F1s}XkAzJCgfmYBdw`@Dw(il3p(T?Snf;@;)4dY=DYJG^ckY?LNLox^FX z=HssBKC+GeK~lf(S;WBvP()me^pjv^xXb;~cYPGc%5dSN^Ig|kkTdRk3AoUgKR-Fi zPboMRSFcKq_cnT%Aim}7Xk7=+D^|Kg6>cfJCX?=eMt+LQ4@nPQCrOhxoij+;mlOe& z#Xdt;#u4!>)7l$K;G0%Gvt*o)MX(}lnUtRMC&9U2>4;t#eSXg+m%}-^1(8m@tQQ%7 zo;aDcNj1Ac5hf;My)%?EY^4To)iRu=GSx8DLfs;qTnFuKo^K{_+=11yg+Of!KbaYS z)XNVnMKSbc_;dd!e|%O0Iu!u8FQ-tqhtAg5dln@D13Wrw@S@E&cPp=RkWnQ$Xj$AVE&6qD_v#H?Jwyppe#PkI>t@!b|+EM69; zN|npfP`w*WpPaOpDw?PdOp6BWKn_Jm4;d1OFFOKS_h=v%fmKG7%=EyLuNm=!1)P7p(U1?Wg98+52P-2_jgKG1rE`W zb;;n$Eqi}2px+s&L zJ;f>Ty<4i#QIYF*M7_2owWv?J>xevG(vP)T#CfL`UH6vnjSA*oz%)>Dr<{$3o2AxJ zz-I@XgYyC{Q)ERJWL=)fT-$ckj}dz7w=CA>{r}X0iXy-z6LDr$uR#%Sq`go11>hQU zoeYS;b`w-9it3pjGZx9kEIhmUo9cYMWa$@rzJFe)99Z11}@8cP0L`L4TgeG~@ zY9Y8mid&g5>o^d`dXW>vaglS!RgJMo3`kqNOj39Y8C;ZQsQv#efQk^0CJ}N|6!Y2nPKK8*d9m@ijL|y_RCs_ zqLdS~iVB-%zN~ZFKMjwcD~>$ZqeD6TDy@NTu^sZh`xbiOSWFRbxocK`%y9INQLY|L(q0IM>gs&_d%%JfnjWpi2#JBlq*`4;aJ z07FQtv4b?ixaMAkQ+MYWsKV|^m;ABV%9b5mUdB6Kzc{aDWn(J+9M|rb&etF7#Xk06 zNa^4iScL3yFe8t5C6LMQ8Q?7vHRoUtO!y#$j$6aLOxon?Hkv@#oruU0JFc~vBADYe zz6U);ri%Tc&7Pe0b2N1-|Zr*6!7Pvq}`7?eAR7 z)Y)b5!5SCbt{!}U%%N*b%c(7lpu!?tzJGG7-9uNhpk%z!>fZ@p6-O~Kf?Ce?CJ^A5 zp_NKQ*XOVM&{-2AQ!7%K^CpOC2ObOb|e8ial6!*VPa_FYE6`9*eU-TqcA&gX*vp znFr1_KOc`^{5DV2mpTrpjm1g9kLxpLQq|8QU+fMiYyMjD^~=waPYYE??fH2I_iC>@ zA5#69j#U~tnvPtLXo&CAYzr&Z`TfY&dZM@Ey_KeFP~er5-27=ld!#>c%a_+kkBoxt zi0EiWsM;;Pazcraxh$g`F*b(f8u&Nl8N*S-ZMnLc@01Pq!Q9woCUA|g*>K`BZIO~# z*fha8JBhE{nSV8MO8WuyYL0~`?Fm|ha&}L4ehemCkxz(xNTEDiN z$INNRDO*BvF}ZUFDVNqCB#Q*Bb36o%_a*)?|0Sl=IIk5X2J`sjy@+d>$`#MVd%uwIBkAt6bB*k~r+u;8&e5N8nV)p0*`D zrOrpdDMRQ?cV~$e)8HntTzLuFm5Z4Ty4+}2yO6&JP9<}JXIKt)7+aRM`K{T5q7wf#fV zNu+m6E?k;9(JY=wNOa$>9Lvr#Vv);mb&8%UQMgs{fI_D0?R7N2Ys;#wUWBJk6fljT zVhb2hBRoES&q4H$x_PJYJl9W;KKoM=?QAIrdoQ zpM^?*@*ZXdRtj>)9G9{Yk3G2!*(Ey6_#xA;*m(0`hJkAXN^6^X(wF~~CmttzurYm% z`cdWExJA3XpcNtOY+=-kO|~P~(t1&kf1WM`F9STSRO_F0J3QN=%lt7Ueyiztlm6}G zc%kx%0x6>??hD*U8EJqR^pJU%u?i*(Fw+QK8ELEcYg_?FQeA(jfuF^He@Y4b%)Zm;yExY4 zXLtc!4>(PIgs=cAxlGYW9hgbXmK-SVTh=#Wce_>Q*?u#$2h4Eo2p7Gtrqb2px{iuGEuPh=! z-A|gy5QW|Ac;wl9c~LGy%y#U7X8dE=;=+a57Q9hD8q;QPR(|DL-UQ^g`_z1;kHyV2 z_QiDlt7;{NivN)iF_Vv+J9>50$}gr_{EjhVIpA4SxfPEY~jL|RG9F|{e_;=pta zt6K85;r`&hmcqrKl^X7+z9tY3xeN#uD|sep;NROqPQ_ZMj4`_O^BioD2S1XY5*syP zmo6~wlDQ#{(-`Ry9$Y&}O?oZ5`Bc@J9zHJzTv5c}gf-Pna9r*Z0cndu*&VCgSL7}a zgU{8276AtEBKa3@QW-sw@hguR9B0=*@}(Ap+tN2{SNeaT8#%PIg)~{c5mHI7?j!y7 z%)0%61azT^hgNr(9LR)HaT^nIfRM@xG{`9@T(I9Ir4SIR$?n3=$aySj2zd>ZLcr$Q z^4hD;XW1k~Z7l5zt|Mu_yL8!03c1AYrY%~rt9#DTB=AqI2FdPkmfY}el<+&M>;Ywd z#4=(QB7oSA+7TjZ{wM9iM_{gHaLkqK?7%)%w)oyiIRE2GE-atk^=_wX$5>4In3wT{ z^P6g{n!V9eY;*;@L`ZG|v$K43Z!7GKWJZUDsHH#W{J;B6Kp74-$dAy zPSG`k))Z_k!gKmgS+G!73^Q!MzG&!0Zu7bjIyKC6s{Z2{fBsj22N(GVsr+_RKR^1k z5q9)EK!1c%QF2*=f4!rbOl-8pdMEwH5{oTNb}yOU|0#t)lRL8*mJ_F?dUsCTW;y0g zxtoBzcM>~nDUf{#j^1Tki6$<6)rqz;jOgJjh~8}eO#zmsF_|^aPp8i;I%_+OS*QZ~ zUmetldNnmCU3CT|{9FG#_#M20$PfDKEc)!t>bhR|EbrvX-~QXU>ni18d+&t zJ|w%RF3wr^L#T(>P&+m!_QK@E3GOyl6zJr7O3{efd=GVA!+Nm!Y13uWlk_U)+(C@2 z@z(`Aw4e-_)=8Zg+T+W_!xFwj0!zf_J zt_w=`JzB~-zM<)?0xWf3>yR9ib3SeW=J2u}Bc7Rt8$}DavITwnhgh3swf@i7nGMA@ z9sr{-mwTHM;;HZ8(1Q#t)m??|{R%}9hSx7R>Bp0w|0Q~0~6HVIRzjjO5pomVCnnj=2720~;q1}^3sn@rrkd?IvwS4U9lFJLuo>-f=Nu+)GR4TRAil#z-#KAN4Bu&g_mu^Ui{~{sbg@_jl zqAuo+%HQ=vA9E`gIb?KGyH~#gm3-w~%5?vC4*xtbSJBL$hxL}b;OJvR{j?e|51jkfgijNGgF^w_F_ zvTo~o^2Tiw@muMA`4H~%GHz4&Tzo-J)P3BP;;TZB{u5OJwj>Wv&w-tdZ5THPN6H&Z zdHXm1y1KgTlSN(IHe#o5WbPeuq0yvI5Jd-`a%xVi)5|IIWAU}vrY4A=VVxp z)^2YaE&svT#MWVnO(Rpe9cBN<4F&QRx2l@27!AY0Rb!8dxNdGnpziif#iy^Xm zRdH>7um5IVCVv+rlN(|vq~ST;`3MTaD|gpa{QA3KN;Y^?Dy~fAt<@mD+_&w~4Yjeb zbWX!e3)|EC%f7=DzLoM%2Z`>kT|?YM8nmp~7F4O)x1n0Xuhd>Qr)zq9s;x@tVn+06 zO?PX$A%>2~IO5${WIo0;0279(vyia~2kAjcV$;QoM}DRhWUllr=T%#$%JlZ$<;b?N zATkKR+GvIL`!;gTiSE)AiPVo}jk5#N`9b%$%b9DNi5A%&jO|>eZO^&Nx@DvCliqyS zKBG1#p-Z>)1Hl!p&Njf{9ETz5a-Q@ahU$SL*~ied^9X*v5@=-wu@yEVmsI(V zY1j(w#T#62^CXk=5+*hAafXq1&la*e_8D|uW^-;^4*?r(Z7x3KSx6WdjQaj98m=(I zE$0_|<_nr()%WDPXm4f|!XCMGmtw@)9{g)WAP5&}mk{ANA4rW3i z{7v(D*X$KI=m~mo1So!~qU1zE*O>=@FTYJn;?d zHL1MkAzRpMmt`apkktHME#yWhKUOaZBf{7+Ew&lI2&3iXv4-IY<@;-Q7fs&POf3CK z^m=+_*=-NOv~BA4N8hg4rlgH!*=MK(w_GD)LtM-6o4GA&J#?Lj%i?(d z{Nt_+2l$~|C*EZlL7YIAQ(+jTVO620os6ici;X-^{jD}s}=bsh3oRSa8Jw%D;%N3=zh~H3jQ-y7}Lr=JU7e__k>6)PB2vn3r_2 z`uFVSbJeK%Bn_Xn2lAm)WXks7?_{6iuHX4ndDTr`_@DfyhNRFcYrr(N{vL8sldWk* zNxKsDo^o)exz{Xxma{!AMRExcdnOpjdZzE4m$nb+tygQy;;dnHg6vUxPe?tdG;Ns6 zD51WPx%9V8kK~lyw@5P!5hWI!6eZj+wW09AXDtyvRz08I)6_K^sW|CX8qEd*ZWn{j zP=;%>wZJt_pK%>6EJgCV;{!;8N8pWBq5K&D2kGdus{T z1zhp2kj!Gdhk)Dh=DWb=%cg{Dl-h4ujV|x&4Z_J{j7@c2i#y>U@2YR8@@ zTHW;?kJ$MTLTY~U>lM zlCOxVOgYB`QEjADx6nYS=|T1=XIQ>TM8!=!e&6NBmwT`R+2GH%X8ksas(N|E{D