git-subtree-dir: vendor/ruvector git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
14 KiB
Implementation Roadmap: Anytime-Valid Coherence Gate
Version: 1.0 Date: 2026-01-17 Related: ADR-001, DDC-001
Executive Summary
This document provides a phased implementation roadmap for the Anytime-Valid Coherence Gate (AVCG), integrating:
- Dynamic Min-Cut (existing, enhanced)
- Online Conformal Prediction (new)
- E-Values/E-Processes (new)
The implementation is designed for incremental delivery with each phase providing standalone value.
Phase 0: Preparation (Current State Analysis)
Existing Infrastructure ✅
| Component | Location | Status |
|---|---|---|
SubpolynomialMinCut |
src/subpolynomial/mod.rs |
Production-ready |
WitnessTree |
src/witness/mod.rs |
Production-ready |
CutCertificate |
src/certificate/mod.rs |
Production-ready |
DeterministicLocalKCut |
src/localkcut/ |
Production-ready |
GateController |
mincut-gated-transformer/src/gate.rs |
Production-ready |
GatePacket |
mincut-gated-transformer/src/packets.rs |
Production-ready |
Dependencies to Add
# Cargo.toml additions for ruvector-mincut
[dependencies]
# Statistics
statrs = "0.17" # Statistical distributions
rand = "0.8" # Random number generation
rand_distr = "0.4" # Probability distributions
# Serialization for receipts
serde_json = "1.0"
bincode = "1.3"
blake3 = "1.5" # Fast cryptographic hashing
# Optional: async support
tokio = { version = "1", features = ["sync"], optional = true }
Phase 1: E-Process Foundation
Goal: Implement core e-value and e-process infrastructure.
Task 1.1: E-Value Module
Create src/eprocess/evalue.rs:
/// Core e-value type with validity guarantees
pub struct EValue {
value: f64,
/// Null hypothesis under which E[e] ≤ 1
null: NullHypothesis,
/// Computation timestamp
timestamp: u64,
}
/// Supported null hypotheses
pub enum NullHypothesis {
/// P(unsafe outcome) ≤ p0
ActionSafety { p0: f64 },
/// Current state ~ reference distribution
StateStability { reference: DistributionId },
/// Policy matches reference
PolicyConsistency { reference: PolicyId },
}
impl EValue {
/// Create from likelihood ratio
pub fn from_likelihood_ratio(
likelihood_h1: f64,
likelihood_h0: f64,
) -> Self;
/// Create mixture e-value for robustness
pub fn from_mixture(
components: &[EValue],
weights: &[f64],
) -> Self;
/// Verify E[e] ≤ 1 property empirically
pub fn verify_validity(&self, samples: &[f64]) -> bool;
}
Task 1.2: E-Process Module
Create src/eprocess/process.rs:
/// E-process for continuous monitoring
pub struct EProcess {
/// Current accumulated value
current: f64,
/// History for audit
history: Vec<EValue>,
/// Update rule
update_rule: UpdateRule,
}
pub enum UpdateRule {
/// E_t = Π e_i (aggressive)
Product,
/// E_t = (1/t) Σ e_i (conservative)
Average,
/// E_t = λe_t + (1-λ)E_{t-1}
ExponentialMoving { lambda: f64 },
/// E_t = Σ w_j E_t^{(j)}
Mixture { weights: Vec<f64> },
}
impl EProcess {
pub fn new(rule: UpdateRule) -> Self;
pub fn update(&mut self, e: EValue);
pub fn current_value(&self) -> f64;
/// Check stopping condition
pub fn should_stop(&self, threshold: f64) -> bool;
/// Export for audit
pub fn to_evidence_receipt(&self) -> EvidenceReceipt;
}
Task 1.3: Stopping Rules
Create src/eprocess/stopping.rs:
/// Anytime-valid stopping rule
pub struct StoppingRule {
/// Threshold for rejection
reject_threshold: f64, // typically 1/α
/// Threshold for acceptance (optional)
accept_threshold: Option<f64>,
}
impl StoppingRule {
/// Check if we can stop now
pub fn can_stop(&self, e_process: &EProcess) -> StoppingDecision;
/// Get confidence at current stopping time
pub fn confidence_at_stop(&self, e_process: &EProcess) -> f64;
}
pub enum StoppingDecision {
/// Continue accumulating evidence
Continue,
/// Reject null (evidence of incoherence)
Reject { confidence: f64 },
/// Accept null (evidence of coherence)
Accept { confidence: f64 },
}
Deliverables Phase 1
src/eprocess/mod.rs- module organizationsrc/eprocess/evalue.rs- e-value implementationsrc/eprocess/process.rs- e-process implementationsrc/eprocess/stopping.rs- stopping rulessrc/eprocess/mixture.rs- mixture e-values- Unit tests with ≥95% coverage
- Integration with
CutCertificate
Acceptance Criteria Phase 1
- E[e] ≤ 1 verified for all implemented e-value types
- E-process maintains supermartingale property
- Stopping rule provides valid Type I error control
- Computation time < 1ms for single e-value
Phase 2: Conformal Prediction
Goal: Implement online conformal prediction with shift adaptation.
Task 2.1: Prediction Set Core
Create src/conformal/prediction_set.rs:
/// Conformal prediction set
pub struct PredictionSet<T> {
/// Elements in the set
elements: Vec<T>,
/// Coverage target
coverage: f64,
/// Non-conformity scores
scores: Vec<f64>,
}
impl<T> PredictionSet<T> {
/// Check if outcome is in set
pub fn contains(&self, outcome: &T) -> bool;
/// Get set size (measure of uncertainty)
pub fn size(&self) -> usize;
/// Get normalized uncertainty measure
pub fn uncertainty(&self) -> f64;
}
Task 2.2: Non-Conformity Scores
Create src/conformal/scores.rs:
/// Non-conformity score function
pub trait NonConformityScore {
type Input;
type Output;
fn score(&self, input: &Self::Input, output: &Self::Output) -> f64;
}
/// Absolute residual score
pub struct AbsoluteResidual<P: Predictor> {
predictor: P,
}
/// Normalized residual score
pub struct NormalizedResidual<P: Predictor + UncertaintyEstimator> {
predictor: P,
}
/// Conformalized Quantile Regression (CQR)
pub struct CQRScore<Q: QuantilePredictor> {
quantile_predictor: Q,
}
Task 2.3: Online Conformal with Adaptation
Create src/conformal/online.rs:
/// Online conformal predictor with shift adaptation
pub struct OnlineConformal<S: NonConformityScore> {
score_fn: S,
/// Calibration buffer
calibration: RingBuffer<f64>,
/// Current quantile
quantile: f64,
/// Adaptation method
adaptation: AdaptationMethod,
}
pub enum AdaptationMethod {
/// Adaptive Conformal Inference
ACI { learning_rate: f64 },
/// Retrospective adjustment
Retrospective { window: usize },
/// Conformal Optimistic Prediction
COP { cdf_estimator: Box<dyn CDFEstimator> },
}
impl<S: NonConformityScore> OnlineConformal<S> {
/// Generate prediction set
pub fn predict(&self, input: &S::Input) -> PredictionSet<S::Output>;
/// Update with observed outcome
pub fn update(&mut self, input: &S::Input, outcome: &S::Output);
/// Get current coverage estimate
pub fn coverage_estimate(&self) -> f64;
}
Task 2.4: CORE RL-Based Adaptation
Create src/conformal/core.rs:
/// CORE: RL-based conformal adaptation
pub struct COREConformal<S: NonConformityScore> {
base: OnlineConformal<S>,
/// RL agent for quantile adjustment
agent: QuantileAgent,
/// Coverage as reward signal
coverage_target: f64,
}
/// Simple TD-learning agent for quantile adjustment
struct QuantileAgent {
q_value: f64,
learning_rate: f64,
discount: f64,
}
impl<S: NonConformityScore> COREConformal<S> {
/// Predict with RL-adjusted quantile
pub fn predict(&self, input: &S::Input) -> PredictionSet<S::Output>;
/// Update agent and base conformal
pub fn update(&mut self, input: &S::Input, outcome: &S::Output, covered: bool);
}
Deliverables Phase 2
src/conformal/mod.rs- module organizationsrc/conformal/prediction_set.rs- prediction set typessrc/conformal/scores.rs- non-conformity scoressrc/conformal/online.rs- online conformal with ACIsrc/conformal/retrospective.rs- retrospective adjustmentsrc/conformal/cop.rs- Conformal Optimistic Predictionsrc/conformal/core.rs- RL-based adaptation- Unit tests with ≥90% coverage
Acceptance Criteria Phase 2
- Marginal coverage ≥ 1 - α on exchangeable data
- Coverage maintained under gradual shift (δ < 0.1/step)
- Recovery within 100 steps after abrupt shift
- Prediction latency < 10ms
Phase 3: Gate Integration
Goal: Integrate all components into unified gate controller.
Task 3.1: Anytime Gate Policy
Create src/anytime_gate/policy.rs:
/// Policy for anytime-valid gate
pub struct AnytimeGatePolicy {
/// E-process thresholds
pub e_deny_threshold: f64, // τ_deny
pub e_permit_threshold: f64, // τ_permit
/// Conformal thresholds
pub uncertainty_threshold: f64, // θ_uncertainty
pub confidence_threshold: f64, // θ_confidence
/// Min-cut thresholds (from existing GatePolicy)
pub lambda_min: u32,
pub boundary_max: u16,
/// Adaptation settings
pub adaptive_thresholds: bool,
pub threshold_learning_rate: f64,
}
Task 3.2: Unified Gate Controller
Create src/anytime_gate/controller.rs:
/// Unified anytime-valid coherence gate
pub struct AnytimeGateController<S: NonConformityScore> {
/// Existing min-cut infrastructure
mincut: SubpolynomialMinCut,
/// Conformal predictor
conformal: OnlineConformal<S>,
/// E-process for evidence
e_process: EProcess,
/// Policy
policy: AnytimeGatePolicy,
}
impl<S: NonConformityScore> AnytimeGateController<S> {
/// Evaluate gate for action
pub fn evaluate(&mut self, action: &Action, context: &Context) -> GateResult;
/// Update after observing outcome
pub fn update(&mut self, action: &Action, outcome: &Outcome);
/// Generate witness receipt
pub fn receipt(&self, decision: &GateDecision) -> WitnessReceipt;
}
pub struct GateResult {
pub decision: GateDecision,
// From min-cut
pub cut_value: f64,
pub witness_partition: Option<WitnessPartition>,
// From conformal
pub prediction_set_size: f64,
pub uncertainty: f64,
// From e-process
pub e_value: f64,
pub evidence_sufficient: bool,
}
Task 3.3: Witness Receipt
Create src/anytime_gate/receipt.rs:
/// Cryptographically sealed witness receipt
#[derive(Serialize, Deserialize)]
pub struct WitnessReceipt {
/// Receipt metadata
pub id: Uuid,
pub timestamp: u64,
pub action_id: ActionId,
pub decision: GateDecision,
/// Structural witness (from min-cut)
pub structural: StructuralWitness,
/// Predictive witness (from conformal)
pub predictive: PredictiveWitness,
/// Evidential witness (from e-process)
pub evidential: EvidentialWitness,
/// Cryptographic seal
pub hash: [u8; 32],
pub signature: Option<[u8; 64]>,
}
#[derive(Serialize, Deserialize)]
pub struct StructuralWitness {
pub cut_value: f64,
pub partition_hash: [u8; 32],
pub critical_edge_count: usize,
}
#[derive(Serialize, Deserialize)]
pub struct PredictiveWitness {
pub prediction_set_size: usize,
pub coverage_target: f64,
pub adaptation_rate: f64,
}
#[derive(Serialize, Deserialize)]
pub struct EvidentialWitness {
pub e_value: f64,
pub e_process_cumulative: f64,
pub null_hypothesis: String,
pub stopping_valid: bool,
}
impl WitnessReceipt {
pub fn seal(&mut self) {
self.hash = blake3::hash(&self.to_bytes()).into();
}
pub fn verify(&self) -> bool {
self.hash == blake3::hash(&self.to_bytes_without_hash()).into()
}
}
Deliverables Phase 3
src/anytime_gate/mod.rs- module organizationsrc/anytime_gate/policy.rs- gate policysrc/anytime_gate/controller.rs- unified controllersrc/anytime_gate/decision.rs- decision typessrc/anytime_gate/receipt.rs- witness receipts- Integration tests with full pipeline
- Benchmarks for latency validation
Acceptance Criteria Phase 3
- Gate latency p99 < 50ms
- All three signals integrated correctly
- Witness receipts pass verification
- Graceful degradation on component failure
Phase 4: Production Hardening
Goal: Production-ready implementation with monitoring and optimization.
Task 4.1: Performance Optimization
- SIMD-optimized e-value computation
- Lazy evaluation for conformal sets
- Batched graph updates for min-cut
- Memory-mapped receipt storage
Task 4.2: Monitoring & Alerting
- Prometheus metrics for gate decisions
- Coverage drift detection
- E-process anomaly alerts
- Latency histogram tracking
Task 4.3: Operational Tooling
- Receipt query API
- Threshold tuning dashboard
- A/B testing framework for policy comparison
- Incident replay from receipts
Task 4.4: Documentation
- API documentation
- Operator runbook
- Threshold tuning guide
- Troubleshooting guide
Timeline Summary
| Phase | Duration | Dependencies | Deliverable |
|---|---|---|---|
| Phase 0 | Complete | - | Requirements analysis |
| Phase 1 | 2 weeks | None | E-process module |
| Phase 2 | 3 weeks | Phase 1 | Conformal module |
| Phase 3 | 2 weeks | Phase 1, 2 | Unified gate |
| Phase 4 | 2 weeks | Phase 3 | Production hardening |
Total estimated effort: 9 weeks
Risk Register
| Risk | Probability | Impact | Mitigation |
|---|---|---|---|
| E-value power too low | Medium | High | Mixture e-values; tuned alternatives |
| Conformal sets too large | Medium | Medium | COP for tighter sets; better base predictor |
| Latency exceeds budget | Low | High | Early profiling; lazy evaluation |
| Integration complexity | Medium | Medium | Phased delivery; isolated modules |
| Threshold tuning difficulty | High | Medium | Adaptive thresholds; meta-learning |
Success Metrics
| Metric | Target | Measurement |
|---|---|---|
| False deny rate | < 5% | Simulation |
| Missed unsafe rate | < 0.1% | Simulation |
| Gate latency p99 | < 50ms | Production |
| Coverage maintenance | ≥ 85% | Production |
| Receipt verification pass | 100% | Audit |
References
- El-Hayek, Henzinger, Li. arXiv:2512.13105 (Dec 2025)
- Online Conformal with Retrospective. arXiv:2511.04275 (Nov 2025)
- Ramdas, Wang. "Hypothesis Testing with E-values" (2025)
- ICML 2025 Tutorial on SAVI
- Distribution-informed Conformal (COP). arXiv:2512.07770 (Dec 2025)