RETE relational alpha β-memory (per-sweep eval cache) Cluster cProfile (combined_40_ings, eos v0.5.423) showed alpha_network.activate at 5.36s cumtime as the residual hot spot after the v0.5.420-423 micro-optimizations. Phase 0 falsifier (commit 99ded2911) measured RelatedNodeAlpha at 84.7% noop ratio on the two_origins fixture — 17K of 20K activations end with the predicate output unchanged. The existing _eval_cache short-circuits PROPAGATION but evaluate() itself still runs on every call. This release adds the textbook β-memory pattern (cache the join result keyed on a generation that advances when inputs change) to the two relational alpha types whose evaluate() bodies do non-trivial per-related-uid work: - 420f88d20 perf(rete): per-sweep eval cache on RelatedNodeAlpha - 7797eb2f9 perf(rete): per-sweep eval cache on CrossNodePropertyAlpha Mirrors the proven PerRelatedNodeAlpha._source_eval_cache pattern. Within a sweep the working memory's cache_generation is fixed, so repeat activations on the same source uid would walk the same related set, do the same filter loop, produce the same quantifier reduction. Cache short-circuits before evaluate() runs. Local cProfile (test_benchmark_two_origins): alpha.activate calls 53K → 33K (-38%); cProfile total 1.295s → 1.146s (-12% cumtime). Wall-clock at this fixture size is within macOS scheduler noise; combined_40_ings is the target. Cancel-rehab cleanup is automatic — `reset_gfm_activation` already pops `_source_eval_cache` via hasattr branch. Tests: 532/532 green. CO2 invariant test_benchmark_two_origins=1.2568 holds. The branch perf/beta-discrimination was created to scope this work and is preserved on origin. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>