Alice and Bob both witness the wolf attacking the sheep. Same event, same shared world. But Alice has the rule attacked → threatens in her graph; Bob doesn’t. After saturation closure runs on each private graph, only Alice’s beliefs contain (wolf, threatens, sheep). No per-agent code branching — the divergence is pure consequence of differing rules. Add a rule to Bob’s side and watch his graph catch up.
#kitchen?x ?y ?z for variables. One or two body patterns.iter until fixpoint: for each rule, find every variable binding under which the body matches the current fact set; instantiate the head and add it. Repeat until no new facts. Run separately over each agent’s private rule + belief store. No per-agent dispatch logic — the same saturate() runs over both graphs; outputs diverge because inputs differ. That’s the substrate eddy carries from the kraken kernel.
examples/multi_agent.py. The kernel function is cognition/processes/reasoning_saturation_closure.py. Bundles (Alice’s predator_knowledge, Bob’s farmer_knowledge) seed each agent with starter rules and beliefs; downstream, the same iter_spo_triples reads see whatever each agent’s saturation closed over. Same event, shared WorldMemory (the objective record), divergent private beliefs (each agent’s interpretation).