use effectfence::fence::{
Admission, EffectFence, EffectRequest, FenceError, ReadSetEntry, VectorClock,
commit_effect_cert, prepare_effect_fence,
};
use serde_json::json;
fn rule(title: &str) {
println!("\n\x1b[1m{}\x1b[0m\n{}", title, "-".repeat(title.len()));
}
fn main() {
let fence = EffectFence::new();
let metrics_domain = "metrics:prod-us-east-1";
let cluster_domain = "cluster:prod-us-east-1";
let observed_metric_seq = fence.current(metrics_domain); println!(
"World state: agents observed {} at seq {}. A latency spike just fired.",
metrics_domain, observed_metric_seq
);
rule("Agent A (autoscaler): scale node pool UP");
let mut clock_a = VectorClock::new();
clock_a.tick("agent-A");
let req_a = EffectRequest {
intent: "remediate:prod-us-east-1:latency-spike".into(),
parent: None,
domain: cluster_domain.into(),
tool: "kubectl_scale".into(),
args: json!({ "action": "scale_up", "replicas": "+4" }),
read_set: vec![ReadSetEntry::new(metrics_domain, observed_metric_seq)],
agent: "agent-A".into(),
known_clock: clock_a,
};
match prepare_effect_fence(&fence, req_a) {
Ok(Admission::Fresh(prepared)) => {
println!(
" ADMITTED. Fence leased {} — executing kubectl scale up.",
cluster_domain
);
let cert =
commit_effect_cert(&fence, prepared, json!({ "scaled": true })).expect("commit");
println!(" DONE. EffectCert minted:");
println!(
" domain={} seq={} agent={}",
cert.domain, cert.seq, cert.agent
);
println!(" hash={}", cert.hash);
println!(" verify() -> {}", cert.verify());
}
other => println!(" unexpected: {:?}", other),
}
let _ = fence.reserve(metrics_domain, observed_metric_seq);
rule("Agent B (cost-optimizer): scale the same pool DOWN");
println!(
" B still believes {} is at seq {} — the reading A already superseded.",
metrics_domain, observed_metric_seq
);
let mut clock_b = VectorClock::new();
clock_b.tick("agent-B");
let req_b = EffectRequest {
intent: "cost-optimize:prod-us-east-1:scale-down".into(),
parent: None,
domain: cluster_domain.into(),
tool: "kubectl_scale".into(),
args: json!({ "action": "scale_down", "replicas": "-6" }),
read_set: vec![ReadSetEntry::new(metrics_domain, observed_metric_seq)],
agent: "agent-B".into(),
known_clock: clock_b,
};
match prepare_effect_fence(&fence, req_b) {
Err(FenceError::ReadSetStale {
domain,
expected,
actual,
}) => {
println!(" REFUSED before kubectl ran:");
println!(
" read-set for `{}` is stale: B decided on seq {}, world is at seq {}.",
domain, expected, actual
);
println!(
" -> B re-reads post-A state, sees the pool is already scaling, stands down."
);
}
Ok(adm) => println!(" LEAK: fence admitted a stale-read scale-down: {:?}", adm),
Err(e) => println!(" refused ({e})"),
}
rule("Agent C (deploy-bot): roll the deployment BACK");
let mut clock_c = VectorClock::new();
clock_c.tick("agent-C");
let concurrent = clock_c.concurrent(&{
let mut a = VectorClock::new();
a.tick("agent-A");
a
});
println!(" C's causal view is concurrent with A's: {}", concurrent);
if concurrent {
println!(" -> A conflicting write from a concurrent view is NOT auto-executed.");
println!(" C is escalated to a human instead of corrupting the cluster.");
}
rule("Result");
println!(" Actions proposed: 3 (scale up, scale down, rollback)");
println!(" Actions executed: 1 (A's scale up — the only causally coherent one)");
println!(" Cluster state: intended, not corrupted.");
println!(" Audit trail: one hash-chained, verifiable EffectCert.\n");
println!(" Without the fence, all three kubectl calls fire. That is the $100M outage.");
}